Ribbon 是 Netflix 发布的负载均衡器,它有助于控制 HTTP 和 TCP 的客户端行为。Ribbon 基于某种负载均衡算法,自动地帮助服务消费者去请求
前言
本文中涉及到的 Spring Cloud 内容,可以查看我的相关博客
使用的 Ribbon 版本为 2.0.0.M
- 服务端指 Eureka Server 所在微服务,客户端指提供数据的微服务,消费端指获取数据的微服务
1、Eureka 消费端整合 Ribbon
引入 Ribbon 依赖
compile('org.springframework.cloud:spring-cloud-starter-ribbon')
只需为 RestTemplate 添加 @LoadBalanced 注解,就可为 RestTemplate 整合 Ribbon,使其具备负载均衡的能力
@Bean
@LoadBalanced
public RestTemplate restTemplate(){return new RestTemplate();
}
Controller 修改如下:
private static final Logger LOGGER= LoggerFactory.getLogger(BaseController.class);@Autowired
private RestTemplate restTemplate;@Autowired
private LoadBalancerClient loadBalancerClient;@GetMapping("/user/{id}")
public User findById(@PathVariable Long id){return this.restTemplate.getForObject("http://service_provider/"+id,User.class);
}@GetMapping("/log-instance")
public void logUserInstance(){ServiceInstance serviceInstance=this.loadBalancerClient.choose("service_provider");LOGGER.info("{}:{}:{}",serviceInstance.getServiceId(),serviceInstance.getHost(),serviceInstance.getPort());
}
代码中的 service_provider 是微服务的虚拟主机名。logUserInstance 方法中可以使用 LoadBalancerClient 的 API 更加直观的获取当前选择的用户微服务节点。
启动服务端,然后启动2个或更多客户端(即微服务,注意端口号要不同,本实验用到端口8000、8001),最后启动本消费端(端口号8010)
多次访问http://localhost:8010/user/1,页面显示信息同时,两个微服务都会打印日志
多次访问http://localhost:8010/user-instance
通过消费端控制台的打印信息,可以看到请求会均匀的分布到两个微服务上。说明已经实现了负载均衡。
2、自定义 Ribbon 配置
使用 Java 代码
创建 Ribbon 配置类如下:
//不能在主应用程序上下文的 @ComponentScan中
@Configuration
public class RibbonConfiguration{
@Beanpublic IRule ribbonRule(){//负载规则改为随机return new RandomRule();}
}
创建空类(没有内容):
@Configuration
@RibbonClient(name = "service_provider",configuration = RibbonConfiguration.class)
public class Empty {
}
使用属性配置
在项目的 application.yml 中添加以下内容可以实现相同的功能
service-provider:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
3、脱离 Eureka 使用 Ribbon
前文的演示中,是将 Eureka 和 Ribbon 配合使用。其实 Ribbon 也支持脱离 Eureka 使用,以适应不具备 Eureka 使用条件,甚至根本不是 Spring Boot 开发的微服务
此时我们去掉 Eureka 的依赖
// compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
去掉启动类 Eureka 注解
// @EnableEurekaClient
application.yml 修改如下:
service-provider:ribbon:listOfServers: localhost:8000,localhost:8001
没有 Eureka ,就没有了服务发现组件,所以上面我们使用 listOfServers 属性设置了客户端(微服务)的地址列表。启动服务可以发现 Ribbon 正常运行
后记
引用的内容源自《Spring Cloud与Docker微服务架构实战》周立/著