从 Docker 内的另一个微服务调用微服务
Call Microservice from another Microservice within Docker
我在windows的docker上用C#创建了几个微服务运行,我需要从另一个微服务调用微服务所以我用这种方式调用:
[HttpGet("GetOrder/{Object_ID}")]
public Order GetOrder (int id)
{
string Baseurl = "http://189.29.0.100/";
…..
using (var client = new HttpClient())
{
//Passing service base url
client.BaseAddress = new Uri(Baseurl);
client.DefaultRequestHeaders.Clear();
//Define request data format
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//Sending request to find web api REST service resource GetAllEmployees using HttpClient
borrowerData = await client.GetStringAsync("api/order/" + Id.ToString());
}
…
}
我在Composed文件中使用了修复IP如下:
orderservice:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "80"
networks:
default:
ipv4_address: 189.29.0.100
问题是当我们在VM中部署这个项目时,如何让它与这些Ips一起工作?
Docker compose 在您的主机上创建一个虚拟网络,并且无法使用这些 IP 从 docker 外部路由服务。但是在虚拟网络内部,所有服务都可以使用它们的名称 (http://otherservice/
) 相互访问。
如果您想访问 VM 上所有已部署的微服务,您需要在 docker compose 中使用反向代理。例如,将请求分派给其他服务的 nginx 服务。
我同意@Bardia 的观点,使用 docker-compose 文件是让微服务知道彼此位置的最简单方法!就个人而言,我还为我的所有微服务使用一个 compose 文件。
因此,如果您在 docker-compose.yml
文件中将服务命名为 service-a
,您将能够通过 http://service-a:{port}/path
找到它。这有一个巨大的优势:您可以在每个微服务上使用相同的端口而不必担心端口冲突(因为使用 DNS 来解析路径),这对于启用水平扩展也至关重要!
更进一步,就像@Bardia 所说的那样,添加一个反向代理而不是在主机上的端口上开始真正的混乱...我个人喜欢 Traefik,您可以使用标签进行配置在撰写文件的服务描述中。这也有利于您的 UI 应用程序(如果您有)通过相对路径访问微服务 API。因此,您可以将其部署到任何地方而无需更改路径。
我在windows的docker上用C#创建了几个微服务运行,我需要从另一个微服务调用微服务所以我用这种方式调用:
[HttpGet("GetOrder/{Object_ID}")]
public Order GetOrder (int id)
{
string Baseurl = "http://189.29.0.100/";
…..
using (var client = new HttpClient())
{
//Passing service base url
client.BaseAddress = new Uri(Baseurl);
client.DefaultRequestHeaders.Clear();
//Define request data format
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
//Sending request to find web api REST service resource GetAllEmployees using HttpClient
borrowerData = await client.GetStringAsync("api/order/" + Id.ToString());
}
…
}
我在Composed文件中使用了修复IP如下:
orderservice:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "80"
networks:
default:
ipv4_address: 189.29.0.100
问题是当我们在VM中部署这个项目时,如何让它与这些Ips一起工作?
Docker compose 在您的主机上创建一个虚拟网络,并且无法使用这些 IP 从 docker 外部路由服务。但是在虚拟网络内部,所有服务都可以使用它们的名称 (http://otherservice/
) 相互访问。
如果您想访问 VM 上所有已部署的微服务,您需要在 docker compose 中使用反向代理。例如,将请求分派给其他服务的 nginx 服务。
我同意@Bardia 的观点,使用 docker-compose 文件是让微服务知道彼此位置的最简单方法!就个人而言,我还为我的所有微服务使用一个 compose 文件。
因此,如果您在 docker-compose.yml
文件中将服务命名为 service-a
,您将能够通过 http://service-a:{port}/path
找到它。这有一个巨大的优势:您可以在每个微服务上使用相同的端口而不必担心端口冲突(因为使用 DNS 来解析路径),这对于启用水平扩展也至关重要!
更进一步,就像@Bardia 所说的那样,添加一个反向代理而不是在主机上的端口上开始真正的混乱...我个人喜欢 Traefik,您可以使用标签进行配置在撰写文件的服务描述中。这也有利于您的 UI 应用程序(如果您有)通过相对路径访问微服务 API。因此,您可以将其部署到任何地方而无需更改路径。