spring cloud ribbon基本原理

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 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 list = new ArrayList(restTemplate.getInterceptors());
                    list.add(loadBalancerInterceptor);
                    restTemplate.setInterceptors(list);
                }
            };
        }

你可能感兴趣的:(spring cloud ribbon基本原理)