dubbo和rpc解析
参考 :
https://www.cnblogs.com/twinhead/p/9900605.html (rpc的调用流程)
https://www.jianshu.com/p/1facbe4a35cf (dubbo解析)
https://www.jianshu.com/p/2ad7c7e8bdb1 (dubbo解析)
https://segmentfault.com/a/1190000019896723 (dubbo多种方式代码实现)
1. RPC
什么是RPC ?
rpc的全称是 Remote Procedure Call是一种进程间通信方式 , 他允许程序调用另一个地址空间的过程或函数 , 而不用程序员显示编码这个远程调用的细节 , 即无论是调用本地接口/服务 , 还是远程的接口/服务 , 本质上编写的调用代码基本相同
举例说明 :
有两台服务器A , B , 一个应用部署在A服务器上, 想要调用B服务器上应用提供的函数或方法 , 由于不在一个内存空间 , 不能直接调用 , 这时候就需要通过RPC框架的实现解决 , 像是调用本地函数或方法一样去调用远程的函数或方法
RPC框架实现原理 :
在RPC框架中主要有三个角色 : provider , consumer和Registry
服务提供者启动后主动向注册中心***器ip , port以及提供的服务列表
服务消费者启动时向注册中心获取服务提供方地址列表, 可实现软负载均衡和Failover
节点角色说明 :
- Server : 暴露服务的服务提供方
- Client : 调用远程服务的服务消费方
- Registry : 服务注册与发现的注册中心
RPC调用流程 :
一次完整的RPC调用流程(同步调用) :
- 服务消费方 (client) 以本地调用方式调用服务
- client stub接收到调用后, 负责将方法 , 参数等组装成能够进行网络传输的消息体(序列化)
- client stub找到服务地址 , 并将消息发送到服务端
- server stub收到消息后进行解码
- server stub根据解码结果调用本地服务
- 本地服务执行并将结果返回给server stub
- server stub将返回结果打包成消息并发送给消费方
- client stub接受到消息进行解码
- 服务消费方得到最终结果
2.Dubbo
为什么使用dubbo ?
1
Dubbo技术框架
首先看一张图(摘自官网)
节点角色说明 :
节点 | 角色说明 |
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
整个发布-订阅的过程非常的简单 :
- 启动容器 加载 运行服务提供者
- 服务提供者在启动时 , 在注册中心发布注册自己提供的服务
- 服务消费者在启动时 , 在注册中心订阅自己所需的服务
如果考虑失败或变更的情况 , 就需要考虑下面的过程 :
- 注册中心返回服务提供者地址列表给消费者 , 如果有变更 , 注册中心将基于长链接推送变更数据给消费者
- 服务消费者 , 从提供者地址列表中 , 基于软负载均衡算法, 选一台提供者进行调用 , 如果调用失败, 在选另一台调用
- 服务消费者和提供者 , 在内存中累计调用次数和调用时间 , 定时每分钟发送一次统计数据到监控中心
具体代码实现 : https://segmentfault.com/a/1190000019896723