本文参考官方文档:Spring Cloud Alibaba
1. 简介
Spring Cloud Alibaba 是阿里巴巴开源中间件与 Spring Cloud 体系的融合,提供了微服务开发一站式解决方案。它包含开发分布式应用微服务所需的所有组件,使得开发者可以通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
2. 核心功能
Spring Cloud Alibaba 的核心功能包括:
-
服务限流降级:集成了 Sentinel,用于流量控制、熔断降级和系统负载保护,确保服务的稳定性。
-
服务注册与发现:通过 Nacos 实现服务的注册与发现,适配 Spring Cloud 服务注册与发现标准,并集成了负载均衡组件。
-
分布式配置管理:支持分布式系统中的外部化配置,配置更改时能够自动刷新。
-
消息驱动能力:基于 Spring Cloud Stream 构建消息驱动能力,使用 RocketMQ Binder 完成 Spring Cloud 应用消息的订阅和发布。
-
分布式事务:使用 Seata 解决分布式事务问题,提供高性能且对业务零侵入的解决方案。
-
Dubbo RPC:扩展了 Spring Cloud 服务间调用的通信协议,支持 Apache Dubbo RPC。
3. 核心组件
Spring Cloud Alibaba 的核心组件包括:
-
Sentinel:用于流量控制、熔断降级和系统负载保护,保护服务稳定性。
-
Nacos:动态服务发现、配置管理和服务管理平台,易于构建云原生应用。
-
RocketMQ:开源的分布式消息系统,提供低延迟、高可靠的消息发布与订阅服务。
-
Seata:高性能微服务分布式事务解决方案,易于使用。
-
Dubbo:高性能 Java RPC 框架,支持服务间调用。
4. 架构
Spring Cloud Alibaba 的架构设计旨在简化微服务的开发和部署。通过集成 Nacos 作为服务发现和配置中心,Sentinel 作为流量控制和熔断降级工具,以及 RocketMQ 和 Seata 作为消息和事务处理工具,Spring Cloud Alibaba 提供了一个完整的微服务解决方案。
-
Nacos Discovery:服务注册与发现组件,用于微服务的注册与发现。
-
微服务实例:表示系统中的微服务实例。
-
Sentinel:流量控制与熔断组件,用于保护微服务不被过载。
-
Config:配置管理组件,用于统一管理微服务的配置信息。
-
Seata:分布式事务管理组件,用于协调和管理微服务间的事务。
-
RocketMQ:消息队列组件,用于异步消息传递和解耦服务。
-
Gateway:API 网关组件,用于路由请求和提供统一的入口。
-
业务逻辑:表示微服务中实现的具体业务逻辑。
Spring Cloud Alibaba 通过整合这些组件,为微服务架构提供了一站式的解决方案。
5. 快速开始
5.1 依赖配置
首先,在项目的 pom.xml
文件中添加 Spring Cloud Alibaba 的依赖管理,以及所需的依赖。
XML
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Nacos Discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- Spring Cloud Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
</dependencies>
5.2 搭建服务注册中心(Nacos)
-
下载并启动 Nacos:
-
访问 ++Nacos Releases++ 下载 Nacos。
-
解压后进入
bin
目录,执行启动命令:-
Windows:
startup.cmd -m standalone
-
Linux/Unix/Mac:
sh startup.sh -m standalone
-
-
启动成功后,访问 http://localhost:8848/nacos 进入 Nacos 控制台。
-
5.3 创建服务提供者
5.3.1 添加依赖:
XML
<dependencies>
<!-- Spring Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Nacos Discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
5.3.2 配置 application.properties
:
XML
server.port=8081
spring.application.name=service-provider
spring.cloud.nacos.discovery.server-addr=localhost:8848
5.3.3 创建主应用和提供服务的方法:
java
package com.example.springcloudalibabademo.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
@GetMapping("/hello")
public String hello() {
return "Hello from Provider!";
}
}
6. 生态集成
Spring Cloud Alibaba 特别关注与 Dubbo、RocketMQ 等阿里开源生态工具的无缝对接。以下是如何集成 RocketMQ 的示例。
集成 RocketMQ
- 添加依赖:
XML
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
- 配置
application.properties
:
XML
rocketmq.name-server=localhost:9876
rocketmq.producer.group=my-group
- 生产者和消费者代码示例:
java
@Component
public class RocketMQProducer {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Value("${rocketmq.producer.group}")
private String producerGroup;
@PostConstruct
public void init() {
rocketMQTemplate.setProducerGroup(producerGroup);
}
public void send(String message) {
rocketMQTemplate.convertAndSend("topic-test", message);
}
}
@Component
public class RocketMQConsumer {
@RocketMQMessageListener(topicConstants = "topic-test", consumerGroup = "my-group")
public void receive(String message) {
System.out.println("Received <" + message + ">");
}
}
7. 组件化设计
Spring Cloud Alibaba 的组件化设计和对云原生应用的支持,使其成为构建现代微服务架构的理想选择。以下是如何使用 Spring Cloud Alibaba 组件来构建微服务的示例。
使用 Spring Cloud Gateway
- 添加依赖:
XML
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
- 配置路由规则:
XML
spring.cloud.gateway.routes[0].id=provider-route
spring.cloud.gateway.routes[0].uri=lb://service-provider
spring.cloud.gateway.routes[0].predicates[0]=Path=/api/hello
- 创建 Gateway 应用:
java
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
不积跬步,无以至千里 --- xiaokai