Skip to content

Dubbo

Apache Dubbo 是一款微服务开发框架

介绍

Dubbo 架构

Dubbo 抽象架构上分为两层:服务治理抽象控制面Dubbo 数据面

Dubbo 与 Spring Cloud

  • Spring Cloud 只提供抽象模式的定义不提供官方稳定实现,开发者只能寻求类似 Netflix、Alibaba、Azure 等不同厂商的实现套件
  • Dubbo 是在超大规模微服务集群实践场景下开发的框架,是企业级微服务实践方案的整体输出

Dubbo 与 gRPC

  • gRPC 定位为一款 RPC 框架
  • Dubbo 定位是一款微服务开发框架

Dubbo 与 Istio

  • Istio 是 Service Mesh 的开源代表实现,可以用 Istio 控制面治理 Dubbo 服务

应用

部署到虚拟机环境

部署到 Docker 环境

部署到 Kubernetes + Docker 环境

部署到 Kubernetes + Containerd 环境

原理

Dubbo 服务发现原理

Dubbo 提供的是一种 Client-Based 的服务发现机制,依赖第三方注册中心组件来协调服务发现过程,支持常用的注册中心如 Nacos、Consul、Zookeeper 等。

高效地址推送实现 从注册中心视角来看,它负责以应用名 (dubbo.application.name) 对整个集群的实例地址进行聚合,每个对外提供服务的实例将自身的应用名、实例ip:port 地址信息 ( 通常还包含少量的实例元数据,如机器所在区域、环境等) 注册到注册中心

丰富元数据配置 Dubbo3 的完整地址发现过程还有一条额外的元数据通路,我们称之为元数据服务 (MetadataService) ,实例地址与元数据共同组成了消费者端有效的地址列表。

问题

Dubbo 支持那些通信协议?

Dubbo 默认通信协议为 dubbo

Dubbo 框架提供了自定义的高性能 RPC 通信协议:基于 HTTP/2 的 Triple 协议 和 基于 TCP 的 Dubbo2协议。除此之外,Dubbo 框架支持任意第三方通信协议,如官方支持的 gRPC、Thrift、REST、JsonRPC、Hessian2 等,更多协议可以通过自定义扩展实现。

Dubbo 框架不绑定任何通信协议,在实现上 Dubbo 对多协议的支持也非常灵活,它可以让你在一个应用内发布多个使用不同协议的服务,并且支持用同一个 port 端口对外发布所有协议。

REST

REST 协议使用 Jackson 序列化 JSON,JAXB 序列化 XML

如果需要自定义 JacksonObjectMapperProvider ,开发者可以通过实现 com.alibaba.dubbo.common.json.JacksonObjectMapperProvider 接口进行自定义,并在 /META-INF/dubbo/ 中添加文件 com.alibaba.dubbo.common.json.MyJacksonObjectMapperProvider

Dubbo 简易部署包含那几部分?

简易部署包含 注册中心、服务消费者、服务提供者 三部分

Dubbo 作为一款微服务框架,最重要的是向用户提供跨进程的 RPC 远程调用能力。如上图所示,Dubbo 的服务消费者(Consumer)通过一系列的工作将请求发送给服务提供者(Provider)。

为了实现这样一个目标,Dubbo 引入了注册中心(Registry)组件,通过注册中心,服务消费者可以感知到服务提供者的连接方式,从而将请求发送给正确的服务提供者。

Dubbo 默认负载均衡策略是什么?

默认 weighted random 基于权重的随机负载均衡策略

Dubbo 流量管控策略有哪些?

流量管控策略分为:地址发现与负载均衡、基于路由规则的流量管控

地址发现与负载均衡

地址发现支持服务实例动态上下线,负载均衡确保流量均匀的分布到每个实例上。

基于路由规则的流量管控

路由规则对每次请求进行条件匹配,并将符合条件的请求路由到特定的地址子集。 路由规则分为 条件路由规则、标签路由规则、脚本路由规则、动态配置规则

在 Dubbo 中,多个路由器组成一条路由链共同协作,前一个路由器的输出作为另一个路由器的输入,经过层层路由规则筛选后,最终生成有效的地址集合。

如何理解 Dubbo 的限流和熔断?

限流和熔断是构建稳定的微服务集群的关键

限流(流量控制)

流量控制是为 Dubbo 服务提供者设置合理的请求上线阈值

  • 用户预先设定一个固定的限流值,通过集成 Sentinel 等产品实现
  • Dubbo 内置自适应限流方式

熔断(熔断降级)

熔断降级从 Dubbo 服务消费者入手,熔断后直接返回调用失败信息,配合服务降级能力,可继续调用预先设置好的服务降级逻辑,以降级逻辑的结果作为最终调用结果,以更优雅的返回给服务调用方。

  • 通过集成 Sentinel、Hystrix、Resilience4J 来实现服务熔断降级能力

Dubbo 的扩展点有哪些?

Dubbo 从设计上是高度可扩展的

按模块划分扩展点

  • 协议与编码扩展。通信协议、序列化编码协议等
  • 流量管控扩展。集群容错策略、路由规则、负载均衡、限流降级、熔断策略等
  • 服务治理扩展。注册中心、配置中心、元数据中心、分布式事务、全链路追踪、监控系统等
  • 诊断与调优扩展。流量统计、线程池策略、日志、QoS 运维命令、健康检查、配置加载等

