本篇文章延续文章“如何理解Nacos册CP和AP架构模型”,大家可以配套一起学习。
Nacos注册中心处理HTTP注册请求
在文章“如何理解Nacos册CP和AP架构模型”中已经提到过,Nacos注册中心用Restful API InstanceController的方法register()处理HTTP类型的注册请求。
第1步,从HTTP请求HttpServletRequest中解析出待注册的实例Instance。
final Instance instance = HttpRequestInstanceBuilder.newBuilder()
.setDefaultInstanceEphemeral(switchDomain.isDefaultInstanceEphemeral()).setRequest(request).build();
第2步,执行注册请求,这一步可以参考Nacos的InstanceOperatorClientImpl类的方法registerInstance()。
在执行注册之前,Nacos注册中心会判断实例Instance的类型(是否是临时实例),这一步主要是为了组装clientId,并用该clientId去标记实例Instance对应的应用服务的唯一性。
public static String getClientId(String address, boolean ephemeral) {
return address + ID_DELIMITER + ephemeral;
}
依据实例Instance解析出待注册的Service信息。
Service.newService(namespaceId, groupName, serviceNameNoGrouped, ephemeral);
第3步,调用接口ClientOperationService的实现类的方法registerInstance(),去注册实例Instance和Service信息。
void registerInstance(Service service, Instance instance, String clientId) throws NacosException;
其中接口ClientOperationService的实现类有三个,分别是:PersistentClientOperationServiceImpl类、EphemeralClientOperationServiceImpl类和ClientOperationServiceProxy类。
在 Nacos 中,PersistentClientOperationServiceImpl,EphemeralClientOperationServiceImpl 和 ClientOperationServiceProxy 是三种不同的客户端操作服务实现,它们之间的主要区别在于服务的持久性和生命周期。
-
PersistentClientOperationServiceImpl:这是一个持久的客户端操作服务实现,意味着它的状态是持久化的。一旦被创建,它就会一直存在,直到显式地被删除或者 Nacos 服务器崩溃。这种类型的服务主要用于需要保存状态的情况,例如配置管理或者一些需要长期保存的信息。
-
EphemeralClientOperationServiceImpl:这是一个非持久化的客户端操作服务实现,它的状态是不保存的。一旦客户端断开连接,这个服务就自动消失。这种类型的服务主要用于临时或者短期的服务,例如动态服务发现或者一些短暂的连接。
-
ClientOperationServiceProxy:这是一个代理类型的客户端操作服务实现。它主要用于对远程服务的代理操作,例如调用远程服务的方法。它的行为和具体的远程服务相关,但是它本身并不持有状态。
以上三种客户端操作服务实现的主要区别在于它们的使用场景和生命周期。在 Nacos 中,你可以根据实际的需求选择合适的实现来使用。
关于Nacos注册中心如何选择以上三个类去做注册请求,我会在下一篇文章中去做分析。
利用PersistentClientOperationServiceImpl类去处理注册请求
假如采用持久化的方式,也就是利用PersistentClientOperationServiceImpl类去处理注册请求,具体过程如下。
第1步,构造注册写请求WriteRequest,这个写请求会存储序列化之后的实例信息和Service信息。
final InstanceStoreRequest request = new InstanceStoreRequest();
request.setService(service);
request.setInstance(instance);
request.setClientId(clientId);
final WriteRequest writeRequest = WriteRequest.newBuilder().setGroup(group())
.setData(ByteString.copyFrom(serializer.serialize(request))).setOperation(DataOperation.ADD.name())
.build();
第2步,将写请求推送给CP一致性协议CPProtocol,当然Nacos注册中心的使用的是CPProtocol的实现类JRaftProtocol。
@Override
public Response write(WriteRequest request) throws Exception {
CompletableFuture<Response> future = writeAsync(request);
// Here you wait for 10 seconds, as long as possible, for the request to complete
return future.get(10_000L, TimeUnit.MILLISECONDS);
}
这样基于JRaft的一致性协议的服务就能够感知该写请求,并执行基于CP协议的一致性持久化操作。
第3步,Raft Server处理该写请求。
@Override
public CompletableFuture<Response> writeAsync(WriteRequest request) {
return raftServer.commit(request.getGroup(), request, new CompletableFuture<>());
}
注意这个Raft Server需要伴随着Nacos注册中心进程一起启动,关于这一块我会在接下来的文章中去给大家解读(具体可以关注JRaftServer类)。
当然大家也可以关注我的书Spring Cloud Alibaba微服务架构实战派上下册中关于Nacos的章节,里面也有详细的分析。
在Raft Server处理处理持久化的注册请求的过程中,Nacos注册中心就会实时的将该请求转发给Nacos集群中的Leader节点,当然该Leader节点就是采用CP算法选举出来的,这样就能确保整个Nacos集群中关于注册信息的CP一致性。
整个选举过程和执行过程是非常复杂的,本篇文章没办法全部讲解完成,我会在接下来的文章中去分析。
大家可以关注我,后面会给大家继续做技术输出。
另外我的新书RocketMQ消息中间件实战派上下册,在京东已经上架啦,目前都是5折,非常的实惠。
https://item.jd.com/14337086.html编辑https://item.jd.com/14337086.html
“RocketMQ消息中间件实战派上下册”是我既“Spring Cloud Alibaba微服务架构实战派上下册”之后,又一本历时超过1年半的巨无霸技术实战类型的书籍。
为了提高读者阅读本书的体验性,本书总共设计了十个特色,下面我一一的给技术小伙伴阐述一下。
【特色一】由浅到深
本书将RocketMQ的技术原理和最佳实践体系化,按照由浅到深的顺序呈现给读者,使读者可以按照章节顺序按部就班地学习。当学习完全书内容之后,读者不仅能熟悉RocketMQ的核心原理,还能充分理解RocketMQ的“根”。
【特色二】技术新
本书不仅包括RocketMQ4.x(4.9.2版本)的核心原理分析和最佳实践,还包括RocketMQ5.x(5.1. 0版本)的新特性分析和最佳实践。
【特色三】精心设计的主线:零基础入门,循序渐进,直至彻底掌握RocketMQ
本书精心研究了程序类、架构类知识的认知规律,全书共分为6篇:①基础;②进阶;③高级;④高并发、高可用和高性能;⑤应用;⑥新特性,是一条相对科学的主线,让读者快速从“菜鸟”向“RocketMQ分布式架构实战高手”迈进。
【特色四】绘制了大量的图,便于读者理解RocketMQ的原理、架构、流程
一图胜于文,书中在涉及原理、架构、流程的地方配有插图,以便读者更加直观地理解。
【特色五】从架构师和技术专家的视角分析RocketMQ
本书创造性地分析了RocketMQ具备高并发、高可用和高性能的功能及原理,并从架构的视角展开分析,这些也是程序员进阶为技术专家或架构师必备的技能。
以下为从架构师和技术专家的视角分析RocketMQ典型案例,读者阅读完本书之后,也能够达到这样的水准。
【特色六】不仅有原理分析,还有大量的实战案例
本书介绍了大量的实战案例,能让读者“动起来”,在实践中体会功能,而不只是一种概念上的理解。
在讲解每一个知识模块时,我在思考:在这个知识模块中,哪些是读者必须实现的“标准动作”(实例);哪些“标准动作”是可以先完成的,以求读者能快速有一个感知;哪些“标准动作”具有一定难度, 需要放到后面完成。读者在实践完书中的案例之后,就能更容易理解那些抽象的概念和原理了。
本书的目标之一是,让读者在动手中学习,而不是“看书时好像全明白了,一动手却发现什么都不会”。通过体系化的理论和实战案例去培养读者的主动学习能力,这样本书的价值就会被最大化。
本书相信“知行合一”的理念,而不是“只知,而不行”,避免开发人员出现眼高手低的现象。尤其是在技术面试过程中,面试官更加看重的是既懂原理,又能够主动是实践技术的技术人。
【特色七】深入剖析原理
本书以系统思维的方式,从业务功能视角剖析 RocketMQ 底层的技术原理,使读者具备快速阅读 RocketMQ 框架源码的能力。读者只有具备了这种能力,才能举一反三,实现更复杂的功能,应对更复杂的应用场景。
【特色八】从运维的视角分析 RocketMQ 的最佳实践
【特色九】参与开源
本书向读者展示了如何修改 RocketMQ 源码,并快速验证案例分析。这样,读者可以从中学到参与开源的技能,并为后续自己能够参与开源做准备。
【特色十】双色印刷,读者体验会更好
为了提高读者阅读本书的体验,在有上下两册的前提下(巨无霸,超过800页),出版社不吝啬印刷成本,依然采用双色印刷。
【推荐】本书的最佳学习路径
为了提高读者学习RocketMQ的效率,我这边结合我自身从RocketMQ小白到RocketMQ专家的经历,为读者汇总了一条最佳学习路径。
【寄语】作者寄语
RocketMQ是我深度参与研究的一款开源消息中间件,无论是从源码,还是架构场景,我都提炼了很多最佳实践。
在开源领域,技术小伙伴可以使用的开源消息中间件非常的多,比如Kafka、Pulsar等,我之所以选择研究RocketMQ,除了工作内容和角色需要之外,更多的还是自己感兴趣,因此我建议技术小伙伴一定要先培养自己的兴趣,兴趣才是提升技术硬实力的第1要素。
当然我并不止研究了RocketMQ,还研究了Pulsar和Kafka等(包括开源消息中间件生态中的主流框架),只是本书作为一本关于RocketMQ实战派的书籍,我必须要以RocketMQ为主。
假如技术小伙伴想成为Java领域的架构师或者技术专家,我强烈建议你去研究RocketMQ,它会给你带来很多意想不到的技术和架构方法论的收获,这个也是我写本书的主要目的之一。
建议技术小伙伴按照本书设计的学习路线,逐章的去阅读和实战,这样学习效果会更好。
如果技术小伙伴有技术交流的,可以通过博文视点官方的读者群找到我的联系方式,并与我沟通,我会实时的解答读者的疑问。
本文公众号“架构随笔录”
本人视频号“架构随笔录”
【博文视点】2021年度优秀作者
2021年我和博文视点合作了一本技术类型的书籍“Spring Cloud Alibaba微服务架构实战派上下册”,它是我涉足知识输出领域以来的第一本书,同时它也是我自己积累的技术池中部分技术的产出。
为了写好那本书,我几乎花费了所有的休息时间,并主动的承担了书的售后技术辅导和咨询的职责(几乎是有问必答,坚持了整整两年)。
所谓有付出总会有回报,Alibaba这本书的销量还不错,我也因此获得了博文视点颁发的2021年度优秀作者。
我很清楚,这个是博文视点为了鼓励我继续去用心写书,因此我又花了接近1年半的时间去写了RocketMQ消息中间件实战派上下册这本书。
所谓一分耕耘一份收获,我将我对RocketMQ的理解体系化的输出给喜欢技术的技术人,希望真的对大家有帮助。
【博文视点】2023技术成长领路人
2022年,我开始涉足技术直播和技术讲师领域,并和博文视点合作几次技术直播,直播效果还不错,再加上我孜孜不倦的布道“Spring Cloud Alibaba微服务架构实战派上下册”这本书相关的技术,并且这些技术都是有助于“技术人”快速成长的,因此也获得了博文视点颁发的“2023技术成长领路人”这个技术奖项,这个奖项也是为了鼓励我继续通过技术直播的方式给技术人去布道技术,因此只要我有时间,我就会孜孜不倦的去讲和聊技术。
【四维口袋】2022 KVP最具价值技术专家
2022年,我开始涉足企业培训和相关技术直播,并和“四维口袋”合作了几次技术直播,并荣获了2022 KVP最具价值技术专家的技术奖项。