【问题标题】:Getting services to communicate with each other using docker compose使用 docker compose 让服务相互通信
【发布时间】:2021-11-23 15:11:26
【问题描述】:

我正在尝试获取一个 api 网关,以便能够根据 URL 成功地将请求重定向到正确的 Spring Boot 微服务。当我在本地运行项目时,以下application.yml 配置有效,但是当我通过docker-compose up 运行这些服务时,api 网关似乎无法找到这些服务:

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

我在进行邮递员测试时遇到的错误,例如:localhost:8080/api/books 是一个

finishConnect(..) failed: Connection refused: localhost/127.0.0.1:8000

这是我的 docker-compose.yml:

version: '3.9'

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

  bookeroo-frontend:
    image: perrywinkle/bookeroo-frontend:latest
    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

我还应该提到我的前端节点应用程序也遇到了这个问题(它无法通过托管在 8080 上的网关访问微服务)。

localhost 不能很好地与 docker-compose 配合使用吗?我已经在堆栈溢出时尝试了各种相关线程的解决方案(例如将 url 静态更改为 0.0.0.0 等),但到目前为止,它们都没有为我工作。任何意见将不胜感激。

更新application.yml 更改为此后,响应现在正在传递到服务:

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/**

但是,邮递员对localhost:8080/api/books 的测试返回一个完全没有错误的 200 OK 响应,它是空的。我试图查看服务以查看是否有任何错误可能被“吞下”,但似乎并非如此。检查books-ms 日志显示它确实收到了请求,但似乎没有返回任何内容:

Hibernate: 
    select
        book0_.book_id as book_id1_0_,
        book0_.book_author as book_aut2_0_,
        book0_.book_category as book_cat3_0_,
        book0_.book_image_url as book_ima4_0_,
        book0_.book_isbn as book_isb5_0_,
        book0_.book_price as book_pri6_0_,
        book0_.book_published_date as book_pub7_0_,
        book0_.book_summary as book_sum8_0_,
        book0_.book_title as book_tit9_0_,
        book0_.price_currency as price_c10_0_ 
    from
        books book0

【问题讨论】:

    标签: docker docker-compose port


    【解决方案1】:

    在使用 compose 文件中的所有服务创建的 docker-compose 网络中,您可以使用服务名称访问其他服务(即连接到 payment-ms 连接到 payment-ms:8002

    除非您想从机器外部访问这些服务,否则您不需要公开端口(意味着不需要撰写文件中的 ports 部分)因为它们在它们的内部都可供彼此使用码头工人网络。

    如果您想使用 localhost 类型的配置,您可以使用此 DNS 名称 host.docker.internal,尽管它不太可取(安全方面)

    这是docs 采取的措施

    【讨论】:

    • 您好,请求现在正在通过服务。但是,微服务本身似乎没有将其响应返回到正确的位置,因为我得到的只是状态 200 OK。到目前为止,我的 application.yml 是我唯一更改的内容(只是将 localhost 换成了服务名称)。有什么建议吗?
    • 你所说的“正确的地方”是什么意思,回复是空的吗?如果是这样,请尝试从外部发送相同的请求,看看你得到了什么,如果可能的话,将输出、错误、日志作为新的 UPDATE 部分添加到问题中
    • 是的,响应,当发送到 localhost:8080 时返回 200 OK 响应请求(如应该),但没有内容。值得注意的是,当我执行相同的请求但直接到托管服务的位置(例如 localhost:8000/api/books)时,它会返回正确的响应。我还添加了包含新信息的更新部分。感谢您迄今为止的帮助。
    • 可能只是一个错字,但在第一次提到你写了localhost:8080 和第二次localhost:8000/api/books 这是两个不同的端口,这个错误是仅在评论中还是在 IRL 中?你如何确认没有收到数据?您是否在开发工具(如果是前端应用程序)或调试器中检查了结果?
    • 不,这不是错字。这是因为我的 api 网关的目的是根据给定的 url 将端口 8080 上的请求路由到正确的微服务(在本例中为端口 8000)。提供的application.yml 表明了这一点。我还通过帖子中提到的简单邮递员测试来检查这一点。
    猜你喜欢
    • 1970-01-01
    • 2019-07-24
    • 2021-11-21
    • 2021-11-07
    • 1970-01-01
    • 2019-09-19
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多