# 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
《分布式服务框架原理与实践》