Spring Cloud 学習ノート [サービスの登録と発見 - Eureka]

サービスガバナンスとは

サービス ガバナンスは、分散システム内の個々のサービスを管理および制御する方法です。分散システムでは、各サービスが異なるチームや企業によって開発、保守、展開される可能性があるため、サービス間の相互運用性と安定性を確保するためのメカニズムが必要です。
サービス ガバナンスには次の側面が含まれます。

  • サービスの登録と検出: サービス プロバイダーはサービスをサービス レジストリに登録でき、サービス コンシューマはレジストリから必要なサービスを見つけることができます。
  • 負荷分散: サービス ガバナンスは、特定のサービス インスタンスの過負荷または過小負荷を回避するために、さまざまなサービスの負荷状況に応じてリクエストをさまざまなサービス インスタンスに割り当てることができます。
  • ヒューズと低下: サービスが失敗したり応答が遅くなった場合、サービス ガバナンスによって、サービスの障害や遅延が、ヒューズや低下によってシステム全体に影響を与えるのを防ぐことができます。
  • API 管理: サービス ガバナンスは、サービス API を管理および制限し、サービス プロバイダーによる API の悪用を防止し、サービス利用者のデータ セキュリティを保護します。
  • 監視と警報: サービス ガバナンスは、サービスの実行状態を監視して警報し、潜在的な問題を適時に発見して対処し、システムの安定性と信頼性を確保します。

サービス ガバナンスは重要な分散システム管理方法であり、システムの信頼性と保守性を効果的に向上させ、システムの運用と保守のコストを削減できます。

サービスの登録と検出とは何ですか

サービスの登録と検出は、マイクロサービス アーキテクチャの非常に重要な部分であり、サービス間の通信の問題を解決します。分散システムでは、サービス提供者は自身のサービス情報をサービスレジストリに登録する必要があり、サービス利用者はサービスレジストリから呼び出す必要のあるサービス情報を取得することで、サービス間の通信を実現します。サービス登録センターは、サービスプロバイダーの名前、住所、ポート番号などの情報を含むサービスの「イエローページ」とみなすことができ、サービス利用者はサービス登録センターに問い合わせることでサービスプロバイダーの情報を取得できます。 。

Eureka の観点から見ると、サービス登録とは、サービス プロバイダーの情報を Eureka レジストリに登録することです。サービス提供者は、起動時にエウレカ登録センターに登録要求を送信し、自身のサービス情報(サービス名、IPアドレス、ポート番号など)をエウレカに登録する必要があります。サービス レジストリは、他のサービス利用者が使用できるようにこれらのサービス情報を保存します。サービス検出とは、サービス利用者が呼び出す必要があるサービス情報を Eureka レジストリから取得することを意味します。サービス利用者は、Eureka レジストリの REST API を通じてサービス プロバイダーの情報をクエリして、サービス間の呼び出しを実装できます。

Eureka のサービス登録および検出メカニズムは、サービスの動的な拡張と縮小を実現することができ、サービスプロバイダーのインスタンス数が変更された場合、Eureka は登録センターのサービス情報を自動的に更新し、サービス利用者は最新のサービス情報を取得できるため、可用性を確保できます。サービスの。Eureka は自己保護メカニズムも提供しており、サービス プロバイダーに障害が発生したり、ネットワークが変動したりした場合に、利用できないサービスを自動的に回復および削除することで、サービスの信頼性と堅牢性を向上させることができます。
ここに画像の説明を挿入

エウレカ 2つのコンポーネント

Eureka は 2 つの主要コンポーネントで構成されます。

  • Eureka サーバー: Eureka サーバーはサービス登録センターです。すべてのサービス インスタンスは、自身の情報を Eureka サーバーに登録し、登録情報の有効性を維持するために Eureka サーバーに定期的にハートビートを送信する必要があります。Eureka サーバーは、すべてのサービス インスタンスの登録情報を維持し、クライアントがサービス情報をクエリするための REST API インターフェイスを提供します。

  • エウレカ クライアント: エウレカ クライアントは、サービス プロバイダーおよびサービス コンシューマであり、サービス プロバイダーは、起動時に自身のサービス情報を Eureka サーバーに登録し、登録情報の有効性を維持するために定期的にハートビートを送信します。サービス コンシューマは、Eureka クライアントを通じてサービス プロバイダーの情報を照会し、負荷分散アルゴリズムを通じて呼び出すサービス プロバイダーの 1 つを選択します。

