netfilx的负载均衡组件
负载策略
策略类 | 命名 | 描述 |
---|---|---|
RandomRule | 随机策略 | 随机选择server |
RoundRobinRule | 轮询策略 | 按顺序循环选择server |
RetryRule | 重试策略 | 在一个配置时间段内当选择server不成功,则一直尝试选择一个可用的server |
BestAvailableRule | 最低并发策略 | 逐个考察server,如果server断路器打开,则忽略,再选择其中并发连接最低的server |
AvukabukutyFilteringRule | 可用过滤策略 | 过滤掉一直连接失败冰杯标记为circuit tripped的servier,过滤掉哪些高并发连接的server(active connections超过配置发的阈值) |
ResponeseTimewightedRule | 响应时间加权策略 | 根据server的响应时间分配权重。响应时间越长,权重越低,被选择到的概率就越低;响应时间越短,权重越高,被选择到的概率就越高。这个策略很贴切 |
ZoneAvoidanceRule | 区域权重策略 | 综合判断server所在区域的性能和server的可用性轮询选择server,提出不可用server。 |
Ribbon的饥饿加载
ribbon负载聚恒不是在启动的时候加载上下文,而是在实际请求的时候采取创建
可以通过制定具体客户端名称来开启饥饿加载
ribbon:
eager-loan:
enabled:true
clients: xxxa,xxxb,xxxc
扩展点
IloadBanlancer,IRule,IPing,ServerList,ServerListFilter,注册中心
都可自定义
基本实现原理:
通过LoadBalancerAutoConfiguration进行配置。
LoadBalancerInterceptor来拦截http请求,将请求绑定Ribbon的负载均衡生命周期。继承spring中的ClientHttpRequestInterceptor,来实现请求拦截.
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
URI originalUri = request.getURI();
String serviceName = originalUri.getHost();
Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
return (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));
}
public RestTemplateCustomizer restTemplateCustomizer(final LoadBalancerInterceptor loadBalancerInterceptor) {
return new RestTemplateCustomizer() {
public void customize(RestTemplate restTemplate) {
List<ClientHttpRequestInterceptor> list = new ArrayList(restTemplate.getInterceptors());
list.add(loadBalancerInterceptor);
restTemplate.setInterceptors(list);
}
};
}
RestTemplateCustomizer:为每个RestTtemplate绑定LoadBalancerInterceptor拦截
public RestTemplateCustomizer restTemplateCustomizer(final LoadBalancerInterceptor loadBalancerInterceptor) {
return new RestTemplateCustomizer() {
public void customize(RestTemplate restTemplate) {
List<ClientHttpRequestInterceptor> list = new ArrayList(restTemplate.getInterceptors());
list.add(loadBalancerInterceptor);
restTemplate.setInterceptors(list);
}
};
}