Ribbon是Netflix公司提供的开源组件,为客户端提供LoadBalance(负载均衡)的能力,与注册中心配合使用。
原理图
策略
策略 | 名称 | 说明 |
---|---|---|
RoundRobinRule(默认) | 轮询 | 轮询选择, 轮询index,选择index对应位置的Server |
RandomRule | 随机 | 随机选择一个Server |
RetryRule | 轮询重试 | 对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server。 |
BestAvailableRule | 最优可用 | 选择一个最小的并发请求的Server,逐个考察Server,如果Server被tripped了,则跳过 |
AvailabilityFilteringRule | 可用性过滤规则 | 过滤掉那些一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个Server的运行状态 |
ZoneAvoidanceRule | 区域内可用性能最优 | 复合判断Server所在区域的性能和Server的可用性选择Server |
ResponseTimeWeightedRule | 响应速度决定权重 | 作用同WeightedResponseTimeRule,二者作用是一样的,ResponseTimeWeightedRule后来改名为WeightedResponseTimeRule |
WeightedResponseTimeRule | 响应速度决定权重 | 根据响应时间分配一个weight(权重),响应时间越长,weight越小,被选中的可能性越低 |
在代码中使用
spring cloud默认集成Ribbon,使用只许加 在RestTemplate 示例方法上加@LoadBalanced注解。
package demo.newsweb.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private RestTemplate restTemplate;
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@GetMapping("/login")
public String login(String user, String pwd) {
return restTemplate.getForObject("http://user-server/user/login?user=" + user + "&pwd=" + pwd, String.class);
}
}
修改策略
# 修改Ribbon策略为随机,user-server为调用服务名
user-server.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule