四、SpringCloud之Ribbon负载均衡
Ribbon是一个客户端的负载均衡(Load Balance)工具,可以很好的控制HTTP和TCP的一些行为,通过基于多种负载均衡算法达到系统的高可用(HA)
官方资料:
https://github.com/Netflix/ribbon
https://github.com/Netflix/ribbon/wiki/Getting-Started
以下内容是基于上一节的工程,使用Ribbon+RestTemplate 实现服务间通讯。
源码下载:https://github.com/hnyydp/microservice
1、在
microservice-dept-consumer-80服务消费者中pom.xml增加Ribbon依赖
<!-- Eureka client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!-- ribbon --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <!-- springcloud config --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
2、配置对应的application.yml配置
server: context-path: / port: 80 eureka: client: register-with-eureka: false #false表示不向注册中心注册自己,因为本身应用就是注册中心 service-url: #集群配置 defaultZone: http://eureka-server-5001.com:5001/eureka/, http://eureka-server-5002.com:5002/eureka/,http://eureka-server-5003.com:5003/eureka/
3、使用
@LoadBalanced开启客户端负载均衡
@Configuration public class RestTemplateConfig { /** * 调用restful服务模版,客户端模版工具 * @return */ @LoadBalanced //开始客户端负载均衡 @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
4、修改controller类
DeptConsumerControllerURL对应的主机名为微服务实例名,Euraka整合Ribbon配置OK后就可以使用服务实例名访问,不需要提供IP和端口
@RequestMapping("/consumer") @RestController public class DeptConsumerController { // private final static String URL_PREFIX = "http://localhost:8001"; //Euraka整合Ribbon配置OK后就可以使用服务实例名访问,不需要提供IP和端口 private final static String URL_PREFIX = "http://MICROSERVICE-DEPT";
5、负载均衡配置
为了模拟多个服务实例,复制3个服务提供者
microservice-dept-provider-8001,
microservice-dept-provider-8002,
microservice-dept-provider-8003
修改端口分别为8001,8002,8003
在controller中增加port输出,用于辨别负载均衡是否生效。
@Value("${server.port}") private Integer port; @GetMapping("/depts") public List<Dept> depts() { //添加端口信息 List<Dept> list = deptService.selectList(); return list.stream().map(dept->{ dept.setPort(port); return dept; }).collect(Collectors.toList()); }
6、分别启动Eureka sever、服务提供者
会在Eureka注册中心中分别注册8001,8002,8003,3个服务实例
启动80端口消费应用microservice-dept-consumer-80
由于restTemplate 启用了ribbon 负载均衡,而Ribbon默认使用轮询算法,因此会轮流调用8001、8002、8003服务
7、自定义Ribbon的负载均衡策略
Ribbon提供了很多负载均衡策略的实现用于获取服务,默认使用轮询的策略,我们可以通过修改配置指定使用哪个策略,也可以自定义我们自己的策略。
在
RestTemplateConfig.java配置类中增加我们需要的指定的负载均衡策略
/** * 修改我们需要的负载均衡策略 * @return */ @Bean public IRule myRule(){ return new RandomRule(); //修改默认的算法为随机算法 }
只针对某个服务实例客制化指定Ribbo负载均衡策略
参考文档:http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-ribbon
使用
@RibbonClient注解应用到主启动类上,指定对应的配置类。
自定义的配置类不能在
@ComponentScan的扫描范围内,否则 会别所有的ribbon客户端共享,就达不到客制化目地。
(1)在主启动类外的包org.pu.rule下创建我们自己指定策略的配置类
MyRuleConfig.java。
@Configuration public class MyRuleConfig { /** * 修改我们需要的负载均衡策略 * @return */ @Bean public IRule myRule(){ return new RandomRule(); //修改默认的算法为随机算法 } }
(2)在主启动类
DeptConsumerApplication.java上增加
@RibbonClient注解
//启动该微服务的时候会加载客制化策略的配置类,使其生效 @RibbonClient(name="MICROSERVICE-DEPT",configuration=MyRuleConfig.class) @SpringBootApplication public class DeptConsumerApplication { public static void main(String[] args) { SpringApplication.run(DeptConsumerApplication.class, args); } }
自定义负载均衡策略:
可以模仿下面随机策略(
RandomRule.java)来实现我们自己的策略:
//随机算法 @SuppressWarnings({"RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"}) public Server choose(ILoadBalancer lb, Object key) { if (lb == null) { return null; } Server server = null; while (server == null) { if (Thread.interrupted()) { return null; } List upList = lb.getReachableServers(); //获取在线的服务 List allList = lb.getAllServers(); //获取所有的服务 int serverCount = allList.size(); if (serverCount == 0) { return null; } int index = this.rand.nextInt(serverCount); //随机获取 server = (Server) upList.get(index); if (server == null) { Thread.yield(); } if (server.isAlive()) { return server; } server = null; Thread.yield(); } return server; }阅读更多
- SpringCloud | Feign如何整合Ribbon进行负载均衡的?
- Spring Cloud 客户端负载均衡之Ribbon(三)
- Spring Cloud Ribbon实现客户端负载均衡的方法
- SpringCloud客户端负载均衡Ribbon
- 客户端实现负载均衡:springCloud Ribbon的使用
- 负载均衡之Spring Cloud Ribbon
- Spring Cloud微服务开发笔记5——Ribbon负载均衡策略规则定制
- springcloud ribbon搭建服务负载均衡
- springcloud ribbon实现负载均衡的时候,提示Request URI does not contain a valid hostname: http://PRODUCT_SERVICE/
- Spring Cloud 入门教程(五): Ribbon实现客户端的负载均衡
- 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍
- spring cloud 之 客户端负载均衡Ribbon深入理解
- 详解spring cloud中使用Ribbon实现客户端的软负载均衡
- Spring Cloud Ribbon实现客户端负载均衡的示例
- Spring Cloud+Eureka+Ribbon实现客户端负载均衡
- 【SpringCloud】Netflix源码解析之Ribbon:负载均衡策略的定义和实现
- spring cloud中Ribbon自定义负载均衡策略
- 客户端负载均衡 Spring Cloud Ribbon
- Spring Boot + Spring Cloud 构建微服务系统(二):服务消费和负载(Ribbon)
- 五、SpringCloud之Feign负载均衡