Spring Cloud Ribbon与Feign

1、Ribbon基本概念及使用

1)Ribbon是一个实现了客户端负载均衡的组件,Netflix开源的,其主要功能是提供客户端侧负载均衡

2)Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等配置。简单来说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中列出负载均衡后面所有的机器,Ribbon会自动的帮助你基于某种规则(轮询,随机等)去连接这些机器,我们也可以使用自定义Ribbon实现自己的负载均衡算法

服务端负载均衡:

客户端负载均衡:

2、自定义Ribbon实现自己的负载均衡策略

1)spring cloud官方文档中是这样说的,如果要自定义Ribbon配置, 则需要把这个配置类放在@SpringBootApplication扫不到的包中(@ComponentScan),因为如果可以扫到自定义的Ribbon配置类的话,那么会对所有的Riboon都生效

配置步骤

独立新建包,并创建ribbon配置类,例如:com.tuling.cloud.config. RibbonConfiguration

创建一个空类ProviderUserConfiguration配置服务的ribbon负载均衡策略

 

在订单微服务application.yml中增加配置

Ribbon配置的优先级:属性配置 > JAVA配置>Netflix Ribbon默认配置

3、Ribbon独立使用的高级特性

内置策略

规则描述

实现说明

RoundRobinRule

简单轮询服务列表来选择服务器。

轮询index,选择index对应位置的server

AvailabilityFilteringRule

对以下两种服务器进行忽略:

1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为短路状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。

注意:可以通过修改配置loadbalancer.<clientName>.connectionFailureCountThreshold来修改连接失败多少次之后被设置为短路状态。默认是3次。

2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上线,可以由客户端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit属性进行配置。

使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态

WeightedResponseTimeRule

为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。

一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weightWeight的计算也比较简单responsetime 减去每个server自己平均的responsetimeserver的权重。当刚开始运行,没有形成status时,使用roubine策略选择server

ZoneAvoidanceRule

以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。

使用ZoneAvoidancePredicateAvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server

BestAvailableRule

忽略哪些短路的服务器,并选择并发数较低的服务器。

逐个考察Server,如果Servertripped了,则忽略,在选择其中ActiveRequestsCount最小的server

RandomRule

随机选择一个可用的服务器。

index上随机,选择index对应位置的server

RetryRule

重试机制的选择逻辑

在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server

4、Fegin介绍及基本使用

Feign是一个声明式的http客户端,使用Feign可以实现声明式REST调用。spring cloudFeign整合了Eureka,Ribbon,以提供服务发现及负载均衡等能力,同时整合了SpringMVC注解

Feign默认使用SpringMVC注解提供契约来进行REST访问,例如@RequestMapping,@PathVariable

在之前的订单微服务中,调用用户微服务,我们使用的是RestTemplate.getForObject(),  URL是我们自己拼接的字符串。如果参数较多的情况下,这种URL拼接参数的方式很低效,很不方便的。而Feign就解决了这些问题

5、Feign继承

1)Feign支持继承,使用继承可以将一些公共操作分组到一些父接口中,从而简化Feign的开发

2)抽取用户服务<05-ms-provider-user>的公共接口到新的项目中<05-ms-provider-user-api>,增加父接口UserService

3)在用户服务服务<05-ms-provider-user>和订单服务<05-ms-consumer-order-feign>里加入新项目的依赖

4)在订单服务里增加接口UserService的子接口RefactorUserService,并在子接口上加注解@FeignClient

 

6、Ribbon源码解析

LoadBalancerClient

DynamicServerListLoadBalance

RestTemplate是如何和Ribbon结合的

综上所述,Ribbon的负载均衡,主要通过LoadBalancerClient来实现的,而LoadBalancerClient具体交给了ILoadBalancer来处理,ILoadBalancer通过配置IRule、IPing等信息,并向EurekaClient获取注册列表的信息,并默认10秒一次向EurekaClient发送“ping”,进而检查是否更新服务列表,最后,得到注册列表后,ILoadBalancer根据IRule的策略进行负载均衡。而RestTemplate 被@LoadBalance注解后,能实现负载均衡,主要是维护了一个被@LoadBalance注解的RestTemplate列表,并给列表中的RestTemplate添加拦截器,进而交给负载均衡器去处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值