通信:遠(yuǎn)程過(guò)程調(diào)用(RPI)

背景

你已經(jīng)使用了微服務(wù)架構(gòu)。服務(wù)需要處理來(lái)自應(yīng)用客戶端的請(qǐng)求。將來(lái),服務(wù)有時(shí)必須協(xié)作起來(lái)處理這些請(qǐng)求。他們必須采用一種內(nèi)部通信協(xié)議。

限制

解決方案

使用RPI來(lái)進(jìn)行內(nèi)部服務(wù)通信??蛻舳瞬捎靡哉?qǐng)求 / 回復(fù)為基礎(chǔ)的協(xié)議請(qǐng)求其他服務(wù)。

示例

有一些RPI技術(shù)的例子:

微服務(wù)示例程序里的RegistrationServiceProxy是用Scala語(yǔ)言寫(xiě)的一個(gè)例子,它用Spring框架的RestTemplate發(fā)起REST請(qǐng)求。

@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的值通過(guò)外部配置提供

結(jié)果

這個(gè)模式有以下優(yōu)勢(shì):

  • 簡(jiǎn)單,也被大家熟悉
  • 請(qǐng)求 / 回復(fù)機(jī)制很簡(jiǎn)單
  • 由于沒(méi)有中間件,系統(tǒng)更簡(jiǎn)單

這個(gè)模式有以下弊端:

  • 通常僅僅支持請(qǐng)求 / 回復(fù)機(jī)制,而不支持其他交互模式,比如通知,請(qǐng)求 / 異步響應(yīng),發(fā)布 / 訂閱,發(fā)布 / 異步響應(yīng)
  • 由于客戶端和服務(wù)在交互過(guò)程中必須可用,因此降低了整體可用性

這個(gè)模式有以下問(wèn)題:

  • 客戶端必須發(fā)現(xiàn)服務(wù)實(shí)例的地址

相關(guān)模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容