Java企业级开发实战:基于Spring Cloud Alibaba的微服务架构深度解析
一、微服务架构演进与选型
Spring Cloud Alibaba核心组件:
- Nacos:动态服务发现与配置管理
- Sentinel:流量控制与熔断降级
- Seata:分布式事务解决方案
- RocketMQ:分布式消息队列
- Dubbo:高性能RPC框架
二、项目初始化与基础架构
1. 项目骨架搭建
// 父pom.xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
// 子模块示例(用户服务)
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
2. 项目结构设计
microservice-project/
├── user-service/ # 用户服务
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── example/
│ │ │ │ ├── UserApplication.java
│ │ │ │ ├── controller/
│ │ │ │ ├── service/
│ │ │ │ └── repository/
│ │ │ └── resources/
│ │ │ ├── application.yml
│ │ │ └── bootstrap.yml
├── order-service/ # 订单服务
├── product-service/ # 商品服务
└── gateway/ # API网关
三、核心功能实现
1. Nacos服务注册与发现
// 启动类注解
@SpringBootApplication
@EnableDiscoveryClient
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
// application.yml配置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: dev
group: DEFAULT_GROUP
application:
name: user-service
2. Feign声明式服务调用
@FeignClient(name = "order-service", path = "/orders")
public interface OrderClient {
@GetMapping("/user/{userId}")
List<Order> getOrdersByUser(@PathVariable Long userId);
@PostMapping
Order createOrder(@RequestBody OrderDTO orderDTO);
}
// 使用示例
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private OrderClient orderClient;
@GetMapping("/{id}/orders")
public ResponseEntity<List<Order>> getUserOrders(@PathVariable Long id) {
return ResponseEntity.ok(orderClient.getOrdersByUser(id));
}
}
四、高级功能实现
1. Sentinel流量控制
// 资源定义
@GetMapping("/{id}")
@SentinelResource(value = "userDetail",
blockHandler = "handleBlock",
fallback = "handleFallback")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return ResponseEntity.ok(userService.findById(id));
}
// 流控处理
public ResponseEntity<User> handleBlock(Long id, BlockException ex) {
log.warn("触发流控,用户ID: {}", id);
return ResponseEntity.status(429).build();
}
// 降级处理
public ResponseEntity<User> handleFallback(Long id, Throwable t) {
log.error("服务降级,用户ID: {}", id, t);
return ResponseEntity.ok(User.defaultUser());
}
// 控制台配置规则
@PostConstruct
public void initRules() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("userDetail");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(100); // 阈值
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
2. Seata分布式事务
// 全局事务入口
@RestController
@RequestMapping("/orders")
public class OrderController {
@Autowired
private OrderService orderService;
@PostMapping
@GlobalTransactional
public ResponseEntity<Order> createOrder(@RequestBody OrderDTO dto) {
return ResponseEntity.ok(orderService.create(dto));
}
}
// 服务实现
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private AccountClient accountClient;
@Autowired
private InventoryClient inventoryClient;
@Transactional
public Order create(OrderDTO dto) {
// 1. 扣减库存
inventoryClient.reduce(dto.getProductId(), dto.getQuantity());
// 2. 扣减账户余额
accountClient.debit(dto.getUserId(), dto.getTotalAmount());
// 3. 创建订单
Order order = new Order();
// 设置订单属性...
return orderRepository.save(order);
}
}
五、系统监控与运维
1. Spring Boot Admin集成
// Admin Server配置
@EnableAdminServer
@SpringBootApplication
public class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args);
}
}
// 客户端配置
spring:
boot:
admin:
client:
url: http://localhost:8080
instance:
name: ${spring.application.name}
service-url: http://${spring.cloud.client.ip-address}:${server.port}
2. Prometheus监控指标
// 依赖引入
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
// 配置启用
management:
endpoints:
web:
exposure:
include: health,info,prometheus
metrics:
tags:
application: ${spring.application.name}