我们在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已经注册上来了。
7、服务访问测试
浏览器访问http://localhost:8091/ribbon/service,可以看到如下输出,说明通过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选项,实现服务并行启动。
此时观察Eureka注册中心,可以看到3个端口都已经注册成功了
9、Ribbon负载均衡测试
浏览器再次访问:http://localhost:8091/ribbon/service
返回内容
x-demo-service hello.8081
x-demo-service hello.8082
x-demo-service hello.8083
到此Ribbon演示完成,因为我们用的随机访问策略,需要多刷新几次,才能把每一个服务访问到。如果用轮询策略就会依次访问各个服务了。