微服务

Spring Cloud 微服务架构实战

基于 Spring Cloud Alibaba 构建企业级微服务平台

进阶 45 分钟 2026-04-02

涉及技术

Spring Cloud Nacos Gateway Sentinel OpenFeign

文档简介

深入讲解 Nacos 服务发现与配置中心、OpenFeign 声明式调用、Gateway 网关路由、Sentinel 流量控制等核心组件,配合实战案例完整落地微服务体系。

正文内容

为什么需要微服务架构

当单体应用规模不断扩大时,会面临代码耦合严重、团队并行开发困难、技术栈单一、部署风险高等问题。微服务架构将系统拆分为一组小型、自治的服务,每个服务围绕业务能力构建,独立部署、独立扩展,使用最适合的技术栈。

服务注册与发现:Nacos

Nacos 是阿里巴巴开源的服务发现、配置管理和服务管理平台。在微服务架构中,服务实例动态上下线,需要一个注册中心来维护服务地址的实时映射。

// 服务提供者注册到 Nacos
@SpringBootApplication
@EnableDiscoveryClient
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

# application.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: prod
        group: DEFAULT_GROUP

声明式服务调用:OpenFeign

OpenFeign 让你可以用声明式接口调用远程服务,就像调用本地方法一样简洁:

@FeignClient(name = "user-service", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {

    @GetMapping("/api/users/{id}")
    User getUserById(@PathVariable("id") Long id);

    @PostMapping("/api/users")
    User createUser(@RequestBody UserDTO user);
}

// 降级处理
@Component
@Slf4j
public class UserClientFallbackFactory implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable cause) {
        log.error("User service fallback, reason: {}", cause.getMessage());
        return new UserClient() {
            @Override
            public User getUserById(Long id) {
                return User.builder().id(id).name("Unknown").build();
            }
            @Override
            public User createUser(UserDTO user) {
                throw new ServiceUnavailableException("User service is unavailable");
            }
        };
    }
}

API 网关:Spring Cloud Gateway

Gateway 作为系统的统一入口,负责路由转发、鉴权、限流、日志记录等横切关注点:

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("user-service", r -> r.path("/api/users/**")
                .filters(f -> f.stripPrefix(1)
                    .addRequestHeader("X-Gateway", "gateway-v1")
                    .circuitBreaker(config -> config
                        .setName("userCircuitBreaker")
                        .setFallbackUri("forward:/fallback")))
                .uri("lb://user-service"))
            .route("order-service", r -> r.path("/api/orders/**")
                .uri("lb://order-service"))
            .build();
    }
}

流量控制与熔断:Sentinel

Sentinel 提供流量控制、熔断降级、系统负载保护等功能。通过注解方式即可实现细粒度的限流:

@RestController
public class OrderController {

    @SentinelResource(
        value = "createOrder",
        blockHandler = "createOrderBlockHandler",
        fallback = "createOrderFallback"
    )
    @PostMapping("/orders")
    public Order createOrder(@RequestBody OrderDTO dto) {
        return orderService.create(dto);
    }

    public Order createOrderBlockHandler(OrderDTO dto, BlockException ex) {
        log.warn("Order creation blocked: {}", ex.getMessage());
        throw new RateLimitExceededException("Server is busy, please try again later");
    }

    public Order createOrderFallback(OrderDTO dto, Throwable ex) {
        log.error("Order creation failed: {}", ex.getMessage());
        return Order.builder().status(OrderStatus.PENDING).build();
    }
}

分布式事务:Seata

在微服务架构中,一个业务操作往往涉及多个服务的数据更新。Seata 提供 AT、TCC、Saga 和 XA 四种模式,其中 AT 模式对业务代码侵入最小:

@Service
public class BusinessService {

    @Autowired
    private StorageClient storageClient;

    @Autowired
    private OrderClient orderClient;

    @Autowired
    private AccountClient accountClient;

    @GlobalTransactional(name = "purchase-tx", rollbackFor = Exception.class)
    public void purchase(String userId, String commodityCode, int orderCount) {
        // 扣减库存
        storageClient.deduct(commodityCode, orderCount);
        // 创建订单
        orderClient.create(userId, commodityCode, orderCount);
        // 扣减账户余额
        accountClient.debit(userId, totalPrice);
        // 任意步骤失败,全局回滚
    }
}

配置中心动态刷新

将配置外置到 Nacos,支持热更新而无需重启服务:

@RefreshScope
@RestController
public class ConfigController {

    @Value("${app.timeout:5000}")
    private int timeout;

    @Value("${app.feature-flag:false}")
    private boolean featureEnabled;

    @GetMapping("/config")
    public Map<String, Object> getConfig() {
        return Map.of("timeout", timeout, "featureEnabled", featureEnabled);
    }
}