手写RPC框架系列(十一) - 总结
手写RPC框架系列(十一) - 总结与未来展望
在这个系列的文章中,一步步构建了一个基础的RPC框架。从最初的网络通信,到协议设计、编解码、请求处理和应答,再到客户端和服务端的示例,逐步完善了RPC框架的各个组成部分。现在,让回顾一下每个章节的主要内容,并对整个系列进行总结和展望。
最终项目参考地址:https://github.com/sjr7/netty-rpc
1. 章节总结 - 第一章 - RPC基础理论与架构
在第一章中,主要讲解了 RPC 的基本概念,章节重点包括:
RPC的基本工作原理是:客户端发起调用并将调用信息传递给本地代理(Client Stub),服务端接收到请求后进行解包并调用对应的本地服务,然后将结果返回给客户端。
RPC的关键组件包括:客户端代理、服务端代理、通信协议、序列化与反序列化机制、服务注册与发现等。
目前业界有多种流行的 RPC 框架,如Dubbo、gRPC、Motan等,它们各有特点,可以根据实际需求进行选择。
2. 章节总结 - 第二章 - 搭建RPC框架基础工程
第二章中,主要介绍了如何搭建 RPC 框架的基础工程。创建了 Maven 项目,并设计了项目的模块结构,为后续的开发工作奠定了基础,章节重点包括:
项目采用Maven多模块的结构,包含 rpc-core 、rpc-example 等模块。其中 rpc-core 为RPC框架的核心实现, rpc-example 包含了服务接口、客户端和服务端示例。
在父 pom 中引入了 Fastjson2、Lombok 等公共依赖,并声明了rpc-core和rpc-example两个子模块。
rpc-core 模块引入了 Netty、Zookeeper、Spring Boot 等依赖,用于实现网络通信、服务注册发现等功能。
rpc-example 模块下又分为 api、client、server三个子模块,分别存放服务接口、消费者、提供者的示例代码。
rpc-example-server 和 rpc-example-client 分别是服务提供者和消费者的 SpringBoot 应用,引入了 rpc-core和 rpc-example-api 的依赖。
3. 章节总结 - 第三章 - 在RPC框架中实现代理模式
在第三章中,学习了如何在RPC框架中应用代理模式。通过动态代理,实现了客户端的透明调用,使得远程方法的调用就像调用本地方法一样简单。章节重点包括:
代理模式是RPC框架中的关键设计模式,可以屏蔽网络通信细节,降低开发复杂度。
动态代理比静态代理更加灵活通用,JDK动态代理基于接口实现, Cglib 动态代理基于继承实现。
通过代理模式可以无侵入地扩展原有功能,如为方法调用添加耗时统计。
给出了在 RPC 框架客户端使用动态代理生成远程服务代理对象的示例代码框架。
4. 章节总结 - 第四章 - 实现服务注册与发现机制
第四章重点介绍了服务注册与发现机制的实现。引入了注册中心,并实现了服务提供者的注册和服务消费者的发现功能,使得服务的部署和调用更加灵活。章节重点包括:
使用服务注册中心相比配置文件,在扩展性、动态性、可用性方面有明显优势,是构建大型分布式系统的关键组件。
服务注册中心的主要作用包括:提供服务注册与发现接口,以及对服务进行健康检查。
常见的服务注册中心有Eureka、Zookeeper等,需要根据系统需求进行选型。
实现基于Zookeeper的服务注册需要创建临时节点存储服务元数据,并考虑节点的异常下线。
实现基于Zookeeper的服务发现需要从Zookeeper获取可用服务列表缓存到本地,并使用Watcher机制监听服务变化。
使用Curator框架操作Zookeeper的示例代码,展示了如何封装通用的服务注册与发现逻辑。
5. 章节总结 - 第五章 - RPC服务的自动扫描与依赖注入
在第五章中,实现了RPC服务的自动扫描和依赖注入功能。通过注解和反射,自动扫描和注册服务,并在服务消费者中自动注入服务代理对象,简化了服务的配置和使用。章节重点包括:
- 自定义 @RpcService 与 @RpcServiceScan 注解,用于标记和扫描 RPC 服务
- 通过 ImportBeanDefinitionRegistrar 扩展点,实现 RPC 服务自动注册
- 自定义 @Reference 注解,用于标记需要注入的 RPC 依赖
- 通过 BeanPostProcessor 扩展点,实现 RPC 依赖自动注入
- 在 Spring Boot 启动类上添加 @RpcServiceScan 注解,即可触发自动注册与注入
6. 章节总结 - 第六章 - 构建RPC通信基础
第六章主要介绍了如何构建RPC通信的基础设施。设计了通信协议,定义了消息格式,并实现了消息的编码和解码功能,为后续的网络通信做好了准备。章节重点包括:
选择TCP作为传输协议,兼顾可靠性与性能。
采用JSON作为序列化方案,易于使用和跨语言。
使用异步非阻塞通信模型,提高并发处理能力。
基于Netty进行网络编程。
7. 章节总结 - 第七章 - Netty快速入门
在第七章中,比较了不同的网络通信框架,并选择了 Netty 作为 RPC 框架的通信基础。快速入门了Netty 框架,了解了其基本概念和使用方法。章节重点包括:
对比了Java领域常用的网络通信框架,并选择了 Netty 作为 RPC 框架的通信基础。
介绍了Netty的基本概念和优缺点。
通过一个 HelloWorld 示例,展示了 Netty 应用的基本开发步骤。
8. 章节总结 - 第八章 - 编写RPC网络通信
第八章详细介绍了如何使用Netty编写RPC框架的网络通信模块。实现了客户端和服务端的通信功能,并通过自定义协议进行数据传输。章节重点包括:
设计了自定义的 RPC 通信协议
实现了协议的编解码器
基于 Netty 实现了 RPC 服务端和客户端
引入了心跳机制维持连接的可用性
9. 章节总结 - 第九章 - RPC请求处理以及应答
在第九章中,重点介绍了RPC请求的处理和应答流程。定义了请求和响应的数据结构,并在服务端实现了请求的处理和结果的返回功能。章节重点包括:
使用 CompletableFuture 和 RequestFutureManager 来管理异步请求和响应的关联
在服务端引入 RpcRequestProcessor 类,用于管理所有的服务实例,并通过反射进行方法调用
客户端使用 Future.get() 阻塞等待远程调用结果,并正确处理调用失败的情况
10. 章节总结 - 第十章 - 客户端与服务端示例及调用流程
本章通过创建客户端和服务端的示例模块,演示了如何使用自己实现的RPC框架进行远程方法调用。章节重点包括:
客户端使用
@Reference
注解引用远程服务,像调用本地方法一样使用,使用简单服务端使用
@RpcService
注解注册RPC服务客户端和服务端都需要通过
@RpcServiceScan
注解开启RPC服务扫描整个RPC调用流程为:客户端代理对象 -> 网络传输 -> 服务端接收请求 -> 反射调用服务实现 -> 网络传输 -> 客户端接收响应 -> 返回结果
通过示例模块的演示,可以更加直观地理解RPC框架的工作原理,加深对各个组件的理解