Spring Cloud 之 Ribbon服务消费(五)

我们在Spring Cloud 之 Eureka Client服务注册(三) 中实现了简单的服务注册,本篇主要通过Ribbon实现服务消费者调用,因为本系列博客不专注细节,所以对于Ribbon及后续其它SpringCloud组件也不展开讨论。Ribbon非常优秀,尤其对接第三方服务时,如果第三方服务涉及多机房部署,往往会给调用者几个服务IP,我们通过Ribbon Httpclient便可以实现客户端的负载均衡及服务探活。

 

1、创建一个module名称为x-demo-service-ribbon的ribbon服务

 

2、build.gradle中加入依赖

dependencies {
    compile("org.springframework.cloud:spring-cloud-starter-netflix-ribbon")
}

 

3、创建启动类

注意启动类上需要加@EnableEurekaClient注解,因为Ribbon默认通过Eureka找服务提供者列表,特殊场景下(比如跨机房),我们也可以把服务提供者IP列表维护在数据库或配置文件里,此时启动类上就不需要加@EnableEurekaClient注解。

第13行通过@LoadBalanced注解使RestTemplate具备负载均衡能力

第12到15行配置了负载均衡的访问策略为随机访问

 1 /**
 2  * @author Leo
 3  */
 4 @SpringBootApplication
 5 @EnableEurekaClient
 6 public class RibbonServerApplication {
 7 
 8     public static void main(String[] args) {
 9         SpringApplication.run(RibbonServerApplication.class, args);
10     }
11 
12     @Bean
13     @LoadBalanced
14     RestTemplate restTemplate() {
15         return new RestTemplate();
16     }
17 
18     @Bean
19     public IRule ribbonRule() {
20         return new RandomRule();
21     }
22 }

 

4、创建测试Controller

 1 @RestController
 2 @RequestMapping("ribbon")
 3 @Slf4j
 4 public class RibbonDemoController {
 5 
 6     @Autowired
 7     RestTemplate restTemplate;
 8 
 9     @Autowired
10     LoadBalancerClient loadBalancerClient;
11 
12     @RequestMapping("service")
13     public String service() {
14         log.info("[ribbon]谁在撩我?");
15 
16         //随机访问策略
17         this.loadBalancerClient.choose("x-demo-service");
18         return restTemplate.getForObject("http://X-DEMO-SERVICE/demo/service", String.class);
19     }
20 }

 

5、bootstrap.yml配置文件

注意第10行配置,这个地方通过配置文件的方式配置了随机访问策略,和之前启动类中的配置只要配置一个即可,都配置也无所谓。

 1 spring:
 2   application:
 3     name: x-demo-service-ribbon
 4 
 5 server:
 6   port: 8091
 7 
 8 spring-demo-service:
 9   ribbon:
10     NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
11 
12 management:
13   endpoints:
14     web:
15       exposure:
16         include: '*'
17   endpoint:
18       health:
19         show-details: ALWAYS

 

6、启动RibbonServerApplication,看到X-DEMO-SERVICE-RIBBON已经注册上来了。

Spring Cloud 之 Ribbon服务消费(五)

 

 

 

7、服务访问测试

浏览器访问http://localhost:8091/ribbon/service,可以看到如下输出,说明通过Ribbon调用服务提供者已经成功了

Spring Cloud 之 Ribbon服务消费(五)

 

 

 

同时观察后台日志输出:

2021-02-23 11:33:50.975 INFO 53920 --- [nio-8091-exec-1] c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client X-DEMO-SERVICE initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=X-DEMO-SERVICE,current list of Servers=[windows10.microdone.cn:8081],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:1; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]

 

8、多实例x-demo-service服务提供者演示

为了更好的验证Ribbon实现了负载均衡,我们对x-demo-service进行一下改造,增加服务端口返回。

 1 @RestController
 2 @RequestMapping("demo")
 3 @Slf4j
 4 public class DemoController {
 5 
 6     @Value("${server.port}")
 7     String port;
 8 
 9     @RequestMapping("service")
10     public String service() {
11         log.info("谁在撩我?");
12         return "x-demo-service hello." + port;
13     }
14 }

 

依次修改启动端口为8081,8082,8083并启动,idea2020.3版本可以通过勾选Allow parallel run选项,实现服务并行启动。

Spring Cloud 之 Ribbon服务消费(五)

 

 

此时观察Eureka注册中心,可以看到3个端口都已经注册成功了

Spring Cloud 之 Ribbon服务消费(五)

 

 

9、Ribbon负载均衡测试

浏览器再次访问:http://localhost:8091/ribbon/service

返回内容

x-demo-service hello.8081

x-demo-service hello.8082

x-demo-service hello.8083

到此Ribbon演示完成,因为我们用的随机访问策略,需要多刷新几次,才能把每一个服务访问到。如果用轮询策略就会依次访问各个服务了。

 

上一篇:ExcelAddIn - VSTO开发的Ribbon插件和用户自定义函数部署问题


下一篇:SpringCloud-Ribbon负载均衡--RestTemplate