按架构层次划分扩展点

  • 协议通信层
  • 流量管控层
  • 服务治理层

Dubbo 的观测服务有哪些?

  • Admin Admin 控制台可视化展示了集群中的应用、服务、实例及依赖关系,支持流量治理规则下发,同时还提供如服务测试、mock、文档管理等提升研发测试效率的工具。
  • Metrics Dubbo 统计了一系列的流量指标如 QPS、RT、成功请求数、失败请求数等,还包括一系列的内部组件状态如线程池数、服务健康状态等。
  • Tracing Dubbo 与业界主流的链路追踪工作做了适配,包括 Skywalking、Zipkin、Jaeger 都支持 Dubbo 服务的链路追踪。
  • Logging Dubbo 支持多种日志框架适配。以 Java 体系为例,支持包括 Slf4j、Log4j2、Log4j、Logback、Jcl 等,用户可以基于业务需要选择合适的框架;同时 Dubbo 还支持 Access Log 记录请求踪迹。

Dubbo 认证鉴权包含哪些方面?

  • 避免通信过程中的中间人攻击,Dubbo 提供了身份认证 (Authentication) 和基于 TLS 的通信链路加密能力
  • 控制服务间的访问鉴权 (Authorization),Dubbo 提供了 mTLS 和权限检查机制

Dubbo 服务网格架构是什么样的?

Dubbo Mesh 的部署架构图

  • 控制面 Istio 作为统一控制面,为集群提供 Kubernetes 适配、服务发现、证书管理、可观测性、流量治理等能力。
  • 数据面 Dubbo 应用实例作为数据面组件,支持两种部署模式
    • Proxy 模式 Dubbo 进程与 Envoy 部署在同一 pod,进出 Dubbo 的流量都经 Envoy 代理拦截,由 Envoy 执行流量管控。
    • Proxyless 模式 Dubbo 进程独立部署,进程间直接通信,通过 xDS 协议与控制面直接交互。

Dubbo Mesh 本身并不绑定任何控制面产品实现,你可以使用 Istio、Linkerd、Kuma 或者任一支持 xDS 协议的控制面产品,对于 Sidecar 亦是如此。

Dubbo 单个服务由什么组成?

接口+分组+版本号

如何动态调整服务超时时间?

动态调整服务超时时间可以在不重启应用的情况下解决一些服务上下游依赖不稳定而导致的调用失败问题

  • 打开 Dubbo Admin 控制台
  • 在左侧导航栏选择【服务治理】>【动态配置】
  • 点击 “创建”,输入服务 org.apache.dubbo.samples.xxx 和新的超时时间如 2000 即可。

配置会将规则发送到服务提供方实例

如何增加重试提高成功率?

  • 打开 Dubbo Admin 控制台
  • 在左侧导航栏选择【服务治理】>【动态配置】
  • 点击 “创建”,输入服务 org.apache.dubbo.samples.xxx 和失败重试次数如 4 即可。

配置会将规则发送到服务消费方实例

如何开启访问日志?

访问日志可以很好的记录某台机器在某段时间内处理的所有服务请求信息,包括请求接收时间、远端 IP、请求参数、响应结果等

  • 打开 Dubbo Admin 控制台
  • 在左侧导航栏选择【服务治理】>【动态配置】
  • 点击 “创建”,输入应用名 xxx 并勾选 “开启访问日志”(此时访问日志将和普通日志打印在一起)。

如何开启同机房/区域优先?

  • 登录 Dubbo Admin 控制台
  • 在左侧导航栏选择【服务治理】>【条件路由】
  • 点击 “创建” 按钮,填入要启用同区域优先的服务如 org.apache.dubbo.samples.xxx 与 区域标识 如 region 即可。

如何设置标签实现流量隔离环境?

  • 打开 Dubbo Admin 控制台
  • 在左侧导航栏选择【服务治理】>【标签路由】
  • 点击 “创建”,输入服务 xxx 和流量隔离条件保存即可。

如何设置请求参数引导流量分布?

  • 打开 Dubbo Admin 控制台
  • 在左侧导航栏选择【服务治理】>【参数路由】
  • 点击 “创建” 按钮,输入。

如何设置权重值的比例流量转发?

  • 打开 Dubbo Admin 控制台
  • 在左侧导航栏选择【服务治理】>【动态配置】
  • 点击 “创建”,输入要调整的 org.apache.dubbo.samples.xxx 、目标实例匹配条件和权重值。

如何设置服务降级?

  • 打开 Dubbo Admin 控制台
  • 在左侧导航栏选择【流量管控】>【服务降级】
  • 点击 “创建”,输入服务 org.apache.dubbo.samples.xxx 和降级规则。

Seata 是什么?

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

Dubbo 常用 HTTP 网关产品有哪些?

Apache APISIX、Apache ShenYu、Higress

配置中心包含什么数据?

  • 外部化配置:启动配置的集中式存储 (简单理解为 dubbo.properties 的外部化存储)。
  • 流量治理规则

元数据中心包含什么数据?

  • 地址发现元数据
  • 服务运维元数据

注册中心包含什么数据?

  • 服务地址