zl程序教程

您现在的位置是:首页 >  Java

当前栏目

【SCT】Spring Cloud Tencent Polaris LoadBalancer

2023-02-18 16:35:40 时间

【引用】

Spring Cloud Tencent 是腾讯开源的一站式微服务解决方案。SCT实现了Spring Cloud 标准微服务 SPI,开发者可以基于 Spring Cloud Tencent 快速开发 Spring Cloud 云原生分布式应用。

Spring Cloud Tencent 的核心依托腾讯开源的一站式服务发现与治理平台 Polaris,实现各种分布式微服务场景。

版本信息

https://github.com/Tencent/spring-cloud-tencent

spring-cloud-tencent:1.6.0-Hoxton.SR12-SNAPSHOT

Spring Cloud:Hoxton.SR12

Spring Framework:5.2.22.RELEASE

【Spring Cloud Tencent Polaris LoadBalancer】

Polaris LoadBalancer 工程,通过对 ribbon 的继承,扩展了实现负载均衡器的能力。

【additional-spring-configuration-metadata.json】

定义 Polaris LoadBalancer 工程的配置属性,前缀为:spring.cloud.polaris.loadbalancer.*

属性名

备注

默认值

enabled

是否开启 Polaris 负载均衡

true

discoveryType

发现服务类型

POLARIS

strategy

负载均衡策略

random

【PolarisLoadBalancerProperties.java】

Polaris LoadBalancer 配置属性对应类,自动将配置文件中的配置转换为 Bean。

【spring.factories】

指定开启 Spring Boot 自动配置类全路径。

【PolarisLoadBalancerAutoConfiguration.java】

Polaris LoadBalancer 自动配置类

1、配置类注解、不使用 proxy bean 代理

2、启用对@ConfigurationProperties注释 Bean 的支持。

3、判断是否满足启用条件:"spring.cloud.polaris.enabled"。

4、判断是否满足启用条件:"spring.cloud.polaris.loadbalancer.enabled"。

5、配置类加载后,自动加载 RibbonAutoConfiguration.java

6、通过 @RibbonClients 注入 Polaris 客户端配置类 PolarisRibbonClientConfiguration.class。

7、将 PolarisLoadBalancerProperties、RouterAPI(通过 polarisContext Bean 创建)实例加入到 IOC 交由 Spring 进行管理。

【PolarisRibbonClientConfiguration.java】

Polaris ribbon client 配置类,注入 Polaris 自定义 ILoadBalancer 接口实现类。

【PolarisLoadBalancer.java】

Polaris 自定义路由负载均衡类。

1、继承了 DynamicServerListLoadBalancer 类,重写了 getReachableServers()、getAllServers() 两个方法。然而 getAllServers() 方法未自定义实现,直接调用了 getReachableServers() 方法。

getReachableServers()

获取已启动且可访问的服务器。

getAllServers()

获取所有已知的服务器,包括可访问和无法访问的服务器。

2、PolarisLoadBalancer 构造器增加了两个自定义参数 ConsumerAPI、PolarisLoadBalancerProperties。

3、getReachableServers()

  • 判断配置文件中的 discoveryType 是否为 POLARIS
    • 通过自定义主调端接口(ConsumerAPI)获取指定命名空间、服务名称的服务器列表。
    • 通过DynamicServerListLoadBalancer 提供的 getAllServer() 接口,获取所有已知的服务器信息。
    • 将获取的服务器信息,组装为 Polaris 自定义的服务器信息。(即:ServiceInstances、ServiceKey、Instance)

【PolarisWeightedRule.java】

Polaris 权重负载均衡实现类。

1、继承默认设置获取负载均衡实现类:AbstractLoadBalancerRule.java

2、初始化时,增加了 Polaris 路由相关 API 接口。

3、重写 choose() 方法,返回 Polaris 的服务器信息对象。

  • 获取已启动且可访问的服务器列表。getReachableServers()
  • 将服务器列表转换为 ServiceInstances
    • 唯一索引标识 ServerKey:命名空间 + 服务名称
    • 服务器实例列表 List<Instance>:ID、IP 地址、端口、健康、熔断情况等。
  • 调用 Polaris 路由相关 API 的执行负载均衡接口:processLoadBalance(ProcessLoadBalanceRequest request)
  • 将获得的目标 Instance 实例组装为 PolarisServer ,并返回结果。

【结尾】

一年已经过去大半,是时候定一个小目标:阅读学习优秀的开源项目源代码。

本文是 Spring Cloud Tencent 第三篇文章,希望今年能完成整个 SCT 源代码的阅读与学习。