掘金 后端 ( ) • 2024-04-26 14:07

1、Dubbo介绍

Apache Dubbo是一款高性能、轻量级的开源微服务开发框架,它提供了RPC通信与微服务治理两大关键能力。这意味着,使用Dubbo开发的微服务,将具备相互之间的远程发现与通信能力,同时利用Dubbo提供的丰富服务治理能力,可以实现诸如服务发现、负载均衡、流量调度等服务治理需求。同时Dubbo是高度可扩展的,用户几乎可以在任意功能点去定制自己的实现,以改变框架的默认行为来满足自己的业务需求。

Dubbo提供了构建云原生微服务业务的一站式解决方案,可以使用Dubbo快速定义并发布微服务组件,同时基于Dubbo开箱即用的丰富特性及超强的扩展能力,构建运维整个微服务体系所需的各项服务治理能力,如Tracing、Trasaction等,Dubbo提供的基础能力包括如下几点:

  • 服务发现
  • 流式通信
  • 负载均衡
  • 流量治理
  • 。。。

Dubbo计划提供丰富的多语言客户端实现,其中Java、Golang版本是当前稳定性和活跃度最高的版本。

Dubbo的优势如下:

(1)开箱即用

  • 易用性高,比如Java版本的面向接口代理特性能实现本地透明调用。
  • 功能丰富,基于原生库或轻量扩展即可实现绝大多数的微服务治理能力。

(2)超大规模微服务集群实战

  • 高性能的跨进程通信协议。
  • 地址发现、流量治理层面,轻松支持百万规模集群实例。

(3)企业级微服务治理能力

  • 服务测试
  • 服务Mock

Dubbo中文官网:https://cn.dubbo.apache.org/zh-cn/

1.1 什么是Dubbo

Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。

在云原生时代,Dubbo 相继衍生出了 Dubbo3、Proxyless Mesh 等架构与解决方案,在易用性、超大规模微服务实践、云原生基础设施适配、安全性等几大方向上进行了全面升级。

Dubbo提供了从服务定义、服务发现、服务通信到流量管控等几乎所有的服务治理能力,并且尝试从使用上对用户屏蔽地层细节,以提供更好的易用性。

现在主流的RPC框架包括Dubbo、SpringCloud、hessian、thrift、gRPC等。

1.2 Dubbo关键特性

  • 面向接口代理的高性能RPC调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。
  • 智能容错和负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
  • 服务自动注册和发现:支持多种注册中心服务,服务实例上下线实时感知。
  • 高度可扩展能力:遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。
  • 运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布、同机房优先等功能。
  • 可视化的服务治理与运维:提供丰富服务治理、运维工具,随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

1.3 什么是RPC

在一个JVM进程中,一个类中的方法调用另一个类中的方法是正常的,可以实现的,但如果在多个JVM进程之间互相调用呢?比如有两台计算机A和B,A计算机运行JVM,B计算机也运行JVM,由于业务是运行在不同的计算机和不同的JVM中,所以A和B计算机不能直接通信,要借助RPC技术。

RPC(Remote Procedure Call,远程过程调用)是一种在不同计算机或不同进程之间进行数据通信的技术,使用RPC不需要了解网络底层知识,即可实现远程通信,RPC底层原理是使用Socket实现不同计算机之间的通信。RPC采用服务端/客户端模式,客户端发起请求,而服务端接收请求及处理响应。

1.4 实现RPC的方式

实现RPC通信可以使用以下2种方式。

  • 基于TCP协议实现:自己定制通信协议格式,就像自定义的JSON协议格式一样,使用TCP协议对定制通信进行传输,实现两端通信。
  • 基于HTTP协议实现:自己定制通信协议格式,就像自定义的JSON协议格式一样,使用HTTP协议对定制通信协议进行传输,实现两端通信。

使用TCP与HTTP实现RPC最大的区别就是TCP执行速度要比HTTP快很多,原因是TCP直接使用基于Socket技术进行通信,而HTTP底层虽然也使用Socket技术进行通信,但HTTP协议是“中协议”,通过HTTP协议进入Web容器后还要处理其他的任务,比如Cookie、Session、Application、Filter、Listener等,还有Web容器内自己的业务都需要执行,并没有针对通信的效率进行垂直直接的优化,所以使用TCP协议实现RPC在执行效率上比HTTP快很多。

使用TCP协议实现RPC通信的原理是达到对端后开始解析RPC协议,然后再使用反射技术进行动态调用业务方法。Dubbo框架已经封装了整个RPC通信的过程,可以快速开发分布式系统。Dubbo也成为RPC框架。

点对点的服务通信是Dubbo提供的基本能力,Dubbo以RPC的方式请求数据(Request)发送给后端服务,并接收服务端返回的计算结果(Response)。RPC通信对用户来说是完全透明的,用户无需关心请求是如何发出去的、去到了哪里,每次调用只需要拿到正确的调用结果就行。同步的Request-Response是默认的通信模型,它最简单但却不能覆盖所有的场景。因此,Dubbo提供更丰富的通信模型。

  • 消费端异步请求(Client Side Asynchronous Request-Response)
  • 提供端异步请求(Server Side Asynchronous Request-Response)
  • 消费端请求流(Request Streaming)
  • 提供端响应流(Response Streaming)
  • 双向流式通信(Bidirectional Streaming)

1.5 Dubbo中的五大核心组件

Dubbo具有五大核心组件。

(1)Provider:服务提供者,提供服务。

(2)Consumer:服务消费者,调用服务。

(3)Registry:注册中心,提供服务注册与服务发现。

(4)Monitor:监控中心,提供服务调用次数和调用时间等监控信息。

(5)Container:服务运行容器。

服务发现,即消费端自动发现服务地址列表的能力,是微服务框架需要具备的关键能力,借助于自动化的服务发现,微服务之间可以在无须感知对端部署位置与IP地址的情况下实现通信。

实现服务发现的方式有很多种,Dubbo提供的是一种Client-Based的服务发现机制,通常还需要部署额外的第三方注册中心来协调服务发现过程,如常用的Nacos、Consul、Zookeeper等,Dubbo自身也提供了对多种注册中心组件的封装,用户可以灵活选择。

服务发现的一个核心组件是注册中心,Provider注册地址到注册中心,Consumer从注册中心读取和订阅Provider地址列表。因此,要启用服务发现,需要为Dubbo增加注册中心配置。

Dubbo工作流程如下图。

image-20240408215028448

通信过程分为以下六步

  1. 容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时向注册中心注册自己提供的服务。
  3. 服务消费者在启动时向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给服务消费者,如果有变更,注册中心将基于长连接推送变更数据给服务消费者。注册中心是Dubbo最为核心、基础及重要的模块,它提供了服务注册与服务发现,将服务提供者的信息注册到注册中心中,将服务提供者与服务消费者的信息透明化,实现服务提供者与服务消费者的解耦。服务消费者只需要从注册中心获取服务提供者的信息,比如ip和port,服务消费者就可以调用服务提供者的服务,如果服务提供者的信息发生更改,只需要刷新注册中心里的服务提供者信息,服务消费者就可以感应到这种改变。
  5. 服务消费者从服务提供者地址列表中,会基于软负载均衡算法选择一台服务提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和服务提供者在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。