天天看点

阿里大佬带你一次性吃透基于Spring Cloud动态配置实现动态数据源

作者:程序员高级码农II

基于Spring Cloud动态配置实现动态数据源

笔者在一些项目中并未使用Sentinel提供的任何一种实现动态数据源的方式,而是选择自己实现动态数据源,因为这些项目被部署在Kubernetes平台上,所以可以利用Kubernetes提供的ConfigMap资源存储限流、熔断降级等规则,又因为Spring Cloud Kubernetes提供了SpringCloud动态配置接口的实现,所以我们不需要关心如何读取ConfigMap资源。

本节以实现FlowRule动态配置为例,详细介绍如何基于Spring Cloud动态配置实现动态数据源,主要分为5个步骤。

第一步,定义一个用于装载动态限流规则配置的FlowRuleProps类,代码如下。

阿里大佬带你一次性吃透基于Spring Cloud动态配置实现动态数据源

第二步,定义限流规则转换器FlowRuleConverter,将限流规则配置转换为FlowRule集合,代码如下。

阿里大佬带你一次性吃透基于Spring Cloud动态配置实现动态数据源

第三步,定义限流规则动态数据源FlowRuleDataSource,继承AbstractDataSource抽象类,并实现readSource方法,代码如下。readSource方法只需要实现获取FlowRuleProps实例并返回即可。

阿里大佬带你一次性吃透基于Spring Cloud动态配置实现动态数据源

第四步,增强FlowRuleDataSource,使FlowRuleDataSource能够监听到配置改变,代码如下。

阿里大佬带你一次性吃透基于Spring Cloud动态配置实现动态数据源

• 增强一:实现Spring InitializingBean接口的afterPropertiesSet方法,在数据源对象创建时,初始化加载一次规则配置。

• 增强二:实现SpringApplicationListener接口的onApplicationEvent方法,监听动态配置改变事件(RefreshScopeRefreshedEvent)。

在监听到RefreshScopeRefreshedEvent事件时,首先调用loadConfig方法加载所有限流规则配置,然后调用getProperty方法获取SentinelProperty实例,最后调用SentinelProperty实例的updateValue方法通知FlowRuleManager的监听器更新限流规则配置。

第五步,定义一个ApplicationRunner,在Spring容器刷新完成后,将FlowRuleDataSource实例的SentinelProperty实例注册给FlowRuleManager,代码如下。

阿里大佬带你一次性吃透基于Spring Cloud动态配置实现动态数据源

提示:在调用FlowRuleManager#register2Property方法将FlowRuleDataSource实例的SentinelProperty实例注册给FlowRuleManager时,FlowRuleManager会自动给该SentinelProperty实例注册一个FlowPropertyListener实例。

至此,一个基于Spring Cloud动态配置实现的限流规则动态数据源就已经完成,整个工作流程如下。

(1)当动态配置改变时,Spring

Cloud会发送RefreshScopeRefreshedEvent事件,

FlowRuleDataSource的onApplicationEvent方法会被调用。

(2)FlowRuleDataSource调用loadConfig方法获取最新的配置。

(3)FlowRuleDataSource#loadConfig方法调用readSource方法获取FlowRuleProps实例,此时的FlowRuleProps实例已经装载了最新的配置。

(4)FlowRuleDataSource#loadConfig方法调用FlowRuleConverter实例的convert方法将FlowRuleProps实例转换为FlowRule集合。

(5)FlowRuleDataSource调用自身的SentinelProperty实例的updateValue方法通知所有监听器,并携带新的规则配置。

(6)FlowPropertyListener的configUpdate方法被调用,FlowPropertyListener在configUpdate方法中更新FlowRuleManager缓存的限流规则配置。

提示:Sentinel实现动态数据源的整体框架的设计值得我们学习,如数据转换器、监听器。

本文给大家讲解的内容是深度解析微服务高并发动态数据源 :基于Spring Cloud动态配置实现动态数据源

  • 下篇文章给大家讲解的内容是深度解析微服务高并发适配主流框架:适配Spring MVC框架
  • 觉得视频不错的话,可以点赞关注转发一下哈~
  • 感谢大家的支持!

继续阅读