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

RPC

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

你以为,设计一个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. 某个服务出了问题怎么办?监控 ..

一、 从使用者考虑

定义过程接口

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

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

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

二、设计客户端

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

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

思考

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

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

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

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

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

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

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

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

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

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

  • 问题:

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

设计客户端协议层

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

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

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

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

  • 客户端完整类图

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

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

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

  • 参数序列化、反序列

三、设计服务端

3.1 RPCServer

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

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

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

  • RPCServer

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

3.2 思考

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

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

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

3.3 RequestHandler

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

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

人性的拷问

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

看看之后的设计

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

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

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

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

代码实现

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

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

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

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

猜你喜欢

转载自blog.csdn.net/Ppikaqiu/article/details/113938246