返回 筑基・网络云路秘径
微服务网络通信模式
博主
大约 4 分钟
微服务网络通信模式
一、问题引入:分布式系统的通信挑战
1.1 真实案例:服务网格化改造
场景:单体应用拆分为50+微服务,通信复杂度激增
问题:服务间调用链路长,故障难以定位
挑战:
┌─────────────────────────────────────────────────────────────┐
│ 通信复杂度: │
│ - 服务间调用关系复杂,形成网状结构 │
│ - 版本兼容性问题 │
│ - 跨语言通信困难 │
├─────────────────────────────────────────────────────────────┤
│ 可靠性问题: │
│ - 网络分区导致服务不可用 │
│ - 级联故障风险 │
│ - 超时和重试策略难以统一 │
├─────────────────────────────────────────────────────────────┤
│ 可观测性问题: │
│ - 调用链路追踪困难 │
│ - 性能瓶颈难以定位 │
│ - 故障排查耗时长 │
└─────────────────────────────────────────────────────────────┘
二、同步通信模式
2.1 RESTful HTTP
/**
* RESTful服务调用
*/
@Service
public class OrderService {
@Autowired
private RestTemplate restTemplate;
public Order getOrder(Long orderId) {
// 同步HTTP调用
ResponseEntity<Order> response = restTemplate.getForEntity(
"http://order-service/orders/{id}",
Order.class,
orderId
);
return response.getBody();
}
}
2.2 gRPC高性能RPC
// 定义服务 service OrderService { rpc GetOrder(GetOrderRequest) returns (Order); rpc CreateOrder(CreateOrderRequest) returns (Order); } message GetOrderRequest { int64 order_id = 1; } message Order { int64 order_id = 1; string status = 2; double amount = 3; }
/**
* gRPC服务实现
*/
@GrpcService
public class OrderGrpcService extends OrderServiceGrpc.OrderServiceImplBase {
@Override
public void getOrder(GetOrderRequest request, StreamObserver<Order> responseObserver) {
Order order = orderRepository.findById(request.getOrderId());
responseObserver.onNext(order);
responseObserver.onCompleted();
}
}
三、异步通信模式
3.1 消息队列
/**
* 事件驱动架构
*/
@Service
public class OrderEventPublisher {
@Autowired
private ApplicationEventPublisher publisher;
public void publishOrderCreated(Order order) {
// 发布异步事件
publisher.publishEvent(new OrderCreatedEvent(order));
}
}
@Component
public class OrderEventListener {
@EventListener
@Async
public void handleOrderCreated(OrderCreatedEvent event) {
// 异步处理:发送通知
notificationService.sendOrderConfirmation(event.getOrder());
}
}
3.2 Saga分布式事务
/**
* Saga模式实现
*/
@Service
public class OrderSaga {
@Autowired
private OrderService orderService;
@Autowired
private PaymentService paymentService;
@Autowired
private InventoryService inventoryService;
@SagaStart
public void createOrder(CreateOrderRequest request) {
try {
// 步骤1:创建订单
Order order = orderService.createOrder(request);
// 步骤2:扣减库存
inventoryService.deductStock(request.getItems());
// 步骤3:处理支付
paymentService.processPayment(order);
} catch (Exception e) {
// 触发补偿
compensateOrder(request);
}
}
@Compensate
public void compensateOrder(CreateOrderRequest request) {
// 补偿逻辑
inventoryService.restoreStock(request.getItems());
}
}
四、服务发现与负载均衡
4.1 Eureka服务注册
/**
* Eureka客户端配置
*/
@SpringBootApplication
@EnableDiscoveryClient
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
@Service
public class ServiceDiscovery {
@Autowired
private LoadBalancerClient loadBalancer;
public String getServiceUrl(String serviceId) {
ServiceInstance instance = loadBalancer.choose(serviceId);
return instance.getUri().toString();
}
}
4.2 Ribbon负载均衡
/**
* 自定义负载均衡策略
*/
@Configuration
public class RibbonConfig {
@Bean
public IRule ribbonRule() {
// 权重响应时间策略
return new WeightedResponseTimeRule();
}
}
五、服务网格(Service Mesh)
5.1 Istio架构
Istio核心组件:
┌──────────────────────────────────────────────────────────────┐
│ │
│ 数据平面(Envoy Sidecar) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Service │◄──►│ Envoy │◄──►│ Service │ │
│ │ A │ │ Sidecar │ │ B │ │
│ └─────────┘ └────┬────┘ └─────────┘ │
│ │ │
│ 控制平面(Istiod) │ │
│ ┌───────────────────┼───────────────────┐ │
│ │ Pilot(流量管理) │ Citadel(安全) │ │
│ │ Galley(配置) │ │ │
│ └───────────────────┴───────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────┘
5.2 Istio流量管理
# VirtualService配置
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: order-service
spec:
hosts:
- order-service
http:
- route:
- destination:
host: order-service
subset: v1
weight: 90
- destination:
host: order-service
subset: v2
weight: 10
timeout: 5s
retries:
attempts: 3
perTryTimeout: 2s
六、通信模式选型
选型指南:
┌──────────────────────────────────────────────────────────────┐
│ │
│ 场景 │ 推荐方案 │
│ ─────────────────┼─────────────────────────────────────── │
│ 实时查询 │ REST/gRPC同步调用 │
│ 异步处理 │ 消息队列(RabbitMQ/Kafka) │
│ 实时推送 │ WebSocket/SSE │
│ 大数据流 │ gRPC Streaming │
│ 跨语言通信 │ gRPC/HTTP REST │
│ 高性能内部通信 │ gRPC │
│ │
└──────────────────────────────────────────────────────────────┘
系列上一篇:长连接与连接池设计
系列下一篇:API网关设计与实现
知识点测试
读完文章了?来测试一下你对知识点的掌握程度吧!
评论区
使用 GitHub 账号登录后即可发表评论,支持 Markdown 格式。
如果评论系统无法加载,请确保:
- 您的网络可以访问 GitHub
- giscus GitHub App 已安装到仓库
- 仓库已启用 Discussions 功能