目录
微服务:整合 Spring Cloud Eureka - 注册中心 Eureka Server
微服务:整合 Spring Cloud Eureka - 服务注册 Eureka Client
微服务:整合 Spring Cloud Eureka - 服务发现 DiscoveryClient
微服务:整合 Spring Cloud Eureka - 服务消费以及Ribbon简单使用
微服务:整合 Spring Cloud Eureka - 高可用集群
微服务:整合 Spring Cloud Eureka - .NET Core Mvc Api (C#)
微服务:整合 Spring Cloud Eureka - 服务治理机制
微服务:整合 Spring Cloud Eureka - 服务事件监听
微服务:整合 Spring Cloud Eureka - 高级属性Region、Zone
微服务:整合 Spring Cloud Eureka - Rest接口文档
微服务:整合 Spring Cloud Eureka - Security 安全保护
一、前言
前面三篇文章已经介绍如何搭建Eureka注册中心以及服务注册、服务发现。本篇文章将会介绍如何使用Ribbon调用服务,并演示在客户端如何使用负载均衡。
二、Ribbon中RestTemplate的使用
1、代码结构
2、pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>spring-cloud-register</artifactId> <groupId>com.demo</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>demo-service-consumer</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- eureka-client 服务注册与发现 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- eureka-client 服务注册与发现 --> <!-- ribbon 负载均衡 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <!-- ribbon 负载均衡 --> </dependencies> </project>
3、RibbonConfig:
package com.demo.service.consumer.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class RibbonConfig { @Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); } }
RibbonConfig 类中很简单,只是配置了一个 Ribbon中的RestTemplate,并声明是一个Bean。
4、ConsumerHelloController
package com.demo.service.consumer.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class ConsumerHelloController { @Autowired RestTemplate restTemplate; @RequestMapping("/hello/{name}") public String hello(@PathVariable("name")String name){ String ribbon_url = "http://demo-service-provider/hello/sayhello/" + name; String msg =restTemplate.getForEntity(ribbon_url,String.class).getBody(); System.out.println("服务返回信息为:" + msg); return "服务返回信息为:" + msg; } }
三、运行分析
1、第一步启动Eureka注册中心 - demo-register,可以参考《微服务:整合 Spring Cloud Eureka - 注册中心 Eureka Server》。
2、第二步启动服务提供者 - demo-service-provider,可以参考 《微服务:整合 Spring cloud Eureka - 服务注册 Eureka Client 》 。
3、第三步启动服务消费者 - demo-service-consumer。
4、在浏览器中打开:http://localhost:8201/hello/tom
服务消费者使用Ribbon-restTemplete调用服务已经成功。
四、总结
@RequestMapping("/hello/{name}") public String hello(@PathVariable("name")String name){ String ribbon_url = "http://demo-service-provider/hello/sayhello/" + name; String msg =restTemplate.getForEntity(ribbon_url,String.class).getBody(); System.out.println("服务返回信息为:" + msg); return "服务返回信息为:" + msg; }
从以上代码可以看出来:
1、restTemplete调用的url地址为:"http://demo-service-provider/hello/sayhello/" + name。
2、Ribbon拿到这个地址后,会解析出路由中的ServiceId:demo-service-provider
3、通过demo-service-provider找到服务提供者的ip:port 列表。
4、通过ip:port 列表按照负载均衡策略选出一个url地址。
5、重新拼接url地址,此时才开始真正的调用远程服务:demo-service-provider