Spring Cloud Ribbon负载均衡器(收藏了)

作者 : 开心源码 本文共5479个字,预计阅读时间需要14分钟 发布时间: 2022-05-12 共47人阅读

1.关键字

负载均衡

2.基本详情

上一次讲到远程调使用的用户端feign,feign的主要功能就是远程对象的本地代理商或者者使用于远程调使用的httpClient,减化远程调使用的复杂性,让本地调使用远程方法好像调使用本地方法一样简单方便。但是在集群环境,远程服务可能有多个可使用节点,那么调使用时就需要负载均衡。ribbon是一个提供用户端负载均衡算法的策略库。

负载均衡主要有种方式,一种是服务端负载算法,一种是用户端负载算法。服务端算法主要是通过反向代理商的方式把用户端请求分发到可使用的节点,如:nginx。用户端算法则是先获取所有可使用节点,再自己选择一个合适的节点。ribbon提供的负载均衡算法属于用户端算法。

3.什么是ribbon?

ribbon是一个建立在http或者tcp之上的本地负载均衡器。feign用ribbon进行负载,因而只需用@FeignClient,就自动引使用了ribbon.

ribbon最核心的概念是:一个被命名的client,也即一个具备唯一名字的用户端每一个负载均衡都是整体组件的一部分,它们相互协作调使用远程服务。每一个client都会通过类RibbonClientConfiguration创立一个新的子spring ApplicationContext,这个子ApplicationContext上下文的名子就是client的名字(如:@FeignClient(“user-server”),每个ribbon用户端包含:ILoadBalancer, RestClient, ServerListFilter, ServerList,IRule。

  1. ILoadBalancer:是负载均衡的入口类。
  2. ServerList:存储远程服务所有可使用节点
  3. ServerListFilter:使用于过滤非法的远程节点(如:不可使用等)
  4. IRule:负载算法(策略),使用于从可使用节点选择一个合适的节点。
  5. RestClient:远程调使用

4.集成ribbon

假如用feign,则默认已经集成,否则手动集成;用maven的pom.xml文件,配置如下:spring-cloud-starter-ribbon

  1. org.springframework.cloud
  2. spring-cloud-starter-ribbon

5.编码方式配置ribbon用户端

可以通过 .ribbon.* 来自己设置配置ribbon用户端。这此属性具体可参考类:CommonClientConfigKey,此类中包含了所有可能配置的属性key.

spring cloud允许用自己设置的配置文件对ribbon进行完全控制,如:@RibbonClient(name = “foo”, configuration = FooConfiguration.class)通过注解中的configuration可以自己设置的配置。这种情况下:RibbonClientConfiguration类中的配置和FooConfiguration类中的配置一起影响ribbonClient,基中FooConfiguration中的配置会覆盖RibbonClientConfiguration中的配置。

注意:FooConfiguration必需用@Configuration进行注解,但是不能被scan到,否则变成全局对旬会被所有client用。它必需放在scan外的包中,或者者是用scan中的exclude排队掉。这些配置都会在子ApplicationContext中被创立。

ribbon默认用以下bean:

  1. IClientConfig ribbonClientConfig: DefaultClientConfigImpl:配置
  2. IRule ribbonRule: ZoneAvoidanceRule:负载算法(如何从可使用中选一个)
  3. IPing ribbonPing: NoOpPing:ping 检查远程服务能否存活
  4. ServerList ribbonServerList: ConfigurationBasedServerList :远程服务节点列表
  5. ServerListFilter ribbonServerListFilter: ZonePreferenceServerListFilter:过滤不符合要求的远程节点(如何排除不可使用的节点)
  6. ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer:负载
  7. ServerListUpdater ribbonServerListUpdater: PollingServerListUpdater:升级远程服务节点(同步远程节点信息)

示例:创立一个自己设置的ping,会覆盖默认的ping bean.

@Configuration

public class FooConfiguration {

@Bean

public IPing ribbonPing(IClientConfig config) {

return new PingUrl();

}

}

6.配置文件配置ribbon用户端

从1.2.0版本,Spring Cloud Netflix支持用properties配置文件配置Ribbon用户端。允许在启动时根据不同环境改变行为。

下面是相关配置,前提是必需加上前前缀:.ribbon. 以下可以类可以通过配置文中指定自己设置类,从而替换默认实现。

  1. NFLoadBalancerClassName: should implement ILoadBalancer:负载均衡器全限定名
  2. NFLoadBalancerRuleClassName: should implement IRule:负载策略(算法)全限定名
  3. NFLoadBalancerPingClassName: should implement IPing:ping全限定名
  4. NIWSServerListClassName: should implement ServerList:远程服务列表全限定名
  5. NIWSServerListFilterClassName should implement ServerListFilter:过滤远程服务点节的过滤器全限定名

注意:配置文件中的配置优先级比@RibbonClient(configuration=MyRibbonConfig.class)中configuration指定的代码配置高,同时也比netflix默认的配置高

优化级如下:

配置文件 > @RibbonClient(configuration=MyRibbonConfig.class)的MyRibbonConfig > 默认配置

示例:

下是为一个叫做“users”的微服务配置IRule,

application.yml

  1. users:
  2. ribbon:
  3. NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

7.集成eureka

当用eureka和ribbon时,ribbonServerList会被eureka中的DiscoveryEnabledNIWSServerList替换,通过eureka获取远程服务节点列表。

IPing会被NIWSDiscoveryPing替换,使用于检查远程服务能否可使用。ServerList 会被DomainExtractingServerList 替换。ribbon相关的组件会被替换成eureka对应的组件。

如何替换?

ribbon组件通过RibbonAutoConfiguration自动集成,而eureka 和ribbon则是通过RibbonEurekaAutoConfiguration自动集成。RibbonAutoConfiguration优先加载并创立,但并未创立对应的RibbonClientConfiguration(包含所有ribbon组件的创立)。RibbonEurekaAutoConfiguration在RibbonAutoConfiguration创立后加载并生成相应bean《通过@AutoConfigureAfter(RibbonAutoConfiguration.class)》。RibbonEurekaAutoConfiguration通过注解@RibbonClients(defaultConfiguration = EurekaRibbonClientConfiguration.class)加载 EurekaRibbonClientConfiguration(包含所有eureka使用于替换ribbon组件的bean)。因为EurekaRibbonClientConfiguration比aRibbonClientConfiguration优先创立,这个配置中的eureka ribbon组件就优生成,通过注解 @ConditionalOnMissingBean,即可以阻止原生ribbon核心组件的生成,从而无缝替换。

8.关闭eureka功能

eureka是一个非常方便的,使用于抽像 “发现远程服务节点”的方法,因而可以不使用在本地硬编码远程服务节点的url地址。但是假如你不想用eureka,但是 依然用Ribbon and Feign ,那么你可以通过@RibbonClient指定远程服务名,而后通过配置文件配置远程节点的url地址,此时需要关闭eureka(classpath下没有eureka包或者者ribbon.eureka.enabled: false主动关闭)

示例:如果有一个名叫”stores”的远程微服务,则以下为本地配置对应的远程节点url,多个以逗号分隔

application.yml

  1. stores:
  2. ribbon:
  3. listOfServers: example.com,google.com

关闭eureka:

application.yml

  1. ribbon:
  2. eureka:
  3. enabled: false

直接用ribbon api接口:

  1. public class MyClass {
  2. @Autowired
  3. private LoadBalancerClient loadBalancer;
  4. public void doStuff() {
  5. ServiceInstance instance = loadBalancer.choose(“stores”);
  6. URI storesUri = URI.create(String.format(“http://%s:%s”, instance.getHost(), instance.getPort()));
  7. // … do something with the URI
  8. }
  9. }

9.缓存Ribbon配置

每个命名的ribbon client(如:@FeignClient(value = “stores”))都会被创立一个子Application Context。即:一个远程微服服务对应的所api接口都会在本创立对应的代理商bean,这些bean都存在于一个新的子Application Context。这些Application Context由spring cloud维护。这些Application Context默认是在第一个请求时创立。不过Application Context的创立时机可以通过配置来改变,从而在项目启动时创立。

指定的远程服务对应的代理商bean在服务启动时生成。

application.yml

  1. ribbon:
  2. eager-load:
  3. enabled: true
  4. clients: client1, client2, client3

10.Ribbon提供的主要负载均衡策略详情

1:简单轮询负载均衡(RoundRobin)

以轮询的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。

2:随机负载均衡 (Random)

随机选择状态为UP的Server

3:加权响应时间负载均衡 (WeightedResponseTime)

根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。

4:区域感知轮询负载均衡(ZoneAvoidanceRule)

复合判断server所在区域的性能和server的可使用性选择server

请关注小编,后续会推出更多精彩内容

本人从事行业工作8年了,工作之余搜集了少量视频资料

有JAVA高级架构师、系统高级架构师、大数据、机器(深度)学习/数据挖掘/数据分析/算法/计算机视觉、Android、IOS、Web前台、JavaScript、WebApp(React Native)、微信小程序开发、C、C++、Python开发运维、Linux运维架构内核、PHP、.Net、数据库、UID、游戏开发、软件测试、网络编程、FFmpeg开发、计算机软考等教程

我把资料都共享出来,也算是物尽其使用,希望能帮到需要的人,不使用费时在找资料;

资料也在不断升级中,不管是新手,还是老手,都能找到你需要的资料;

获取方式:

1、因为人数太多,请评论区留下你们评论

2、评论后私信我:“xx资料”就可领取!如:大数据资料,dubbo资料,云计算资料等等

老规矩,一个转发+评论,一份资料。名额有限,太多人我送不过来,请谅解!

资料只为有需要的朋友准备,而且整理不易,假如觉得资源不错,希望大家能积极转发让更多人看到,给予小编鼓励与支持,有动力分享资源。

下期资源更劲爆哦,欢迎关注 + 留言+点赞+转发+收藏!

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Spring Cloud Ribbon负载均衡器(收藏了)

发表回复