- 前言
- 一、Ribbon是什么?
- 二、使用Ribbon实现负载均衡
- 1.启动两个user-service实例
- 2、开启负载均衡
- 3、更换负载均衡策略
前言
在实际环境中,我们往往会开启很多个user-service的集群。此时我们获取的服务列表中就会有多个,到底该访
问哪一个呢?一般这种情况下我们就需要编写负载均衡算法,在多个实例列表中进行选择,不过Eureka中已经帮我们集成了负载均衡组件:Ribbon
一、Ribbon是什么?
Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为,为Rib。bon配置服务提供者地址列表后,Ribbon就可以基于负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多的负载均衡算法,例如轮询、随机等
二、使用Ribbon实现负载均衡 1.启动两个user-service实例一个端口号为9091,另一个端口号为9092
在user-service的配置文件:
server:
port: ${port:9091} #如果port没有值,就默认为9091
因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖。直接修改代码:
在RestTemplate的配置方法上添加 @LoadBalanced 注解
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
String url = "http://user-service/user/" + id;
return restTemplate.getForObject(url, User.class);
}
为什么只输入了service名称就可以访问了呢?而不需要获取ip和端口。
显然是有组件根据service名称,获取到了服务实例的ip和端口。因为 发送请求使用的是RestTemplate,spring使LoadBalancerInterceptor拦截器 ,这个类会在对RestTemplate的请求进行拦截,然后Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。
默认是轮询策略。SpringBoot也帮我们提供了修改负载均衡规则的配置入口:
user-service:
ribbon:
NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule
格式是: {服务名称}.ribbon.NFLoadBalancerRuleClassName ,值就是IRule的实现类。



