前言
前面完成了商品和用户微服务的注册发现,是基于点对点的微服务之间的调用,那么在实际场景中微服务都是集群部署的,调用关系如下图所示:
看到这里大家会想到不就是负载均衡嘛!项目中经常用Nginx来解决图中的服务集群问题,那如果有1000+甚至10000+的服务呢?每增加一个服务要去Nginx里面配置一下,然后重启?额......想想都头皮发麻!并且Nginx的负载均衡模式和本文将要讲的是有区别的。
那么本章将会用到Ribbon组件来解决上述问题。
Ribbon简介及使用场景
Ribbon通俗来讲就是一个负载均衡器,用来控制HTTP和TCP客户端行为,Ribbon从配置服务提供者列表库(例如:Eureka、Zookeeper)去获取服务配置信息,基于负载均衡算法计算出要请求的目标服务地址。
在Spring Cloud中Ribbon通常配合Eureka使用,Ribbon可以自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,选择其中一个服务提供者实例。下图展示了Ribbon与Eureka配合使用时的大致架构。
Spring Cloud集成Ribbon
第一步:复制商品和用户微服务项目
复制项目microservice-consumer-goods,将pom.xml文件中ArtifactId内容修改为 microservice-consumer-goods-ribbon 。如下图所示:
复制商品微服务
复制项目microservice-provider-user,将pom.xml文件中ArtifactId 内容修改为microservice-provider-user-ribbon。如下图所示:
备注:记得修改端口,不然启动会出现端口冲突问题。
第二步:添加Ribbon依赖
由于 spring-cloud-starter-netflix-eureka-client 已经包含 spring-cloud-starter-netfilx-ribbon ,这一步可以省略。
第三步:在RestTemplate上增加@LoadBalanced注解支持
MicroserviceConsumerGoodsRibbonApplication.java
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
};
对的,你没看错,到这里就结束了!只需要添加LoadBalanced注解就可以让RestTemplate整合Ribbon。
第四步:修改调用用户微服务
GoodsController.java
@GetMapping("/goods/{id}")
public User findById(@PathVariable Long id){
return this.restTemplate.getForObject("http://microservice-provider-user/simple/"+id,User.class);
}
前面我们在调用用户微服务的时候采用的是IP+端口+目标服务端点的方式,这里将请求目标改为http://{目标服务名称}/{目标服务端点} 的形式。这样的话Ribbon会自动在实际调用时,将目标服务名替换为该服务的IP和端口。
第五步:启动测试
启动microservice-discovery-eureka
启动microservice-provider-user
启动microservice-provider-user-ribbon
启动microservice-consumer-goods-ribbon
微服务注册情况
如上图所示,2个用户微服务和1个商品微服务都注册到了Eureka Server,由于2个用户微服务的名称都是microservice-provider-user那么会自动识别为同一个集群服务,也就是上面商品微服务调用用户微服务的目标服务名称。
访问http://127.0.0.1:8091/goods/2
10次,会发现两个用户微服务示例都会打印日志并且是每个被请求5次。
配套代码
主代码库:https://github.com/yundianzixun/spring-cloud-study