乾物|SpringCloud-Eureka登録センター、サービスプロバイダーおよび消費者

コンテンツのクイックビュー:

1. 登録センター、サービス登録、サービスディスカバリについて

1 Q: 登録センターが必要な理由は何ですか?

マイクロサービスフレームワークの台頭によりサービスノードが増え、サービス間の呼び出しが蜘蛛の巣のように密集していき、単純なファイル構成形式では増加する呼び出し関係に対応できなくなるため、機能的には独立したハイレベル 利用可能な仲介者登録センターが、呼び出す側と呼び出される側の関係を維持します。

2Q: サービス登録とは何ですか?

サービス プロバイダーは、登録センターのサービス リストに独自の情報を書き込みます。登録センターは上記のサービスを定期的に監視して、サービスが稼働しているかどうかを判断し、適時にサービスのトラブルシューティングを行います。

3 Q: サービスディスカバリとは何ですか?

サービスガバナンスフレームワークの下では、サービスコンシューマは呼び出すサービスの名前を登録センターに指示し、登録センターはサービスリストからサービスコンシューマへの実際のアクセス情報を取得します。サービスプロバイダはサービス消費者によって発見され、サービス消費者はサービスプロバイダの情報を能動的に取得することができる。

2. サービス登録とサービス発見を実現するエウレカについて

1. エウレカの特徴

  • Eureka にはサーバー側コンポーネントとクライアント側コンポーネントが含まれており、どちらも Java で開発されているため、Java で実装された分散システムによく適合します。
  • 他の人気のある開発プラットフォームにも Eureka 用のパッケージがあります
  • Eureka は Restful API を提供しており、非 Java 言語は API を通じて独自のクライアント プログラムを実装できます。
  • Eureka は典型的な AP タイプのレジストリであり、サーバーはその強力な一貫性を利用して良好なサービス インスタンスの可用性を提供します。ただし、AP の一般的な状況は、クラスター自体に問題が発生した場合、データの整合性を確保するために外部サービスを提供できなくなり、自己保護モードに入るということです。クラスターデータが同期され、一貫性がある場合、サービスを外部から提供できます。
  • Eureka クライアントは、独自のサービスをレジストリに登録し、サービス ハートビートを通じて契約を更新します。また、定期的にレジストリのサービス リストをローカルにプルし、定期的なキャッシュを実行できます。これは、実際の IP 呼び出しに便利です。ローカルサービス。

次のテストではバージョン情報を使用します。

java11
gradle
springboot:2.3.12.RELEASE
springcloud:Hoxton.SR12

2. エウレカ登録センター

依存関係を追加します。

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
}

サーバーのメインクラスで、Eureka Server を有効にし、@EnableEurekaServer アノテーションを使用して Eureka 登録センター モードを有効にします。

@EnableEurekaServer //一个注解开启Eureka注册中心模式
@SpringBootApplication
public class EurekaserverApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(EurekaserverApplication.class, args);
    }

}

Eureka Server もデフォルトで独自のサービスを登録したいと考えていますが、これは構成によって閉じることができます

public class EurekaClientConfigBean{
    
    
private boolean registerWithEureka = true;
private boolean fetchRegistry = true;
...
}

SpringBootでの設定は以下の通りです。

server:
  port: 8801
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false #关闭自己注册
    fetch-registry: false #关闭拉取注册
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

サービス起動後は、Eureka Serverの管理ページが表示され
ここに画像の説明を挿入
、クライアントの登録情報や、登録されているインスタンスの情報や状態も確認できます。

 ......
