如何让微服务相互通信?

How to allow microservices to communicate with each other?

所以我是 运行 一个基于 nodejs 后端微服务的应用程序。我正在尝试做这样的事情:

services:
      comments:
        build: ./comments
        ports:
          - "4201:4201"
      posts:
        build: ./posts
        ports: 
          - "4200:4200"
        links:
          - comments
        depends_on:
          - comments

我在我的本地主机地址上托管它,我的容器在环境中保存在一起,那么如何从 docker-compose 中的另一个服务正确获取微服务 API IP环境?

这是我在posts微服务

中调用注释的地方
let comments  = await axios.get("http://localhost:4201/comments");

这是我执行 docker-compose run 并尝试使用名为 Postman 的测试工具获取路线时的错误:

在错误行的末尾:It says isAxiosError: true(这可能会有帮助)

您必须将所有服务添加到同一个网络中。您可以通过首先在您的撰写文件中创建一个网络来做到这一点(将其添加到底部)

networks:
  my-network:

然后将您的服务连接到此网络

services:
  comments:
    build: ./comments
    ports:
      - "4201:4201"
    networks:
      - my-network
  posts:
    build: ./posts
    ports: 
      - "4200:4200"
    networks:
      - my-network
    links:
      - comments
    depends_on:
      - comments

您的问题与容器内 localhost 的使用有关。检查 this 以了解为什么 localhost 在 docker 环境中不起作用。

您需要服务器的 ip,在您的情况下是您的笔记本电脑。如果你在 5000 启动一个应用程序(任何技术),你可以使用 localhost:5000 访问它,如果你知道你的 ip:192.168.1.10:5000

尝试获取您的本地 ip 并直接在您的 axios 调用中使用它来验证这是否是您的问题。

如果这是错误的,第二级改进是在你的 nodejs 中使用环境变量来避免硬编码值。您可以使用 docker-compose

传递此值
services:
  comments:
    build: ./comments
    ports:
      - "4201:4201"
  posts:
    build: ./posts
    ports: 
      - "4200:4200"
    environment:
        - POSTS_API_BASE_DOMAIN=http://192.168.4.15:4201
    depends_on:
      - comments

在你的 nodejs 中:

await axios.get(process.env.POSTS_API_BASE_DOMAIN+"/comments");

此策略将允许您在真实场景中使用 public 域,而不是在您的开发或暂存环境中使用 ips:

POSTS_API_BASE_DOMAIN=https://jan-tudan-post.com

如您所见,如果您使用 ip 就不需要网络或链接,并让您准备好微服务部署在具有自己的 ip 或 public 域的不同服务器中的真实环境

在另一台服务器上部署

如果您需要在另一台服务器上部署会发生什么情况。您必须在 docker-compose 中更新 ip 或使用一种脚本来获取 ip 并使用变量。 linux 样本:

export POSTS_API_BASE_DOMAIN="http://"$(hostname -I| awk '{printf }')

并在您的 docker-compose

environment:
    - POSTS_API_BASE_DOMAIN=http://192.168.4.15:4201

仅供测试或快速部署

如果你不想弄乱 ips,而你只需要快速部署一个演示,你可以使用 host.docker.internal。检查该部分 here

推荐主题

  • ports on docker
  • 分布式环境中的变量管理