本文详细介绍了如何利用 SpringCloud Alibaba 构建和使用基于 SpringCloud 的微服务开发框架。该框架集成了阿里云的多个产品,如 Nacos、Sentinel 和 Seata,为开发者提供了一站式的微服务解决方案。文章不仅讲解了环境搭建、服务注册与发现、分布式事务和配置管理等关键步骤,还通过具体代码示例帮助读者更好地理解这些概念。
SpringCloud Alibaba 是基于 SpringCloud 构建的微服务开发框架,由阿里巴巴开源并维护。该框架集成了阿里云的多个产品,如 Nacos、Sentinel、Seata 等,为开发者提供了构建微服务应用的一站式解决方案。SpringCloud Alibaba 为微服务架构提供了服务注册与发现、配置管理、分布式事务、负载均衡、断路器等功能,极大地简化了微服务的开发和维护过程。
@SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
为了能够顺利开发使用 SpringCloud Alibaba 的微服务应用,首先需要准备开发工具、配置本地环境,并选择合适的 SpringBoot 和 SpringCloud 版本。
IntelliJ IDEA:推荐使用 IntelliJ IDEA 作为开发工具,它提供了强大的代码编辑、调试、测试等功能,支持 SpringBoot 和 SpringCloud 项目开发。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
``
JAVA_HOME
,例如:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH
MAVEN_HOME
,例如:
export MAVEN_HOME=/usr/share/maven export PATH=$MAVEN_HOME/bin:$PATH
java -version
和 mvn -version
,验证 JDK 和 Maven 是否安装成功。java -version mvn -version
SpringCloud版本:选择与 SpringBoot 版本兼容的 SpringCloud 版本,当前推荐使用 SpringCloud 2021.0.0 版本。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.0</version> <relativePath/> <!-- lookup parent from repository --> </parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在本节中,我们将通过具体步骤创建一个简单的 SpringCloud Alibaba 应用,包括创建父工程和子模块(服务提供者和服务消费者),并搭建服务提供者和服务消费者的代码和配置。
创建父工程:
spring-cloud-alibaba-parent
。<groupId>com.example</groupId> <artifactId>spring-cloud-alibaba-parent</artifactId> <version>1.0.0</version> <packaging>pom</packaging> <modules> <module>service-provider</module> <module>service-consumer</module> </modules>
service-provider
模块,该模块提供服务。service-consumer
模块,该模块消费服务。pom.xml 配置:
service-provider
模块的 pom.xml 中,添加 SpringCloud Alibaba 依赖。
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 其他依赖 --> </dependencies>
配置文件 application.yml:
server: port: 8080 spring: application: name: service-provider cloud: nacos: discovery: server-addr: 127.0.0.1:8848
编写服务提供者的代码:
创建一个简单的 Controller,提供一个 REST API。
package com.example.serviceprovider; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ProviderController { @Value("${server.port}") private String port; @GetMapping("/provider") public String getProvider() { return "Hello, I'm provider. Port: " + port; } }
pom.xml 配置:
service-consumer
模块的 pom.xml 中,添加 SpringCloud Alibaba 依赖。
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 其他依赖 --> </dependencies>
配置文件 application.yml:
server: port: 8081 spring: application: name: service-consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848
编写服务消费者的代码:
创建一个简单的 Controller,调用服务提供者的 REST API。
package com.example.serviceconsumer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class ConsumerController { @Autowired private LoadBalancerClient loadBalancer; @GetMapping("/consumer") public String getConsumer() { ServiceInstance serviceInstance = loadBalancer.choose("service-provider"); String serviceUrl = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/provider"; return new RestTemplate().getForObject(serviceUrl, String.class); } }
在本节中,我们将介绍如何使用 Nacos 进行服务注册与发现,并集成 Nacos 到服务提供者和服务消费者。
Nacos 是一个动态服务发现、配置管理和服务管理平台,支持大规模服务架构的动态服务发现和配置管理。Nacos 提供了服务注册与发现、配置管理、服务管理等功能,支持多种编程语言和框架。
安装Nacos:
docker run -d --name nacos-server -p 8848:8848 -p 8849:8849 nacos/nacos-server:latest
registry.conf
和 file.conf
):
[registry] type = consul server-addr = 127.0.0.1:8500
服务提供者集成Nacos:
service-provider
模块的 pom.xml 中添加依赖。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848
service-consumer
模块的 pom.xml 中添加依赖。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848
在本节中,我们将介绍如何使用 Seata 实现分布式事务,并集成 Seata 到服务提供者和服务消费者。
Seata 是阿里巴巴开源的分布式事务解决方案,它通过一个分布式事务中间件,实现了全局事务管理功能。Seata 支持多种编程模型,包括 AT(自动提交)、Saga(链式事务)、XA(两阶段提交)等,适用于各种微服务架构。
下载和安装Seata:
wget https://github.com/seata/seata/releases/download/1.5.0/seata-server-1.5.0.zip unzip seata-server-1.5.0.zip cd seata-server-1.5.0
registry.conf
和 file.conf
):
[registry] type = consul server-addr = 127.0.0.1:8500 application-id = service-provider
sh ./bin/seata-server.sh -m standalone -p 8091
服务提供者集成Seata:
service-provider
模块的 pom.xml 中添加 Seata 依赖。
<dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>1.5.0</version> </dependency>
seata: enabled: true service: vgroup-mapping: default: load-balance: random registry: group: default enable: true server-list: 127.0.0.1:8091 application-id: service-provider transaction-service-group: DefaultTransactionServiceGroup
service-consumer
模块的 pom.xml 中添加 Seata 依赖。
<dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>1.5.0</version> </dependency>
seata: enabled: true service: vgroup-mapping: default: load-balance: random registry: group: default enable: true server-list: 127.0.0.1:8091 application-id: service-consumer transaction-service-group: DefaultTransactionServiceGroup
在本节中,我们将介绍如何使用 SpringCloud Alibaba Config 管理配置,以及如何使用 RocketMQ 消息队列。
SpringCloud Alibaba Config 提供了集中式、分布式的配置管理功能,支持动态刷新配置。
config-server
。config-server
的 pom.xml 中添加依赖。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
spring: application: name: config-server cloud: nacos: config: server-addr: 127.0.0.1:8848 namespace: your-namespace auto-refresh-enabled: true refresh-enabled: true group: DEFAULT_GROUP
application.properties
。
spring.application.name=service-provider server.port=8080
service-provider
和 service-consumer
模块的 pom.xml 中添加依赖。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
spring: cloud: nacos: config: server-addr: 127.0.0.1:8848 namespace: your-namespace auto-refresh-enabled: true refresh-enabled: true group: DEFAULT_GROUP
RocketMQ 是一款分布式消息队列,适用于大规模、高并发、高可靠的消息传输场景。
创建消息生产者和消费者:
创建一个简单的消息生产者和消费者,使用 RocketMQ 提供的客户端 API。
import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.common.message.Message; public class SimpleProducer { public static void main(String[] args) throws Exception { DefaultMQProducer producer = new DefaultMQProducer("TestProducer"); producer.setNamesrvAddr("127.0.0.1:9876"); producer.start(); Message message = new Message("TestTopic", "TestTag", "Hello, RocketMQ!".getBytes()); producer.send(message); producer.shutdown(); } }
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; public class SimpleConsumer { public static void main(String[] args) throws Exception { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("TestConsumer"); consumer.setNamesrvAddr("127.0.0.1:9876"); consumer.subscribe("TestTopic", "*"); consumer.registerMessageListener((msgs, context) -> { for (org.apache.rocketmq.common.message.MessageExt msg : msgs) { System.out.println("Received message: " + new String(msg.getBody())); } return MessageListenerConcurrently.ConsumeResult.CONSUME_SUCCESS; }); consumer.start(); } }
public static void main(String[] args) throws Exception { SimpleProducer producer = new SimpleProducer(); producer.main(args); }
public static void main(String[] args) throws Exception { SimpleConsumer consumer = new SimpleConsumer(); consumer.main(args); }
通过以上步骤,可以轻松搭建一个基于 SpringCloud Alibaba 的微服务架构,利用 Nacos 进行服务注册与发现,Seata 实现分布式事务,RocketMQ 作为消息队列,SpringCloud Alibaba Config 实现配置管理。这有助于构建高性能、高可用、可扩展的微服务应用。