领事:SD架构。 从前端访问微服务的正确方法是什么?

我有一些由领事pipe理的后台微服务,为了从另外一个服务中获取一些数据,我使用consul的服务发现function,例如获取所有健康的服务器,然后从检索的条目中获取服务器地址和端口等但是我应该如何从前端做到这一点呢? 只需调用需要的微服务器使用它的实际IP或使用docker集装箱的命名空间调用它? 从知道该怎么做,甚至更好的人那里得到任何回应,谁会做得更好,这是非常有帮助的,因为我坚持了一下。

“前端”是指在Web浏览器上运行Javascript还是在同一个数据中心内运行的一个软件? 我假设我们不是在这里谈论networking浏览器的情况。

我认为具有智能caching和循环负载平衡function的客户端发现可以最大程度地扩展,因为没有单点故障,并且对集群内的任何中断作出反应都非常快。 但是它将更多的逻辑推向了客户端,使得日志logging比Nginx的普通访问日志更难。

第二个选项是非常标准的,很好理解,Nginx和Haproxy是为这个工作负载devise的。 请注意,您应该有一些不会有单点故障,并且升级它们的二进制文件(特别是在Docker上运行它们时)会导致短暂的停机时间。 无论如何,客户需要发现这些负载平衡器,DNS是最常见的select。 如果情况非常静态,并且所有内容都在默认端口上运行,那么DNS运行良好,因此您不需要使用TTL和SRVlogging进行过多的修改。

第三种select使得客户端逻辑变得更简单,因为API网关可以作为您内部可用服务的“视图”。 但是,您仍然需要为客户find服务,以便他们不会真正解决原来的问题。

欢迎任何反馈,这是一个非常广泛的话题,你的里程可能会有所不同。

更新:另外,如果您使用的是HTTP协议,您可能需要通过HTTPS来保护它。 有了负载平衡器,您就有机会终止HTTPS,在VPC内部或在防火墙后面有更简单的非encryptionstream量。

在调查过程中,我发现有几种方法:

  1. 客户端服务发现 – 假设你有领事,知道所有可用的服务器及其状态,在客户端你应该写一个服务层,可以调用consul的API,获取健康的服务器,然后再做一个http请求来需要服务器。 (当然,它可以有点更聪明,有一个能力,如caching健康的服务器等)。

  2. 服务器端服务发现(负载均衡器) – 领事上方的附加层 – 可以是haproxy或nginx,它将转发请求到需要的服务器。 (从前端可以使用consul域名或docker容器域名)。

  3. 服务器端服务发现(API网关) – 最后一个,你可以再写一个微服务来处理所有请求,并在检查他们的状态之后,将它们代理到所需的服务器。

但现在还有一个问题 – 你应该使用哪种方法? – 我认为这取决于项目的复杂性,服务器负载和微服务的数量。

恕我直言,如果你有几个微服务和低服务器负载,你可以使用其中任何一个,但在其他任何情况下,我认为最好select第二种方法。