通信:远程过程调用(RPI)

背景

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

限制

解决方案

使用RPI来进行内部服务通信。客户端采用以请求 / 回复为基础的协议请求其他服务。

示例

有一些RPI技术的例子:

微服务示例程序里的RegistrationServiceProxy是用Scala语言写的一个例子,它用Spring框架的RestTemplate发起REST请求。

@Component
class RegistrationServiceProxy @Autowired()(restTemplate: RestTemplate) extends RegistrationService {

  @Value("${user_registration_url}")
  var userRegistrationUrl: String = _

  @HystrixCommand(commandProperties=Array(new HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="800")))
  override def registerUser(emailAddress: String, password: String): Either[RegistrationError, String] = {
    try {
      val response = restTemplate.postForEntity(userRegistrationUrl,
        RegistrationBackendRequest(emailAddress, password),
        classOf[RegistrationBackendResponse])
      response.getStatusCode match {
        case HttpStatus.OK =>
          Right(response.getBody.id)
      }
    } catch {
      case e: HttpClientErrorException if e.getStatusCode == HttpStatus.CONFLICT =>
        Left(DuplicateRegistrationError)
    }
  }
}

user_registration_url的值通过外部配置提供

结果

这个模式有以下优势:

  • 简单,也被大家熟悉
  • 请求 / 回复机制很简单
  • 由于没有中间件,系统更简单

这个模式有以下弊端:

  • 通常仅仅支持请求 / 回复机制,而不支持其他交互模式,比如通知,请求 / 异步响应,发布 / 订阅,发布 / 异步响应
  • 由于客户端和服务在交互过程中必须可用,因此降低了整体可用性

这个模式有以下问题:

  • 客户端必须发现服务实例的地址

相关模式

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

相关阅读更多精彩内容

友情链接更多精彩内容