別々のAmazonEC2インスタンスにデプロイされた別々のDockerコンテナーで実行されているSpringBootとSpringCloud(ZuulとEureka)を使用してマイクロサービスを構築することを評価しています。
Eurekaに登録する単純なRESTサービスがあり、Eurekaで検索してこのサービスにリクエストをルーティングするようにZuulを構成しました。
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アドレスで自分自身を登録しているようです。
エッジサーバーリンクは 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プロパティを構成しましたか?
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ごとに複数のドッカーを備えたサーバーをいくつか構成し、次のセットアップを行いました。
この設定は、Zuulサーバーの前にロードバランサーがある2つのアベイラビリティーゾーンで複製されます。各サービスには、名前、ホスト名、ポート、および呼び出された回数を返すだけのエンドポイントがあります。
次に、ロードバランサーを押すと、AWSロードバランサーとリボンロードバランサーがサービスを循環するときに各サービスが呼び出されるのを確認できます。