Angularjs 如何获取api网关地址以便从docker compose中的angular容器调用它

Angularjs 如何获取api网关地址以便从docker compose中的angular容器调用它,angularjs,docker,docker-compose,microservices,gateway,Angularjs,Docker,Docker Compose,Microservices,Gateway,我有一个docker compose文件,其中有几个容器,其中有一个api网关,还有一个带有angularjs应用程序(该堆栈的网站)。api网关负责调用组合文件中存在的几个容器的正确api。但是我需要从网站(angular容器)调用api网关 我想知道获取api网关容器地址的最佳实践是什么,以便从angular容器(或者从浏览器)调用它。 目前我在当地工作,所以我指定 localhost:portofapagateway/api/ 一切正常,但很明显,如果尝试从另一台主机连接,它将无法工作 有

我有一个docker compose文件,其中有几个容器,其中有一个api网关,还有一个带有angularjs应用程序(该堆栈的网站)。api网关负责调用组合文件中存在的几个容器的正确api。但是我需要从网站(angular容器)调用api网关 我想知道获取api网关容器地址的最佳实践是什么,以便从angular容器(或者从浏览器)调用它。 目前我在当地工作,所以我指定 localhost:portofapagateway/api/

一切正常,但很明显,如果尝试从另一台主机连接,它将无法工作


有什么建议吗?

在docker compose文件中,您可以使容器加入现有网络,该网络可以是默认网络。所以,您所需要做的就是确保您的容器加入一个网络,您的angularjs容器已经在其中。然后,您可以通过docker compose文件中提供的名称来引用API容器(例如,如果您将其命名为API,则
ping API
将起作用)。请参阅。

在docker compose文件中,可以使容器加入现有网络,该网络可以是默认网络。所以,您所需要做的就是确保您的容器加入一个网络,您的angularjs容器已经在其中。然后,您可以通过docker compose文件中提供的名称来引用API容器(例如,如果您将其命名为API,则
ping API
将起作用)。请参阅。

根据您的环境,我看到了几种可能的解决方案

1。您可以在Angular中拥有一个配置文件

例如,Angular Cli提供2个文件:environment.ts和environment.prod.ts

文件的内容可以是:

export const environment = {
  production: false,
  apiBaseUrl: 'http://localhost:3000'
};
生产的等价物可以是真实的DNS url

这是由Angular CLI提供的,但在没有CLI的情况下也可以这样做。这里的想法是在编译时选择文件

2。始终使用同一台服务器

您可以假设主机名与您从以下位置获得Angular应用程序的主机名相同:

import { Location } from '@angular/common';
// Get the hostname
this.hostname = location.host;
if (this.hostname.indexOf(':') > 0) {
 this.hostname = this.hostname.substr(0, this.hostname.indexOf(':'));
}
// Add a port or a subdomain to get the API url:
this.apiUrl = 'http://' + this.hostname + ':8080';
组合中的变量?

正如您在前面的评论中所说,这些呼叫是从浏览器中发出的,因此在Docker之外。我认为没有一种简单的方法可以将这些信息放入撰写文件中。也就是说我很想知道


我希望它能有所帮助。

根据您的环境,我看到了几种可能的解决方案

1。您可以在Angular中拥有一个配置文件

例如,Angular Cli提供2个文件:environment.ts和environment.prod.ts

文件的内容可以是:

export const environment = {
  production: false,
  apiBaseUrl: 'http://localhost:3000'
};
生产的等价物可以是真实的DNS url

这是由Angular CLI提供的,但在没有CLI的情况下也可以这样做。这里的想法是在编译时选择文件

2。始终使用同一台服务器

您可以假设主机名与您从以下位置获得Angular应用程序的主机名相同:

import { Location } from '@angular/common';
// Get the hostname
this.hostname = location.host;
if (this.hostname.indexOf(':') > 0) {
 this.hostname = this.hostname.substr(0, this.hostname.indexOf(':'));
}
// Add a port or a subdomain to get the API url:
this.apiUrl = 'http://' + this.hostname + ':8080';
组合中的变量?

正如您在前面的评论中所说,这些呼叫是从浏览器中发出的,因此在Docker之外。我认为没有一种简单的方法可以将这些信息放入撰写文件中。也就是说我很想知道


我希望它有帮助。

是的,这是正确的,但如果我需要从浏览器调用api网关,则情况并非如此。你可以想象我在angular上有一个服务,它必须调用我的api网关的api,如果我使用docker的alias network,我必须调用egx:但浏览器不能这样做…我认为,这样做只能从服务器端实现。在这种情况下,您的API容器应该有一个
ports
部分,用于将端口从主机映射到容器。具体取决于您想要什么-我还不清楚-您可能需要设置一个反向代理,比如Nginx。当然,您需要打开服务器防火墙中的端口。是的,这是正确的,但如果我需要从浏览器调用api网关,则不需要。你可以想象我在angular上有一个服务,它必须调用我的api网关的api,如果我使用docker的alias network,我必须调用egx:但浏览器不能这样做…我认为,这样做只能从服务器端实现。在这种情况下,您的API容器应该有一个
ports
部分,用于将端口从主机映射到容器。具体取决于您想要什么-我还不清楚-您可能需要设置一个反向代理,比如Nginx。当然,您需要打开服务器防火墙中的端口。