介绍

画了一个示意图,整体表达一下 Feign 和 Ribbon 在微服务调用中的关系和角色。
在这里插入图片描述

  • Ribbon 是一个客户端负载均衡器,它可以在客户端配置 ribbonServerList(服务端列表)或者直接从注册中心获取服务列表,然后根据负载均衡规则(目前系统提供了7种规则)以实现均衡负载。
  • Feign 是一个使用起来比较方便的 HTTP 客戶端,它用起來就好像调用本地方法一样,默认基于 RestTemplate 进行 HTTP 接口调用。

对于 Ribbon 的负载均衡策略,系统默认提供了7种规则(如下),当然你也可以扩展自定义规则进行负载均衡,比如通过自定义规则来实现微服务的灰度发布。

策略Java类名规则名称规则描述
RandomRule随机策略随机选择server
RoundRobinRule轮询策略按照顺序选择server(ribbon默认策略)
RetryRule重试策略在一个配置时间段内,当选择server不成功,则一直尝试选择一个可用的server
BestAvailableRule最低并发策略逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server
AvailabilityFilteringRule可用过滤策略过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值)
WeightedResponseTimeRule响应时间加权重策略根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间
ZoneAvoidanceRule区域权重策略综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server

这些所有类都继承自抽象类 AbstractLoadBalancerRule 进而实现了顶层接口 IRuleIClientConfigAware

下面是类关系图:

类关系图

配置

如上,了解清楚 Ribbon 的角色以及它支持的策略规则后,下面来看一下如何选择配置规则。

  • 可以选择使用自带的策略进行配置
  • 可以自定义实现自己的策略规则
  • 可以进行全局配置或者针对访问某一个服务单独设置策略
  • 以下配置以微服务 shanhy-svc1 通过 feign+ribbon 调用微服务 shanhy-svc2 为例,所以配置中会出现 shanhy-svc2 这样的名称,shanhy-svc2 为该服务配置文件中 spring.application.name 的值。
  • Ribbon 客户端配置涉及的相关类:@RibbonClient 注解、默认配置类 RibbonClientConfiguration

全局配置

@Configuration
public class RibbonConfiguration {

    @Bean
    public IRule ribbonRule() {
        // 这里实例化你需要的全局负载均衡策略,可以是内置的7分之一,也可以是你自定义的
        // 除此之外,你也可以在这个配置类中自定义IPing和ServerList
        return new RandomRule(); 
    }
}

指定服务配置

# 针对服务使用不同的负载均衡策略(shanhy-service-hello 和 shanhy-service-world 是2个服务名称
# 建议和服务自身的 spring.application.name 对应)
shanhy-service-hello.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.BestAvailableRule
shanhy-service-world.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RetryRule

自定义策略

按照上面的类关系图,继承你需要扩展的类,并实现你需要重写的方法即可。
然后参照如上两点,使用全局配置或者指定具体的服务进行配置上即可。

自定义负载均衡服务器列表

ribbon 默认从注册中心读取需要进行 feign 调用的服务器列表,有的时候我们想使用 ribbon 和 feign 进行基于声明式接口的 api 调用,但是调用的目标又不在注册中心里,我们可以通过手工设定服务清单的方式来实现,如下:

# 服务名称为 myservice
# 对于这个服务,需要先禁用从 eureka 中读取服务列表
myservice.ribbon.eureka.enabled=false
# 为这个服务配置服务清单,可以是一个或N个
myservice.ribbon.listOfServers=http://localhost:5000, http://localhost:5001

(END)

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