SpringCloud Alibaba学习:从入门到初级应用指南
本文详细介绍了SpringCloud Alibaba学习的相关内容,包括其主要组件和服务治理能力,帮助开发者快速入门并应用于实际项目。文章还提供了具体的入门指南和实践案例,展示了如何构建一个简单的电商系统。
SpringCloud Alibaba学习:从入门到初级应用指南 SpringCloud Alibaba简介SpringCloud Alibaba是什么
SpringCloud Alibaba是阿里巴巴开源的一个基于SpringCloud的微服务解决方案。它提供了微服务架构中常见的功能模块,如服务注册与发现、配置中心、分布式事务等,使得开发者能够更便捷地开发分布式系统。SpringCloud Alibaba为微服务架构提供了全面的支持,包括服务治理、服务监控、熔断降级等。
SpringCloud Alibaba的主要组件
SpringCloud Alibaba主要包括以下几个核心组件:
- Nacos:动态服务发现、配置管理和服务管理,作为SpringCloud Alibaba的服务发现与配置中心。
- Sentinel:一个轻量级的、高性能的分布式服务保护方案,可以快速、有效地保护微服务免受瞬时高流量和复杂连锁错误的影响。
- Seata:一个开源的分布式事务解决方案,旨在提供高性能和可靠性的分布式事务服务。
- RocketMQ:一款分布式消息中间件,用于实现系统间的异步解耦。
- Dubbo:阿里巴巴开源的服务治理框架,用于构建高性能的微服务架构。
- Alibaba Cloud Services:整合了众多阿里巴巴云服务,简化了云服务的使用。
SpringCloud Alibaba的优势和应用场景
SpringCloud Alibaba的优势在于其强大的服务治理能力和全面的微服务支持。它提供了以下几方面的优势:
- 服务注册与发现:通过Nacos实现服务的动态注册与发现,简化了服务间的通信。
- 配置管理:Nacos不仅支持服务注册与发现,还支持动态配置管理,使配置变更可实时生效。
- 分布式事务管理:Seata提供了基于XA和TCC的分布式事务解决方案,确保跨服务的分布式事务的一致性。
- 服务监控和保护:Sentinel提供了实时监控和流量控制功能,确保服务在高负载下的稳定运行。
应用场景包括电商、金融、物流等需要高并发、高性能、高可用性的分布式系统。
快速入门SpringCloud Alibaba准备开发环境
- JDK环境:确保安装了JDK 1.8及以上版本。
- IDE:推荐使用IntelliJ IDEA或者Eclipse等。
- Maven:需要安装Maven 3.0及以上版本。
- Git:用于获取源码。
- Nacos服务:需要启动Nacos服务。可以从Nacos官网下载并安装。
# 启动Nacos服务
sh bin/startup.sh -m standalone
创建第一个SpringCloud Alibaba应用
创建一个简单的SpringCloud Alibaba应用,包含服务提供者和消费者。
- 创建父工程
spring-cloud-alibaba
<groupId>com.example</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>service-provider</module>
<module>service-consumer</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 创建服务提供者
service-provider
<parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>service-provider</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
package com.example.serviceprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, Nacos!";
}
}
}
- 创建服务消费者
service-consumer
<parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>service-consumer</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
package com.example.serviceconsumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
}
package com.example.serviceconsumer;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(value = "service-provider")
public interface ServiceProviderClient {
@GetMapping("/hello")
String hello();
}
package com.example.serviceconsumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private ServiceProviderClient serviceProviderClient;
@GetMapping("/hello")
public String hello() {
return serviceProviderClient.hello();
}
}
部署和运行应用
- 启动Nacos服务:按照上文提到的方式启动Nacos服务。
- 启动服务提供者和消费者:分别在两个不同的IDE窗口或终端中启动
service-provider
和service-consumer
应用。
# 启动服务提供者
mvn spring-boot:run -f service-provider/pom.xml
# 启动服务消费者
mvn spring-boot:run -f service-consumer/pom.xml
- 访问服务:通过浏览器或Postman访问
http://localhost:8081/hello
,可以查看服务消费者调用服务提供者后返回的Hello, Nacos!
。
Nacos简介
Nacos是一个动态服务发现、配置管理和服务管理平台。Nacos提供了以下功能:
- 服务发现:Nacos支持基于DNS和基于API的服务发现,使得微服务之间可以方便地互相调用。
- 配置管理:Nacos可以动态地管理配置文件,支持配置的热更新,使应用在不重启的情况下可以实时获取最新的配置。
- 服务管理:Nacos提供了服务管理功能,可以实时查看服务状态,支持健康检查和故障转移。
使用Nacos进行服务注册与发现
使用Nacos进行服务注册与发现,需要在服务提供者和消费者中启用Nacos服务发现功能。
- 服务提供者的Nacos配置
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
- 服务消费者的Nacos配置
spring:
application:
name: service-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
- 在服务提供者中注册服务
package com.example.serviceprovider;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
Nacos配置管理的基本使用
在服务提供者中使用Nacos进行配置管理。
- 在Nacos控制台中创建配置
在Nacos控制台中创建一个配置,例如application.properties
,设置server.port=8082
。
- 在服务提供者的配置文件中引用Nacos配置
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
namespace: 7b41b03c-1234-4657-9c74-9749c4021111
auto-refresh-enabled: true
- 在服务提供者中读取Nacos配置
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 ConfigController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/config")
@RefreshScope
public String getConfig() {
return "Server port: " + serverPort;
}
}
Seata分布式事务管理
Seata简介
Seata是一个开源的分布式事务解决方案,致力于提供高性能和可靠性的分布式事务服务。它支持XA和TCC两种分布式事务模型,使得开发者能够轻松地构建具有高并发、高性能和高可用性的微服务架构。
Seata的分布式事务模型
Seata支持两种分布式事务模型:
- XA模式:基于XA协议,实现全局事务的提交和回滚。
- TCC模式:Try-Confirm-Cancel模式,由业务服务自己控制事务的提交和回滚。
使用Seata进行分布式事务管理
使用Seata进行分布式事务管理,需要在服务提供者和服务消费者中引入Seata相关依赖,并配置Seata服务器地址。
- 引入Seata依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
- 配置Seata服务器地址
seata:
server:
# Seata服务器地址
service:
vgroup-mapping:
default:
registry:
# Seata服务器地址
address: 127.0.0.1:8091
- 使用TCC模式进行分布式事务管理
package com.example.serviceprovider;
import io.seata.core.context.RootContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TccController {
@Autowired
private TccService tccService;
@GetMapping("/tcc")
public String tcc() {
String xid = RootContext.getXID();
return "TCC Transaction: " + xid;
}
}
package com.example.serviceprovider;
import io.seata.core.context.RootContext;
import org.springframework.stereotype.Component;
@Component
public class TccService {
public void tccTransaction() {
String xid = RootContext.getXID();
// 执行业务逻辑
System.out.println("TCC Transaction: " + xid);
}
}
Dubbo微服务开发
Dubbo简介
Dubbo是阿里巴巴开源的一款分布式服务框架,它提供了高性能的RPC调用和丰富的服务治理特性,使得开发者可以轻松地构建高性能的微服务架构。
使用Dubbo构建微服务
- 引入Dubbo依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
- 配置Dubbo服务
dubbo:
scan:
base-packages: com.example.serviceprovider
registry:
address: nacos://127.0.0.1:8848
application:
name: service-provider
- 定义服务接口
package com.example.serviceprovider;
public interface DemoService {
String sayHello(String name);
}
- 实现服务接口
package com.example.serviceprovider;
import org.springframework.stereotype.Service;
@Service
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello, " + name;
}
}
Dubbo服务的注册与发现
- 服务提供者的注册与发现配置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
- 服务消费者的注册与发现配置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
- 服务消费者的配置
dubbo:
scan:
base-packages: com.example.serviceconsumer
registry:
address: nacos://127.0.0.1:8848
application:
name: service-consumer
- 调用服务
package com.example.serviceconsumer;
import com.example.serviceprovider.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@Autowired
private DemoService demoService;
@GetMapping("/sayHello")
public String sayHello(@RequestParam String name) {
return demoService.sayHello(name);
}
}
实践案例:构建一个简单的电商系统
结合SpringCloud Alibaba构建一个简单的电商系统
构建一个简单的电商系统,包括商品服务、订单服务和支付服务。
系统架构设计
- 商品服务:提供商品信息的查询和更新功能。
- 订单服务:提供订单的创建和查询功能。
- 支付服务:提供支付功能,支持多种支付方式。
服务拆分与实现
商品服务
- 创建商品服务工程
product-service
<parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>product-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: product-service
package com.example.productservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ProductServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ProductServiceApplication.class, args);
}
}
package com.example.productservice;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(value = "product-service")
public interface ProductServiceClient {
@GetMapping("/products")
String getProducts();
}
package com.example.productservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProductController {
@Autowired
private ProductServiceClient productServiceClient;
@GetMapping("/products")
public String getProducts() {
return productServiceClient.getProducts();
}
}
订单服务
- 创建订单服务工程
order-service
<parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>order-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: order-service
package com.example.orderservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
package com.example.orderservice;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(value = "product-service")
public interface ProductServiceClient {
@GetMapping("/products")
String getProducts();
}
package com.example.orderservice;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(value = "order-service")
public interface OrderServiceClient {
@GetMapping("/orders")
String getOrders();
}
package com.example.orderservice;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
@Autowired
private ProductServiceClient productServiceClient;
@Autowired
private OrderServiceClient orderServiceClient;
@GetMapping("/orders")
public String getOrders() {
String products = productServiceClient.getProducts();
String orders = orderServiceClient.getOrders();
return "Products: " + products + ", Orders: " + orders;
}
}
支付服务
- 创建支付服务工程
payment-service
<parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>payment-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: payment-service
package com.example.paymentservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentServiceApplication {
public static void main(String[] args) {
SpringApplication.run(PaymentServiceApplication.class, args);
}
}
package com.example.paymentservice;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(value = "order-service")
public interface OrderServiceClient {
@GetMapping("/orders")
String getOrders();
}
package com.example.paymentservice;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PaymentController {
@Autowired
private OrderServiceClient orderServiceClient;
@GetMapping("/payment")
public String pay() {
String orders = orderServiceClient.getOrders();
return "Payment: " + orders;
}
}
部署和运行应用
- 启动Nacos服务:按照上文提到的方式启动Nacos服务。
- 启动商品服务、订单服务和支付服务:分别在不同的IDE窗口或终端中启动
product-service
、order-service
和payment-service
应用。
# 启动商品服务
mvn spring-boot:run -f product-service/pom.xml
# 启动订单服务
mvn spring-boot:run -f order-service/pom.xml
# 启动支付服务
mvn spring-boot:run -f payment-service/pom.xml
- 访问服务:通过浏览器或Postman访问
http://localhost:8081/payment
,可以查看支付服务调用订单服务后返回的结果。
通过以上步骤,你已经成功构建了一个简单的电商系统,包括商品服务、订单服务和支付服务。这个系统展示了SpringCloud Alibaba在微服务架构中的应用,包括服务发现、服务调用和分布式事务管理等功能。
共同学习,写下你的评论
评论加载中...
作者其他优质文章