Eureka Server と Eureka Client の間に複数のクラスターを確立して、高可用性と耐障害性を実現できます。Eureka サーバーは相互に登録して、相互接続されたクラスターを形成します。Eureka クライアントがサービスにクエリを実行する場合、まずローカル Eureka サーバーにクエリを実行しますが、ローカル Eureka サーバーに対応するサービス インスタンスがない場合は、他の Eureka サーバーの登録情報をクエリします。Eureka は、さまざまなシナリオのニーズを満たすために、セキュリティ認証、自己保護メカニズム、マルチデータセンターのサポートなど、いくつかの高度な機能も提供します。

エウレカビルド

スタンドアロンの Eureka サーバーを構築する

新しいモジュールcloud-eureka-server7001
ここに画像の説明を挿入
pom.xml

<dependencies>
        <!--eureka-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!--boot web actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--图形监控,以后的swagger和Hystrix要用的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--一般通用配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>

アプリケーション.yml

server:
  port: 7001

eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  client:
    #false表示不向注册中心注册自己。
    register-with-eureka: false
    #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    fetch-registry: false
    service-url:
      #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
      defaultZone: http://${
    
    eureka.instance.hostname}:${
    
    server.port}/eureka/

開始クラス Eureka7001Application

@SpringBootApplication
@EnableEurekaServer
public class Eureka7001Application {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(Eureka7001Application.class, args);
    }
}

テストの開始
http://localhost:7001/ にアクセスすると、次のように表示され、eureka サーバーが正常に起動したことがわかります。
ここに画像の説明を挿入
次に、サービスを登録します。

エウレカクライアント登録

前の 2 つのデモ サービスの auth と user を変換し、Eureka に登録します。

ユーザーサービス

pom.xml は eureka-client 依存関係を追加します

<!--eureka-client-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

application.yml に eureka 設定を追加

eureka:
  instance:
    # 配置eureka的状态显示
    hostname: localhost
    instance-id: ${
    
    eureka.instance.hostname}:${
    
    spring.application.name}:${
    
    server.port}
  client:
    #表示是否将自己注册进EurekaServer默认为true。
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

スタートアップクラスにアノテーションを追加する

@SpringBootApplication
@EnableEurekaClient
public class UserApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(UserApplication.class,args);
    }
}

ユーザーサービス

設定はauthのものと同じなので詳しくは書きません

単一点テスト

まず Eureka7001Application サーバーを起動し、
次に 2 つの Eureka クライアントを起動します。
ここに画像の説明を挿入
サービスが正常に登録されました

クラスター Eureka Server を構築する

Eureka 登録センターのクラスターを構築して、負荷分散とフォールト トレランスを実現します。cloud
-eureka-server7001 を参照し、新しい cloud-eureka-server7002 を作成します。

ホスト ファイル C:\Windows\System32\drivers\etc を変更し、マッピングを追加して、効果を簡単に確認できるようにインスタンス名を区別します。

  • 127.0.0.1 eureka7001.com
  • 127.0.0.1 eureka7002.com

application.yml を変更します
。 ホスト名を変更します。
変更: 上記の偽のドメイン名に変更します。
7001サービス:
ここに画像の説明を挿入
7002サービス:
ここに画像の説明を挿入

クラスタ起動テスト

ここに画像の説明を挿入

サブサービスクラスタ構築

ユーザー サービスをクラスターに変換し、サービス名による認証をテストし、ユーザーの複数のサービスを呼び出します。

  • ユーザーサービスを参照すると、
    ここに画像の説明を挿入
    新しい user2 のモジュール application.yml のポートが異なり、その他は同じです
    ここに画像の説明を挿入
  • 次に、すべてのサブサービスのアドレスをカンマで区切ってクラスター アドレスに変更します。
    ここに画像の説明を挿入
  • すべてのサービスを開始します。最初に eureka サーバーを開始する順序に注意し
    ここに画像の説明を挿入
    、3 つのサービスがすべて正常に登録されていることを確認します。

サービスの呼び出しと負荷分散

前回の号では、ユーザー サービスを呼び出す認証が実際にはハードコーディングされました。
ここに画像の説明を挿入

  • eurekaに登録したマイクロサービス名で呼び出すように変更します
    ここに画像の説明を挿入
  • サービスはクラスターであるため、LF-USER の下に複数のサービス (ポート 9001 とポート 9011 上のサービス) があり、 @LoadBalanced アノテーションを使用して RestTemplate にロード バランシング機能を与える必要があり、デフォルトではサービスをポーリングする必要があります。ポート 9001 および 9011。同時に、テストを容易にするために、返された情報にポート番号を追加します。
@Configuration
public class ApplicationContextConfig {
    
    

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
    
    
        return new RestTemplate();
    }

}

テスト効果

最初のリクエスト:
ここに画像の説明を挿入
2 番目のリクエスト:
ここに画像の説明を挿入
これまでのところロード バランシング効果が達成されており、9001/9002 ポートが交互に表示されます。

おすすめ

転載: blog.csdn.net/qq_33129875/article/details/129539437