RPC服务治理框架
文章目录
第二章 RPC服务治理框架
第一节 RPC技术
2.1.1 RPC理论
1. RPC是什么
- RPC(remote procedure call):远程过程调用
- 其中,过程是指业务处理、计算任务,更直白理解,就是程序。(像调用本地方法一样调用远程的过程。)
- RPC采用Client-Server结构,通过request-response消息模式实现。
- RMI(remote method invocation):远程方法调用是OOP领域中RPC的一种具体实现,是Java原生的RPC框架。
- webservice、restful接口调用都是RPC,仅消息的组织方式及消息协议不同。
- 远程过程调用与本地调用相比:速度相对慢、可靠性减弱;
2. RPC的流程
- 客户端处理过程中
调用
Client stub(就像调用本地方法一样),传递参数; - Client stub将参数
编组
为消息,然后通过系统调用向服务端发送消息; - 客户端本地操作系统将消息从客户端机器
发送
到服务端机器; - 服务端操作系统将接收到的数据包
传递
给Server stub; - Server stub
解组
消息为参数; - Server stub
再调用
服务端的过程,过程执行结果以反方向的相同步骤响应给客户端。
3. RPC流程中需要处理的问题
- Client stub、Server stub的开发;
- 参数如何编组为消息,以及解组消息;
- 消息如何发送;
- 过程结果如何表示、异常情况如何处理;
- 如何实现安全的访问控制。
4. RPC协议是什么
- RPC调用过程中需要将参数编组为消息进行发送,接收方需要解组消息为参数,过程处理结果同样需要经编组、解组。消息由哪些部分构成及消息的表示形式就构成了消息协议。
- RPC调用过程中采用的消息协议称为RPC协议。
- RPC协议规定请求、响应消息的格式:
- 在TCP(网络传输控制协议)上可选用或自定义消息协议来完成RPC消息交互
- 我们可以选用通用的标准协议(如:http、https),也可根据自身的需要定义自己的消息协议。
5. 常见RPC协议
6. RPC框架是什么
- 封装好参数编组、消息解组、底层网络通信的RPC程序开发框架,带来的便捷是可以直接在其基础上只需专注于过程代码编写。
- Java领域
-
传统的webService框架
:Apache CXF、Apache Axis2、java自带的JAX-WS等等。webService框架大多基于标准的SOAP协议。 -
新兴的微服务框架
:Dubbo、Spring Cloud、Apache Thrift等等
-
7. 为什么要用RPC
- 服务化
- 可重用
- 系统间交互调用
8. RPC核心概念术语
- Client(客户端)、Server(服务端)、calls(调用)、replies(响应)、service(服务)、programs(程序)、procedures(过程)、version(版本)、marshalling(编组)、unmarshalling(解组)
- 一个网络服务由一个或多个远程程序集构成
- 一个远程程序实现一个或多个远程过程
- 过程、过程的参数、结果在程序协议说明书中定义说明
- 为兼容程序协议变更、一个服务端可能支持多个版本的远程程序
2.1.2 手写RPC框架
1. 从使用者角度开始
- 用户使用RPC框架开发过程时需要做什么?
- 定义过程、定义接口
- 服务端实现过程
- 客户端使用生成的stub代理对象
2. 设计客户端
- 客户端生成过程接口的代理对象
- 设计客户端代理工厂,用JDK动态代理即可生成接口的代理对象。
1)思考
- 在
ClientStubinvocationHandler
中需要完成哪些事情? - 将请求的内容编组为消息这件事由谁来做?
- 消息协议是固定不变的么?它与什么有关?
- 看框架对协议的支持广度,如果支持多种协议,就是会灵活变化的,它与具体的服务相关,A服务提供者可能选用的是协议1,B服务的提供者可能选用协议2。
- 某服务是用的什么消息协议这个信息从哪儿来?
- 从获取的服务信息中来,因此需要一个服务信息发现者。
- 把发现者设计出来,要求:可灵活支持多种发现机制
2)发现者
3)协议层
- 我们想要做到可以支持多种协议,我们的类该如何设计?
- 面向接口、策略模式、组合
- 面向接口、策略模式、组合
问题:
- marshalling 和 unmarshalling 方法该定义怎样的参数与返回值?
- 编组、解组的操作对象是请求、响应,请求、响应的内容是不同的。编组、解组两个方法是否满足?
-
定义框架标准的请求、响应类
-
将协议层方法扩展为四个
-
消息协议独立为一层(客户端、服务端均需要)
4)网络层
- 网络层的工作是什么?
- 发送请求,获得响应。要发起网络请求,则需要知道服务地址。
5)客户端完整类图
- 不同的颜色代表不同的层
6)实现客户端
- 按照类图设计,填码
- 看ClientStubProxyFactory核心类的代码示例
- 在实现过程中,协议层涉及一个重要概念:参数序列化、反序列化
3. 设计服务端
- 客户端请求过来了,服务端首先需要通过RPCServer接收请求。
1)思考
- RPCServer接收到客户端请求后,还需要做哪些工作?
- 网络层在RPCServer中提供多线程来处理请求,消息协议层复用客户端设计的。(设计一个请求处理类,来完成网络层以上的事情。)
2)请求处理类
- RPCServer接收到请求后,将请求交给RequestHandler来处理,RequestHandler调用协议层来解组请求消息为Request对象,然后调用过程。
问题:
- RequestHandler如何得到过程对象?
- Request中有什么?
- 服务名、方法名、参数类型、参数值
- 是否需要一个过程注册模块?
-
过程注册模块
:让用户将他们的过程注册到RPC框架中来。 -
过程暴露模块
:向对外发布(暴露)服务注册、暴露可以由同一个类实现。
3)服务端完整类图
4)实现服务端
- RPCServer中实现网络层:Netty,使用RequestHandler
- ServiceRegister模块实现服务注册、发布。
- RequestHandler中实现消息协议处理、过程调用。
4. 扩展
思考:如何与Spring集成?
- 使用Bean配置,而不使用手动装配