docker - Eureka 客户端无法使用 docker 连接到服务器
问题描述
当我通过Intellij启动zuul和eureka时,一切正常,zuul注册在eureka-server上。在尤里卡服务器我看到
2019-03-15 18:00:20.727 INFO 31713 --- [nio-8761-exec-2] c.n.e.registry.AbstractInstanceRegistry : Registered instance ZUUL-SERVER/192.168.0.11:zuul-server:8762 with status UP (replication=false)
2019-03-15 18:00:21.309 INFO 31713 --- [nio-8761-exec-3] c.n.e.registry.AbstractInstanceRegistry : Registered instance ZUUL-SERVER/192.168.0.11:zuul-server:8762 with status UP (replication=true)
但是,当我尝试docker-compose up -d
在 zuul 容器中使用 docker 启动这两个服务时,我遇到了异常:
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.3.jar!/:1.9.3]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) ~[eureka-client-1.9.3.jar!/:1.9.3]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$6.execute(EurekaHttpClientDecorator.java:137) ~[eureka-client-1.9.3.jar!/:1.9.3]
at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.3.jar!/:1.9.3]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.getApplications(EurekaHttpClientDecorator.java:134) ~[eureka-client-1.9.3.jar!/:1.9.3]
at com.netflix.discovery.DiscoveryClient.getAndStoreFullRegistry(DiscoveryClient.java:1051) ~[eureka-client-1.9.3.jar!/:1.9.3]
at com.netflix.discovery.DiscoveryClient.fetchRegistry(DiscoveryClient.java:965) ~[eureka-client-1.9.3.jar!/:1.9.3]
at com.netflix.discovery.DiscoveryClient.<init>(DiscoveryClient.java:414) ~[eureka-client-1.9.3.jar!/:1.9.3]
at com.netflix.discovery.DiscoveryClient.<init>(DiscoveryClient.java:269) ~[eureka-client-1.9.3.jar!/:1.9.3]
at org.springframework.cloud.netflix.eureka.CloudEurekaClient.<init>(CloudEurekaClient.java:63) ~[spring-cloud-netflix-eureka-client-2.1.0.M1.jar!/:2.1.0.M1]
at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration.eurekaClient(EurekaClientAutoConfiguration.java:290) ~[spring-cloud-netflix-eureka-client-2.1.0.M1.jar!/:2.1.0.M1]
at org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration$$EnhancerBySpringCGLIB$$8fcb0d88.CGLIB$eurekaClient$2(<generated>) ~[spring-cloud-netflix-eureka-client-2.1.0.M1.jar!/:2.1.0.M1]
spring-boot-starter-parent
is 的版本2.1.2.RELEASE
和spring-cloud
eureka 和 zuul 的版本是Greenwich.M1
尤里卡服务器属性文件:
# Give a name to the eureka server
spring.application.name=eureka-server
# default port for eureka server
server.port=8761
# eureka by default will register itself as a client. So, we need to set it to false.
# What's a client server? See other microservices (image, gallery, auth, etc).
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
zuul-properties 文件包含这一行:
eureka.client.service-url.default-zone=http://eureka:8761/eureka/
docker-compose.yml 文件(相关服务)
version: "2"
services:
eureka:
container_name: eureka
build:
context: .
dockerfile: eureka.Dockerfile
image: eureka-service
ports:
- "8761:8761"
networks:
- event-network
zuul:
container_name: zuul
build:
context: .
dockerfile: zuul.Dockerfile
image: zuul-service
ports:
- "8762:8762"
networks:
- event-network
networks:
event-network:
driver: bridge
在这两个 Dockerfile 中,我只是将 jar 添加到容器并使用java -jar
命令启动 jar。我用 zuul 主类@EnableEurekaClient
和eureka 主类注释@EnableEurekaServer
。我认为该异常与 zuul 无关,因为我的其他微服务也有同样的问题。他们中的其他人也无法连接到尤里卡。
当我在容器中或通过 intellij 启动 eureka 时,我可以访问 eureka 仪表板。我什至试图把这张图片代替我的,但我得到了同样的例外。我也试过docker exec "zuul" -it bash
,在我试过的那个zuul容器里面,curl eureka:8761
我可以正常访问仪表板。
解决方案
不确定 Eureka,但 nginx 代理服务器有类似的问题。Nginx 无法识别 docker 的主机解析器,我使用的一种可能的解决方案是获取特定容器服务的静态 IP。
对于这种情况,可以为 Eureka 容器设置静态 IP 并在 Zuul 的配置文件中使用它。
当然,如果您有一个 Eureca 容器,这将起作用。对于很多容器来说,应该看看 zuul 如何读取和理解 docker 的主机解析器。
推荐阅读
- c# - C# LinqToExcel GetColumnName 第 n 行
- javascript - Reactjs, React, styled-components - Rebass 库基于对象文字的道具是否不需要重新渲染组件?
- python - 我想根据python中其他两个数组的条件定义一个数组
- spring - 带有 Zuul 代理和多个客户端(本机、移动、Web)的 Spring Boot Oauth2 SSO
- vue.js - @click 函数调用中的错误呈现变量
- kubernetes - 确定配额和限制范围的合理值
- assembly - 汇编语言 Pep9 简介:向下移动多少
- list - Jenkins + groovy:数组、列表和闭包的奇怪之处
- java - getAdapterPosition 没有做它应该做的事情
- spring-boot - 执行器的“记录”端点上的只读配置