Spring Cloud(Greenwich版)-05-Spring Cloud集成Ribbon(客

图片

前言

前面完成了商品和用户微服务的注册发现,是基于点对点的微服务之间的调用,那么在实际场景中微服务都是集群部署的,调用关系如下图所示:


图片


看到这里大家会想到不就是负载均衡嘛!项目中经常用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


猜你喜欢

转载自blog.51cto.com/15127576/2667934