如何让微服务相互通信?
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
- 分布式环境中的变量管理
所以我是 运行 一个基于 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
- 分布式环境中的变量管理