什么是 Dubbo?
Dubbo 是阿里巴巴于 2008 年开源的一款高性能、轻量级 RPC 框架。它致力于提供高可扩展性和可靠消息服务的 SOA(面向服务体系结构) 中间件,可以用于解决分布式架构下的服务治理与远程通信问题。
Dubbo提供了服务注册中心、集群容错、负载均衡等核心特性,使服务调用像本地调用一样透明便捷。官方还提供了 Java、Golang 等多语言 SDK,使其支持更加丰富的服务治理功能。
2017 年, Dubbo 被正式捐献给 Apache 基金会,标志着其进入国际开源社区的新阶段。随后 Dubbo 积极拥抱云原生时代,推出了 Dubbo3、Proxyless Mesh 等新一代微服务解决方案。在易用性、超大规模实践、云原生支持以及安全性等方面进行了重点优化升级。
目前 Dubbo 已在超大规模下的微服务场景中得到成功应用。截止 2022 年 11 月 11 日, Dubbo3 正式取代 HSF 成为阿里微服务架构的标准,电商核心、阿里云等重点系统业务已经全面运行在 Dubbo 3 之上。
Dubbo 与 RPC 的关系
RPC 协议是一种远程过程调用的实现方式。假设现在有两台服务器 A 和 B。部署在 A 服务器上的服务希望调用正在 B 服务器上运行的另一个进程。但由于双方服务并不在一个内存空间而导致无法直接调用,那么就可以使用 RPC 来达到调用效果。
RPC 能够在为双方提供统一接口的前提下隐藏双方内部通信的复杂性,使得开发者只需要关注业务逻辑,而无需关注底层网络通信细节。
Dubbo 本质上是一种 RPC(远程过程调用)框架,让应用程序能够在分布式环境(例如微服务场景)快速构建高可靠性和可扩展性的服务。
Dubbo 采用阻塞 I/O 和线程池的方式实现高并发,同时还支持多种协议和序列化格式的扩展。其生态系统日趋完善,用户社区活跃,被广泛应用于 Web 应用,企业级中间件,大数据等领域。
Dubbo 的核心
Dubbo 的核心功能包括高性能远程通讯、服务注册与发现、负载均衡、服务调用和容错能力,适用于多种语言和多种异构环境的通信。
- 高性能远程通讯:Dubbo 在设计之初的目标就是用于解决阿里巴巴超大规模的电商微服务集群实践。经过近十年的发展,已在各个行业头部企业历经十万、百万规模的微服务实践检验。Dubbo2 是基于 TCP 传输协议之上构建的二进制私有 RPC 通信协议,是一款非常简单、紧凑、高效的通信协议。同时还内置了基于 HTTP/2 的新一代 RPC 通信协议(Triple),在网关穿透性、通用性以及 Streaming 通信上具备优势。
- 服务注册与发现:为了便于管理众多的服务提供者,Dubbo 提供了注册中心作为服务注册与发现的中心化管理工具。Dubbo 支持多种注册中心,如 ZooKeeper、Redis、Consul、Etcd 等。通过注册中心,服务消费者可以自动发现可用的服务提供者,而无需手动配置服务提供者地址,大大降低了服务调用的复杂度。
- 出色的负载均衡:Dubbo 丰富的流量管控规则可以控制服务间的流量走向和 API 调用,基于这些规则可以实现在运行期动态的调整服务行为如超时时间、重试次数、限流参数等,通过控制流量分布可以实现 A/B 测试、金丝雀发布、多版本按比例流量分配、条件匹配路由、黑白名单等,提高系统稳定性。
- 服务调用和容错:Dubbo 通过抽象 Invoker 概念对服务调用过程进行 Interceptor 式拦截,实现调用链路生成、监控等功能,并基于代理机制使远程调用对用户透明化;另一方面,Dubbo 提供超时重试、断路器、故障转移等完善的容错机制,以及线程池隔离、请求并行等手段,极大增强了远程服务调用的稳定性与容错性能,使分布式服务能像本地服务一样可靠。
Dubbo 和 Spring Cloud 区别
Dubbo 是一种 RPC 框架, 而 Spring Cloud 更侧重于微服务全家桶,两者的架构图例如下图所示:
Spring Cloud 是一个完整的微服务框架,它对一些常用的微服务模式做了抽象,例如服务发现、动态配置、异步消息等。同时包括一些批处理任务、定时任务、持久化数据访问等领域也有涉猎。但它仍无法解决大规模服务集群下的实践场景,相比而言 Dubbo 具备高性能的 RPC 协议编码与实现。
深入了解:微服务框架对比:Spring Cloud vs Dubbo
Dubbo 的节点
- Provider:发布服务,并将服务注册到注册中心,等待消费者调用。
- Consumer:从注册中心订阅服务,和服务提供者进行通信,消费服务。
- Registry:记录服务提供者的信息,以及服务提供者和服务消费者之间的关系,帮助消费者发现可用的服务实例。
- Monitor:收集 Dubbo 节点的性能指标、服务调用统计信息等,以便运维人员进行监控和管理。
- Container:服务的运行容器
Dubbo 的框架
Dubbo 的框架 包括了:
- 单一应用框架:适用于流量较小的时候
- 垂直应用框架:适用与流量较大的时候
- 分布式服务架构:适用于垂直应用架构较多的时候
- 流动计算架构:当流量超级大的时候,需要一个调度中心
Dubbo 服务
Dubbo 接口定义
我们可以写一个 sayHello 的方法。
/**
* xml方式服务提供者接口
*/
public interface ProviderService {
String SayHello(String word);
}
接着,定义它的实现类。
/**
* xml方式服务提供者实现类
*/
public class ProviderServiceImpl implements ProviderService{
public String SayHello(String word) {
return word;
}
}
然后,导入 maven 依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ouyangsihai</groupId>
<artifactId>dubbo-provider</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https: //mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.5</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
</project>
发布 Dubbo 接口
接口写完之后,需要进行接口的发布,这样才能访问到此接口。
package com.sihai.dubbo.provider;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import com.alibaba.dubbo.container.Main;
import com.sihai.dubbo.provider.service.ProviderService;
import com.sihai.dubbo.provider.service.ProviderServiceImpl;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
* xml方式启动
*
*/
public class App
{
public static void main( String[] args ) throws IOException {
//加载xml配置文件启动
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/provider.xml");
context.start();
System.in.read(); // 按任意键退出
}
}
启动 Dubbo 服务
最后就是启动 Dubbo 服务,看到以下 log,说明启动成功。
使用 Apifox 调试 Dubbo 接口
调试 Dubbo 可类比为调用 RPC 的服务。我们需要使用专业的 API 管理工具发起接口请求,今天我选择了 Apifox 来进行请求,因为它支持中文,且免费使用。
- 集成了 API 文档、API 调试、API Mock、API 自动化测试 API 一体化协作平台
- 拥有更先进的 API 设计/开发/测试工具
- Apifox = Postman + Swagger + Mock + JMeter
新建一个 Dubbo 项目
调试 Dubbo 接口前需要在 Apifox 中新建项目,并填写好对应的名称。
新建 Dubbo 接口
点击新建 Package 选项。
然后添加一个 Service。
调试 Dubbo 接口
先点击 Service 下某个方法的环境配置按钮。
然后配置并保存服务器地址。
最后点击“调用”按钮并得到返回结果。