查阅了一些资料,站在前人的肩膀上看世界会很美好。
最近一段时间在学习记录Dubbo的一些内容… …
RPC(Remote Procedure Call),远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC简单理解就是在本地调用远端的程序,但是感觉好像是在调用本地的程序一样。
与PRC远程调用对应的是本地调用:
client stub会对RPC调用的过程进行一些封装,包括代理、传递、序列化等,使得用户使用起来,和调用本地程序一样。
知道RPC是怎么一回事了,现在问你如何设计一个RPC框架,该如何设计?(用户调用是无感的哦!)
注册中心&配置中心&监控运维
当然,上述的这些功能是生成环境级别的了。
总结一下一个RPC框架需要做的就是约定通信协议、序列化格式、容错机制、负载均衡策略、监控和运维、注册中心!
注意:RPC是协议,具体的RPC框架是实现。
现在使用较多的RPC框架有:Dubbo、gRPC、Thift、Spring Cloud等。他们之间使用起来都差不多,这里也不做出具体的对比了,很多文章都描述了他们之间的异同。
分布式应用场景有高并发,高可扩展和高性能的要求。还涉及到序列化/反序列化,网络,多线程以及设计模式的问题。幸好 Dubbo 框架将上述知识进行了封装,让程序员能够把注意力放到业务上。
这里推荐一个dubbo入门demo:xxx
上面简单的说了一下RPC的东西,现在就从概念到实体——Dubbo。
Dubbo是阿里巴巴2011年开源的基于Java的RPC框架,中间停止了一段时间的更新维护,2017年开始继续维护,2018年和Dubbox合并,2019年由Apach维护。
Dubbo社区主要维护2.6.x和2.7.x,现在使用比较多的也是2.7.x,3.0的话是2021年推出的新版本(云原生)。
它实现了面向接口的代理RPC调用,可以配合zookeeper等组件实现服务注册和发现功能,且拥有负载均衡、容错机制等。
官网的架构图如下:
角色说明如下:
节点 | 角色说明 |
---|---|
Container | 运行的容器 |
Provider | 服务提供方 |
Registry | 注册中心 |
Consumer | 服务消费方 |
Monitor | 监控中心 |
它整体的流程在图中就是一个很好的呈现:
请注意:
总的而言Dubbo分为三层:Business(业务)、RPC层、Remoting。还可分为API和SPI层。
这三个分层使得Dubbo架构层次分明,职责边界清晰,可实现更好的扩展。另外采用微内核设计+SPI扩展,可以自行扩展,做定制开发。
下面看一下每一层的作用:
序号 | 名称 | 作用 |
---|---|---|
1 | Service | 业务层,开发人员开发的业务逻辑(实际上,开发人员开发过程中只需要关注这一层) |
2 | Config | 配置层,主要围绕ServiceConfig和ReferenceConfig,初始化配置信息 |
3 | Proxy | 代理层,服务方和提供方各自生成代理类,做远程调用和返回结果。 |
4 | Registry | 注册层,封装服务注册和发现 |
5 | Cluster | 路由和集群容错层,负责选取具体调用的节点、负责远程调用失败的容错措施 |
6 | Monitor | 监控层,负责监控统计和调用的时间 |
7 | Protocol | 远程调用层,封装RPC调用,以 Invocation , Result 为中心,扩展接口为 Protocol , Invoker , Exporter |
8 | Exchange | 信息交换层,封装请求响应模式,同步转异步,以 Request , Response 为中心 |
9 | Transport | 网络传输层,抽象 mina 和 netty 为统一接口,想用谁用谁 |
10 | Serialize | 序列化层,将数据序列化/反序列化(序列化成二进制流) |
下图是对上图的解释,其中:
左边是Consumer,右边是Provider,绿色的表示接口,蓝色的表示类,在中轴线上的接口或类双方都使用到,蓝色虚线为初始化过程,红色实线为方法调用过程,紫色实线为继承,线上的文字为调用的方法。
建议手动debug一下这个过程,down官方的实例项目。
$ git clone https://github.com/apache/dubbo.git
调用启动流程图(注意,不要与上面的分层架构图混淆!!!!):
(上面的序号表示启动两个服务后各自模块的执行流程)
首先是图中左上角的服务提供者Provider服务暴露流程(这部分严格来说不在调用过程当中,但是为了全局理解就直接放进了)
再就是右边的消费者Cosumer调用流程了:
调用过程就是如上所示,下面就可以再来看一看Consumer和Provider的依赖关系(清晰很多):
图例说明:
参考:
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/yeahPeng11/article/details/122419764
内容来源于网络,如有侵权,请联系作者删除!