spring cloud 负载均衡
Ⅰ、负载均衡之Ribbon
1、Ribbon入门
-
Ribbon 是进程内的本地负载均衡,在调用微服务的时候,会在注册中心上获取注册信息服务列表缓存至本地jvm,从而在本地实现RPC远程服务调用技术。主要实现是负载均衡+RestTemplate服务调用
-
客户端负载均衡的组件,可以和其他客户端结合使用
例如:Eureka+Ribbon
-
Ribbon 负载原理(负载策略:轮询、随机和响应时间加权)
- 第一步选择EurekaServer,优先选择在同一区域负载较少的server
- 第二部根据用户指定的策略,从server列表中获取一个地址
-
Eureka client中集成了Ribbon 或者自己引入pom
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
-
Ribbon重要组件IRule(七种负载策略)
- 新建Ribbon的IRuleConfig(在启动类@ComponentScan扫描不到的地方,新建包目录创建新的策略规则,默认是轮询)
- MyRule重新定义策略
/** * Ribbon 策略 * * RandomRule随机策略 * RoundRobinRule轮询策略 * RetryRule重试策略 * BestAvailableRule最低并发策略 * AvailabilityFilteringRule可用过滤策略 * ResponseTimeWeightedRule响应时间加权重策略 * ZoneAvoidanceRule区域权重策略 * */ @Configuration public class MyIRule { @Bean public IRule myRule(){ IRule iRule ;//选择一种 iRule = new RandomRule(); iRule = new RoundRobinRule(); iRule = new RetryRule(); iRule = new BestAvailableRule(); iRule = new AvailabilityFilteringRule(); iRule = new ResponseTimeWeightedRule(); iRule = new ZoneAvoidanceRule(); return iRule ; } }
- 主启动类增加
@SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient @RibbonClient(name = "EUREKA-CLIENT-PROVIDER",configuration = MyIRule.class) public class EurekaorderApplication { public static void main(String[] args) { SpringApplication.run(EurekaorderApplication.class, args); } }
策略类 | 描述 |
---|---|
RandomRule随机策略 | 随机选择server |
RoundRobinRule轮询策略 | 按照顺序选择server(ribbon默认策略) |
RetryRule重试策略 | 在一个配置时间段内,当选择server不成功,则一直尝试选择一个可用的server |
BestAvailableRule最低并发策略 | 逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server |
AvailabilityFilteringRule可用过滤策略 | 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值) |
ResponseTimeWeightedRule响应时间加权重策略 | 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间 |
ZoneAvoidanceRule区域权重策略 | 综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server |
2、Ribbon解析
- 负载均衡算法轮询:N(次)%M(台)=I -> rest接口第几次请求数%服务器总数量=实际服务器位置下标
- 可自己重写算法