当部署在 Docker 上时,Spring Cloud Config Server 在 Url -http://localhost:8888 上给出连接超时异常
Posted
技术标签:
【中文标题】当部署在 Docker 上时,Spring Cloud Config Server 在 Url -http://localhost:8888 上给出连接超时异常【英文标题】:Spring Cloud Config Server gives Connect Timeout Exception on Url -http://localhost:8888 When deployed on Dockers 【发布时间】:2020-10-29 04:52:21 【问题描述】:我正在尝试将我的 spring-boot 微服务转移到 docker。在本地系统上的 STS 上实施时,我的微服务运行得非常好。但是当我将它们 dockerize 时,我得到一个连接超时错误。
我在下面分享我的代码 sn-ps:
Docker-compose:
version: '3.6'
services:
db:
image: 'mysql:8.0.18'
container_name: mysqldb
ports:
- '3300:3300'
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=root
networks:
- truyum-nw
- movie-cruiser-nw
volumes:
- './mysqldb:/var/lib/mysql'
- './dbscripts:/docker-entrypoint-initdb.d'
config-server:
image: spring-cloud-config-server
build: ./spring-cloud-config-server
container_name: spring-cloud-config-server
ports:
- '8888:8888'
networks:
- truyum-nw
- movie-cruiser-nw
eureka:
image: eureka-discovery-service
build: ./eureka-discovery-service
container_name: eureka-discovery
ports:
- '8761:8761'
depends_on:
- config-server
- db
networks:
- truyum-nw
- movie-cruiser-nw
zuul:
image: zuul-service
build: ./zuul-gateway
container_name: zuul-bridge
ports:
- '8762:8762'
depends_on:
- eureka
- config-server
networks:
- truyum-nw
- movie-cruiser-nw
auth-service:
image: auth-service
build: ./Authentication-service
container_name: auth-service
ports:
- '9100:9100'
depends_on:
- eureka
- config-server
networks:
- truyum-nw
- movie-cruiser-nw
menu-item-service:
image: menu-item-service
build: ./menuitem-service
container_name: menu-item-service
ports:
- '34000:34000'
depends_on:
- eureka
- config-server
- zuul
- db
- auth-service
networks:
- truyum-nw
cart-service:
image: cart-service
build: ./cart-service
container_name: cart-service
ports:
- '34001:34001'
depends_on:
- eureka
- config-server
- zuul
- db
- menu-item-service
- auth-service
networks:
- truyum-nw
movie-service:
image: movie-service
build: ./movie-service
container_name: movie-service
ports:
- '35000:35000'
depends_on:
- eureka
- config-server
- db
- zuul
- auth-service
networks:
- movie-cruiser-nw
favourite-service:
image: favourite-service
build: ./favorite-service
container_name: favourite-service
ports:
- '35001:35001'
depends_on:
- eureka
- config-server
- db
- zuul
- auth-service
- movie-service
networks:
- movie-cruiser-nw
networks:
truyum-nw:
name: truyum-nw
driver: bridge
movie-cruiser-nw:
name: movie-cruiser-nw
driver: bridge
spring-cloud-config-server的application.properties:
spring.cloud.config.server.git.uri = https://github.com/satyamthedeveloper/Stage4_Week2_841418_SatyamKumar
server.port=8888
Eureka-Discovery-Server的application.properties:
spring.application.name=discoveryservice
spring.cloud.config.uri = http://spring-cloud-config-server:8888
当我执行docker-compose up
并检查http://localhost:8888/discoveryservice/default
时,我得到的结果为
"name": "discoveryservice",
"profiles": [
"default"
],
"label": null,
"version": "8450532e432fb103ef30d0002fa254b23d2158d6",
"state": null,
"propertySources": [
"name": "https://github.com/satyamthedeveloper/Stage4_Week2_841418_SatyamKumar/discoveryservice.properties",
"source":
"server.port": "8761",
"eureka.client.register-with-eureka": "false",
"eureka.client.fetch-registry": "false",
"info.app.name": "Spring Eureka Server Application"
,
"name": "https://github.com/satyamthedeveloper/Stage4_Week2_841418_SatyamKumar/application.yml",
"source":
"eureka.client.service-url.defaultZone": "http://eureka-discovery:8761/eureka",
"logging.level.org.springframework.web": "DEBUG",
"management.endpoints.web.exposure.include": "*"
]
但是,我的Eureka discovery service
仍然从 8080 开始,因为我没有公开它,所以无法访问它。我尝试了其中一些没有帮助的步骤。
-
尝试在我的云配置启动并准备就绪时停止并重新启动发现服务。
通过创建网络在没有 docker-compose 的情况下单独尝试了它仍然无法正常工作。
我不确定为什么我的服务无法获取我可以使用 URL 轻松获取的链接。
【问题讨论】:
【参考方案1】:您必须在配置服务器的 eureka 配置中引用的名称仅为 config-server
,因为这是您撰写 yaml 中的服务名称。
【讨论】:
不过,你的配置有问题。config-server
将通过撰写文件中给出的名称被发现。您可以做的是 ssh 进入您的容器并尝试 ping 并手动连接到 config-server。命令:docker exec -it <containerid> bash
同时检查容器内的文件/etc/resolve.conf
我能够使用 Postman 和浏览器手动连接配置服务器。我的微服务无法连接到它的某个地方。我终于通过下面给定的方法解决了这个问题。【参考方案2】:
花了两天时间,我通过以下方式解决了这个问题:
我将在application.properties
中定义的属性转移到bootstrap.yml
。变化如下。
bootstrap.yml:
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/satyamthedeveloper/Stage4_Week2_841418_SatyamKumar
clone-on-start: true
Eureka-Discovery-Server的bootstrap.yml:
spring:
application:
name: discoveryservice
cloud:
config:
fail-fast: true
retry:
maxAttempts: 200
maxInterval: 10000
uri: http://spring-cloud-config-server:8888
了解了bootstrap.yml
和application.properties
的区别后,才明白出现这种错误的原因:
application.properties 的用途是:
我们使用 application.yml 或 application.properties 来配置 应用程序上下文。
当一个 Spring Boot 应用程序启动时,它会创建一个应用程序 不需要显式配置的上下文 - 它已经 自动配置。但是,Spring Boot 提供了不同的覆盖方式 这些属性。
而bootstrap.yml的使用是:
我们使用 bootstrap.yml 或 bootstrap.properties 来配置 引导上下文。这样我们就可以保留外部配置 引导程序和主要上下文很好地分开。
引导上下文负责加载配置 来自外部来源的属性和用于解密中的属性 本地外部配置文件。
当 Spring Cloud 应用程序启动时,它会创建一个引导程序 语境。首先要记住的是引导上下文是 主应用程序的父上下文。
另一个要记住的关键点是这两个上下文共享 环境,它是任何 Spring 的外部属性的来源 应用。与应用程序上下文相比,引导程序 context 使用不同的约定来定位外部 配置。
您可以参考以下博客了解更多具体信息: Difference between Application.properties and Bootstrap.yml with example
【讨论】:
【参考方案3】:实际上在运行 docker-compose.yml 时,一个图像(例如 localhost:8761)不知道 localhost:8888(您的配置服务器)。
您的 application.properties/ yml 文件将 localhost:port 返回给 eureka 图像,该图像需要与其他图像/实例建立连接,但一个图像期待其他图像 uri 即 http://service_name:port强> 所以你需要将它作为环境变量从外部传递
在 eureka 镜像下添加环境变量配置服务器 uri 即 在 docker-compose.yml:
eureka:
image: eureka-discovery-service
build: ./eureka-discovery-service
container_name: eureka-discovery
ports:
- '8761:8761'
depends_on:
- config-server
environment:
# Important for clients to register with config server
- spring.config.import=optional:configserver:http://config-server:8888
- db
networks:
- truyum-nw
- movie-cruiser-nw
另外,如果您需要在任何 eureka 客户端中传递 eureka,您需要将其作为环境变量传递到 eureka 客户端映像下
environment:
# Important for clients to register with eureka
eureka.client.serviceUrl.defaultZone=http://discovery-service:8761/eureka/
上面代码中discover-service是eureka server的服务名(在8761端口)。
【讨论】:
以上是关于当部署在 Docker 上时,Spring Cloud Config Server 在 Url -http://localhost:8888 上给出连接超时异常的主要内容,如果未能解决你的问题,请参考以下文章
Docker AWS Elastic beanstalk 在本地机器 docker build 中没有错误,但是当放在服务器上时,spacy NLP 永远挂起
80070005 访问被拒绝,当带有水晶报表的asp.net网站部署在专用服务器上时
当 vault 部署在专用集群上时,如何从另一个 kubernetes 集群访问 vault secret?