我有一些由consul管理的后端微服务,并且从一个服务获取另一个服务的一些数据,我使用consul的服务发现功能 - 比如获取所有健康的服务器,然后从服务器获取服务器地址和端口但是我应该如何从前端进行操作?只需使用它实际的ip调用所需的微服务器或使用docker容器的命名空间调用它?获得任何知道如何做到甚至更好的人的反应将非常有帮助,之前是谁做过,因为我坚持了一点。
答案 0 :(得分:1)
来自"前端"你的意思是在网络浏览器上运行的Javascript或你在同一数据中心内运行的软件吗?我假设我们不是在讨论网络浏览器方案。
我认为使用智能缓存和循环负载平衡的客户端发现可以实现最佳扩展,因为没有单点故障,并且它对群集中的任何中断反应非常快。但是它向客户端推送了更多的逻辑,并使得日志记录比Nginx的简单访问日志更难。
第二个选项非常标准且易于理解,Nginx和Haproxy专为此工作负载而设计。请注意,您应该可以使用其中一些不会出现单点故障,并且升级其二进制文件(特别是如果您在Docker上运行它们)将导致短时间的停机。无论如何,客户端需要以某种方式发现这些负载均衡器,DNS是最常见的选择。当情况非常静止并且所有内容都在默认端口上运行时,DNS运行良好,因此您不需要对TTL和SRV记录进行太多修改。
第3个选项使客户端逻辑更简单,因为API网关可以充当"视图"对于您内部可用的服务。但是你仍然需要服务发现让客户找到这些,这样他们才能真正解决原来的问题。
欢迎任何反馈,这是一个非常广泛的主题,您的里程可能会有所不同。
更新:此外,如果您使用HTTP协议,您可能希望通过HTTPS保护它。使用负载均衡器,您可以在那里终止HTTPS,并在您的VPC或防火墙后面的任何地方拥有更简单的非加密流量。
答案 1 :(得分:0)
在调查过程中,我发现有几种方法:
客户端服务发现 - 假设您有领事并且在客户端知道所有可用服务器及其状态 你应该写一个服务层,它可以调用consul的API,fetch 健康的服务器,然后再向需要的服务器再做一次http请求。 (当然它可以更聪明一些并且具有例如缓存的能力 健康的服务器等。)。
服务器端服务发现(负载均衡器) - 领事上方的附加层 - 可以是haproxy或nginx,它会将请求转发给 需要服务器。 (从前端可以使用领事名称 或码头工人容器dns名称)。
服务器端服务发现(API网关) - 最后一个,您可以再写一个微服务,它将处理所有请求并在检查其状态后将它们代理到所需的服务器在领事。
但现在还有一个问题 - 你应该使用哪种方法? - 我认为这很大程度上取决于项目的复杂性,服务器负载和微服务的数量。
恕我直言,如果你有一些微服务和低服务器负载,你可以使用其中任何一个,但在任何其他情况下,我认为最好选择第二种方法。