Rob*_*Rob 14 spring amazon-web-services spring-cloud netflix-eureka
我正在使用Spring Boot和Spring Cloud(Zuul和Eureka)在单独的docker容器中运行构建微服务,这些容器部署在单独的Amazon EC2实例中.
我有一个简单的REST服务,它向Eureka注册,并已配置Zuul通过在Eureka中查找请求来将请求路由到此服务.

我可以使用boot2docker在Mac上本地运行(即不在Amazon/EC2中),但是当部署在EC2上时,Zuul无法找到服务,并报告"转发错误"(状态500).
在EC2中,一切都配置为在端口80上运行(只是在评估时,我可以通过我们的防火墙轻松访问).我可以在Eureka系统状态页面中看到Zuul和我的服务(尽管没有链接可用!).
客户端配置为使用完整的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/
Run Code Online (Sandbox Code Playgroud)
但是,客户似乎正在使用其内部docker IP地址进行注册(基于Eureka系统状态链接).
edgeserver链接指向http://172.17.0.2/info 试用服务链接指向http://172.17.0.3/info
我猜这是不正确的,其他EC2实例不知道到达这个地址.
我已经阅读了这个页面https://github.com/Netflix/eureka/wiki/Configuring-Eureka-in-AWS-Cloud,建议使用AWS EC2弹性IP地址,但我希望我不必这样做.
我也看到目前有关于这个主题的讨论,https://github.com/spring-cloud/spring-cloud-netflix/issues/432
有没有人设法让这种类型的设置工作,如果是这样,他们是如何配置Eureka属性的?
Rob*_*Rob 16
好的,回答我自己的问题,我找到了解决方案.它主要涉及配置eureka以使用主机名和docker来使用net = host选项.
这是我的设置(只显示一个可用区的设置):
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/
Run Code Online (Sandbox Code Playgroud)
我不确定是否需要"数据中心:云"?
然后发布每个:
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
Run Code Online (Sandbox Code Playgroud)
为了确保在更复杂的设置中工作,我配置了更多的服务器,其中一些服务器每个EC2有多个docker,现在有以下设置.
此设置在两个可用区域中重复,并在Zuul服务器前面具有负载平衡器.每个服务都有一个端点,只返回其名称,主机名,端口及其被调用的次数.
然后,我可以点击负载均衡器,看到每个服务被调用为AWS负载均衡器,并且功能区负载均衡器在服务中循环.
| 归档时间: |
|
| 查看次数: |
11105 次 |
| 最近记录: |