zl程序教程

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

当前栏目

【SCT】Spring Cloud Starter Tencent Polaris Config

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 Starter Tencent Polaris Config】

Polaris Config 工程。

【Polaris Config 模块属性】

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

属性

备注

默认值

enabled

是否开启 Polaris Config

true

address

Polaris Config 服务器地址

port

Polaris Config 服务器端口

8093

auto-refresh

是否在更新配置文件时自动更新到 Spring 上下文。

true

groups

导入的配置文件列表

connect-remote-server

是否连接到远程服务器,适合本地开发模式。

true

【Polaris Config 模块启动类】

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

PolarisConfigBootstrapAutoConfiguration.java

Spring Cloud 引导阶段自动配置类。

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

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

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

4、引入自动配置 PolarisSDKContex: PolarisContextAutoConfiguration.java

5、注入自定义实例加入到 IOC 交由 Spring 进行管理。

  • Config模块引导配置:PolarisConfigProperties.java
  • 配置文件来源管理类:PolarisPropertySourceManager.java
  • 判断是否满足启用条件:"spring.cloud.polaris.config.connect-remote-server"。
    • 初始化 ConfigFileService 实例
    • 初始化 PolarisConfigFileLocator 实例
    • 初始化 ConfigurationModifier 实例

PolarisConfigAutoConfiguration.java

SpringBoot 应用上下文初始化阶段自动配置类。

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

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

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

4、注入自定义实例加入到 IOC 交由 Spring 进行管理。

  • 配置来源自动更新器:PolarisPropertySourceAutoRefresher.java
  • 配置注解处理器:PolarisConfigAnnotationProcessor.java
  • 配置修改事件监听器:PolarisConfigChangeEventListener.java

【Polaris Config 基础配置】

ConfigFileGroup.java

配置文件组类,包含分组名称与其包含的配置文件列表。

PolarisConfigProperties.java

Polaris Config 引导配置文件类,读取配置前缀为 "spring.cloud.polaris.config" 的 key。

ConfigFileFormat.java

配置文件格式定义。

【Polaris Config 适配器】

PolarisPropertySource.java

Polaris Config 文件将被包装 Polaris 属性源。

PolarisPropertySourceManager.java

Polaris 属性源管理器。

1、线程安全、分段锁、并发效率高:polarisPropertySources = new ConcurrentHashMap<>()

2、如果已经存在key,则不添加;否则添加进Map:putIfAbsent(polarisPropertySource.getPropertySourceName(),polarisPropertySource);

  • Key:namespace + "-" + group + "-" + fileName

3、返回所有来源的 Polaris 属性源列表。

PolarisConfigFileLocator.java

1、实现 Spring Cloud 的配置文件扩展 SPI:PropertySourceLocator 接口类。

2、定义默认文件名称,以及引入 Polaris 相关配置完成初始化。

3、重写 locate 方法

  • 加载线上配置文件(polaris-config)。
    • 从 PolarisContext 获取命名空间、服务名称
    • 按规则初始化配置文件列表(优先级顺序:application-{profile} > application > boostrap-
    • 按顺序处理。
      • 判断配置文件存在后,初始化 polarisPropertySource 实例。
  • 加载自定义配置文件。
    • 从配置文件读取,spring.cloud.polaris.config.group
    • 从上下文配置文件读取命名空间
    • 读取 group 文件列表
      • 判断配置文件存在后,初始化 polarisPropertySource 实例。
  • 合并配置文件,通过 polarisPropertySourceManager 实例进行管理。

PolarisPropertySourceAutoRefresher.java

1、实现 ApplicationListener、ApplicatioContextAware 接口

  • 获取应用上下文
  • 注册 Polaris 自定义事件

2、初始化引入 Polaris 相关配置

3、注册 Polaris 配置发布事件

  • 自旋锁,执行一次:compareAndSet
  • 循环 polarisPropertySource 实例
  • 在 ConfigKVFile 实例中添加更新监听接口实现
  • 更新类型新增、删除时,同步在 source 中 新增、删除。
  • 最后刷新应用上下文。

【PolarisConfig 模块监听】

ConfigChangeListener.java

配置更新接口类,提供监听更新方法。

ConfigChangeEvent.java

配置更新事件类,存储所有修改 key 集合,以及所有需要监听的 key 集合。

  • 获取所有更新 key 集合
  • 根据 key 获取配置更新信息实例,ConfigPropertyChangeInfo
  • 判断 key 是否更新
  • 获取所有需要监听的 key 集合。

PolarisConfigListenerContext.java

配置监听上下文类

1、属性定义,任务执行服务、监听器集合、需要监听的 key 以及 key 前缀集合、配置缓存对象。

2、初始化任务执行服务。创建一个线程池,并注册一个服务关闭线程到 JVM shutdown Hook 里。

3、初始化配置缓存对象。

4、合并配置对象方法。(入参与配置缓存合并)

5、添加监听实例

6、根据更新 key 集合筛选符合条件的监听器,并在线程池中调用监听器的更新方法。

7、检查监听器是否满足更新 key 集合。

8、返回所有感兴趣的 key 集合。

PolarisConfigChangeEventListener.java

Polaris 配置更新事件监听类,实现了 ApplicationListener 接口类。

1、从应用上下文的环境变量中获取 PropertySources,解析后合并返回键值对集合。

2、重写应用事件接口

  • 判断 ApplicationStartedEvent 实例,且执行一次。
    • 读取应用上下文的环境变量
    • 从环境变量中读取配置的键值对集合
    • 将键值对集合,初始化到 PolarisConfigListenerContext 实例
  • 判断 EnvironmentChangeEvent 实例
    • 读取应用上下文的环境变量
    • 从环境变量中读取配置的键值对集合
    • 将键值对集合,合并到 PolarisConfigListenerContext 实例。
    • 触发 PolarisConfigListenerContext 实例的更新监听器事件。

【Polaris Config 模块注解】

PolarisConfigKVFileChangeListener.java

Polaris Config 更新事件监听注解。

1、设置需要监听的 key 数组,未设置则监听所有。

2、设置需要监听的 key 前缀数组,未设置则监听所有。

PolarisConfigAnnotationProcessor.java

Polaris Config 更新事件监听注解处理器。

1、实现 BeanPostProcessor 接口,重写 Bean 初始化回调接口。

  • 读取 Bean 实例方法集合
  • 循环执行自定义方法

2、自定义方法

  • 判断方法是否包含自定义注解:PolarisConfigKVFileChangeListener
  • 读取自定义注解中的参数:key 集合与 key 前缀集合
  • 根据bean实例与方法名,通过反射API 获取 ConfigChangeListener 监听实例。
  • 调用 Polaris ConfigListenerContext 实例添加更新监听方法,将监听实例加入配置监听上下文。

ConfigurationModifier.java

从 SpringCloud的配置文件中读取配置并覆盖 polaris.yaml


【结尾】

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

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