【问题标题】:docker-compose: services in a network can ping each other but API requests return as empty responsesdocker-compose:网络中的服务可以相互 ping,但 API 请求返回为空响应
【发布时间】:2021-10-03 13:48:10
【问题描述】:

这篇文章链接到我之前的文章,但我想我会发一个新的,因为问题已经转移了。

所以,我试图在 docker compose 文件中获取服务以相互交谈。这是docker-compose.yml

version: '3.9'

services:
  bk-api-gateway:
    image: perrywinkle/api-gateway:latest
    ports:
      - '8080:8080'
    build:
      context: BackEnd/bk_api_gateway
      dockerfile: Dockerfile

  frontend:
    image: perrywinkle/bookeroo-frontend
    ports:
      - '3000:3000'
    build:
      context: FrontEnd/myfirstapp
      dockerfile: Dockerfile
    stdin_open: true
    command: npm start

  books-ms:
    image: perrywinkle/books-ms:latest
    ports:
      - '8000:8000'
    build:
      context: BackEnd/bookmicroservices
      dockerfile: Dockerfile
    volumes:
      - /data/bookeroo-db

  login-ms:
    image: perrywinkle/login-ms:latest
    ports:
      - '8001:8001'
    build:
      context: BackEnd/loginmicroservices
      dockerfile: Dockerfile
    volumes:
      - /data/bookeroo-db

  payment-ms:
    image: perrywinkle/payment-ms:latest
    ports:
      - '8002:8002'
    build:
      context: BackEnd/paymentmicroservices
      dockerfile: Dockerfile
    volumes:
      - /data/bookeroo-db

这里有很多服务,所以我现在只是在尝试解决api网关服务和书籍服务之间的问题。这 2 个具有以下 Dockerfile:

FROM openjdk:11
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} api-gateway.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","api-gateway.jar"]
FROM openjdk:11
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} books-ms.jar
EXPOSE 8000
ENTRYPOINT ["java","-jar","books-ms.jar"]

老实说,这里没有什么值得注意的,但我想我还是会把它们包括在内。

当我尝试使用 localhost:8080/api/books 从浏览器发出 get 请求时,它会返回 empty 200 OK 响应,此时确实应该返回书籍列表,这让我相信我的 api 网关可能有一些问题,它有一些基本路由,形式如下 application.yml(没有 Eureka 服务器或类似的东西):

server:
  port:8080
spring:
  cloud:
    gateway:
      routes:
        - id: user_service
          uri: 'login-ms:8001'
          predicates:
            - Path=/api/users/**
        - id: user_service
          uri: 'login-ms:8001'
          predicates:
            - Path=/api/business/**
        - id: book_service
          uri: 'books-ms:8000'
          predicates:
            - Path=/api/books/**
        - id: payment_service
          uri: 'payment-ms:8002'
          predicates:
            - Path=/api/payment/**

如果我访问这些服务之一的 CLI 并从那里 ping 它们(使用ping books-ms 或反之亦然),它们将相互识别。如果我在 api 网关中执行curl books-ms:8000/api/books,它将能够得到预期的响应,这意味着这两个服务之间不应该存在网络问题。

总的来说,我对 docker 很陌生,因此非常感谢任何指导。

【问题讨论】:

    标签: java docker docker-compose


    【解决方案1】:

    我不是 Spring Cloud Gateway 方面的专家,但我会尝试在 Dockerfile 中公开每个服务的端口。

    # In each service's dockerfile
    EXPOSE 8000
    EXPOSE 8001
    EXPOSE 8002
    EXPOSE 8003
    

    我还认为在路由 URI 中丢弃模式也是一个好主意。类似的东西

    - id: user_service
      uri: 'http://login-ms:8001' # Added 'http://' here
      predicates:
         - Path=/api/users/**
    

    【讨论】:

      猜你喜欢
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 2020-11-19
      • 1970-01-01
      相关资源
      最近更新 更多