Ribbon
负载均衡原理
- order-service 发起 user-service 请求,被ribbon进行拦截;
- ribbon会向注册中心拉取user-service 相对应的服务;
- 注册中心返回user-service服务列表;
- 由ribbon的负载均衡机制去选择一个服务进行访问;默认采用的是轮训的机制。
负载均衡流程
请求示例
配置
@Configuration
public class RestTemplateConfiguration {
/**
* 添加LoadBalanced,使RestTemplate以负载均衡的方式调用服务
* @return
*/
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
接口调用
@RequestMapping("consumer")
@RestController
public class ConsumerController {
/**
* spring提供的一个用于访问rest接口的模板对象
* 提供了多重便捷访问远程HTTP服务的方法,简单的RestFul 服务模板
*/
@Resource
private RestTemplate restTemplate;
/**
* 服务地址
*/
private static final String REST_FIX_URL_PREFIX = "http://XY-PROVIDER";
@GetMapping("/getProvider")
public String getConsumerByIp() {
String res = restTemplate.getForObject(REST_FIX_URL_PREFIX + "/helloProvider", String.class);
return res;
}
}
Debug 效果如下所示
暂时先保留
负载均衡策略
内置负载均衡类 | 说明 |
---|---|
RoundRobinRule | 简单的轮训服务列表来选择服务器。Ribbon的默认规则 |
AvailabilityFilteringRule | 对以下两种服务器进行忽略: (1)在默认的情况下:这台服务器如果3次连接失败,这台服务器就会被设置“短路”状态。短路状态将持续30S,如果在此连接失败,短路的持续时间就会几何级增加 (2)并发数较高的服务器。如果一个服务器的并发连接数过高,配置了此规则的而客户端也会将忽略,可以有客户端的ActiveConnectionsLimit属性进行配置 |
WeightedResponseTimeRule | 为每一个服务器赋予一个权重。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择 |
ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架。而在对Zone内的多个服务器进行轮询 |
BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器 |
RandomRule | 随机选择一个可用的服务器 |
RetryRule | 重试机制的选择逻辑 |
负载均衡策略配置
负载均衡策略配置的方式有两种:
代码方式、配置文件方式
代码方式
配置灵活,修改时需要重新打包发布,针对全局配置。
指定为随机策略
@Bean
public IRule randomRule(){
return new RandomRule();
}
配置文件方式
直观、方便、无需重新打包,但无法做全局配置
# 指定某个服务
xy-provider:
ribbon:
# 指定负载均衡规则
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
饥饿加载
配置方式
ribbon:
eager-load:
# 开启饥饿加载
enabled: true
# 指定饥饿加载的服务器列表名称
clients:
- xy-provider
开启前
第一次访问时耗时会比较长,因为会去注册中心拉取注册列表缓存到本地。
之后的访问耗时都会很短,因为少了一步操作。
浏览器请求耗时
控制台
- 从注册中心拉取所有的实例(服务)
- 然后拉取我们需要的服务,由负载均衡去选择访问节点。
开启后
控制台
开启饥饿加载后,重新启动,我们会发现项目一启动,就去加载服务列表。
浏览器
跟没开启之前,耗时会相差很多。