我在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一起工作?
答案 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的优势。因此,您可以将其部署到任何地方,而无需更改路径。