【问题标题】:Consul: SD architecture. What is the right way to access microservices from a front-end side?领事:SD架构。从前端访问微服务的正确方法是什么?
【发布时间】:2017-06-23 17:40:45
【问题描述】:

我有一些由 consul 管理的后端微服务,为了从一个服务中为另一个服务获取一些数据,我使用了 consul 的服务发现功能——比如获取所有健康的服务器,然后从检索条目等。但是我应该如何从前端执行它?只需使用它的实际 ip 调用所需的微服务器或使用 docker 容器的命名空间调用它?从知道如何做甚至更好的人那里得到任何回应将非常有帮助,谁以前做过,因为我坚持了一点。

【问题讨论】:

    标签: node.js docker microservices consul


    【解决方案1】:

    您所说的“前端”是指在网络浏览器上运行的 Javascript 还是在同一数据中心内运行的软件?我假设我们在这里讨论的不是网络浏览器场景。

    我认为具有智能缓存和循环负载平衡的客户端发现可扩展最佳,因为没有单点故障,并且它对集群内的任何中断反应非常快。但是它把更多的逻辑推到了客户端,使得日志记录比 Nginx 的琐碎访问日志更加困难。

    第二个选项非常标准且易于理解,Nginx 和 Haproxy 就是为这种工作负载而设计的。请注意,您应该让其中一些可用,以免出现单点故障,并且升级它们的二进制文件(特别是如果您在 Docker 上运行它们)将导致短暂的停机时间。无论如何,客户端都需要以某种方式发现这些负载均衡器,DNS 是最常见的选择。当情况相当静态且一切都在默认端口上运行时,DNS 运行良好,因此您无需过多地修改 TTL 和 SRV 记录。

    第三个选项使客户端逻辑更简单,因为 API 网关可以充当您在内部可用的服务的“视图”。但是您仍然需要服务发现让客户端找到这些,因此它们并不能真正解决最初的问题。

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

    更新:此外,如果您使用的是 HTTP 协议,您可能希望通过 HTTPS 保护它。使用负载均衡器,您有机会在那里终止 HTTPS,并在您的 VPC 或防火墙后面的任何地方拥有更简单的非加密流量。

    【讨论】:

      【解决方案2】:

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

      1. 客户端服务发现 - 假设你有 consul,它知道所有关于可用服务器及其状态的信息,在客户端 你应该写一个服务层,它可以调用consul的API,获取 健康的服务器,然后再向所需的服务器发出一个 http 请求。 (当然它可以更聪明一点,并且有能力,例如缓存 健康的服务器等)。

      2. 服务器端服务发现(负载均衡器) - 在 consul 之上的附加层 - 它可以是 haproxy 或 nginx,它将请求转发到 需要的服务器。 (从前端你可以使用 consul dns 名称 或 docker 容器 dns 名称)。

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

      但现在还有一个问题 - 您应该使用哪种方法? - 我认为这在很大程度上取决于项目的复杂性、服务器负载和微服务的数量。

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

      【讨论】:

        猜你喜欢
        • 2019-03-30
        • 2014-06-14
        • 2019-11-11
        • 2016-04-15
        • 1970-01-01
        • 2018-10-12
        • 2019-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多