乐趣区

SpringCloud-第十篇-Ribbon

1:Ribbon 是什么

Ribbon 是一个开源的客户端负载均衡器,由 Netflix 公布,是 SpringCloud-Netflix 中重要的一环,通过它将 Netflix 的中间层服务连贯在一起。
Ribbon 客户端组件提供一系列欠缺的配置项,如连贯超时、重试等。简略的说,就是在配置文件中列出 Load Balancer 前面所有的服务,Ribbon 会主动的基于某种规定(如简略轮询,随机连贯等)去连贯这些服务,也很容易实现自定义的负载平衡算法。

2:Ribbon 能干什么

Ribbon 是在客户端来实现负载平衡的拜访服务,次要的性能点:
1:服务发现,发现依赖服务的列表
2:服务抉择规定,在多个服务中如何抉择一个无效服务
3:服务监听,检测生效的服务,高效剔除生效服务

3:架构图

4:集成

  • 退出依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

先不要加 Eureka 的 starter
官网的 HelloWorld
具体示例参看:
https://github.com/Netflix/ri…

5:参数配置

5.1:概述

对于 Ribbon 参数的 key 以及 value 类型的定义,能够通过 com.netflix.client.config.CommonClientConfigKey 查看
如果你没有配置任何属性,则 ribbon 会应用 com.netflix.client.config.DefaultClientConfigImpl 里的值

5.2:配置形式

Ribbon 的参数配置通常有二种形式:全局配置以及指定客户端配置

  • 全局配置的形式很简略只须要应用 ribbon.<key>=<value> 格局进行配置即可。

其中,<key> 代表了 Ribbon 客户端配置的参数名,<value> 则代表了对应参数的值。
比方,能够向上面这样配置 Ribbon 的超时工夫:
ribbon.ConnectTimeout=250
全局配置能够作为默认值进行设置,当指定客户端配置了相应的 key 的值时,将笼罩全局配置的内容

  • 指定客户端的配置形式

<client>.ribbon.<key>=<value> 的格局进行配置
<client> 示意服务名,比方没有服务治理框架的时候(如 Eureka),须要指定实例清单,如:userService.ribbon.listOfServers=localhost:8080

6:外围组件

6.1:Ribbon 外围组件

  • IRule:依据特定算法中从服务列表中选取一个要拜访的服务
  • IPing:后盾运行线程,用来判断服务是否可用
  • ServerList:服务列表,能够是动态的或动静的。如果它是动静的,后盾线程将刷新并按肯定的工夫距离过滤列表

还有:

  • ServerListFilter:该接口容许过滤配置或动静获取的具备所需个性的服务器列表
  • ServerListUpdater:被 DynamicServerListLoadBalancer 用于动静的更新服务列表
  • IClientConfig:定义各种配置信息,用来初始化 ribbon 客户端和负载均衡器
  • ILoadBalancer:定义软件负载平衡器操作的接口。动静更新一组服务列表及依据指定算法从现有服务器列表中抉择一个服务

6.2:配置

这些组件能够以编程形式设置,也能够是客户端配置属性的一部分,并通过反射创立。
反对的属性如下所示,应以 <clientName>.ribbon. 为前缀:

  • NFLoadBalancerClassName:要应用的 ILoadBalancer
  • NFLoadBalancerRuleClassName:要应用的 Irule
  • NFLoadBalancerPingClassName:要应用的 Iping
  • NIWSServerListClassName:要应用的 ServerList
  • NIWSServerListFilterClassName:要应用的 ServerListFilter

6.3:IRule,罕用实现有以下几种:

都在 com.netflix.loadbalancer 包上面

1:RoundRobinRule:轮询规定
2:RandomRule:随机获取一个服务
3:AvailabilityFilteringRule 
这个负载均衡器规定,会先过滤掉因为屡次拜访故障而处于断路器跳闸状态的服务,还有并发的连贯数量超过阈值的服务,而后对残余的服务列表依照轮询策略进行拜访
4:WeightedResponseTimeRule  依据均匀响应工夫计算所有服务的权重,响应工夫越快,服务权重越大、被选中的概率越高。刚启动时,如果统计信息有余,则应用 RoundRobinRule 策略,等统计信息足够,会切换到 WeightedResponseTimeRule。
5:RetryRule 先依照 RoundRobinRule 的策略获取服务,如果获取服务失败,则在指定工夫内会进行重试,获取可用的服务
6:BestAvailableRule 此负载均衡器会先过滤掉因为屡次拜访故障而处于断路器跳闸状态的服务,而后抉择一个并发量最小的服务
7:ZoneAvoidanceRule:默认规定, 复合判断 server 所在区域的性能和 server 的可用性抉择 server

6.4:IPing,罕用实现有以下几种:

都在 com.netflix.loadbalancer 包上面
1:DummyPing:默认实现,默认返回 true,即认为服务永远活着
2:NIWSDiscoveryPing  不执行真正的 ping。如果 Discovery Client 认为是在线,则程序认为本次心跳胜利,服务活着
3:PingUrl  此组件会应用 HttpClient 调用服务的一个 URL,如果调用胜利,则认为本次心跳胜利,示意此服务活着。
4:NoOpPing:永远返回 true,即认为服务永远活着
ServerList,罕用实现有以下几种:
都在 com.netflix.loadbalancer 包上面
1:ConfigurationBasedServerList,从配置文件中获取所有服务列表,也是动态获取服务列表,配置例子:sample-client.ribbon.listOfServers=
2:DiscoveryEnabledNIWSServerList 
从 Eureka Client 中获取服务列表。此值必须通过属性中的 VipAddress 来标识服务器集群。DynamicServerListLoadBalancer 会调用此对象动静获取服务列表
3:DomainExtractingServerList:代理类,依据 ServerList 的值实现具体的逻辑

