我正在使用 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 问题,也不是 Eureka 问题。
简单的 docker 主机名问题。您的网络是正确的。
您的容器端口暴露于
localhost
,因此您可以从本地计算机连接到 localhost:8761
上的 eureka 服务器。但是,当容器与同一网络中的其他容器通信时,它就不再是本地主机了。
因为对于
aaservice
本地主机将指向其自身而不是 eurekaserver
容器。所以为了解决这个问题,我可以想到两种方法 -
localhost:8761
,即 eurekaserver:8761
。在这种情况下,网络发生在内部。所以不必暴露端口(这是可选的)host.docker.internal:8761
而不是 localhost
。欲了解更多信息请关注此从 Docker 文档 你有这样的声明:
如果您希望容器相互通信,则默认情况下,Compose 会为您的应用程序设置一个网络。每个 服务的容器加入默认网络并且既是 该网络上的其他容器可以访问,并且可以通过 它们的主机名与容器名称相同。
localhost 不是有效的 主机名。这是正常行为,因为您的容器集成在网络中,并且在真实网络中您无法访问另一台名为 localhost 的计算机。