Overview
Spring Cloud Alibaba is a microservices solution provided by Alibaba, offering components such as Nacos (service registration and configuration), Sentinel (traffic control), RocketMQ (message queue), and Seata (distributed transactions).
Core Components
1. Nacos (Service Registration and Configuration Center)
Nacos Server Installation:
# 下载 Nacos
wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz
Extract and Start
tar -xzf nacos-server-2.2.0.tar.gz cd nacos/bin sh startup.sh -m standalone
**服务注册**:
```java
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
application.yml:
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: dev
group: DEFAULT_GROUP
Configuration Management:
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
namespace: dev
group: DEFAULT_GROUP
shared-configs:
- data-id: common-config.yaml
group: DEFAULT_GROUP
refresh: true
Dynamic Configuration Refresh:
@RestController
@RefreshScope
public class ConfigController {
@Value("${app.name:default}")
private String appName;
@GetMapping("/config")
public String getConfig() {
return appName;
}
}
2. Sentinel (Traffic Control)
Dependencies:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
Configuration:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
port: 8719
datasource:
flow:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-flow-rules
groupId: SENTINEL_GROUP
rule-type: flow
Traffic Control:
@Service
public class UserService {
@SentinelResource(value = "getUser", blockHandler = "getUserBlockHandler")
public User getUser(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new UserNotFoundException(id));
}
public User getUserBlockHandler(Long id, BlockException ex) {
return new User(); // 降级处理
}
}
Circuit Breaking and Degradation:
@SentinelResource(
value = "getUser",
fallback = "getUserFallback",
blockHandler = "getUserBlockHandler"
)
public User getUser(Long id) {
// 业务逻辑
}
public User getUserFallback(Long id, Throwable ex) {
// 降级处理
return new User();
}
3. RocketMQ (Message Queue)
Dependencies:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-rocketmq</artifactId>
</dependency>
Configuration:
spring:
cloud:
stream:
rocketmq:
binder:
name-server: localhost:9876
bindings:
output:
producer:
group: user-service-group
Message Sending:
@Service
public class UserService {
private final RocketMQTemplate rocketMQTemplate;
public UserService(RocketMQTemplate rocketMQTemplate) {
this.rocketMQTemplate = rocketMQTemplate;
}
public void sendUserCreatedEvent(User user) {
rocketMQTemplate.convertAndSend("user-topic", user);
}
}
Message Receiving:
@Component
@RocketMQMessageListener(
topic = "user-topic",
consumerGroup = "user-consumer-group"
)
public class UserEventListener implements RocketMQListener<User> {
@Override
public void onMessage(User user) {
// 处理消息
System.out.println("Received user: " + user.getName());
}
}
4. Seata (Distributed Transactions)
Dependencies:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
Configuration:
spring:
cloud:
alibaba:
seata:
tx-service-group: my-tx-group
enabled: true
seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: my-tx-group
config:
type: nacos
nacos:
server-addr: localhost:8848
namespace: ""
group: SEATA_GROUP
registry:
type: nacos
nacos:
server-addr: localhost:8848
namespace: ""
group: SEATA_GROUP
Using @GlobalTransactional:
@Service
public class OrderService {
@GlobalTransactional
public void createOrder(Order order) {
// 1. 创建订单
orderRepository.save(order);
// 2. 扣减库存
productService.reduceStock(order.getProductId(), order.getQuantity());
// 3. 扣减余额
accountService.deductBalance(order.getUserId(), order.getAmount());
}
}
5. Dubbo (RPC Framework)
Dependencies:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
Configuration:
spring:
cloud:
dubbo:
application:
name: user-service
registry:
address: nacos://localhost:8848
protocol:
name: dubbo
port: 20880
Service Provider:
@Service
@org.apache.dubbo.config.annotation.Service
public class UserServiceImpl implements UserService {
public User getUser(Long id) {
return userRepository.findById(id).orElseThrow();
}
}
Service Consumer:
@Service
public class OrderService {
@org.apache.dubbo.config.annotation.Reference
private UserService userService;
public Order createOrder(Long userId, Order order) {
User user = userService.getUser(userId);
// 创建订单逻辑
return order;
}
}
Microservices Architecture Example
Project Structure
microservices/
├── nacos-server/ # Nacos 服务
├── gateway/ # API 网关
├── user-service/ # 用户服务
├── order-service/ # 订单服务
└── product-service/ # 商品服务
Configuration Example
Unified Configuration Management:
# Nacos 配置中心
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
namespace: ${spring.profiles.active}
group: DEFAULT_GROUP
extension-configs:
- data-id: common-datasource.yaml
group: DEFAULT_GROUP
refresh: true
- data-id: common-redis.yaml
group: DEFAULT_GROUP
refresh: true
Best Practices
1. Service Registration
- Use Nacos as the service registry
- Configure appropriate namespaces and groups
- Set up health checks
2. Configuration Management
- Use Nacos Configuration Center for unified management
- Distinguish environment configurations (dev, test, prod)
- Support dynamic refresh
3. Traffic Control
- Use Sentinel for traffic control
- Configure rate limiting, circuit breaking, and degradation rules
- Monitor service invocation status
4. Distributed Transactions
- Use Seata to handle distributed transactions
- Use @GlobalTransactional appropriately
- Avoid long transactions
Common Dependencies
<!-- 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>
<!-- Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- RocketMQ -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-rocketmq</artifactId>
</dependency>
<!-- Seata -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
Example Prompts
- "How to build a microservices architecture using Spring Cloud Alibaba?"
- "How does Nacos configure service registration and configuration management?"
- "How to use Sentinel for traffic control in Spring Cloud Alibaba?"
- "How to use Seata to handle distributed transactions in Spring Cloud Alibaba?"
- "How to configure RocketMQ message queue?"