我有一个使用spring boot+Docker Compose+Eureka的非常简单的演示。
“我的服务器”运行在端口8671上,具有以下应用程序属性:
server:
port: 8761
eureka:
instance:
prefer-ip-address: true
client:
registerWithEureka: false
fetchRegistry: false
server:
waitTimeInMsWhenSyncEmpty: 0
我的Eureka客户端在端口9000上运行,具有以下应用程序属性:
server:
port: 9000
spring:
application:
name: user-registration
eureka:
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
当我在父maven项目中启动我的docker.compose文件时,这是我的docker-compose文件的内容:
eureka-server:
image: rosenthal/eureka-server
ports:
- "8761:8761"
user-registration:
image: rosenthal/user-registration
ports:
- "9000:9000"
links:
- eureka-server
当我运行应用程序时,首先启动eureka服务器,然后通过
mvn spring-boot:run
服务器成功注册了我的客户端(我称之为用户注册)。
当我通过docker-compose运行应用程序时,客户端注册失败,输出如下:
DiscoveryClient_USER-REGISTRATION/0fd640cbc3ba:user-registration:9000:
registering service...
user-registration_1 | 2017-06-21 04:36:05.120 ERROR 1 --- [nfoReplicator-0]
c.n.d.s.t.d.RedirectingEurekaHttpClient : Request execution error
user-registration_1 |
user-registration_1 | com.sun.jersey.api.client.ClientHandlerException:
java.net.ConnectException: Connection refused (Connection refused)
我的第一个假设是,运行docker-compose在等待服务器启动时遇到了一个竞争条件,但我的eureka客户机似乎有心跳试图向配置它的服务器调用home。这意味着它无法找到我注册的Eureka服务器(并且正在运行,我可以在localhost:8671上导航到它)。
我错过了什么?在本地运行时,所有的一切都运行得很好,spring启动时使用它自己的嵌入式tomcat容器。当我开始使用docker-compose时,它就不想工作了。
我相信我意识到了我的问题。所以docker不在localhost上运行,而是在我启动docker时分配给它的公共IP上运行。导航到此ip+端口显示为Eureka服务器运行的我的服务。客户仍然没有注册。
因此,我将eureka客户端的application.yml文件修改为:
serviceUrl:
defaultZone: http://192.168.59.103:8761/eureka/
该IP是我的docker后台进程运行的IP。现在,当我做docker-compose时,它错过了第一次注册,但是第二次心跳会接起我的客户机。
如何确保客户端一直等到服务器完全启动?我在我的docket compose文件中使用了适当的docker“links”字段,但它并没有像我希望的那样工作。另外,我如何看到defaultZone文件是我的DOCKER_HOST IP?
得到的docker-compose文件使我的一切都能正常工作,它是:
eureka-server:
image: thorrism/eureka-server
ports:
- "8761:8761"
user-registration:
image: thorrism/user-registration
ports:
- "9000:9000"
links:
- eureka-server
environment:
EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://eureka-server:8761/eureka
设置环境属性以重写eureka.client.Serviceurl.DefaultZone
以匹配docker组合文件中的服务名称。
eureka-server:
image: rosenthal/eureka-server
ports:
- "8761:8761"
user-registration:
image: rosenthal/user-registration
ports:
- "9000:9000"
environment:
- EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://eureka-server:8761/eureka
这将覆盖打包的application.properties
中的属性。
注意:正如注释中所提到的,您不需要compose文件中的links
部分。我移除了它。请参阅https://docs.docker.com/compose/networking/了解有关信息。
如果对您有用的话,这是我在生产环境(docker-compose file version 2)中配置它的方式:
version: '2'
services:
eureka-server:
image: rosenthal/eureka-server
expose:
- "8761"
user-registration:
image: rosenthal/user-registration
container_name: user-registration
ports:
- "9000:8080"
environment:
server.port: 8080
eureka.client.enabled: 'true'
eureka.host: eureka-server
eureka.instance.preferIpAddress: 'true'
在文档中,expose
就是这样做的:
公开端口而不将其发布到主机--它们仅可被链接的服务访问。只能指定内部端口。
由于所有的东西都在同一个网络中,容器之间没有链接就可以互相看到。
附注
请记住,通过此配置,端口9000将在主机上公开访问,并映射到用户注册容器的8080端口。
pom.xml 主应用程序类 Application.Properties eureka客户端设置 pom.xml Application.Properties 我在eureka-server仪表板(http://localhost:8761)中没有看到向Eureka server注册的micro-service-currency-exchange-service 为什么eureka客户端没有注册
我们正在尝试在Docker容器上部署NetflixEureka服务器,Docker容器是一个Spring Boot应用程序。我们将其部署为Docker服务,Docker集群用于容器编排。当我们直接创建容器并运行应用程序时,一切都很好。Eureka服务器使用正确的IP地址注册所有客户端应用程序。但是当我们创建并部署为docker服务时,它会使用错误的IP地址注册应用程序。 我们已经根据 spring
我对docker,Spring框架的一切都很陌生…它们成功地在localhost环境中运行,现在我想把它们推送到docker中,但是总是给我错误,我在那里卡住了大约一周。有人能帮我弄清楚吗!!! 现在我有 eureka 服务器和云配置服务器服务,这是我的代码: 尤里卡服务器应用程序.yml 和 Dockerfile: 现在我有云配置服务器应用程序.yml:在这个文件中,我试图在github上备份它
我刚刚关注了下面这篇文章,https://spring.io/blog/2015/07/14/microservices-with-spring,但是我无法在尤里卡注册我的微服务。 customer-service.yml build . gradle for customer-service CustomerService.java 注册-server.yml
该应用程序在Eureka注册后以“未知”的状态启动,并且从未更改为“启动”。如果这些标志中的任何一个被设置为false,那么应用程序启动时注册为“up”。 当两个标志都启用/true时,我看到了以下一系列日志记录: 我如何让应用程序注册为启用了这两个标志/真? bootstrap.yml
本规范不排除使用未注册的客户端。然而,使用这样的客户端超出了本规范的范围,并需要额外的安全性分析并审查其互操作性影响。