微服务间的通信
微服务之间通信主要分两种方式:同步RPC 和异步MQ
同步通信
同步通信是指调用方发起请求,等待服务端返回结果,再继续执行后续逻辑。
RPC 框架:
适用范围:
- 上下文比较依赖这次调用返回的结果,比如登陆,支付,查询等等
RPC的问题:
- 同步执行,可能会阻塞当前调用链,导致整个服务的延迟增加
- 需要服务发现和负载均衡,可以使用consul/etcd/zookeeper
,或者直接使用k8s的service/istio服务网格。 - 需要熔断和限流,可以使用hystrix-go
- 需要链路追踪,已观察每个RPC的调用时长,推荐opentelemetry
- 如果使用grpc,建议引入go-grpc-middleware
,他会提供很多中间件,比如限流,日志,链路追踪等
异步通信:
异步通信是指调用方发起请求,不等待服务端返回结果,直接继续执行后续逻辑。
MQ:
适用范围:
- 各种广播,聊天,watch变化等等用例
MQ的问题:
- 一般是最终一致性,不保证消息的顺序和可靠性
- 消息可能重复,需要幂等处理/过滤重复消息
- 调试难度大,难以跟踪消息的流向,不建议大规模使用
- 有的消息支持request/response模式,但是这里不建议使用,因为调试难度大,不如直接使用RPC框架