# RPC框架 **Repository Path**: zwhddup/rpc-framework ## Basic Information - **Project Name**: RPC框架 - **Description**: 写一个RPC框架吧 - **Primary Language**: Java - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2022-09-28 - **Last Updated**: 2025-06-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: rpc ## README # RPC框架 ### 介绍 写一个RPC框架吧,最后加点自己的想法。 ### 什么是RPC > 原理很简单,客户端和服务端都可以访问到通用的接口,但是只有服务端有这个接口的实现类,客户端调用这个接口的方式,是通过网络传输,告诉服务端我要调用这个接口,服务端收到之后找到这个接口的实现类,并且执行,将执行的结果返回给客户端,作为客户端调用接口方法的返回值,就是个API接口吧。 ### Netty > 用netty做网络通信 ### Nacos > 用Nacos做服务注册中心 #### 安装&配置参考 安装Nacos:https://blog.csdn.net/Soldoros_/article/details/118943062 创建服务:https://blog.csdn.net/sunkaijie123/article/details/121615733 ### SPI 参考资料:https://cloud.tencent.com/developer/article/1785056 SPI 全称:Service Provider Interface,是Java提供的一套用来被第三实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 作用:为被扩展的API寻找服务实现。 Dubbo:ExtensionLoader #### 序列化器 1. kryo 2. gson有问题 3. java自带 #### 压缩器 1. Gzip #### 负载均衡 1. 随机选取 2. 转轮算法 3. 一致性哈希算法 ### RPC框架测试 待测试,jmeter??? ### 多个请求结果返回 利用单列对象UnprocessedRequests里的对象ConcurrentHashMap存储,实现多个请求结果等待 和 通知。 ### 分布式框架设计 #### 通信框架 1.关键技术点 - 服务器内部通信选用长连接,节省创建链路的时间、资源。 - 选用NIO - Netty 2.可靠性设计 - 心跳机制 - 断线重连 - 消息缓存重发 - 资源优雅释放 3.性能设计 - 网络传输性能:NIO - 序列化性能 - 线程模型:Reactor线程模型 #### 序列化与反序列化 1.功能丰富度 2.跨语言支持 3.兼容性 - 前向兼容 4.性能 - 码流大小 - 序列化/反序列化速度 - 资源占用 Protobuf性能好 5.扩展性设计 #### 协议栈 私有协议栈性能高 #### 服务路由 1.透明化路由 - 服务注册中心(Nacos、ZooKeeper):订阅发布机制 - 消费者缓存服务提供者信息,根据服务注册中心发布的信息及时更新信息 2.负载均衡 - 随机 - 轮循 - 服务调用时延 - 一致性哈希 - 粘滞连接(用于有状态服务) 3.本地路由优先策略 - injvm模式 - innative模式 4.路由规则 - 条件路由 - 脚本路由规则 5.路由策略定制 - 灰度升级 - 服务故障、业务高峰期的导流 6.配置化路由 #### 集群容错 1.集群容错场景 - 通信链路故障 - 服务端超时 - 服务端调用失败 2.容错策略 - 失败自动切换 - 失败通知 - 失败缓存 - 快速失败 - 容错策略扩展 #### 服务调用 1.几个误区 - NIO就是异步服务 - 服务调用天生就是同步 - 异步服务调用性能更高 2.服务调用方式 - 同步服务调用 - 异步服务调用(Future-Listener) - 并行服务调用 - 泛化调用 #### 服务注册中心 1.几个概念 - 服务提供者 - 服务消费者 - 服务注册中心 2.关键功能特性设计 - 支持对等集群 - 提供CRUD接口 - 安全加固(客户端身份认证) - 订阅发布机制 - 可靠性 - 服务健康状态检测 - 对等集群防止单点故障 - 变更通知机制 #### 服务发布和引用 1.服务发布设计 - 服务发布的几种方式 - XML配置化方式 - 注解方式 - API调用方式 - 本地实现类封装成代理 - 服务发布成指定协议 - 服务提供者信息注册 2.服务引用设计 - 本地接口调用转换成远程服务调用 - 服务地址本地缓存 - 远程服务调用 #### 服务灰度发布 1.服务灰度发布流程设计 - 灰度环境准备 - 灰度规则设计 - 灰度规则下发 - 灰度路由 - 失败回滚 #### 参数传递 1.内部传参 - 业务内部参数传递 - 服务框架内部参数传递 2.外部传参 - 通信协议支持 - 传参接口定义 #### 服务多版本 #### 流量控制 1.静态流控 2.动态流控 3.并发控制 4.连接控制 5.并发和连接控制算法 #### 服务降级 1.屏蔽降级 2.容错降级 #### 服务优先级调度 1.设置服务优先级 2.线程调度器方案 3.Java优先级队列 4.加权优先级队列 4.服务迁入迁出 #### 服务治理 #### 分布式消息跟踪 1.业务场景分析 2.分布式消息跟踪系统设计 #### 可靠性设计 1.服务状态检测 2.服务健康度检测 3.服务故障隔离 #### 微服务架构 ### 其他所需了解 #### 注解 #### 反射 #### 钩子? #### @Builder用法 > https://blog.csdn.net/u012846445/article/details/109715515 > > Builder使用**创建者模式**又叫**建造者模式**。简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程。 #### java动态代理 > https://blog.csdn.net/weixin_43849277/article/details/108291320 > > 在不修改被代理对象功能的基础上,通过对代理类进行扩展,进行一些功能上的附加与增强。 > > 控制访问,即代理类不让你访问目标。 **静态代理** **优点** 简单,容易理解 **缺点** 1. 当目标类增加了,代理类可能也需要成倍的增加 2. 当你的接口中功能在增加了,或者修改了,会影响众多的实现类,厂家类,代理都需要修改,影响比较多,不符合开闭原则。 **动态代理** > 在静态代理中目标类很多的时候,可以使用动态代理,避免静态代理的缺点。 > > 在程序**执行过程**中,使用jdk的反射机制,创建代理类对象,并动态的指定要代理目标类。 动态代理中目标类即使很多 1. 代理类数量可以很少。 2. 当你修改了接口中的方法时,不会影响代理类。 #### 线程池 #### BlockingQueue #### ConcurrentHashMap >https://zhuanlan.zhihu.com/p/425159494 > >concurrentHashMap是一个支持高并发更新与查询的哈希表(基于HashMap)。在保证安全的前提下,进行检索不需要锁定。与hashtable不同,该类不依赖于synchronization去保证线程操作的安全。 #### 责任链模式 ### 参考资料 https://javaguide.cn/ https://zhuanlan.zhihu.com/p/435960751 https://blog.csdn.net/qq_40856284/article/details/106972591 《分布式服务框架原理与实践》