RPC调用-Dubbo

RPC基本概念

微服务在维基上对其定义为:一种软件开发技术- 面向服务的体系结构(SOA)架构样式的一种变体,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。所以微服务之间日常调用一般用的都是RestFul,比如Feign、Ribbon等。国内厂商阿里巴巴提供了同样轻量级的通信另一种解决方案:RPC通信方式,Dubbo是其中的代表。
RPC是指远程过程调用(Remote Procedure Call)的缩写,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务 A、B 部署在两台不同的机器上,那么服务 A 如果想要调用服务 B 中的某个方法该怎么办呢?使用 RestFul_请求_ 当然可以,但是相对RestFul,RPC采用长链接机制,性能更高延时更低,RPC 与 RESTful 最大的不同是,RPC 采用客户端(Client) - 服务端(Server) 的架构方式实现跨进程通信,实现的通信协议也没有统一的标准,具体实现依托于研发厂商的设计。
最终解决的问题:让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单。
【云原生】RPC调用-Dubbo-LMLPHP
RPC通信过程

RPC框架包含4个核心的组件,分别是Client ,Server,Client Stub以及Server Stub,这个Stub大家可以理解为存根

  • 客户端(Client),服务的调用方。
  • 服务端(Server),真正的服务提供者。
  • 客户端存根,存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
  • 服务端存根,接收客户端发送过来的消息,将消息解包,并调用本地的方法、

RPC框架要做到最基本的3件事情:
1)服务端如何确定客户端要调用的函数;
在远程调用中,客户端和服务端分别维护一个【ID->函数】的对应表, ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,附上这个ID,服务端通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
2)如何进行序列化和反序列化;
客户端和服务端交互时将参数或结果转化为字节流在网络中传输,那么数据转化为字节流的或者将字节流转换成能读取的固定格式时就需要进行序列化和反序列化,序列化和反序列化的速度也会影响远程调用的效率。
3)如何进行网络传输
多数RPC框架选择TCP作为传输协议,也有部分选择HTTP。如gRPC使用HTTP2。不同的协议各有利弊。TCP更加高效,而HTTP在实际应用中更加的灵活
【云原生】RPC调用-Dubbo-LMLPHP
REST和RPC对比
RESTful 通信更适合调用延时不敏感、短连接的场景。而 RPC 则拥有更好的性能,适用于长连接、低延时系统。两者本质是互补的,并不存在孰优孰劣。在微服务架构场景下,因为大多数服务都是轻量级的,同时 90%的任务通过短连接就能实现,因此日常使用更推荐使用 RESTful 通信。这只是因为应用场景所决定的,并不代表 RPC 比 RESTful 落后。

Dubbo

Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。目前Dubbo已经被Apache收录。官网地址:https://dubbo.apache.org/zh/
Apache Dubbo 提供了六大核心能力:

  • 面向接口代理的高性能 RPC 调用;
  • 智能容错和负载均衡;
  • 服务自动注册和发现;
  • 高度可扩展能力;
  • 运行期流量调度;
  • 可视化的服务治理与运维。
    【云原生】RPC调用-Dubbo-LMLPHP
    Dubbo官方对主要特性说明

【云原生】RPC调用-Dubbo-LMLPHP
Dubbo架构原理图
Dubbo 架构中,包含 5 种角色。

  1. Provider:RPC服务提供者,Provider 是消息的最终处理者。
  2. Container:容器,用于启动、停止 Provider 服务。这里的容器并非 Tomcat、Jetty 等 Web 容器,Dubbo 也并不强制要求 Provider 必须具备 Web 能力。Dubbo 的容器是指对象容器,例如 Dubbo 内置的 SpringContainer 容器就提供了利用 Spring IOC 容器管理 Provider 对象的职能。
  3. Consumer:消费者,调用的发起者。Consumer 需要在客户端持有 Provider 的通信接口才能完成通信过程。
  4. Registry:注册中心,Dubbo 架构中注册中心与微服务架构中的注册中心职责类似,提供了 Dubbo Provider 的注册与发现职能,Consumer通过 Registry 可以获取Provider 可用的节点实例的 IP、端口等,并产生直接通信。需要注意的是,前面我们讲解的 Alibaba Nacos 除了可以作为微服务架构中的注册中心外,同样对自家的 Dubbo 提供了 RPC 调用注册发现的职责,这是其他 Spring Cloud 注册中心所不具备的功能。
  5. Monitor:监控器,监控器提供了Dubbo的监控职责。在 Dubbo 产生通信时,Monitor 进行收集、统计,并通过可视化 UI 界面帮助运维人员了解系统进程间的通信状况。Dubbo Monitor 主流产品有 Dubbo Admin、Dubbo Ops 等。
    【云原生】RPC调用-Dubbo-LMLPHP

Dubbo部署架构
上图完整的描述了 Dubbo 微服务组件与各个中心的交互过程。
以上三个中心并不是运行 Dubbo 的必要条件,用户完全可以根据自身业务情况决定只启用其中一个或多个,以达到简化部署的目的。通常情况下,所有用户都会以独立的注册中心 开始 Dubbo 服务开发,而配置中心、元数据中心则会在微服务演进的过程中逐步的按需被引入进来。

作为一个微服务框架,Dubbo sdk 跟随着微服务组件被部署在分布式集群各个位置,为了在分布式环境下实现各个微服务组件间的协作, Dubbo 定义了一些中心化组件,这包括:

  • 注册中心。协调 Consumer 与 Provider 之间的地址注册与发现
  • 配置中心。
    • 存储 Dubbo 启动阶段的全局配置,保证配置的跨环境共享与全局一致性
    • 负责服务治理规则(路由规则、动态配置等)的存储与推送。
  • 元数据中心。
    • 接收 Provider 上报的服务接口元数据,为 Admin 等控制台提供运维能力(如服务测试、接口文档等)
    • 作为服务发现机制的补充,提供额外的接口/方法级别配置信息的同步能力,相当于注册中心的额外扩展

【云原生】RPC调用-Dubbo-LMLPHP

08-11 14:15