web-dev-qa-db-ja.com

EC2インスタンスに含まれるDockerでNetflixZuulとEurekaを使用してSpringCloudを構成するにはどうすればよいですか

別々のAmazonEC2インスタンスにデプロイされた別々のDockerコンテナーで実行されているSpringBootとSpringCloud(ZuulとEureka)を使用してマイクロサービスを構築することを評価しています。

Eurekaに登録する単純なRESTサービスがあり、Eurekaで検索してこのサービスにリクエストをルーティングするようにZuulを構成しました。 enter image description here

Boot2dockerを使用してMacでローカル(つまり、Amazon/EC2ではない)でこれを実行することはできますが、EC2にデプロイすると、Zuulはサービスを見つけることができず、「転送エラー」(ステータス500)を報告します。

EC2では、すべてがポート80で実行されるように構成されています(ファイアウォールを介して簡単にアクセスできるように評価中です)。 Zuulと私のサービスの両方がEurekaシステムステータスページに表示されます(リンクはどれも機能しませんが!)。

クライアントは、完全なAWSドメイン名でEurekaを検索するように構成されているため、EurekaがどのようにOKであるかを確認できます。例えば.

  client:
    serviceUrl:
      defaultZone: http://ec2-XX-XX-XX-XX.ap-southeast-2.compute.amazonaws.com:80/eureka/,http://ec2-YY-YY-YY-YY.ap-southeast-2.compute.amazonaws.com:80/eureka/

ただし、クライアントは、(Eurekaシステムステータスリンクに基づいて)内部DockerIPアドレスで自分自身を登録しているようです。

enter image description here

エッジサーバーリンクは http://172.17.0.2/info を指しますトライアルサービスリンクは http://172.17.0.3/info を指します

これは正しくなく、他のEC2インスタンスがこのアドレスに到達することを知らないと思います。

このページを読みました https://github.com/Netflix/eureka/wiki/Configure-Eureka-in-AWS-Cloud AWS EC2 Elastic IPアドレスの使用を提案していますが、私はこれを行う必要はありません。

また、このテーマに関する現在の議論がここにあることも確認しました https://github.com/spring-cloud/spring-cloud-netflix/issues/432

誰かがこのタイプのセットアップを機能させることができましたか?もしそうなら、彼らはどのようにEurekaプロパティを構成しましたか?

14
Rob

OK、私自身の質問に答えるために、私は解決策を見つけました。基本的には、ホスト名を使用するようにeurekaを構成し、net = Hostオプションを使用するようにdockerを構成する必要があります。

これが私のセットアップです(1つのアベイラビリティーゾーンのセットアップを示しています):

application.yml:

Zuul:   
    spring:
      profiles: aws         
    server:
      port: 80          
    eureka:
      datacenter: cloud
      instance:
        preferIpAddress: false
      client:
        serviceUrl:
          defaultZone: http://ec2-XX-XX-XX-XX.ap-southeast-2.compute.amazonaws.com:80/eureka/

Eureka:
    spring:
      profiles: aws-discoA          
    server:
      port: 80          
    eureka:
      instance:
        preferIpAddress: false
      datacenter: cloud
      enableSelfPreservation: false
      client:
        name: eureka
        preferSameZone: false
        shouldOnDemandUpdateStatusChange: false
        region: default
        serviceUrl:
          defaultZone: http://ec2-YY-YY-YY-YY.ap-southeast-2.compute.amazonaws.com:80/eureka/

Service:
    spring:
      profiles: aws
    server:
      port: 0 # or 80 if there is only 1 service/docker in this EC2
    eureka:
      datacenter: cloud
      instance:
        preferIpAddress: false
      client:
        serviceUrl:
          defaultZone: http://ec2-XX-XX-XX-XX.ap-southeast-2.compute.amazonaws.com:80/eureka/

「データセンター:クラウド」が必要かどうかわかりませんか?

次に、それぞれを起動します。

Zuul

    Sudo docker run -d --name Edge -e Java_TOOL_OPTIONS="-Dspring.profiles.active=aws -Deureka.instance.hostname=$HOSTNAME" --net="Host" Edge

Eureka

    Sudo docker run -d --name discovery -e Java_TOOL_OPTIONS="-Dspring.profiles.active=aws-discoA -Deureka.instance.hostname=$HOSTNAME" --net="Host" discovery

Service

    Sudo docker run -d --name service -e Java_TOOL_OPTIONS="-Dspring.profiles.active=aws -Deureka.instance.hostname=$HOSTNAME" --net="Host" service

これがより複雑なセットアップで機能することを確認するために、EC2ごとに複数のドッカーを備えたサーバーをいくつか構成し、次のセットアップを行いました。

enter image description here

この設定は、Zuulサーバーの前にロードバランサーがある2つのアベイラビリティーゾーンで複製されます。各サービスには、名前、ホスト名、ポート、および呼び出された回数を返すだけのエンドポイントがあります。

次に、ロードバランサーを押すと、AWSロードバランサーとリボンロードバランサーがサービスを循環するときに各サービスが呼び出されるのを確認できます。

16
Rob