无法连接Eureka服务器-Spring Boot |尤里卡 |码头工人

问题描述 投票:0回答:2

我正在使用 Spring 3.0 构建微服务系统,我想使用 Docker 设置 Eureka。 我有 2 个服务,称为“AA 服务”和“订单服务”以及“Eureka 服务器”。

Eureka 服务器设置如下:

应用程序属性

spring.application.name=eureka-server

server.port=8761

eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false

EurekaServerApplication.class:

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

依赖:

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'

设置 AA 服务(与订单服务类似) - 我尝试了两种方法,但没有成功

应用程序.属性 第一种方式:

spring.application.name=aa-service

eureka.instance.hostname=localhost
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.instance.prefer-ip-address=true

第二种方式:

spring.application.name=aa-service

eureka.client.service-url.defaultZone=http://localhost:8761/eureka
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.instance.prefer-ip-address=true

依赖:

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client:4.0.0'

docker-compose.yml:

services:
  postgres:
    container_name: postgres
    image: postgres
    environment:
      POSTGRES_USER: khoadev
      POSTGRES_PASSWORD: password
      PGDATA: /data/postgres
    volumes:
      - postgres:/data/postgres
    ports:
      - 5432:5432
    networks:
      - postgres
    restart: unless-stopped

  pgadmin:
    container_name: pdadmin
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:[email protected]}
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-admin}
      PGADMIN_CONFIG_SERVER_MODE: 'False'
    volumes:
      - pgadmin:/var/lib/pgadmin
    ports:
      - "5050:80"
    networks:
      - postgres
    restart: unless-stopped

  eureka-server:
    container_name: eurekaserver
    build:
      dockerfile: ./docker/eurekaserver.Dockerfile
    environment:
      SPRING_PROFILES_ACTIVE: docker
    ports:
      - "8761:8761"
    networks:
      - spring

  aaservice:
    container_name: aaservice
    build:
      dockerfile: ./docker/aaservice.Dockerfile
    environment:
      HOST_NAME: postgres
      DB_PORT: 5432
      USERNAME: khoadev
      PASSWORD: password
      DATABASE_NAME: user-service
      SECRET_KEY: secret_key
      SPRING_PROFILES_ACTIVE: docker
    ports:
      - "8080:8080"
    networks:
      - spring
      - postgres
    depends_on:
      - postgres

  orderservice:
    container_name: orderservice
    build:
      dockerfile: ./docker/orderservice.Dockerfile
    environment:
      HOST_NAME: postgres
      DB_PORT: 5432
      USERNAME: khoadev
      PASSWORD: password
      DATABASE_NAME: order-service
      SPRING_PROFILES_ACTIVE: docker
    ports:
      - "8181:8181"
    networks:
      - spring
      - postgres
    depends_on:
      - postgres


networks:
  postgres:
    driver: bridge

  spring:
    driver: bridge

volumes:
  postgres:
  pgadmin:

当我运行 2 个服务时,我收到此错误:

2023-03-04 22:59:50 2023-03-04T15:59:50.717Z  INFO 1 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_AA-SERVICE/d3e4061f76ba:aa-service: registering service...
2023-03-04 22:59:50 2023-03-04T15:59:50.722Z  INFO 1 --- [nfoReplicator-0] c.n.d.s.t.d.RedirectingEurekaHttpClient  : Request execution error. endpoint=DefaultEndpoint{ serviceUrl='http://localhost:8761/eureka/}, exception=I/O error on POST request for "http://localhost:8761/eureka/apps/AA-SERVICE": Connect to http://localhost:8761 [localhost/127.0.0.1] failed: Connection refused stacktrace=org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:8761/eureka/apps/AA-SERVICE": Connect to http://localhost:8761 [localhost/127.0.0.1] failed: Connection refused

有人遇到同样的问题吗?是否缺少任何配置? 预先感谢!

spring-boot docker-compose docker-networking docker-network
2个回答
2
投票

这既不是 Spring 问题,也不是 Eureka 问题。
简单的 docker 主机名问题。您的网络是正确的。

您的容器端口暴露于

localhost
,因此您可以从本地计算机连接到
localhost:8761
上的 eureka 服务器。但是,当容器与同一网络中的其他容器通信时,它就不再是本地主机了。

因为对于

aaservice
本地主机将指向其自身而不是
eurekaserver
容器。所以为了解决这个问题,我可以想到两种方法 -

  1. [推荐] 使用容器主机名(与容器名称相同)代替
    localhost:8761
    ,即
    eurekaserver:8761
    。在这种情况下,网络发生在内部。所以不必暴露端口(这是可选的)
  2. 或者您可以通过主机网络,因为您已将端口 8761 暴露给本地计算机 8761。使用主机名作为
    host.docker.internal:8761
    而不是
    localhost
    。欲了解更多信息请关注此

0
投票

从 Docker 文档 你有这样的声明:

默认情况下,Compose 会为您的应用程序设置一个网络。每个 服务的容器加入默认网络并且既是 该网络上的其他容器可以访问,并且可以通过 它们的主机名与容器名称相同。

如果您希望容器相互通信,则

localhost 不是有效的 主机名。这是正常行为,因为您的容器集成在网络中,并且在真实网络中您无法访问另一台名为 localhost 的计算机。

© www.soinside.com 2019 - 2024. All rights reserved.