我有一个非常简单的演示使用Spring ++ 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-复合文件的内容:
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-组合运行我的应用程序时,客户端无法使用以下输出注册:
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进入了一个竞争状态,但是我的eureka客户端似乎有一个心跳,试图调用它配置的服务器。这意味着它无法找到我注册的Eureka服务器(并且正在运行,我可以在localhost:8671上导航到它)。
我在这里错过了什么?所有东西在本地运行都很好,由它自己的嵌入式tomcat容器启动。一旦我开始用码头写作,它就不想工作了。
编辑
我想我意识到了我的问题。因此,docker不运行在localhost上,而是在我启动docker时分配的公共IP上运行。导航到此ip +端口显示我为Eureka Server运行的服务。客户还没有注册。
因此,我对我的eureka客户端的application.yml文件进行了更改,以便:
serviceUrl:
defaultZone: http://192.168.59.103:8761/eureka/那个IP是我的停靠守护进程正在运行的IP。现在,它错过了第一次注册时,我做码头-撰写,但第二次心跳接住了我的客户。
如何确保客户端在服务器完全启动之前等待?我在我的文档中使用了正确的docker“link”字段,但是它没有像我希望的那样工作。此外,如何将defaultZone文件视为我的DOCKER_HOST IP?
最终结果
得到的对我起作用的对接-撰写文件是:
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发布于 2017-06-22 08:30:36
如果对您有用,在某种程度上这就是我如何为我的生产环境配置它(docker-组合文件版本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端口。
发布于 2017-06-21 06:02:05
设置一个环境属性以覆盖eureka.client.serviceUrl.defaultZone,以匹配您的停靠器撰写文件中的服务名称。
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中的属性。
注意:正如注释中提到的那样,不需要撰写文件中的links部分。我移除就是这样。有关这方面的信息,请参见https://docs.docker.com/compose/networking/。
发布于 2021-05-28 02:39:21
更新:
看起来,对于较新版本的spring(在我的例子中是2.4.5),这个解决方案不起作用。不会自动拾取EUREKA_CLIENT_SERVICEURL_DEFAULTZONE属性。骆驼壳有一个永久性的问题,这造成了不一致。EUREKA_CLIENT_SERVICEURL_DEFAULTZONE未转换为eureka.client.serviceUrl.defaultZone。它被转换成eureka.client.serviceurl.defaultzone。有关更多细节,请查看此春季云-netflix Github发行版。他们现在不能更改参数,因为这会破坏向后兼容性。下面是对我起作用的代码
discovery:
container_name: discovery
build: .
ports:
- "8761:8761"
user-registration:
container_name: user-registration
build: .
ports:
- "8080:8080"
environment:
SPRING_APPLICATION_JSON: '{"eureka":{"client":{"serviceUrl":{"defaultZone":"http://discovery:8761/eureka"}}}}'对于要通过环境变量设置的此属性,您必须使用SPRING_APPLICATION_JSON。很丑但很管用。
https://stackoverflow.com/questions/44667063
复制相似问题