通信:消息

背景

你已经使用了微服务架构。服务需要处理来自应用客户端的请求。将来,服务有时必须协作起来处理这些请求。他们必须采用一种内部通信协议。

限制

解决方案

使用异步消息来进行内部服务通信。服务间通过消息队列交换消息来进行通信。

示例

有几种异步消息技术的例子:

微服务示例应用中的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() {}

}

结果

这个模式有以下优势:

  • 由于将客户端与服务端解耦,因此它是松散耦合的
  • 由于消息中间件缓存了消息,知道消费者处理它,因此提高了可用性
  • 支持各种各样的通信模式,包括请求 / 回复,通知,请求 / 异步响应,发布 / 订阅,发布 / 异步响应等等

这个模式有以下弊端:

  • 消息中间件需要高可用,带来了额外的复杂度

这个模式有以下问题:

  • 请求 / 回复风格的通信更加复杂
  • 客户端需要发现消息中间件的地址

相关模式

参见

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容