RPC实现思路

本文详细阐述了RPC框架的开发流程,包括客户端和服务端的设计与实现。重点介绍了客户端代理对象生成、消息协议处理、服务注册与暴露机制,以及请求处理流程。通过分析,帮助读者理解RPC框架的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 使用RPC框架开发过程时需要做什么?

  • 定义过程接口 img

  • 服务端代码实现过程

  • 客户端使用生成的stub代理对象 img

2 设计客户端

客户端生成过程接口的代理对象 设计客户端代理工厂,用JDK动态代理即可生成接口的代理对象。 img

思考

1、在ClientStubInvocationHandler中 需完成哪些事情?

img

2、将请求的内容编组为消息这件事由谁来做?

img

3、消息协议是固定不变的吗?它与什么有关? 看框架对协议的支持广度,如果支持多种协议,就是会灵活变化的,它与具体的服务相关, A服务提供者可能选用的是协议1,B服务提供者可能选用协议2。

4、某服务是用的什么消息协议这个信息从哪来? 从获取的服务信息中来,因此需要一个服务信息发现者。 把发现者设计出来, 要求:可灵活支持多种发现机制

imgimg

5、我们想要做到可以支持多种协议,我们的类该如何设计? 面向接口、策略模式、组合

img

问题: ➢ marshalling和unmarshalling方法该定义怎样的参数与返回值? ➢ 编组、解组的操作对象是请求、响应,请求、响应的内容是不同的。编组、解组两个方法是否满足?

设计客户端协议层

6.定义框架标准的请求, 响应类

img

7.将协议层扩展为四个img 消息协议独立为一层(客户端、服务端均需要)

网络层 发送请求,获得响应 要发起网络请求,则须知道服务地址

客户端完整类图

img

实现客户端 按照类图设计,填码! 看ClientStubProxyFactory核心类的代码示例!

 

在实现过程中,协议层涉及一个重要概念

  • 参数序列化、反序列

3 设计服务端

3.1 RPCServer

客户端请求过来了,服务端首先需要通过RPCServer接收请求。

img

img

 

RPCServer接收到客户端请求后,还需要做哪些工作?

img

网络层在RPCServer中提供多线程来处理请求,消息协议层复用客户端设计的。 (设计一个请求处理类,来完成网络层以上的事情。)

 

3.3 RequestHandler

RPCServer接收到请求后,将请求交给RequestHandler来处理 RequestHandler调用协议层来解组请求消息为Request对象,然后调用过程!

img

 

➢ RequestHandler如何得到过程对象? ➢ Request中有什么? ➢ 服务名、方法名、参数类型、参数值 ➢ 是否需要一个过程注册模块?

看看之后的设计

 

img

 

过程注册模块:让用户将他们的过程注册到RPC框架 ➢ 过程暴露模块:想对外发布(暴露)服务注册、暴露可以由同一个类实现

 

img

 

  1. RPCServer 中实现网络层: Netty, 使用RequestHandler

  2. ServiceRegister 模块实现服务注册、发布。

  3. RequestHandler 中实现消息协议处理、过程调用

RPC 服务调用过程

     0.服务消费方(Client)以本地调用方式调用服务

  1. client stub 接收到调用后负责将方法、参数等封装成能够进行网络传输的消息体

  2. client stub 将消息进行编码并发送到服务端

  3. server stub 收到消息后进行解码

  4. server stub 根据解码结果调用本地的服务

  5. 本地服务执行并将结果返回给server stub

  6. server stub 将返回导入结果进行编码并发送至消费方

  7. client stub 接收到消息并进行解码

  8. 服务消费方(client)得到结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值