# 学习rpc **Repository Path**: clove0207/study-rpc ## Basic Information - **Project Name**: 学习rpc - **Description**: 学习rpc - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-08-16 - **Last Updated**: 2023-05-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 学习rpc ### 介绍 学习手写rpc ccrpc是一款分布式的、高性能、可扩展的RPC框架。 rpc框架支持如下功能: 1.注册中心的插件化动态扩展 2.序列化方式插件化动态扩展 3.动态代理插件化动态扩展 4.服务的动态注册与发现 5.参数验证、结果缓存 6.服务调用区分版本号(对标Dubbo) 7.超时重试 8.同步调用、异步调用、异步执行 9.异步回调 10.事件通知 11.SPI扩展技术 12.支持原生RPC 13.支持基于Spring(XML/注解)整合RPC 14.支持SpringBoot整合RPC 15.支持Docker整合RPC 16.支持K8S整合RPC 待扩展功能: 1.路由控制与管理 2.流控分析与管理 3.限流、熔断、降级 4.并发控制、连接控制、延迟连接 5.全链路监控 6.多SDK建设 7.其他暂时还未想到的扩展 ### 软件架构 软件架构说明 基于JDK1.8 ### 提交内容概述 1.rpc核心注解设计和实现 RpcReference和RpcService注解的编写 2.实现RPC服务核心注解的扫描与解析 自定义通用扫描器ClassScanner(file,jar,.class)实现,rpc核心注解扫描器(RpcServiceScanner)实现 #### 服务提供者 3.服务提供者收发消息基础实现 启动RPC服务的接口(Server)实现Netty启动(BaseServer),RPC服务提供者的Handler处理类(RpcProviderHandler)实现,定义handleMap存放@RpcService注解标注的类实例 4.自定义网络传输协议的实现 Rpc协议(RpcProtocol)实现,包含消息头和消息体(实际发送的数据) 消息头RpcHeader实现,目前固定为32个字节:魔数 2byte | 报文类型 1byte | 状态 1byte | 消息 ID 8byte | 序列化类型 16byte | 数据长度 4byte RPC的请求类(RpcRequest)和响应类(RpcResponse)实现,对应的请求id在响应头中 5.自定义网络编码、解码的实现 定义序列化接口(Serialization),实现jdk序列化(JdkSerialization) 定义实现编解码的接口(RpcCode)提供序列化和反序列化的默认方法,实现RPC编码(RpcEncoder)操作,实现RPC解码(RpcDecoder)操作 6.模拟服务消费者与服务提供者之间的数据交互 测试自定义协议收发消息 7.服务提供者调用Service真实方法的实现 服务提供者端线程池(ServerThreadPool)实现,RPC服务提供者的Handler处理类(RpcProviderHandler)调整为线程池执行bean的method方法(jdk动态代理) 8.测试服务提供者调用真实方法 9.服务提供者扩展支持CGLib调用真实方法 RPC服务提供者的Handler处理类(RpcProviderHandler)添加成员变量调用类型(reflectType:jdk/cglib), 实现jdk反射、cglib代理执行方法,服务启动基类(BaseServer)添加成员变量调用类型 #### 服务消费者 10.实现服务消费者与服务提供者直接通信 RPC消费者Handler处理器(RpcConsumerHandler)实现,服务消费者(RpcConsumer)实现 11.服务消费者异步转同步直接获取返回结果 RPC消费者Handler处理器(RpcConsumerHandler)添加成员变量返回值map(pendingResponse=key:请求ID-val:RpcResponse协议),用于存放请求返回值。 channelRead0中接收到返回值存放到map中,sendRequest中循环获取map中的返回值,直到有返回值结束 12.服务消费者异步转同步的自定义Future与AQS实现 自定义Future(RpcFuture),内部定义Sync实现AQS功能,实现tryAcquire和tryRelease。 RPC消费者Handler处理器(RpcConsumerHandler)添加成员变量futureMap(pendingRPC=key:请求ID-val:RpcFuture), sendRequest中构建RpcFuture并放入map,channelRead0中根据请求ID获取future唤醒阻塞线程获取结果数据 13.服务消费者同步、异步、单向调用的实现 定义上下文(RpcContext)内部(InheritableThreadLocal)存放RpcFuture,异步调用通过上下文获取返回结果。 RPC消费者Handler处理器(RpcConsumerHandler)添加同步、异步、单向调用方法 14.服务消费者回调方法的实现 定义异步回调接口(AsyncRpcCallback),服务消费者线程池(ClientThreadPool)实现, 自定义Future(RpcFuture)添加存放回调方法list(pendingCallbacks),实现新增回调、执行回调方法,远程调用完成时执行回调方法 15.服务消费者实现动态代理功能屏蔽构建请求协议对象的细节 定义服务消费者(Consumer)发送请求,对象代理类(ObjectProxy)实现远程调用invoke方法。 JDK代理工厂(JdkProxyFactory)实现构建代理对象 16.服务消费者整合动态代理实现直接调用接口返回结果数据 服务消费客户端(RpcClient)实现构建service代理对象(JDK代理工厂创建) 17.服务消费者动态代理实现异步调用 定义异步访问接口(IAsyncObjectProxy),对象代理类(ObjectProxy)实现IAsyncObjectProxy的异步代理对象调用方法。 服务消费客户端(RpcClient)实现构建异步化调用对象 18.服务消费者动态代理扩展优化 封装代理配置(ProxyConfig),定义动态代理工厂(ProxyFactory),基础代理工厂(BaseProxyFactory)实现初始化init方法,JDK代理工厂(JdkProxyFactory)继承基础代理工厂,实现动态代理工厂 #### 注册中心 19.注册中心基础服务功能的实现 服务元数据(ServiceMeta)实现,注册配置类(RegistryConfig)实现,定义服务注册与发现接口(RegistryService), 基于Zookeeper的注册服务(ZookeeperRegistryService)实现连接初始化、服务注册、服务注销、服务发现、连接销毁等方法 20.服务提供者整合注册中心实现服务注册 注解扫描器(RpcServiceScanner)扫描方法添加服务注册ip地址、端口和实例,扫描后构建服务元数据注册到注册中心。 基础服务(BaseServer)添加成员变量服务注册实例,通过传入注册地址(IP:端口)和注册中心类型构建服务注册实例 21.服务消费者整合注册中心实现服务发现 缓存服务消费者处理器(RpcConsumerHandlerHelper)抽取实现,服务消费者(RpcConsumer)中修改为从注册中心获取服务提供者ip和端口, 对象代理类(ObjectProxy)、代理配置类(ProxyConfig)、服务消费客户端(RpcClient)新增注册服务registryService成员变量和赋值方法