七的博客

手写RPC框架系列(十一) - 总结

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框架的工作原理,加深对各个组件的理解