从 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。因此,您可以将其部署到任何地方而无需更改路径。