微服务架构设计与实践
1. 微服务架构概述
微服务架构是一种将单一应用程序划分为一组小型服务的方法,每个服务运行在自己的进程中,服务之间通过轻量级机制(通常是 HTTP API)进行通信。
1.1 微服务 vs 单体架构
| 特性 |
单体架构 |
微服务架构 |
| 代码库 |
单一 |
多个独立 |
| 部署 |
整体部署 |
独立部署 |
| 扩展 |
整体扩展 |
按需扩展 |
| 技术栈 |
统一 |
多样化 |
| 复杂度 |
代码复杂,部署简单 |
代码简单,部署复杂 |
1.2 微服务的优势
- 独立部署:每个服务可以独立开发、部署和扩展
- 技术异构:不同服务可以使用不同的技术栈
- 故障隔离:单个服务故障不会影响整个系统
- 团队自治:小团队负责单个服务,提高开发效率
1.3 微服务的挑战
- 分布式复杂性:网络延迟、分布式事务、服务发现等
- 运维复杂度:需要完善的监控、日志、追踪系统
- 数据一致性:分布式数据管理困难
- 测试复杂度:集成测试和端到端测试复杂
2. 服务拆分策略
2.1 拆分原则
- 单一职责原则:每个服务只负责一个业务领域
- 高内聚低耦合:服务内部功能紧密相关,服务间依赖最小化
- 业务边界清晰:按照业务领域边界划分服务
- 数据独立性:每个服务管理自己的数据
2.2 拆分方法
按业务领域拆分(DDD)
1 2 3 4 5 6 7
| 电商系统示例: ├── 用户服务 (User Service) ├── 商品服务 (Product Service) ├── 订单服务 (Order Service) ├── 库存服务 (Inventory Service) ├── 支付服务 (Payment Service) └── 物流服务 (Logistics Service)
|
按功能拆分
1 2 3 4 5 6
| 内容管理系统示例: ├── 内容服务 (Content Service) ├── 评论服务 (Comment Service) ├── 推荐服务 (Recommendation Service) ├── 搜索服务 (Search Service) └── 通知服务 (Notification Service)
|
3. 服务通信
3.1 同步通信
RESTful API
1 2 3 4 5 6 7 8 9 10 11 12
| @RestController @RequestMapping("/api/orders") public class OrderController {
@Autowired private OrderService orderService;
@PostMapping public Order createOrder(@RequestBody OrderRequest request) { return orderService.createOrder(request); } }
|
gRPC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| syntax = "proto3";
service OrderService { rpc CreateOrder (OrderRequest) returns (OrderResponse); rpc GetOrder (OrderId) returns (Order); }
message OrderRequest { string user_id = 1; repeated OrderItem items = 2; }
message OrderResponse { string order_id = 1; double total_amount = 2; }
|
3.2 异步通信
消息队列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @Component public class OrderEventPublisher {
@Autowired private RabbitTemplate rabbitTemplate;
public void publishOrderCreatedEvent(Order order) { OrderCreatedEvent event = new OrderCreatedEvent(order); rabbitTemplate.convertAndSend("order.exchange", "order.created", event); } }
@Component public class InventoryEventListener {
@RabbitListener(queues = "order.created.queue") public void handleOrderCreated(OrderCreatedEvent event) { inventoryService.deductStock(event.getOrder()); } }
|
事件驱动架构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class OrderCreatedEvent extends DomainEvent { private String orderId; private String userId; private BigDecimal amount; private LocalDateTime createdAt; }
@Component public class OrderCreatedHandler {
@EventListener public void handle(OrderCreatedEvent event) { notificationService.sendOrderConfirmation(event); analyticsService.trackOrder(event); } }
|
4. 服务发现与注册
4.1 Eureka 服务注册中心
1 2 3 4 5 6 7 8 9 10
| server: port: 8761
eureka: instance: hostname: localhost client: register-with-eureka: false fetch-registry: false
|
1 2 3 4 5 6 7 8
| @SpringBootApplication @EnableEurekaClient public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } }
|
4.2 Consul 服务发现
1 2 3 4 5 6 7 8
| spring: cloud: consul: host: localhost port: 8500 discovery: service-name: order-service health-check-interval: 10s
|
5. 负载均衡
5.1 客户端负载均衡(Ribbon)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| @Configuration public class RibbonConfig {
@Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
@Service public class OrderService {
@Autowired private RestTemplate restTemplate;
public User getUser(String userId) { return restTemplate.getForObject( "http://user-service/api/users/{id}", User.class, userId ); } }
|
5.2 Spring Cloud LoadBalancer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| @Configuration public class LoadBalancerConfig {
@Bean @LoadBalanced public WebClient.Builder webClientBuilder() { return WebClient.builder(); } }
@Service public class ProductService {
@Autowired private WebClient.Builder webClientBuilder;
public Mono<Product> getProduct(String productId) { return webClientBuilder.build() .get() .uri("http://product-service/api/products/{id}", productId) .retrieve() .bodyToMono(Product.class); } }
|
6. 服务网关
6.1 Spring Cloud Gateway
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| spring: cloud: gateway: routes: - id: user-service uri: lb://user-service predicates: - Path=/api/users/** filters: - StripPrefix=1 - name: Retry args: retries: 3 statuses: BAD_GATEWAY - id: order-service uri: lb://order-service predicates: - Path=/api/orders/** filters: - StripPrefix=1 - name: CircuitBreaker args: name: orderServiceCircuitBreaker fallbackUri: forward:/fallback
|
6.2 网关过滤器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @Component public class AuthenticationFilter extends AbstractGatewayFilterFactory<Config> {
@Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { ServerHttpRequest request = exchange.getRequest(); String token = request.getHeaders().getFirst("Authorization");
if (token == null || !isValidToken(token)) { ServerHttpResponse response = exchange.getResponse(); response.setStatusCode(HttpStatus.UNAUTHORIZED); return response.setComplete(); }
return chain.filter(exchange); }; } }
|
7. 熔断与限流
7.1 Resilience4j 熔断器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| @Configuration public class Resilience4jConfig {
@Bean public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() { return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id) .circuitBreakerConfig(CircuitBreakerConfig.custom() .failureRateThreshold(50) .waitDurationInOpenState(Duration.ofMillis(1000)) .slidingWindowSize(10) .build()) .timeLimiterConfig(TimeLimiterConfig.custom() .timeoutDuration(Duration.ofSeconds(4)) .build()) .build()); } }
@Service public class PaymentService {
@CircuitBreaker(name = "paymentService", fallbackMethod = "fallbackPayment") public PaymentResult processPayment(PaymentRequest request) { return paymentClient.charge(request); }
public PaymentResult fallbackPayment(PaymentRequest request, Exception ex) { return PaymentResult.failed("Payment service unavailable"); } }
|
7.2 限流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @Component public class RateLimitingFilter extends AbstractGatewayFilterFactory<Config> {
private final RateLimiter rateLimiter = RateLimiter.create(100.0);
@Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { if (!rateLimiter.tryAcquire()) { exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS); return exchange.getResponse().setComplete(); } return chain.filter(exchange); }; } }
|
8. 分布式事务
8.1 Saga 模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| @Component public class OrderSaga {
@Autowired private OrderService orderService; @Autowired private InventoryService inventoryService; @Autowired private PaymentService paymentService;
public void execute(CreateOrderRequest request) { try { Order order = orderService.createOrder(request);
inventoryService.deductStock(order);
paymentService.processPayment(order);
orderService.confirmOrder(order.getId());
} catch (Exception e) { compensate(request); } }
private void compensate(CreateOrderRequest request) { } }
|
8.2 Seata 分布式事务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Service public class BusinessService {
@GlobalTransactional(name = "create-order", rollbackFor = Exception.class) public void purchase(String userId, String commodityCode, int orderCount) { storageService.deduct(commodityCode, orderCount);
orderService.create(userId, commodityCode, orderCount);
accountService.debit(userId, orderCount * price); } }
|
9. 监控与追踪
9.1 Micrometer + Prometheus
1 2 3 4 5 6 7 8 9
| management: endpoints: web: exposure: include: health,info,metrics,prometheus metrics: export: prometheus: enabled: true
|
9.2 Zipkin 分布式追踪
1 2 3 4 5 6
| spring: zipkin: base-url: http://localhost:9411 sleuth: sampler: probability: 1.0
|
1 2 3 4 5 6 7 8
| @Service public class OrderService {
@NewSpan("create-order") public Order createOrder(@SpanTag("userId") String userId, OrderRequest request) { } }
|
10. 容器化与编排
10.1 Dockerfile
1 2 3 4 5 6 7 8 9
| FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/order-service.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
|
10.2 Kubernetes 部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| apiVersion: apps/v1 kind: Deployment metadata: name: order-service spec: replicas: 3 selector: matchLabels: app: order-service template: metadata: labels: app: order-service spec: containers: - name: order-service image: order-service:latest ports: - containerPort: 8080 env: - name: SPRING_PROFILES_ACTIVE value: "prod" --- apiVersion: v1 kind: Service metadata: name: order-service spec: selector: app: order-service ports: - port: 80 targetPort: 8080 type: ClusterIP
|
本文档全面介绍了微服务架构的设计原则、服务拆分策略、通信方式、服务发现、负载均衡、网关、熔断限流、分布式事务、监控追踪以及容器化部署等内容,是微服务开发的完整指南。