基于 Spring Cloud Alibaba 构建企业级微服务平台
深入讲解 Nacos 服务发现与配置中心、OpenFeign 声明式调用、Gateway 网关路由、Sentinel 流量控制等核心组件,配合实战案例完整落地微服务体系。
当单体应用规模不断扩大时,会面临代码耦合严重、团队并行开发困难、技术栈单一、部署风险高等问题。微服务架构将系统拆分为一组小型、自治的服务,每个服务围绕业务能力构建,独立部署、独立扩展,使用最适合的技术栈。
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 让你可以用声明式接口调用远程服务,就像调用本地方法一样简洁:
@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");
}
};
}
}
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 提供流量控制、熔断降级、系统负载保护等功能。通过注解方式即可实现细粒度的限流:
@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 提供 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);
}
}