
1) 【一句话结论】微服务间通信主要采用RESTful(HTTP+JSON)和gRPC(HTTP2+Protobuf),需通过超时控制、指数退避重试、熔断降级等机制处理网络延迟与超时,并借助断路器、降级、限流等保证服务间容错性,避免级联故障。
2) 【原理/概念讲解】
老师:咱们先讲两种核心通信方式。
GET /api/jobs?status=active请求,响应JSON数据。优点是跨语言支持好(前端JS、后端Java都能用),松耦合;缺点是序列化开销大,网络传输效率低,可能受HTTP 1.1连接复用限制。JobService服务,提供GetJobs RPC方法。优点是序列化快(比JSON小30%)、性能高,支持流式传输;缺点是需要双方都支持Protobuf,跨语言编译依赖工具,对技术栈有要求。网络延迟与超时:实际部署中,网络抖动(如延迟突然增加)会导致请求超时,需合理设置超时时间(如查询操作超时2秒,写入操作1秒),避免客户端长时间阻塞。重试策略:失败后用指数退避(第一次重试1秒,第二次2秒,指数增长),避免短时间内大量重试导致服务器雪崩。容错性:断路器模式(如Hystrix),当服务调用失败次数超阈值(如5次),断路器打开,后续请求直接返回失败或默认值,防止级联故障;结合降级(服务不可用时返回缓存数据),限流(熔断器+限流控制请求速率)。
3) 【对比与适用场景】
| 通信方式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| RESTful | 基于HTTP协议,JSON数据,无状态资源调用 | 跨语言支持好,松耦合,HTTP 1.1连接复用,序列化开销大 | 异构系统集成(如前端调用后端)、轻量级调用(查询、简单操作) | 需考虑HTTP状态码,序列化效率低,不适合高频大流量 |
| gRPC | 基于HTTP/2,Protobuf二进制序列化,流式传输 | 序列化效率高,性能优,支持流式,HTTP/2连接复用 | 高性能场景(实时通信、高频内部调用)、内部服务间通信 | 需支持Protobuf,跨语言编译,对技术栈有要求,HTTP/2需双方配置 |
4) 【示例】
GET /api/jobs?status=active HTTP/1.1
Host: job-service
Accept: application/json
职位服务响应JSON:
[
{"id":1,"title":"后端开发","location":"广州","status":"active"},
...
]
JobService服务:
service JobService {
rpc GetJobs (GetJobsRequest) returns (GetJobsResponse);
}
message GetJobsRequest {
string status = 1;
}
message GetJobsResponse {
repeated Job job = 1;
}
message Job {
int32 id = 1;
string title = 2;
string location = 3;
string status = 4;
}
用户服务调用:
// Java gRPC客户端
JobServiceGrpc.JobServiceBlockingStub stub = JobServiceGrpc.newBlockingStub(channel);
GetJobsResponse response = stub.getJobs(GetJobsRequest.newBuilder().setStatus("active").build());
5) 【面试口播版答案】
“微服务间通信常用RESTful(HTTP+JSON)和gRPC(HTTP2+Protobuf)。RESTful适合异构系统,比如用户服务调用职位服务查职位列表用GET请求;gRPC性能更高,适合高频内部调用。处理网络延迟,设置合理超时(如查询2秒),避免阻塞。重试用指数退避(1秒→2秒),防雪崩。容错性方面,用熔断器(如Hystrix),失败次数超阈值断开调用,返回默认值;结合降级(服务不可用时用缓存数据),保证即使某服务故障,系统仍能运行。”
6) 【追问清单】
7) 【常见坑/雷区】