RPC 框架主体思想笔记 — 服务端部分
一、服务注册方式
1. 接口级注册
-
注册内容:单个接口及其实现类逐一注册到注册中心。
-
服务端实现获取:
-
不一定维护独立的本地服务容器。
-
可能直接依赖 Spring 容器或其他IOC容器,按需获取接口实现。
-
适合接口单独变更频繁、开发节奏快的场景。
-
-
调用时流程:收到请求后,通过接口名查找对应实现,反射或依赖注入执行。
2. 模块级注册
-
注册内容:整个模块作为服务整体注册到注册中心,模块内含多个接口实现。
-
服务端实现获取:
-
维护本地服务容器,模块启动时加载所有接口实现。
-
统一管理生命周期和接口调用的实例。
-
适合模块化微服务场景,调用性能和管理性较好。
-
-
调用时流程:收到请求后,通过本地容器快速定位接口实现,执行调用。
二、远程调用传输内容
-
调用请求内容结构一致:接口名、方法名、参数、版本号等。
-
服务端处理路径不同,但传输层协议对接口级和模块级无差别。
三、服务端调用流程总结
步骤 | 接口级注册 | 模块级注册 |
---|---|---|
1. 请求接收 | 接收客户端请求 | 接收客户端请求 |
2. 服务定位 | 从注册中心获取接口对应实现,或依赖Spring容器查找 | 从本地维护的服务容器定位接口实现 |
3. 方法调用 | 反射调用接口实现方法 | 容器内实例直接调用接口实现方法 |
4. 返回结果 | 返回调用结果 | 返回调用结果 |
RPC 框架主体思想笔记 — 客户端部分
一、服务发现
-
服务发现目的:客户端需要找到对应服务实例地址才能发起调用。
-
发现方式:
-
通过注册中心查询接口名或模块名对应的服务地址列表。
-
支持动态刷新服务地址,保证服务调用的高可用和负载均衡。
-
二、动态代理实现
-
动态代理作用:客户端调用接口时,实际上调用代理对象,隐藏了远程调用细节。
-
实现原理:
-
利用 Java 动态代理(JDK Proxy 或 CGLIB)创建接口的代理实例。
-
代理方法内将调用信息(接口名、方法名、参数等)封装成请求。
-
请求通过网络发送到服务端。
-
等待并返回服务端响应结果。
-
三、负载均衡与容错
-
负载均衡:客户端维护服务实例列表,调用时选择合适实例(轮询、随机、一致性哈希等)。
-
容错机制:
-
重试机制:调用失败时自动重试。
-
降级策略:调用失败时返回默认值或备用逻辑。
-
超时控制:防止请求长时间阻塞。
-
四、调用流程总结
-
客户端调用接口的代理方法。
-
代理封装请求,查询注册中心获取服务地址。
-
选取服务实例,发送网络请求。
-
服务端处理请求,执行接口实现。
-
返回结果给客户端代理。
-
客户端代理返回结果给调用者。