作为架构师最基本的技能就是可扩展架构设计,那么开源的Nacos注册中心和配置中心的命令事件机制就具备可扩展性,那么技术人为什么不充分利用这个能力去为自己的业务产品所用呢?
如下图所示,架构师可以做一个关于Nacos事件通知机制的开源场景分析。在Nacos注册中心和配置中心中,Nacos将一系列的事件注册到通知中心,那么订阅者就可以主动的去订阅这些事件,并准实时的解析事件中的数据,从而达到实时更新数据的目的。
以上只是给大家比较粗的分析Nacos事件机制,作为一名优秀的架构师,除了要会画框图之外,还要会细化技术,也就是需要有细分技术的能力。
如下图所示为Nacos事件通知机制的细分过程,当然为了方便技术人理解它,图中重现了Nacos配置中心的一个事件场景:配置信息变更的事件,也就是技术开发人员通过Nacos控制台变更一条配置信息之后,Nacos配置中心是如何利用事件通知机制去通知集群中的各个节点去变更配置信息的。
首先,Nacos定义了一个统一的通知中心(NotifyCenter,感兴趣的技术人可以去查阅相关源码),在Nacos注册中心和配置中心启动的过程中,会向通知中心注册系列的事件,一个事件对应通知中心中的一个事件发布者,二者在单进程内是1:1的映射关系。
比如图中的配置信息变更事件ConfigDataChangeEvent,就会造配置中心启动的过程中,利用Spring Framwork的注解@Service和@Autowired自动的注册到通知中心,具体代码可以参考AsyncNotifyService类。
其次,在Nacos注册中心和配置中心启动过程中,Nacos会自动的注册事件的订阅者Subscriber。
还是以事件ConfigDataChangeEvent举例子,该事件注册完成之后,Nacos配置中心会在AsyncNotifyService类中自动的注入一个订阅者到通知中心NotifyCenter,并根据事件类型,将事件订阅者和事件发布者绑定在一起。
每个事件发布者会在内存中利用本地缓存(其实就是一个并发ConcurrentHashMap)去存储订阅者。
其中Key为事件类型,Value为一个存储订阅该事件的订阅者集合(用ConcurrentHashSet来存储)。
最后,当调用者向通知中心发布一个事件时,那么对应的订阅者就会实时的收到该事件,并做出数据变更的逻辑处理。
这里还是拿事件ConfigDataChangeEvent举例子,发布该事件的调用方为如下几个:
(1)发布、更新和删除配置信息的HTTP接口/v1/cs/configs,具体可以参考Controller类ConfigController。
(2)发布、更新和删除配置信息的gRPC接口,具体可以参考ConfigPublishRequestHandler和ConfigRemoveRequestHandler类,这里就不做详细描述啦。
也就是说应用服务无论是通过HTTP接口,还是gRPC接口去做配置信息的变更,都会触发一条事件ConfigDataChangeEvent,并发布到通知中心中,从而订阅者就可以实时的感知到该事件。
当然Nacos配置中心在注册事件订阅者的时候,已经定义了“订阅到该事件之后”的处理逻辑。
那就是向Nacos集群中的其他节点发起远程的RPC请求(采用gRPC通信渠道,具体可以参考ClusterRpcClientProxy类),并将新的配置信息实时的推送给其他节点。
当然下面就是各个节点处理配置信息变更的gRPC请求,这个就比较复杂啦,涉及到数据一致性的逻辑,这里就不过多的分析啦,感兴趣的技术小伙伴可以自行去查阅一下。
总之,如下图所示为Nacos注册中心和配置中心支持的所有RPC命令事件类型。
架构师是可以将这些事件类比为业务系统中的业务事件,比如电商通知服务中的业务事件。
?另外我的新书RocketMQ消息中间件实战派上下册已经上架啦,这里我简单的给大家阐述一下。
?本书总共包括如下十大特色,供技术小伙吧去参考。
本书将RocketMQ的技术原理和最佳实践体系化,按照由浅到深的顺序呈现给读者,使读者可以按照章节顺序按部就班地学习。当学习完全书内容之后,读者不仅能熟悉RocketMQ的核心原理,还能充分理解RocketMQ的“根”。
本书不仅包括RocketMQ4.x(4.9.2版本)的核心原理分析和最佳实践,还包括RocketMQ5.x(5.1. 0版本)的新特性分析和最佳实践。
?
本书精心研究了程序类、架构类知识的认知规律,全书共分为6篇:①基础;②进阶;③高级;④高并发、高可用和高性能;⑤应用;⑥新特性,是一条相对科学的主线,让读者快速从“菜鸟”向“RocketMQ分布式架构实战高手”迈进。
一图胜于文,书中在涉及原理、架构、流程的地方配有插图,以便读者更加直观地理解。
?
本书创造性地分析了RocketMQ具备高并发、高可用和高性能的功能及原理,并从架构的视角展开分析,这些也是程序员进阶为技术专家或架构师必备的技能。
以下为从架构师和技术专家的视角分析RocketMQ典型案例,读者阅读完本书之后,也能够达到这样的水准。
?
本书介绍了大量的实战案例,能让读者“动起来”,在实践中体会功能,而不只是一种概念上的理解。
?在讲解每一个知识模块时,我在思考:在这个知识模块中,哪些是读者必须实现的“标准动作”(实例);哪些“标准动作”是可以先完成的,以求读者能快速有一个感知;哪些“标准动作”具有一定难度, 需要放到后面完成。读者在实践完书中的案例之后,就能更容易理解那些抽象的概念和原理了。
本书的目标之一是,让读者在动手中学习,而不是“看书时好像全明白了,一动手却发现什么都不会”。通过体系化的理论和实战案例去培养读者的主动学习能力,这样本书的价值就会被最大化。?
本书相信“知行合一”的理念,而不是“只知,而不行”,避免开发人员出现眼高手低的现象。尤其是在技术面试过程中,面试官更加看重的是既懂原理,又能够主动是实践技术的技术人。
本书以系统思维的方式,从业务功能视角剖析?RocketMQ?底层的技术原理,使读者具备快速阅读?RocketMQ?框架源码的能力。读者只有具备了这种能力,才能举一反三,实现更复杂的功能,应对更复杂的应用场景。
本书除了分析大量的原理和实战案例,还从运维的视角分析?RocketMQ?的最佳实践(消息的可追踪性和稳定性),让开发人员也能从中受益。
本书向读者展示了如何修改?RocketMQ?源码,并快速验证案例分析。这样,读者可以从中学到参与开源的技能,并为后续自己能够参与开源做准备。
为了提高读者阅读本书的体验,在有上下两册的前提下(巨无霸,超过800页),出版社不吝啬印刷成本,依然采用双色印刷。
为了提高读者学习RocketMQ的效率,我这边结合我自身从RocketMQ小白到RocketMQ专家的经历,为读者汇总了一条最佳学习路径。