设计一个RPC框架很简单吗?应该从哪入手?深入剖析?

本文详细探讨了RPC框架的设计,包括客户端的 stub 代理对象、服务注册中心、负载均衡、服务版本控制、熔断器和监控等方面。介绍了客户端如何通过网络IO、序列化和动态代理实现远程调用,并讨论了服务端的请求处理和过程调用。同时,提出了设计考虑如协议的灵活性、服务发现和多协议支持。文章适合对RPC感兴趣的开发者阅读。
摘要由CSDN通过智能技术生成

RPC

我们即希望能够敏捷开发,不做重复的劳动,用别人的势能赋能自己;又要成为一名能够赋能别人的人,拥有自身的势能。

RPC需要什么

想要实现一个基本的RPC框架,其实需要什么?

  1. 网络IO,BIO\NIO\AIO,Socket编程,HTTP通信,一个就行。
  2. 序列化,JDK序列化,JSON、Hessian、Kryo、ProtoBuffer、ProtoStuff、Fst知道一个就行。
  3. 反射,JDK或者Cglib的动态代理。

那一个优秀的RPC框架,还需要考虑什么问题?

  1. 一个服务可能有多个实例,你在调用时,要如何获取这些实例的地址?服务注册中心
  2. 多个实例,选哪个调用好?负载均衡
  3. 服务注册中心每次都查?缓存相关
  4. 客户端每次要等服务器返回结果?异步调用
  5. 服务是要升级的?版本控制
  6. 多个服务依赖,某个有问题?熔断器
  7. 某个服务出了问题怎么办?监控 ..

一、 从使用者考虑

定义过程接口

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

二、设计客户端

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

思考

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

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

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

4、某服务是用的什么消息协议这个信息从哪来? 从获取的服务信息中来,因此需要一个服务信息发现者。

把发现者设计出来, 要求:可灵活支持多种发现机制

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

  • 问题:

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

设计客户端协议层

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

  1. 将协议层扩展为四个
  • 消息协议独立为一层(客户端、服务端均需要)
  • 网络层 发送请求,获得响应
  • 要发起网络请求,则须知道服务地址

  • 客户端完整类图

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

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

  • 参数序列化、反序列

三、设计服务端

3.1 RPCServer

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

  • RPCServer

3.2 思考

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

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

3.3 RequestHandler

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

人性的拷问

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

看看之后的设计

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

  1. RPCServer 中实现网络层: Netty, 使用RequestHandler
  2. ServiceRegister 模块实现服务注册、发布。
  3. RequestHandler 中实现消息协议处理、过程调用

代码实现

  • 首先,用户需要设置你的端口和协议哦

以上就是有关RPC框架的学习知识笔记,希望可以对大家学习RPC有帮助,喜欢的小伙伴可以帮忙进行转发+关注,感谢大家!LZ也会不定时更新干货的!

原文链接:
https://www.tuicool.com/articles/ju2UBfM

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值