【问题标题】:Call Microservice from another Microservice within Docker从 Docker 中的另一个微服务调用微服务
【发布时间】:2018-03-04 08:17:59
【问题描述】:

我用C#创建了几个在windows的docker上运行的微服务,我需要从另一个微服务调用微服务,所以我用这种方式调用:

    [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());

        }

       …
    }

我在 Compposed 文件中使用的修复 IP 如下:

 orderservice:
    environment:
     - ASPNETCORE_ENVIRONMENT=Development
   ports:
  - "80"
networks:
  default:
    ipv4_address: 189.29.0.100

问题是当我们在VM中部署这个项目时,如何使它与这些Ips一起工作?

【问题讨论】:

  • 您应该改用名称。喜欢serviceA。然后,您应该在撰写中使用extra_hosts 将应用程序IP 的主机条目设置为189.29.0.100。部署到 VM 时,您可以使用 /etc/hosts 中的条目作为主机
  • 您可以创建一个具有有效名称的网络并将其用作主机名。这能解决您的问题吗?

标签: c# docker microservices docker-for-windows


【解决方案1】:

Docker compose 在您的主机上创建一个虚拟网络,并且这些服务无法从 docker 外部使用这些 IP 进行路由。但是在虚拟网络中,所有服务都可以通过它们的名称(http://otherservice/)相互访问。 如果您想访问 VM 上所有已部署的微服务,您将需要在 docker compose 中使用反向代理。例如一个 nginx 服务将请求分派给其他服务。

【讨论】:

  • 应该每个微服务都有自己的 docker-compose 文件吗?如果是这样,一个 docker-compose 文件上的虚拟网络是否可以访问另一个(具有单独 docker-compose 文件的微服务)?我在这里发布了一个类似的问题:stackoverflow.com/q/48663545/1632961 如果您想发表您的见解
  • 为所有堆栈拥有一个撰写文件更容易。除非它太大而无法由一个运营团队管理。如果你想在许多物理节点上扩展它,你可以使用 docker-compose 版本 3 来实现 swarm 模式。或者 Kubernetes 而不是 docker compose。
【解决方案2】:

我同意@Bardia 的观点,即使用 docker-compose 文件是让微服务知道彼此位置的最简单方法!就我个人而言,我的所有微服务也使用一个 compose 文件。

因此,如果您在docker-compose.yml 文件中将服务命名为service-a,您将能够通过http://service-a:{port}/path 找到它。这有一个巨大的优势:您可以在每个微服务上使用相同的端口,而不必担心端口冲突(因为使用 DNS 来解析路径),这对于启用水平扩展也至关重要!

更进一步,就像@Bardia 说的那样,添加一个反向代理,而不是在主机上的端口开始真正的混乱......我个人喜欢Traefik,您可以通过在服务描述中使用标签来配置它的撰写文件。这也有利于您的 UI 应用程序(如果有的话)通过相对路径访问微服务 API。因此,您可以在任何地方部署它,而无需更改路径。

【讨论】:

    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2018-02-20
    • 2021-03-17
    • 2020-07-06
    相关资源
    最近更新 更多