SpringCloud实战之路 | 应用篇(二)负载均衡Ribbon
文章内容输出来源:拉勾教育Java高薪训练营;
负载均衡
负载均衡一般分为服务端负载均衡与客户端负载均衡
- 服务端负载均衡: 比如nginx,F5等,请求到达服务器后由这些负载均衡器根据一定的算法将请求路由到目标服务器处理
- 客户端负载均衡: 比如Ribbon服务消费者会有一个服务器地址列表,调用方在请求前通过负载均衡算法选择一个服务器访问,负载均衡算法实在请求客户端进行
Ribbon是Netflix发布的负载均衡器,Eureka一般配合Ribbon进行使用,Ribbon利用Eureka中读取到的服务信息,在调用服务器提供者提供的服务时,会根据一定算法进行负载。
Ribbon应用
Ribbon无需引用额外jar,因为在服务消费者中已经引入过eureka-client,他其中包含了Ribbon相关的jar包
代码中使用只需要在RestTemplate加上对应注解即可
@Bean
// Ribbon负载均衡
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
通过返回端口号来观察负载均衡情况
@RestController
@RequestMapping("/test")
public class TestController {
//获取服务实例端口
@Value("${server.port}")
private Integer port;
//通过返回端口号来观察负载均衡情况
@GetMapping("getPort")
public Integer getPort(){
return port;
}
}
测试类
@Test
public void testRibbon(){
Integer forObject = restTemplate.getForObject("http://cloud-service-user/test/getport",Integer.class);
System.out.println(forObject);
}
Ribbon负载均衡策略
Ribbon内置多种负载均衡策略,内部负载均衡策略顶级接口为 com.netflix.loadbalancer.IRule
Ribbon的默认负载均衡策略是ZoneAvoidanceRule(区域权衡策略),而不是轮询策略。
负载均衡策略 | 描述 |
---|---|
RoundRobinRULE(轮询策略) | 默认超过10次获取到的server都不可用,会返回一个空的server |
RandomRule(随机策略) | 如果随机到的server为null或者不可用的话,会while不停循环选取 |
RetryRule(重试策略) | 一定时限内循环重试。默认继承RoundRobinRule也支持自定义注入,RetryRule会在每次选取之后,对选举的server进行判断,是否为null,是否为alive,并在500ms内会不停的选取判断,而RoundRobinRule失效的策略是超过10次,RandomRule是没有失效时间的概念,只要serverList没都挂 |
BestAvailableRule(最小连接数策略) | 遍历severList,选取可用的且连接数最小的一个server。该算法里面有一个LoadBalancerStats的成员变量,会存储所有server的运行状情况和连接数。如果选取到的server为null,那么会调用RoundRobinRule重新选取 |
AvailabilityFilteringRule(可用过滤策略) | 扩展了轮询策略,会先通过默认的轮询策略选取一个server,再去判断该server是否超时可用,当前连接数是否超限,都成功再返回 |
ZoneAvoidanceRule(区域权衡策略策略/默认测试) | 扩展了轮询策略,继承了两个过滤器:ZoneAvoidancePredicate和AvailabilityPredicate,除了过滤器超时和链接数过多的server,还会过滤掉不符合要求的zone区域里面的所有节点,AWS-ZONE在一个区域/机房内的服务实例中轮询 |
修改配置负载均衡策略
#针对的被调⽤⽅微服务名称,不加就是全局⽣效
cloud-service-user:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载策略调整
Ribbon工作原理
当我们访问http://cloud-service-user/test/getport
的时候ribbon会根据服务名获取到该服务的实例列表,然后按照负载均衡策略从实例列表中获取一个实例Server,最终完成请求访问