负载均衡流程
- order-service发起请求到Ribbon
- 发送请求到RibbonLoadBanlancerClient
- 获取id后,发送给DynamicServerListLoadBalancer
- Ribbon要求eureka-server拉取userservice,返回服务器列表
- Ribbon通过IRule接口进行负载均衡
负载均衡策略
内置负载均衡规则类 |
规则描述 |
RoundRobinRule |
简单轮询 |
AvailabilityFilteringRule |
对以下两种服务器进行忽略:(1)默认情况下3次连接失败,会设置为短路状态,持续30秒。如果再次失败,短路时间几何级增加。(2)并发数过高的服务器。并发数上限,可由客户端设置。 |
WeightedResponseTimeRule |
为每一个服务器赋予一个权重。服务器响应时间越长,权重越小。此规则会按权重值随机选择服务器 |
ZoneAvoidanceRule |
以区域可用的服务器为基础进行服务器选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、机架等。而后再对Zone内多个服务器轮询 |
BestAvailableRule |
忽略短路服务器,选择并发数低的 |
RandomRule |
随机选择 |
RetryRule |
重试机制的选择逻辑 |
通过定义IRule实现可以修改负载均衡规则,有两种方式
- 代码方式:在order-service中定义一个新的IRule(阵对全局)
1 2 3 4
| @Bean public IRule randomRole() { return new RandomRule(); }
|
- 配置文件方式:在配置文件中,添加新的配置(阵对某个微服务)
1 2 3
| userservice: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
|
饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
而饥饿加载则会在项目启动时创建,降低第一次访问耗时,通过配置开启饥饿加载
1 2 3 4
| ribbon: eager-load: enabled: true clients: userservice
|