Docker通过网关访问服务时拒绝连接

Posted

技术标签:

【中文标题】Docker通过网关访问服务时拒绝连接【英文标题】:Docker giving Connection refused when accessing service through gateway 【发布时间】:2021-07-31 20:41:15 【问题描述】:

我有一个在没有 docker 的情况下运行良好的微服务项目。我使用 react 作为前端,spring boot 作为后端。在前端,我使用 localhost:9191/images/test/all 发表了一篇文章。 9191 是我的网关所在的位置,然后它重定向到位于 9001 中的图像微服务。在 docker 中查看网关日志时,它给了我这个错误:

2021-05-10 12:14:27.002 ERROR 1 --- [or-http-epoll-4] a.w.r.e.AbstractErrorWebExceptionHandler : [dca16fe0-1] 500 Server Error for HTTP GET "/images/test/all"

io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: Connection refused: localhost/127.0.0.1:9001

Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:

Error has been observed at the following site(s):

|_ checkpoint ⇢ springfox.boot.starter.autoconfigure.SwaggerUiWebFluxConfiguration$CustomWebFilter [DefaultWebFilterChain]

|_ checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]

|_ checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]

|_ checkpoint ⇢ HTTP GET "/images/test/all" [ExceptionHandlingWebHandler]

这是我的 docker-compose.yml:

version: '3'
services:
  react-front:
    image: reactimage:latest
    ports:
      - 3000:3000
    profiles:
      - docker
    depends_on:
      - gateway-service
  registry:
    image: registryimage:latest
    ports:
      - 8084:8084
    profiles:
      - docker
    environment:
      - "SPRING_PROFILES_ACTIVE=docker"
  gateway-service:
    image: gatewayimage:latest
    container_name: gatewaycontainer
    environment:
      - JAVA_OPTS=
        -DEUREKA_SERVER=http://registry:8084/eureka
      - "SPRING_PROFILES_ACTIVE=docker"
    ports:
      - 9191:9191
    depends_on:
      - registry
    profiles:
      - docker
  db:
    container_name: dbcontainer
    image: 'mysql/mysql-server:5.7'
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: nasausers
      MYSQL_ROOT_HOST: '%'
    volumes:
      - ./login-service/InsertData:/docker-entrypoint-initdb.d
    ports:
      - '3301:3306'
    restart: always
    profiles:
      - docker
  login-service:
    image: loginimage:latest
    environment:
      - JAVA_OPTS=-DEUREKA_SERVER=http://registry:8084/eureka
      - "SPRING_PROFILES_ACTIVE=docker"
    ports:
      - 9000:9000
    depends_on:
      - db
      - registry
    profiles:
      - docker
  images-service:
    image: imagesimage:latest
    environment:
      - JAVA_OPTS=-DEUREKA_SERVER=http://registry:8084/eureka
      - "SPRING_PROFILES_ACTIVE=docker"
    ports:
      - 9001:9001
    depends_on:
      - registry
    profiles:
      - docker

我还有一个发现服务,我的网关使用它来查找图像服务,它在 docker-compose 中称为 registry-service。使用邮递员向 localhost:9001/images/test 发送 get 请求可以,但是当我尝试通过 localhost:9191/images/test 的网关时,它给了我 500 状态错误。

【问题讨论】:

网关是将请求转发到后端,还是发送HTTP重定向到客户端?它如何知道各种后端服务在哪里? (错误消息对我来说暗示images-service 将自己注册为127.0.0.1:9001 到网关,但网关需要使用 Compose 服务名称images-service 转发给它。) 网关正在使用 images-service 在 eureka 服务中注册的名称。通过进入我的 eureka 服务器 localhost,我可以看到我所有的微服务都在正确注册。网关像这样重定向到图像服务:- id:IMAGES-SERVICE uri:lb://IMAGES-SERVICE 谓词:- Path=/images/** 【参考方案1】:

我实际上是通过使用来解决的

 instance:
    preferIpAddress: true 

关于连接到 eureka 的微服务

【讨论】:

以上是关于Docker通过网关访问服务时拒绝连接的主要内容,如果未能解决你的问题,请参考以下文章

连接拒绝 docker、laravel 和 mysql 服务器

Docker,拒绝所有其他正在运行的服务的连接

Docker:无法连接到localhost端口80:连接被拒绝

在 docker-compose 中使用 MySQL 初始化 Hibernate 时连接被拒绝

Zuul 网关无法连接到 Docker-Compose 下的 Eureka 服务注册表

使用go webservice在docker中连接到mysql时连接被拒绝