
在微服务架构下,课程服务与用户服务通过**RESTful HTTP同步调用(结合服务发现与负载均衡)和消息队列(如RabbitMQ)异步通信(采用至少一次投递AT模式)**实现,数据格式采用JSON(易解析)或Protobuf(高并发),并通过重试、熔断、消息确认、死信队列等机制保障调用可靠性。
老师:微服务通信的核心是“解耦+可靠”,分两种方式:
GET /users/{userId}?courseId={courseId}获取用户信息。数据格式JSON易读,Protobuf序列化效率高。可靠性:配置指数退避的重试策略(避免频繁请求导致雪崩)、熔断器(调用失败超阈值降级)。| 通信方式 | 定义 | 数据格式 | 响应速度 | 适用场景 | 注意点 |
|---|---|---|---|---|---|
| 同步调用(REST) | 服务间直接请求,等待响应 | JSON(易解析)、Protobuf(高效) | 即时 | 实时查询(如获取用户课程信息) | 需考虑服务降级、熔断,高并发下可能响应慢 |
| 异步调用(消息队列) | 通过消息中间件传递请求,服务异步处理 | JSON/Protobuf(消息体) | 延迟(队列处理速度) | 批量操作、解耦(如课程发布通知) | 需消息确认、死信队列,避免消息丢失 |
场景1:课程服务调用用户服务获取用户信息(同步REST)
请求:
GET /users/123?courseId=001
Host: user-service
Authorization: Bearer token
响应(JSON):
{
"userId": "123",
"username": "张三",
"courses": [
{
"courseId": "001",
"courseName": "Java基础",
"status": "已报名"
}
]
}
场景2:课程服务通过消息队列通知用户(异步)
课程服务发送消息(RabbitMQ):
{
"type": "courseNotify",
"userId": "123",
"courseId": "001",
"action": "publish"
}
用户服务消费消息并处理(如发送邮件/短信)。
(约90秒)
“在微服务架构下,课程服务与用户服务通信通常采用RESTful HTTP同步调用(结合Nacos服务注册与Ribbon负载均衡)和消息队列(如RabbitMQ)异步通信(采用AT模式确保消息不丢失)。数据格式主要用JSON(易解析),或者Protobuf(高并发下效率更高)。对于实时查询,比如获取用户课程信息,课程服务会调用用户服务的REST接口,通过HTTP GET请求,携带用户ID和课程ID参数,获取用户信息后返回。对于批量或解耦场景,比如课程发布后通知用户,会通过消息队列发送消息,用户服务异步处理。可靠性方面,同步调用会配置指数退避的重试策略(避免频繁请求导致雪崩),异步调用会确保消息至少投递一次(通过消息确认机制),并设置TTL和死信队列处理异常。总结来说,通过混合使用同步和异步通信,结合服务发现、负载均衡、重试、熔断、消息确认等机制,保证服务间调用的可靠性和性能。”