[翻訳]マイクロサービスデザインパターン-4。サービスディスカバリ-クライアントサービスディスカバリ

元のアドレス:https//microservices.io/patterns/client-side-discovery.html

サービスは相互に呼び出す必要があります。モノリシックアーキテクチャでは、サービス間の呼び出しは、プログラミング言語レベルのメソッド呼び出しを介して直接行われます。従来の分散アプリケーションのデプロイメントでは、サービスアドレスとポートは事前に固定および予測されるため、それらを直接呼び出すために必要なのは、単純なHTTP / REST呼び出しまたはその他のRPCメカニズムのみです。ただし、現在のクラウドネイティブマイクロサービスシステムでは、ほとんどのマイクロサービスが特定の仮想マシンまたは特定のコンテナで実行されており、サービスインスタンスの数、サービスのアドレスとポートは固定されていません。これらのサービスは理解できます。インスタンスはすべて一時的なものです。したがって、サービスクライアントが動的に変化する一時的なサービスインスタンスのグループにリクエストを送信できるようにするメカニズムを実装する必要があります。

画像

質問を送信する

サービスのクライアント、APIゲートウェイ、またはサービスインスタンスを検出する必要があるその他のサービスは、どのようにしてサービスインスタンスの場所を知ることができますか?

考慮事項

  • サービスの各インスタンスは、HTTP / RESTやThriftなどの特定の場所(ホストとポート)でリモートAPIを公開します。
  • サービスインスタンスの数とその場所は動的に変化します
  • 仮想マシンとコンテナには通常、動的IPアドレスが割り当てられます
  • サービスインスタンスの数は動的に変化する可能性があります。たとえば、AWSのEC2自動スケーリンググループは、LOAD(ロード)に基づいてインスタンスの数を動的に調整できます。

解決

サービスを要求する場合、クライアントはパブリックサービスレジストリ(サービスレジストリ、通常はレジストリと呼びます)にクエリを実行して、呼び出されるサービスのインスタンスとアドレスの場所を確認します。以下に示すように:

画像

例えば

ここでは、Scala言語、Spring Boot、Spring Cloudフレームワークを例として使用します。SpringCloudのサービス検出は、主にクライアントサービス検出に基づいています。

RegistrationServiceProxyは、ユーザーの登録に使用されるアプリケーションのコンポーネントです。

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

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

  override def registerUser(emailAddress: String, password: String): Either[RegistrationError, String] = {

      val response = restTemplate.postForEntity(userRegistrationUrl,
        RegistrationBackendRequest(emailAddress, password),
        classOf[RegistrationBackendResponse])
       ...
}

このクラスが注入されRestTemplate、およびuser_registration_urlアプリケーションがデプロイされている場合、user_registration_url実際にhttp://REGISTRATION-SERVICE/userREGISTRATION-SERVICEそれはサービス名サービスの発見を作るために使用されるクライアントです。サービス検出は、レジストリとしてのEurekaを含むNetflix OSSコンポーネント、およびHttpリクエスト呼び出しを行うためのインスタンスを取得するためにEurekaにクエリを実行するためのリボンを介して実現されます。

クライアントサービスディスカバリは、構成にさまざまなSpringCloudアノテーションを使用します。

@Configuration
@EnableEurekaClient
@Profile(Array("enableEureka"))
class EurekaClientConfiguration {

  @Bean
  @LoadBalanced
  def restTemplate(scalaObjectMapper : ScalaObjectMapper) : RestTemplate = {
    val restTemplate = new RestTemplate()
    restTemplate.getMessageConverters foreach {
      case mc: MappingJackson2HttpMessageConverter =>
        mc.setObjectMapper(scalaObjectMapper)
      case _ =>
    }
    restTemplate
  }

@EnableEurekaClientEurekaクライアントが有効になっています。リモート呼び出しEurekaリボンクライアントサービスディスカバリを使用する@LoadBalancedようにRestTemplateすでに構成されている注釈構成したがって、RestTemplateをhttp://REGISTRATION-SERVICE/user解決してサービスの名前を取得し、Eurekaにリクエストをクエリして利用可能なネットワークロケーションサービスインスタンスを探します。

分析

クライアントサービス検出の利点:

  • サーバー側のサービス検出と比較して、ネットワーク中間コンポーネントとネットワークジャンプが少なくなります

クライアントサービスディスカバリのデメリット:

  • 登録センターと連携して、異なる登録センターの登録ロジックは異なります。
  • さまざまな言語でクライアントサービス検出ロジックを実装する必要があります。

関連するデザインパターン

  • サービスレジストリ(サービスレジストリ、レジストリとも呼ばれます)
  • マイクロサービスの基本フレームワーク
  • サーバー側のサービス検出は、このデザインパターンの代替手段です

おすすめ

転載: blog.51cto.com/11418075/2659735