微服务在实践中

我现在已经研究了微服务的概念,了解它们是什么以及为什么它们是必要的。

快速复习

简而言之,monolith应用程序被分解为独立的可部署单元,每个单元通常暴露自己的web API并拥有自己的数据库。 每项服务都履行一项责任,并做得很好。 这些服务通过REST或SOAP等同步Web服务进行通信,或使用asynchronous消息传递(如JMS)来协同执行某些请求。 我们的庞大应用已经成为一个分布式系统。 通常,所有这些细粒度的API都可以通过API网关或代理服务器提供,该代理服务器充当单点入口外观,执行安全和监视相关任务。

适应微服务的主要原因是高可用性,零停机时间更新和通过特定服务的横向扩展实现的高性能,以及系统中的松耦合,意味着更容易的维护。 此外,IDEfunction,构build和部署过程将显着加快,并且更改框架甚至语言更容易。

微服务与Docker等集群化和集装化技术并驾齐驱。 每个微服务可以作为docker容器打包在任何平台上运行。 集群的主要概念是服务发现复制负载平衡容错 。 Docker Swarm是一个集群化工具,它们协调这些集装箱化的服务,将它们粘合在一起,并以声明的方式处理所有这些任务,维护集群的所需状态。

理论上听起来很简单,但我仍然不明白如何在实践中实现这一点,即使我对Docker Swarm也相当了解。 我们来看一个具体的例子。

这是问题

我正在使用Spring Boot构build一个简单的java应用程序,并由MySQL数据库支持。 我想build立一个系统,用户从服务A获得一个网页并提交一个表单。 服务A将对数据进行一些操作并将其发送给服务B服务B将进一步操作数据,写入数据库,返回一些内容,最终将一些响应发回给用户。

现在的问题是, 服务A不知道在哪里find服务B服务B也不知道在哪里可以find数据库 (因为他们可以部署在集群中的任何节点),所以我不知道应该如何configurationSpring启动应用程序。 首先想到的是使用DNS,但是我找不到在Docker Swarm中如何设置这样一个系统的教程。 在Spring中为分布式云部署configuration连接参数的正确方法是什么? 我已经研究过关于Spring Cloud的项目,但不明白这是否是这个困境的关键。

我也很困惑如何部署数据库。 他们是否应该住在集群中,与服务一起部署(可能需要通过docker撰写),还是用更固定的IP更传统的方式来pipe理它们?

最后一个问题是关于负载平衡。 如果每个服务应该有多个负载均衡器,或者只有一个主负载均衡器,我感到困惑。 负载均衡器是否应该有一个映射到域名的静态IP,并且所有的用户请求都是以这个负载均衡器为目标的? 如果负载平衡器失败了,那么不是所有的努力来扩大服务的意义? 是否有必要使用Docker Swarm来设置负载平衡器,因为它有自己的路由网格? 那么哪个节点最终用户应该瞄准?

如果您正在考虑使用Docker Swarm,则不必担心DNSconfiguration,因为它已经由覆盖networking处理。 假设您有三项服务:

A B C

A是你的数据库,B可能是第一个收集数据的服务,C是接收数据并更新数据库(A)

docker network create \ --driver overlay \ --subnet 10.9.9.0/24 \ youroverlaynetwork docker service create --network youroverlaynetwork --name A docker service create --network youroverlaynetwork --name B docker service create --network youroverlaynetwork --name C 

一旦所有的服务都被创build出来, 他们可以通过名字直接引用对方

这些请求将对该覆盖networking上容器的所有副本进行负载平衡。 所以A可以通过引用“ http:// b ”或者只是通过调用主机名B来获得B的IP。

当您在Docker中处理负载均衡时,群集服务已经在内部进行负载平衡。 一旦你定义了一个监听端口8018的服务,所有的主机将监听端口8018,并以循环的方式将其路由到一个容器。

但是,如果发生主机故障,最好还是让应用程序负载均衡器位于主机前。