Spring Cloud Alibaba基础教程:与Dubbo的完美融合
📝准备工作
- 👥 f-alibaba-dubbo-client:
客户端 - 🌌 f-alibaba-dubbo-server:
服务端
🌐HTTP 和 HTTPS
| 对比维度 | HTTP | HTTPS |
|---|---|---|
| 安全性 | 明文传输,无加密,易被窃听或篡改 | 基于 SSL/TLS 加密传输,保障机密性、完整性、身份认证 |
| 默认端口 | 80 8080 | 443 443443 |
| URL 前缀 | http:// | https:// |
| 证书要求 | 无需数字证书 | 必须部署由 CA 签发的 SSL/TLS 证书 |
| 协议栈位置 | 应用层,直接运行于 TCP 之上 | 应用层协议,实际运行于TLS/SSL 层之上(即:HTTP → TLS → TCP) |
| 性能开销 | 无加解密开销,延迟略低 | 初始握手有少量计算与往返延迟,但现代优化(如 TLS 1.3、会话复用)已极大缓解 |
✅总体结论:HTTPS 是 HTTP 的安全演进形态,在安全性上实现质的提升,而性能差距在当代基础设施下可忽略;已成为 Web 标准与合规(如 GDPR、PCI-DSS)的强制要求。
🌐 HTTP/REST 与 RPC
| 维度 | RPC(如 Dubbo) | HTTP(如 REST/Feign) |
|---|---|---|
| 定位 | 远程过程调用协议(让远程调用像本地方法一样) | 应用层通信协议(通用、无状态、基于请求-响应模型) |
| 传输层 | 通常基于TCP(长连接、二进制流) | 基于TCP,但语义上是应用层协议(明文/JSON/XML) |
| 数据格式 | 二进制序列化(Hessian2、Kryo、Protobuf)→ 小、快、语言相关 | 文本为主(JSON/XML)→ 可读、通用、跨语言友好 |
| 性能 | ⚡ 高(低序列化开销、连接复用、无 HTTP 头开销) | 🐢 相对低(文本解析慢、Header 冗余、短连接默认) |
| 耦合度 | ⚠️ 较高(强依赖接口定义、序列化协议、注册中心) | ✅ 较低(URL + JSON 即可调用,浏览器/Fiddler 直接测) |
| 典型框架 | Dubbo、gRPC、Thrift | SpringRestTemplate、Feign、Axios、curl |
💡一句话理解:
HTTP 是“打电话说普通话”——通用、易懂、谁都能接;
RPC 是“打电话说密语+专用耳机”——更快更省,但双方得装同款APP、约定暗号。
🚀 代码编写
👥 f-alibaba-dubbo-client
1️⃣ 添加依赖
<!-- 该项目继承的父项目,通常用于继承一些常用的 Maven 配置和依赖版本 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.5.RELEASE</version><!-- 用于指定寻找 parent POM 的方式,这里表示不需要寻找 --><relativePath/></parent><!-- 一些项目属性的配置 --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><!-- 使用的 Java 版本 --><java.version>1.8</java.version></properties><!-- 项目的依赖列表 --><dependencies><!-- 依赖项目的 API 包 --><dependency><groupId>com.didispace</groupId><artifactId>f-alibaba-dubbo-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!-- Spring Boot 的健康检查和监控功能 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Spring Boot 的 Web 功能,用于创建 Web 项目 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Cloud 的 Dubbo 起步依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><!-- Spring Cloud 的 Nacos 服务发现功能 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- Lombok,一个可以简化 Java 代码的工具,如自动生成 getter 和 setter --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version><optional>true</optional></dependency><!-- Spring Boot 的测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!-- 对于多模块的 Maven 项目,用于管理所有子模块共享的依赖版本 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.SR1</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>0.2.2.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>2️⃣ 添加配置信息
# 应用名称,用于注册到服务中心时识别此服务spring.application.name=alibaba-dubbo-client# 服务运行的端口server.port=8002# Nacos 服务注册与发现中心的地址spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848# Dubbo 服务使用的协议名称dubbo.protocol.name=dubbo# Dubbo 服务协议的端口,这里的 -1 表示自动分配端口dubbo.protocol.port=-1# Dubbo 服务注册中心的地址,这里使用的是 Spring Cloud 作为注册中心dubbo.registry.address=spring-cloud://localhost# 服务消费方需要订阅的服务名称列表,这里只订阅了 alibaba-dubbo-server 服务dubbo.cloud.subscribed-services=alibaba-dubbo-server3️⃣ Java代码
这是一个简单的 Spring Boot 应用,它使用 Dubbo 作为 RPC 框架,并利用 Spring Cloud Alibaba 对 Nacos 进行服务注册与发现。
/** * HelloService 接口定义 * 用于描述一个远程服务的契约 */publicinterfaceHelloService{/** * hello 方法定义 * * @param name 接收一个名字作为参数 * @return 返回一个字符串消息 */Stringhello(Stringname);}// 开启服务发现的功能,这使得 Spring Boot 应用能够将自己注册到服务中心@EnableDiscoveryClient// 标识该类为 Spring Boot 的主启动类@SpringBootApplicationpublicclassF_DubboClient{// 应用主入口publicstaticvoidmain(String[]args){SpringApplication.run(F_DubboClient.class,args);}// 使用 Lombok 提供的 Slf4j 注解,自动生成日志对象@Slf4j// 标识该类为 Controller,可以接受 HTTP 请求@RestControllerstaticclassTestController{// 使用 Dubbo 的 @Reference 注解,注入远程的 HelloService 服务@ReferenceHelloServicehelloService;// 定义一个 HTTP GET 请求的处理方法,映射到 "/test" 路径@GetMapping("/test")publicStringtest(){// 调用远程的 HelloService 服务的 hello 方法returnhelloService.hello("yueerba.com");}}}这个应用主要是一个 Dubbo 服务消费者,它调用远程的HelloService服务,并通过 HTTP 接口将结果暴露给外部。
🌌 f-alibaba-dubbo-server
1️⃣ 添加依赖
<!-- 项目的父项目,通常用于提供通用的 Maven 配置 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.5.RELEASE</version><relativePath/><!-- 不需要从仓库查找父 POM --></parent><!-- 项目的一些属性设置 --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><!-- 项目的依赖列表 --><dependencies><!-- 引入项目中定义的 API 包 --><dependency><groupId>com.didispace</groupId><artifactId>f-alibaba-dubbo-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!-- Spring Boot 的运维端点依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Spring Boot 的 Web 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Cloud 对 Dubbo 的支持 --><dependency><groupId>org.springframework.cloud</groupId><!--<groupId>com.alibaba.cloud</groupId>--><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><!-- Spring Cloud Alibaba 对 Nacos 服务发现的支持 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- Lombok 项目,用于简化 Java 代码 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version><optional>true</optional></dependency><!-- Spring Boot 的测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!-- 依赖管理,用于管理项目中的依赖版本 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.SR1</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>0.2.2.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>2️⃣ 添加配置信息
# 应用的名称spring.application.name=alibaba-dubbo-server# 应用的服务端口server.port=8001# Nacos 服务发现的地址spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848# 指定 Dubbo 服务实现类的扫描基准包dubbo.scan.base-packages=com.didispace.alibaba.dubbo.server# Dubbo 服务使用的协议名称dubbo.protocol.name=dubbo# Dubbo 服务协议的端口,-1 表示自动分配端口dubbo.protocol.port=-1# Dubbo 服务的注册中心地址,这里配置为使用 Spring Cloud 的服务注册中心dubbo.registry.address=spring-cloud://localhost3️⃣ Java代码
// 启用服务发现客户端,这样可以让这个服务被 Spring Cloud 的服务注册中心发现@EnableDiscoveryClient// 标明这是一个 Spring Boot 应用@SpringBootApplicationpublicclassF_DubboServer{// 主入口方法publicstaticvoidmain(String[]args){// 启动 Spring Boot 应用SpringApplication.run(F_DubboServer.class,args);}}// 使用 Dubbo 提供的 @Service 注解进行服务的发布// 注意:此处的 @Service 注解并不是 Spring 的,而是来自于 org.apache.dubbo.config.annotation.Service@ServicepublicclassHelloServiceImplimplementsHelloService{// 实现 HelloService 接口中定义的方法@OverridepublicStringhello(Stringname){// 返回欢迎语句return"hello "+name;}}🧪 测试验证
启动 Nacos、服务提供者、服务消费者。在 Nacos 控制台,你可以看到两个新定义的服务。通过调用服务消费者中的/test接口,你可以测试 Dubbo 服务消费。
📌 启动Nacos
startup.cmd-mstandalone#单机startup.cmd-mcluster#集群📌 查看Nacos
http://localhost:8848/nacos/index.html
📌 查看访问/test接口
C:\Users\Administrator>curl localhost:8002/test hello yueerba.com⚡️ Dubbo 功能详解
🔎1. 服务注册与发现
Dubbo 服务可以轻松地与 Nacos 集成,实现服务的注册与发现。这为 Spring Cloud 服务提供了强大的微服务治理能力。
🚀如何使用
添加依赖:
在pom.xml中引入 Spring Cloud Alibaba 官方最新 Starter(2023.1.0+):<!-- ✅ Spring Cloud Alibaba 2023.1.0+ 统一 Starter --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><!-- ✅ Nacos 发现(2023.1.0+) --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>配置 Nacos:
在application.properties中指定注册中心地址:spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
🌟特点与优势
- 中心化管理: 所有服务实例统一注册、可视化监控。
- 动态服务发现: 实例上下线实时同步,客户端自动刷新服务列表。
- 健康检查: Nacos 主动探测实例状态,自动剔除异常节点。
- 高可扩展性: 支持 Nacos 集群部署,适配大规模微服务场景。
📡2. 服务提供与引用
通过 Dubbo 3.3 原生 Spring Boot 支持注解实现声明式服务暴露与消费。
🚀如何使用
提供服务:
使用@DubboService(非@Service)并显式指定接口类型(强类型安全):importorg.apache.dubbo.config.annotation.DubboService;@DubboService(version="1.0.0",group="testGroup")publicclassHelloServiceImplimplementsHelloService{@OverridepublicStringhello(Stringname){return"Hello, "+name;}}引用服务:
使用@DubboReference(非@Reference),支持泛型与超时配置:importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;importorg.apache.dubbo.config.annotation.DubboReference;@RestControllerpublicclassTestController{@DubboReference(interfaceClass=HelloService.class,version="1.0.0",group="testGroup",timeout=3000)privateHelloServicehelloService;@GetMapping("/hello")publicStringsayHello(){returnhelloService.hello("Dubbo");}}
🌟特点与优势
- 零配置接入: 注解驱动,无需 XML 或额外配置类。
- 接口契约强类型: 基于 Java 接口通信,编译期校验方法签名。
- 透明远程调用:
@DubboReference自动生成动态代理,调用如本地方法。 - 内置负载均衡: 多实例间自动分发请求(默认 Random)。
🌀3. 负载均衡
Dubbo 3.3 提供多种策略,支持按需选择,保障流量分发合理性与稳定性。
🚀如何使用
在@DubboReference中指定loadbalance属性:
@DubboReference(interfaceClass=HelloService.class,version="1.0.0",group="testGroup",loadbalance="roundrobin")privateHelloServicehelloService;🌟常见策略
- Random: 随机选取(默认),适用于实例性能均一场景。
- RoundRobin: 轮询调度,保证请求均匀分布。
- LeastActive: 优先分配至活跃请求数最少的实例,适合响应时间差异大场景。
- ConsistentHash: 相同参数请求始终路由至同一实例,支持会话粘连与缓存亲和。
💡价值
- 提升系统容错性与可用性;
- 降低单实例延迟与过载风险;
- 充分利用集群资源,提升吞吐量。
🎯4. 服务版本和分组
支持多版本共存与业务维度隔离,是灰度发布、平滑升级的关键能力。
🚀如何使用
服务提供端指定
version和group:importorg.apache.dubbo.config.annotation.DubboService;@DubboService(version="1.0.0",group="testGroup")publicclassHelloServiceImplimplementsHelloService{...}服务消费端需严格匹配:
@DubboReference(interfaceClass=HelloService.class,version="1.0.0",group="testGroup")privateHelloServicehelloService;
🌟价值
- 版本兼容: 新旧接口并行运行,消费者按需升级,避免强耦合。
- 业务分治: 同一接口按场景分组(如
order-domestic/order-international)。 - 精准路由: 结合 Dubbo Router 实现基于
version/group的灰度或条件路由。
