springcloud-Ribbon

基本用法:
注入一个RestTemplate,并使用@loadBalanced注解标注RestTemplate,从而使RestTemplate具备负载均衡的能力。
当spring容器启动时,使用#loadBalanced注解修饰RestTemplate会被添加拦截器,拦截器中使用了LoadBalancerClient处理请求,从而达到负载均衡的目的。

LoadBalancerClient是springCloud提供的一个非常重要的接口,他继承自ServicelnstanceChoose,该接口实现类是RibbonLoadBalancerClient,他们之间的关系如下:
在这里插入图片描述

public interface LoadBalancerClient extends ServiceInstanceChooser {
     <T> T execute(String serviceId, LoadBalancerRequest<T> request) 
                      throws IOException;
     <T> T execute(String serviceId, ServiceInstance serviceInstance, 
                      LoadBalancerRequest<T> request) throws IOException;
     URI reconstructURI(ServiceInstance instance, URI original);
}

上述源码中,LoadBalancerClient提供的两个execute()方法用于执行请求, reconstructURI()方法用于重构URL。

继续查看LoadBalancerClient继承的ServiceInstanceChooser接口源码,具体如下:

public interface ServiceInstanceChooser {
            ServiceInstance choose(String serviceId);
}

上述源码中,ServiceInstanceChooser接口定义一个choose()方法,该方法用于根据serviceId选择一个服务实例,即通过服务名选择服务实例。

RibbonLoadBalanceClient是LoadBalancerClient的实现类,它用来执行最终的负载均衡请求。其中,RibbonLoadBalanceClient的一个choose()方法用于选择具体的服务实例,其内部是通过getServer()方法交给ILoadBalancer完成的。

ILoadBalancer是一个接口,该接口定义了一系列实现负载均衡的方法。ILoadBalancer接口的实现类结果如下图所示。

在这里插入图片描述

查看BaseLoadBalancer和DynamicServerListLoadBalancer远吗,默认情况下实现了一下配置

1、IClientConfig clientConfig:用于配置负载均衡;
2、IRule rule:用于配置负载均衡策略,默认使用RundRobinRule(轮询)策略;
3、IPing ping:用于检查当前服务是否有响应,从而判断当前服务是否可用,默认实现DummyPing,该实现类的isAlive()方法返回值是true,默认所有服务实例都是可用的;
4、ServerList serverList:用于获取所有Server注册列表信息,通过跟踪源码会发现,ServerList的实现类是DiscoveryEnabledNIWSServerList,该类定义的obtainServersDiscovery()方法是根据eurekaClientProvider.get()方法获取EurekaClient,在根据EurekaClient获取服务注册列表信息。EurekaClient的实现类是DiscoveryClient,DiscoverClient具有服务注册、获取服务注册列表等功能;
5、ServerListFilter filter:定义了根据配置过滤或者动态获取符合条件的服务列表,默认实现类是ZonePreferenceServerlistFilter,该车辆能哥优先过滤出请求调用放处于同区域的服务实例。

综上所述,使用RibbonLoadBalancerClient实现负载均衡策略时,会从EurekaClient获取服务列表信息,然后根据IPing判断服务是否可用。如果可用,则会根据IRule选择负载均衡策略,否则会重新获取服务清单。

了解LoadBalancerClient负载均衡功能后,那么RestTemplate添加LoadBalanced注册后,为什么会被拦截呢?这是因为LoadBalancerAutoConfiguration类维护了一个被@LoadBalanced修饰的RestTemplate列表,在初始化过程中,通过调用customizer.customize(restTemplate)方法为RestTemplate添加了LoadBalancerInterceptor拦截器,该拦截器中的方法将远程服务调用的方法交给了LoadBalancerClient去处理,从而达到负载均衡的目的。

Ribbon负载均衡的几种机制:

1.轮询机制:RoundRobinRule
简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则
2.随机机制:RandomRule
随机选择一个可用的服务器
3.根据响应时间分配权重:WeightedResponseTimeRule
为每一个服务器赋予一个权重值,服务器响应时间越长,这个服务器的权重就越小,这个规则会随机选择服务器,这个权重值会影响服务器的选择,权重值越大,选择的可能性越高
4.根据服务是否短路或者服务处于高并发来分配权重: AvailabilityFilteringRule
对以下两种服务器进行忽略:
(1):在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为短路状态,短路状态持续30秒,如果再次连接失败,短路的持续时间会集合级的增加,可以通过修改配置loadbalancer..connectionFailureCountThreshold来修改连接失败多少次被设置为短路状态,默认3次
(2):并发数过高的服务器。如果一个服务器的并发连接数过高,配置了 AvailabilityFilteringRule规则的客户端也会将其忽略,并发连接数的上线可以由客户端的..ActiveConnectionsLimit属性进行配置;
5.使用Zone对服务器进行分类:ZoneAvoidanceRule
以区域可用的服务器为基础进行服务器的选择,使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。
6.忽略短路,选择低并发:BestAvailableRule
忽略哪些短路的服务器,并选择并发数较低的服务器
7.重试机制的选择逻辑:Retry
重试机制选择

对比dubbo的负载均衡:

Dubbo内置了4种负载均衡策略:
RandomLoadBalance:随机负载均衡。随机的选择一个。是Dubbo的默认负载均衡策略。
RoundRobinLoadBalance:轮询负载均衡。轮询选择一个。
LeastActiveLoadBalance:最少活跃调用数,相同活跃数的随机。活跃数指调用前后计数差。使慢的 Provider 收到更少请求,因为越慢的 Provider 的调用前后计数差会越大。
ConsistentHashLoadBalance:一致性哈希负载均衡。相同参数的请求总是落在同一台机器上。

使用:
1.启动多个服务提供者
2.修改RestTemplate实例,添加负载均衡注解:@LoadBalanced

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumberApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumberApplication.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

3.修改ConsumerController:
不再手动获取IP端口,而是直接通过服务名称调用:
修改负载均衡规则:

user-service:
	ribbon:
		NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值