从Docker中的另一个微服务调用微服务

时间:2017-09-22 17:18:05

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

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

def gen_weapon
  WEAPON_PROBABILITY[rand(1..80)].new
end

我在Composed文件中使用了修复IP,如下所示:

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

        }

       …
    }

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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