微服务架构将单体应用拆分为独立部署的小型服务,服务间通过网络通信协作。服务注册发现解决”如何找到对方”的问题,熔断降级解决”对方不可用时怎么办”的问题。这两套机制是服务治理的核心基础设施,本文从原理到代码实现完整拆解。
服务注册发现机制与Nacos实战
服务注册发现的基本模型:服务启动时向注册中心注册自身地址,调用方从注册中心获取目标服务实例列表,客户端负载均衡选择具体实例发起请求。常见注册中心包括Nacos、Consul、Eureka,这里以Nacos为例。
Spring Boot集成Nacos的服务注册配置:
# application.yml
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: 192.168.1.100:8848
namespace: production
group: DEFAULT_GROUP
weight: 1
metadata:
version: v2.1.0
region: east
server:
port: 8081
服务发现端通过Feign或RestTemplate消费服务:
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
@GetMapping("/api/users/{id}")
UserDTO getUserById(@PathVariable Long id);
@PostMapping("/api/users")
UserDTO createUser(@RequestBody UserCreateRequest request);
@GetMapping("/api/users")
PageResult<UserDTO> listUsers(@RequestParam int page, @RequestParam int size);
}
// 降级实现
@Component
public class UserClientFallback implements UserClient {
@Override
public UserDTO getUserById(Long id) {
// 返回缓存或默认值
return UserDTO.builder()
.id(id)
.name("unknown")
.source("fallback")
.build();
}
@Override
public UserDTO createUser(UserCreateRequest request) {
throw new ServiceException("用户服务暂不可用,请稍后重试");
}
@Override
public PageResult<UserDTO> listUsers(int page, int size) {
return PageResult.empty();
}
}
高并发设计中的客户端负载均衡
注册中心返回的是服务实例列表,具体选择哪个实例由客户端负载均衡器决定。Spring Cloud LoadBalancer支持轮询、随机、基于响应时间的权重策略。
@Configuration
public class LoadBalancerConfig {
@Bean
ReactorLoadBalancer<Instance<?>> reactorServiceInstanceLoadBalancer(
Environment environment,
LoadBalancerClientFactory factory) {
String serviceId = environment.getProperty(
LoadBalancerClientFactory.PROPERTY_NAME);
return new RoundRobinLoadBalancer(
factory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class),
serviceId
);
}
}
在高并发场景下,负载均衡需要考虑实例健康状态和实时负载。配合Spring Cloud的HealthIndicator机制,不健康实例会被自动剔除。对于有状态的实例(如缓存所在节点),可通过metadata标记并通过自定义路由策略优先路由。
熔断器模式:Sentinel实战配置
熔断器模式防止级联故障。当某个服务调用失败率达到阈值时,熔断器打开,后续请求直接快速失败而非等待超时。经过一段恢复时间后进入半开状态,放行少量请求探测服务是否恢复。
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
}
// 熔断规则配置
@PostConstruct
public void initFlowRules() {
// 慢调用比例熔断
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule("getUserById")
.setGrade(CircuitBreakerStrategy.SLOW_CALL_RATIO.getType())
.setCount(500) // 慢调用阈值500ms
.setSlowRatioThreshold(0.6) // 慢调用比例阈值60%
.setMinRequestAmount(10) // 最小请求数
.setStatIntervalMs(10000) // 统计窗口10秒
.setTimeWindow(10); // 熔断持续时间10秒
rules.add(rule);
// 异常比例熔断
DegradeRule exceptionRule = new DegradeRule("createOrder")
.setGrade(CircuitBreakerStrategy.ERROR_RATIO.getType())
.setCount(0.5) // 异常比例阈值50%
.setMinRequestAmount(20)
.setStatIntervalMs(10000)
.setTimeWindow(15);
rules.add(exceptionRule);
DegradeRuleManager.loadRules(rules);
}
分布式事务与服务降级策略
微服务架构中,一个业务操作可能跨多个服务,分布式事务是绕不开的问题。常见方案有TCC、Saga和基于消息中间件的最终一致性方案。以订单创建为例,涉及订单服务、库存服务、支付服务三个环节。
@Service
public class OrderService {
@Resource
private OrderMapper orderMapper;
@Resource
private InventoryClient inventoryClient;
@Resource
private PaymentClient paymentClient;
// Saga模式:正向操作+补偿操作
@Transactional
public Order createOrder(OrderRequest request) {
// 1. 创建订单(状态为PENDING)
Order order = Order.builder()
.userId(request.getUserId())
.productId(request.getProductId())
.amount(request.getAmount())
.status(OrderStatus.PENDING)
.build();
orderMapper.insert(order);
try {
// 2. 扣减库存
inventoryClient.deduct(order.getId(),
request.getProductId(), request.getQuantity());
// 3. 发起支付
PaymentResult result = paymentClient.pay(
order.getId(), order.getAmount());
// 4. 更新订单状态
order.setStatus(OrderStatus.SUCCESS);
orderMapper.updateById(order);
} catch (Exception e) {
// 补偿操作:回滚库存,取消订单
compensationHandler.handle(order, request);
order.setStatus(OrderStatus.FAILED);
orderMapper.updateById(order);
throw new ServiceException("订单创建失败: " + e.getMessage());
}
return order;
}
}
降级策略分读降级和写降级。读降级返回缓存数据或默认值,写降级转换为异步消息暂存后重试。关键原则:核心链路不降级,非核心功能可降级;读操作优先降级,写操作慎降级。
API接口规范与服务治理监控
微服务间的API接口规范影响调用链路的可靠性和可观测性。统一错误码、响应格式和超时设置是基本原则。
// 统一响应格式
@Data
@Builder
public class ApiResponse<T> {
private int code; // 业务码,0表示成功
private String message; // 描述信息
private T data; // 业务数据
private String traceId; // 链路追踪ID
public static <T> ApiResponse<T> success(T data) {
return ApiResponse.<T>builder()
.code(0)
.message("success")
.data(data)
.traceId(MDC.get("traceId"))
.build();
}
public static <T> ApiResponse<T> error(int code, String message) {
return ApiResponse.<T>builder()
.code(code)
.message(message)
.traceId(MDC.get("traceId"))
.build();
}
}
业务中台建设中,集中式配置的超时和重试策略通过线程池隔离或信号量隔离来防止资源耗尽。配合Prometheus + Grafana监控每个服务的QPS、错误率、P99延迟和熔断器状态,形成完整的服务治理闭环。当某个服务频繁触发熔断时,告警推送至应急响应群,结合分布式追踪系统(如SkyWalking)定位根因,这是业务中台稳定性运营的标准流程。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/wei-fu-wu-jia-gou-shi-zhan-fu-wu-zhu-ce-fa-xian-yu-rong/