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:无法连接到localhost端口80:连接被拒绝
在 docker-compose 中使用 MySQL 初始化 Hibernate 时连接被拒绝