7: 联合 Eureka

在 SpringCloud 中应用的 HelloWorld

  • 先退出依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

能够不必退出 Ribbon 依赖,因为 Eureka 的 starter 外面蕴含了 ribbon

  • 写一个配置类

提供 RestTemplate,示例如下:

@Bean
@LoadBalanced
public RestTemplate rt(){return new RestTemplate();
}
  • 写一个 Hello2 的 Controller,在办法外面应用 RestTemplate
  • 启动 SpringBoot 的启动类,而后就能够通过页面进行拜访测试了

8: RestTemplate

  • RestTemplate 是 Spring 提供的用于拜访 Rest 服务的客户端,RestTemplate 提供了多种便捷拜访近程 Http 服务的办法,可能大大提高客户端的编写效率。
  • @LoadBalanced 示意 restTemplate 应用 LoadBalancerClient 执行申请,会主动应用负载平衡策略,它外部会在 RestTemplate 中退出 LoadBalancerInterceptor 这个拦截器,这个拦截器的作用就是应用负载平衡。这样在拜访近程服务的时候,能够间接应用 Provider 向 Eureka Server 注册的虚构名字,如:

rt.getForObject(“http://userService/userServiceProvider?name=cc”, String.class);

  • 当 Eureka 与 Ribbon 联合应用(即两者都在类门路上)时,ribbonServerList 将被扩大为 DiscoveryEnabledNIWSServerList,扩大名为 Eureka 的服务器列表。它还用 NIWSDiscoveryPing 替换 IPing 接口,代理到 Eureka 以确定服务器是否启动。
  • 能够通过代码来进行配置,比方配置 IRule、IPing 等
  • 设置属性 ribbon.eureka.enabled = false 将明确禁用在 Ribbon 中应用 Eureka

9:ServerListFilter

罕用实现有以下几种:
都在 com.netflix.loadbalancer 包上面

  • ZoneAffinityServerListFilter  过滤掉所有的不和客户端在雷同 zone 的服务,如果和客户端雷同的 zone 不存在,才不过滤不同 zone 有服务。启用此配置应用以下配置

<clientName>.ribbon.EnableZoneAffinity=true

  • ServerListSubsetFilter  ZoneAffinityServerListFilter 的子类。此过滤器确保客户端仅看到由 ServerList 实现返回的整个服务器的固定子集。它还能够定期用新服务器代替可用性差的子集中的服务器。要启用此过滤器,请指定以下属性:
myClient.ribbon.NIWSServerListClassName=com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList 
# the server must register itself with Eureka server with VipAddress "myservice"
myClient.ribbon.DeploymentContextBasedVipAddresses=myservice
myClient.ribbon.NIWSServerListFilterClassName=com.netflix.loadbalancer.ServerListSubsetFilter
# only show client 5 servers. default is 20.
myClient.ribbon.ServerListSubsetFilter.size=5

10:ServerListUpdater

ServerListUpdater,罕用实现有以下几种:
都在 com.netflix.loadbalancer 包上面

  • PollingServerListUpdater 默认的实现策略。此对象会启动一个定时线程池,定时执行更新策略
  • EurekaNotificationServerListUpdater 当收到缓存刷新的告诉,会更新服务列表。

11:IClientConfig

罕用实现有以下几种:
com.netflix.client.config.DefaultClientConfigImpl IClientConfig 的默认实现

12:ILoadBalancer

罕用实现有以下几种:
都在 com.netflix.loadbalancer 包上面

  • DynamicServerListLoadBalancer DynamicServerListLoadBalancer 组合 Rule、IPing、ServerList、ServerListFilter、ServerListUpdater 实现类,实现动静更新和过滤更新服务列表
  • ZoneAwareLoadBalancer  这是 DynamicServerListLoadBalancer 的子类,次要退出 zone 的因素。统计每个 zone 的均匀申请的状况,保障从所有 zone 选取对以后客户端服务最好的服务组列表

13:重试机制

SpringCloud 通过整合 Spring retry 来加强 RestTemplate 的重试能力,对于开发者来说,只须要简略配置,即可实现重试策略,配置示例如下:
// 该参数用来开启重试机制,它默认是敞开的

spring.cloud.loadbalancer.retry.enabled=true 
// 断路器的超时工夫须要大于 Ribbon 的超时工夫,不然不会触发重试
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000 
// 申请连贯超时工夫
userService.ribbon.ConnectTimeout=250 
// 申请解决的超时工夫
userService.ribbon.ReadTimeout=1000 
// 对所有操作申请都进行重试
userService.ribbon.OkToRetryOnAllOperations=true 
// 切换实例的重试次数
userService.ribbon.MaxAutoRetriesNextServer=2 
// 对以后实例的重试次数
userService.ribbon.maxAutoRetries=1

14:@RibbonClient

注解 @RibbonClient,这样做的目标是为了在启动该微服务的时候就能去加载咱们的自定义 Ribbon 配置类,从而使配置失效,形如:
@RibbonClient(name=”userService”,configuration=MyConf2.class)

  • 这个 userService 不是轻易写的,而是注册到 Eureka 发现组件上的微服务服务端,意思是要对所有工程名为 userService 的服务提供者进行负载平衡治理
  • 官网文档明确给出了正告:这个测试配置类 MyConf2 不能放在 @ComponentScan 所扫描的以后包下以及子包下,否则咱们自定义的这个配置类就会被所有的 Ribbon 客户端所共享,也就是说咱们达不到特殊化定制的目标了。
退出移动版