前言
- spring cloud的ribbon是一种实现客户端负载均衡策略的组件。工作原理是从eureka注册中心获取服务集群列表,再按照一定的策略来选取调用哪一个服务。这就是客户端发现模式。
引入依赖
maven项目引入下面依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
如果是在eureka下使用,则不需要引入上面的依赖,因为spring-cloud-starter-eureka中会自动引入ribbon的依赖:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lnHHJzt1-1571018837467)(media/1569377843079.png)]
使用
使用注解形式
在主启动类中添加@RibbonClient(name = "xxx", configuration = xxx.class)
注解,name是微服务名称,configuration配置使用的策略类。
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "MICROSERVICECLOUD-DEPT",configuration = MySelfRule.class)
public class DeptConsumerApp {
public static void main(String[] args) {
SpringApplication.run(DeptConsumerApp.class, args);
}
}
还需要在restTemplate的配置上添加@LoadBalanced
注解。
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
注意:
如果这个客户端只访问一个服务集群,configuration中指定的策略配置类可以放在@ComponentScan
扫描下的包中,不会出什么问题。
但是如果这个客户端访问不止一个服务,那么configuration中指定的策略配置类就一定不能放在@ComponentScan
扫描下的包中。因为如果放在@ComponentScan
扫描下的包中,spring扫描后会将该策略设置为所有的负载均衡策略而不是单单只对name中指定微服务的负载均衡策略。
针对这种情况,可以在@ComponentScan
注解中添加过滤,也可以直接将configuration中指定的策略配置类放在扫描范围之外。
配置多个
使用@RibbonClients(value = {@RibbonClient(),@RibbonClient(),...})
@RibbonClients(value = {
@RibbonClient(name = "A",configuration = A.class),
@RibbonClient(name = "B",configuration = B.class)
})
使用配置文件的形式
在yml文件中进行配置
# 微服务名.ribbon.NFLoadBalancerRuleClassName:负载均衡策略
microservice-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule