1

我正在尝试将我的 spring-boot 微服务转移到码头工人。在本地系统上的 STS 上实施时,我的微服务运行得非常好。但是当我将它们 dockerize 时,我得到一个连接超时错误。

我在下面分享我的代码片段:

码头工人组成:

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-serverapplication.properties

spring.cloud.config.server.git.uri = https://github.com/satyamthedeveloper/Stage4_Week2_841418_SatyamKumar
server.port=8888

Eureka-Discovery-Serverapplication.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 开始,因为我没有公开它,所以无法访问它。我已经尝试了其中一些没有帮助的步骤。

  1. 当我的云配置启动并准备就绪时,尝试停止并重新启动发现服务。
  2. 通过创建网络在没有 docker-compose 的情况下单独尝试它仍然无法正常工作。

我不确定为什么我的服务无法获取我可以使用 URL 轻松获取的链接。

这是我每次尝试的日志的屏幕截图,无论我尝试什么。

4

3 回答 3

1

您必须在配置服务器的 eureka 配置中引用的名称只是config-server因为这是 compose yaml 中的服务名称。

于 2020-07-08T21:32:29.733 回答
0

实际上,在运行 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端口)。

于 2021-10-15T06:25:01.353 回答
0

在花了两天时间之后,我必须通过以下方式解决此问题:

我将我定义的属性转移application.propertiesbootstrap.yml. 变化如下。

spring-cloud-config-serverbootstrap.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-Serverbootstrap.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 应用程序的外部属性的来源。与应用程序上下文相比,引导程序上下文使用不同的约定来定位外部配置。

您可以参考以下博客以获取更具体的信息: Application.properties 和 Bootstrap.yml 之间的区别与示例

于 2020-07-10T02:09:20.673 回答