2023-06-08 10:31:40.186  INFO 29553 --- [           main] DiscoveryClientOptionalArgsConfiguration : Eureka HTTP Client uses Jersey
2023-06-08 10:31:40.205  WARN 29553 --- [           main] ockingLoadBalancerClientRibbonWarnLogger : You already have RibbonLoadBalancerClient on your classpath. It will be used by default. As Spring Cloud Ribbon is in maintenance mode. We recommend switching to BlockingLoadBalancerClient instead. In order to use it, set the value of `spring.cloud.loadbalancer.ribbon.enabled` to `false` or remove spring-cloud-starter-netflix-ribbon from your project.
2023-06-08 10:31:40.256  INFO 29553 --- [           main] o.s.c.n.eureka.InstanceInfoFactory       : Setting initial instance status as: STARTING
2023-06-08 10:31:40.285  INFO 29553 --- [           main] com.netflix.discovery.DiscoveryClient    : Initializing Eureka in region us-east-1
2023-06-08 10:31:40.285  INFO 29553 --- [           main] com.netflix.discovery.DiscoveryClient    : Client configured to neither register nor query for data.
2023-06-08 10:31:40.294  INFO 29553 --- [           main] com.netflix.discovery.DiscoveryClient    : Discovery Client initialized at timestamp 1686191500293 with initial instances count: 0
2023-06-08 10:31:40.321  INFO 29553 --- [           main] c.n.eureka.DefaultEurekaServerContext    : Initializing ...
2023-06-08 10:31:40.323  WARN 29553 --- [           main] c.n.eureka.cluster.PeerEurekaNodes       : The replica size seems to be empty. Check the route 53 DNS Registry
2023-06-08 10:31:40.338  INFO 29553 --- [           main] c.n.e.registry.AbstractInstanceRegistry  : Finished initializing remote region registries. All known remote regions: []
2023-06-08 10:31:40.339  INFO 29553 --- [           main] c.n.eureka.DefaultEurekaServerContext    : Initialized
2023-06-08 10:31:40.351  INFO 29553 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 2 endpoint(s) beneath base path '/actuator'
2023-06-08 10:31:40.410  INFO 29553 --- [           main] o.s.c.n.e.s.EurekaServiceRegistry        : Registering application UNKNOWN with eureka with status UP
2023-06-08 10:31:40.412  INFO 29553 --- [      Thread-10] o.s.c.n.e.server.EurekaServerBootstrap   : Setting the eureka configuration..
2023-06-08 10:31:40.413  INFO 29553 --- [      Thread-10] o.s.c.n.e.server.EurekaServerBootstrap   : Eureka data center value eureka.datacenter is not set, defaulting to default
2023-06-08 10:31:40.414  INFO 29553 --- [      Thread-10] o.s.c.n.e.server.EurekaServerBootstrap   : Eureka environment value eureka.environment is not set, defaulting to test
2023-06-08 10:31:40.425  INFO 29553 --- [      Thread-10] o.s.c.n.e.server.EurekaServerBootstrap   : isAws returned false
2023-06-08 10:31:40.426  INFO 29553 --- [      Thread-10] o.s.c.n.e.server.EurekaServerBootstrap   : Initialized server context
2023-06-08 10:31:40.426  INFO 29553 --- [      Thread-10] c.n.e.r.PeerAwareInstanceRegistryImpl    : Got 1 instances from neighboring DS node
2023-06-08 10:31:40.426  INFO 29553 --- [      Thread-10] c.n.e.r.PeerAwareInstanceRegistryImpl    : Renew threshold is: 1
2023-06-08 10:31:40.426  INFO 29553 --- [      Thread-10] c.n.e.r.PeerAwareInstanceRegistryImpl    : Changing status to UP
2023-06-08 10:31:40.435  INFO 29553 --- [      Thread-10] e.s.EurekaServerInitializerConfiguration : Started Eureka Server
2023-06-08 10:31:40.446  INFO 29553 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8901 (http) with context path ''
2023-06-08 10:31:40.447  INFO 29553 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8901
2023-06-08 10:31:40.470  INFO 29553 --- [           main] c.l.e.EurekaserverApplication            : Started EurekaserverApplication in 3.977 seconds (JVM running for 4.644)
2023-06-08 10:39:40.450  INFO 29553 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 1ms
2023-06-08 10:40:40.455  INFO 29553 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 4ms
2023-06-08 10:40:43.326  INFO 29553 --- [nio-8901-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-06-08 10:40:43.326  INFO 29553 --- [nio-8901-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-06-08 10:40:43.350  INFO 29553 --- [nio-8901-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 24 ms
2023-06-08 10:40:43.651  INFO 29553 --- [nio-8901-exec-2] c.n.e.registry.AbstractInstanceRegistry  : Registered instance CLIENT1/192.168.2.180:client1:8902 with status UP (replication=false)
2023-06-08 10:41:40.336  WARN 29553 --- [eerNodesUpdater] c.n.eureka.cluster.PeerEurekaNodes       : The replica size seems to be empty. Check the route 53 DNS Registry
2023-06-08 10:41:40.459  INFO 29553 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 2ms
2023-06-08 10:42:40.464  INFO 29553 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 4ms

3. エウレカクライアント

依存関係を追加します。

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}

クライアント構成:

server:
  port: 8902
spring:
  application:
    name: client1 #默认使用服务名称进行访问,所以必须要起一个有指向意义的服务名字
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8901/eureka/
    fetch-registry: true  #默认true
    register-with-eureka: true #默认true

クライアントのメインクラスで、EnableDiscoveryClient アノテーションを使用してサービスの登録と検出を有効にします。

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaclientApplication {
    
    

    public static void main(String[] args){
    
    
        SpringApplication.run(EurekaclientApplication.class,args);
    }
}

DiscoveryClient を使用してサービス リストとサービス インスタンスの詳細を取得します

@Slf4j
@RestController
@RequestMapping("test")
public class TestController {
    
    
    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/service-instances/{applicationName}")
    public List<ServiceInstance> serviceInstancesByApplicationName(@PathVariable String applicationName) {
    
    
        return this.discoveryClient.getInstances(applicationName);
    }

    @GetMapping("/discovery")
    public String discovery() {
    
    
        List<String> serviceNames = discoveryClient.getServices();
        for (String serviceName : serviceNames) {
    
    
            log.info("***** element:" + serviceName);
            List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
            for (ServiceInstance instance : instances) {
    
    
                log.info(instance.toString());
            }
        }
        return "success";
    }
}

サービス インスタンス情報 (後続のサービス呼び出しに必要な IP やポートなどの必要な情報を含む)

[
  {
    
    
    "uri": "http://192.168.2.180:8902",
    "metadata": {
    
    
      "management.port": "8902"
    },
    "port": 8902,
    "host": "192.168.2.180",
    "scheme": "http",
    "secure": false,
    "instanceId": "192.168.2.180:client1:8902",
    "serviceId": "CLIENT1",
    "instanceInfo": {
    
    
      "instanceId": "192.168.2.180:client1:8902",
      "app": "CLIENT1",
      "appGroupName": null,
      "ipAddr": "192.168.2.180",
      "sid": "na",
      "homePageUrl": "http://192.168.2.180:8902/",
      "statusPageUrl": "http://192.168.2.180:8902/actuator/info",
      "healthCheckUrl": "http://192.168.2.180:8902/actuator/health",
      "secureHealthCheckUrl": null,
      "vipAddress": "client1",
      "secureVipAddress": "client1",
      "countryId": 1,
      "dataCenterInfo": {
    
    
        "@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
        "name": "MyOwn"
      },
      "hostName": "192.168.2.180",
      "status": "UP",
      "overriddenStatus": "UNKNOWN",
      "leaseInfo": {
    
    
        "renewalIntervalInSecs": 30,
        "durationInSecs": 90,
        "registrationTimestamp": 1686192043567,
        "lastRenewalTimestamp": 1686192193487,
        "evictionTimestamp": 0,
        "serviceUpTimestamp": 1686192043567
      },
      "isCoordinatingDiscoveryServer": false,
      "metadata": {
    
    
        "management.port": "8902"
      },
      "lastUpdatedTimestamp": 1686192043568,
      "lastDirtyTimestamp": 1686192043464,
      "actionType": "ADDED",
      "asgName": null
    }
  }
]

クライアントが起動すると、クライアントのアクティブな登録のログが表示されます。

.......
2023-06-08 10:40:42.607  INFO 29923 --- [           main] DiscoveryClientOptionalArgsConfiguration : Eureka HTTP Client uses Jersey
2023-06-08 10:40:42.664  WARN 29923 --- [           main] ockingLoadBalancerClientRibbonWarnLogger : You already have RibbonLoadBalancerClient on your classpath. It will be used by default. As Spring Cloud Ribbon is in maintenance mode. We recommend switching to BlockingLoadBalancerClient instead. In order to use it, set the value of `spring.cloud.loadbalancer.ribbon.enabled` to `false` or remove spring-cloud-starter-netflix-ribbon from your project.
2023-06-08 10:40:42.750  INFO 29923 --- [           main] o.s.c.n.eureka.InstanceInfoFactory       : Setting initial instance status as: STARTING
2023-06-08 10:40:42.782  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Initializing Eureka in region us-east-1
2023-06-08 10:40:42.935  INFO 29923 --- [           main] c.n.d.provider.DiscoveryJerseyProvider   : Using JSON encoding codec LegacyJacksonJson
2023-06-08 10:40:42.935  INFO 29923 --- [           main] c.n.d.provider.DiscoveryJerseyProvider   : Using JSON decoding codec LegacyJacksonJson
2023-06-08 10:40:43.056  INFO 29923 --- [           main] c.n.d.provider.DiscoveryJerseyProvider   : Using XML encoding codec XStreamXml
2023-06-08 10:40:43.056  INFO 29923 --- [           main] c.n.d.provider.DiscoveryJerseyProvider   : Using XML decoding codec XStreamXml
2023-06-08 10:40:43.144  INFO 29923 --- [           main] c.n.d.s.r.aws.ConfigClusterResolver      : Resolving eureka endpoints via configuration
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Disable delta property : false
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Single vip registry refresh property : null
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Force full registry fetch : false
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Application is null : false
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Registered Applications size is zero : true
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Application version is -1: true
2023-06-08 10:40:43.161  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Getting all instance registry info from the eureka server
2023-06-08 10:40:43.457  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : The response status is 200
2023-06-08 10:40:43.458  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Starting heartbeat executor: renew interval is: 30
2023-06-08 10:40:43.460  INFO 29923 --- [           main] c.n.discovery.InstanceInfoReplicator     : InstanceInfoReplicator onDemand update allowed rate per min is 4
2023-06-08 10:40:43.463  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Discovery Client initialized at timestamp 1686192043462 with initial instances count: 0
2023-06-08 10:40:43.464  INFO 29923 --- [           main] o.s.c.n.e.s.EurekaServiceRegistry        : Registering application CLIENT1 with eureka with status UP
2023-06-08 10:40:43.464  INFO 29923 --- [           main] com.netflix.discovery.DiscoveryClient    : Saw local status change event StatusChangeEvent [timestamp=1686192043464, current=UP, previous=STARTING]
2023-06-08 10:40:43.466  INFO 29923 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_CLIENT1/192.168.2.180:client1:8902: registering service...
2023-06-08 10:40:43.492  INFO 29923 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8902 (http) with context path ''
2023-06-08 10:40:43.493  INFO 29923 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8902
2023-06-08 10:40:43.504  INFO 29923 --- [           main] c.l.e.EurekaclientApplication            : Started EurekaclientApplication in 2.806 seconds (JVM running for 4.028)
2023-06-08 10:40:43.653  INFO 29923 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_CLIENT1/192.168.2.180:client1:8902 - registration status: 204
2023-06-08 10:41:13.464  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Disable delta property : false
2023-06-08 10:41:13.464  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Single vip registry refresh property : null
2023-06-08 10:41:13.464  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Force full registry fetch : false
2023-06-08 10:41:13.465  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Application is null : false
2023-06-08 10:41:13.465  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Registered Applications size is zero : true
2023-06-08 10:41:13.465  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Application version is -1: false
2023-06-08 10:41:13.465  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : Getting all instance registry info from the eureka server
2023-06-08 10:41:13.515  INFO 29923 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient    : The response status is 200
2023-06-08 10:41:54.752  INFO 29923 --- [nio-8902-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-06-08 10:41:54.752  INFO 29923 --- [nio-8902-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-06-08 10:41:54.758  INFO 29923 --- [nio-8902-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 6 ms
2023-06-08 10:42:07.625  INFO 29923 --- [nio-8902-exec-3] c.l.e.controller.TestController          : ***** element:client1
2023-06-08 10:42:07.628  INFO 29923 --- [nio-8902-exec-3] c.l.e.controller.TestController          : [EurekaDiscoveryClient.EurekaServiceInstance@64ca6245 instance = InstanceInfo [instanceId = 192.168.2.180:client1:8902, appName = CLIENT1, hostName = 192.168.2.180, status = UP, ipAddr = 192.168.2.180, port = 8902, securePort = 443, dataCenterInfo = com.netflix.appinfo.MyDataCenterInfo@5288f575]

デフォルトでは、appname を使用することになっており、spring.application.name を構成する必要があります。サービスへのアクセスに appname を使用したくない場合は、IP を使用するように構成できます。

eureka:
  instance:
    prefer-ip-address: true #强制使用IP

以上が最も基本的なサービスレジストリとサービスプロバイダの構築手順であり、サービスレジストリの起動、サービスクライアントの起動、クライアント自身のレジストリへの登録、レジストリ上のサービスリストの取得が可能となる。

さらに、サービス登録センターの高可用性バージョン、つまり 2 つ以上の eurekaserver ノードがあり、それらは相互に登録され、サービス プロバイダーは 2 つのノードに独自の情報を登録でき、サービス登録ノードのダウンタイムは影響を受けません。各サービスはノード間で呼び出します。

また、サービス利用者は、複数のサービス プロバイダー間の負荷分散戦略を要求し、その実現をリボンに依存します。

おすすめ

転載: blog.csdn.net/c_zyer/article/details/131104642