当部署在 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。变化如下。

spring-cloud-config-server

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.ymlapplication.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 永远挂起

当网站部署在主机上时,MySql Insert 不起作用!

80070005 访问被拒绝,当带有水晶报表的asp.net网站部署在专用服务器上时

当 vault 部署在专用集群上时,如何从另一个 kubernetes 集群访问 vault secret?

感受 Docker 魅力, 排解决多应用部署之疼,Docker Compose + Spring Boot 实践

Spring Boot 控制器跨 docker pod 重定向