背景
你已经使用了微服务架构。服务需要处理来自应用客户端的请求。将来,服务有时必须协作起来处理这些请求。他们必须采用一种内部通信协议。
限制
解决方案
使用异步消息来进行内部服务通信。服务间通过消息队列交换消息来进行通信。
示例
有几种异步消息技术的例子:
微服务示例应用中的UserRegistrationController
是用Scala语言编写的一个例子,它采用Spring框架的RabbitTemplate
,通过RabbitMQ发送消息:
@RestController
class UserRegistrationController @Autowired()(registeredUserRepository: RegisteredUserRepository, rabbitTemplate: RabbitTemplate) {
import MessagingNames._
@RequestMapping(value = Array("/user"), method = Array(RequestMethod.POST))
def registerUser(@Validated @RequestBody request: RegistrationRequest) = {
val registeredUser = new RegisteredUser(null, request.emailAddress, request.password)
registeredUserRepository.save(registeredUser)
rabbitTemplate.convertAndSend(exchangeName, routingKey, NewRegistrationNotification(registeredUser.id, request.emailAddress, request.password))
RegistrationResponse(registeredUser.id, request.emailAddress)
}
@ResponseStatus(value = HttpStatus.CONFLICT, reason = "duplicate email address")
@ExceptionHandler(Array(classOf[DuplicateKeyException]))
def duplicateEmailAddress() {}
}
结果
这个模式有以下优势:
- 由于将客户端与服务端解耦,因此它是松散耦合的
- 由于消息中间件缓存了消息,知道消费者处理它,因此提高了可用性
- 支持各种各样的通信模式,包括请求 / 回复,通知,请求 / 异步响应,发布 / 订阅,发布 / 异步响应等等
这个模式有以下弊端:
- 消息中间件需要高可用,带来了额外的复杂度
这个模式有以下问题:
- 请求 / 回复风格的通信更加复杂
- 客户端需要发现消息中间件的地址
相关模式
参见
- Enterprise Integration Patterns - 全面的消息模式
- 外部配置 提供了消息队列的逻辑名字
网友评论