微服务实践
Microservices in practice
我研究微服务的概念已经有一段时间了,了解它们是什么以及为什么需要它们。
快速复习
简而言之,整体应用程序被分解为独立的可部署单元,每个单元通常公开其自己的 Web API 并拥有自己的数据库。每项服务都履行单一职责并且做得很好。这些服务通过同步 Web 服务(如 REST 或 SOAP)进行通信,或使用异步消息传递(如 JMS)来协同完成某些请求。我们的单体应用程序已经变成了一个分布式系统。通常,所有这些细粒度 API 都可以通过 API 网关或代理获得,它们充当单点入口外观,执行安全和监控相关任务。
采用微服务的主要原因是高可用性、零停机更新和通过特定服务的水平扩展实现的高性能,以及系统中更松散的耦合,这意味着更容易维护。此外,IDE 功能、构建和部署过程将显着加快,并且更容易更改框架甚至语言。
微服务与集群和容器化技术齐头并进,例如 Docker。每个微服务都可以作为 docker 容器打包到 运行 在任何平台上。集群的主要概念是服务发现、复制、负载平衡和容错。 Docker Swarm 是一种集群工具,可编排这些容器化服务,将它们粘合在一起,并以声明方式处理所有这些任务,维护集群的所需状态。
理论上听起来很简单,但我仍然不明白如何在实践中实现这一点,即使我非常了解 Docker Swarm。让我们看一个具体的例子。
这里是问题
我正在使用 Spring Boot 构建一个简单的 java 应用程序,由 MySQL[=48 支持=] 数据库。我想构建一个系统,用户从 Service A 获取网页并提交表单。 服务 A 将对数据进行一些操作并将其发送到 服务 B,后者将进一步操作数据,写入数据库,return一些东西,最后一些响应被发送回用户。
现在的问题是,服务 A 不知道在哪里可以找到 服务 B,也不知道 服务 B 知道在哪里可以找到 数据库 (因为它们可以部署在集群中的任何节点),所以我不知道应该如何配置 Spring引导应用程序。我首先想到的是使用 DNS,但我找不到如何在 docker swarm 中设置这样一个系统的教程。在 Spring 中为分布式云部署配置连接参数的正确方法是什么?我研究过 Spring Cloud project,但不明白它是否是这个困境的关键。
我也对应该如何部署数据库感到困惑。他们应该住在集群中,与服务一起部署(可能借助 docker 组合),还是以更传统的方式使用固定 IP 管理它们更好?
最后一个问题是关于负载均衡的。我很困惑是每个服务应该有多个负载均衡器,还是只有一个主负载均衡器。负载均衡器是否应该有一个映射到域名的静态IP,并且所有用户请求都针对这个负载均衡器?如果负载平衡器发生故障怎么办,它不会使所有扩展服务的努力变得毫无意义吗?是否有必要使用 Docker Swarm 设置负载均衡器,因为它有自己的路由网格?那么最终用户应该定位哪个节点?
如果您正在考虑使用 Docker Swarm,则无需担心 DNS 配置,因为它已由覆盖网络处理。假设您有三项服务:
一个
乙
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
创建所有服务后它们可以通过名称直接相互引用
这些请求针对该覆盖网络上容器的所有副本进行负载平衡。因此,A 始终可以通过引用“http://b”或仅通过调用主机名 B 来获取 B 的 IP。
当您在 Docker 中处理负载平衡时,群服务 已经 在内部进行了负载平衡。一旦你定义了一个服务来监听 8018 端口,所有 swarm 主机将监听 8018 端口,并以循环方式将其路由到容器。
但是,在主机发生故障时让应用程序负载平衡器位于主机前面仍然是最佳做法。
我研究微服务的概念已经有一段时间了,了解它们是什么以及为什么需要它们。
快速复习
简而言之,整体应用程序被分解为独立的可部署单元,每个单元通常公开其自己的 Web API 并拥有自己的数据库。每项服务都履行单一职责并且做得很好。这些服务通过同步 Web 服务(如 REST 或 SOAP)进行通信,或使用异步消息传递(如 JMS)来协同完成某些请求。我们的单体应用程序已经变成了一个分布式系统。通常,所有这些细粒度 API 都可以通过 API 网关或代理获得,它们充当单点入口外观,执行安全和监控相关任务。
采用微服务的主要原因是高可用性、零停机更新和通过特定服务的水平扩展实现的高性能,以及系统中更松散的耦合,这意味着更容易维护。此外,IDE 功能、构建和部署过程将显着加快,并且更容易更改框架甚至语言。
微服务与集群和容器化技术齐头并进,例如 Docker。每个微服务都可以作为 docker 容器打包到 运行 在任何平台上。集群的主要概念是服务发现、复制、负载平衡和容错。 Docker Swarm 是一种集群工具,可编排这些容器化服务,将它们粘合在一起,并以声明方式处理所有这些任务,维护集群的所需状态。
理论上听起来很简单,但我仍然不明白如何在实践中实现这一点,即使我非常了解 Docker Swarm。让我们看一个具体的例子。
这里是问题
我正在使用 Spring Boot 构建一个简单的 java 应用程序,由 MySQL[=48 支持=] 数据库。我想构建一个系统,用户从 Service A 获取网页并提交表单。 服务 A 将对数据进行一些操作并将其发送到 服务 B,后者将进一步操作数据,写入数据库,return一些东西,最后一些响应被发送回用户。
现在的问题是,服务 A 不知道在哪里可以找到 服务 B,也不知道 服务 B 知道在哪里可以找到 数据库 (因为它们可以部署在集群中的任何节点),所以我不知道应该如何配置 Spring引导应用程序。我首先想到的是使用 DNS,但我找不到如何在 docker swarm 中设置这样一个系统的教程。在 Spring 中为分布式云部署配置连接参数的正确方法是什么?我研究过 Spring Cloud project,但不明白它是否是这个困境的关键。
我也对应该如何部署数据库感到困惑。他们应该住在集群中,与服务一起部署(可能借助 docker 组合),还是以更传统的方式使用固定 IP 管理它们更好?
最后一个问题是关于负载均衡的。我很困惑是每个服务应该有多个负载均衡器,还是只有一个主负载均衡器。负载均衡器是否应该有一个映射到域名的静态IP,并且所有用户请求都针对这个负载均衡器?如果负载平衡器发生故障怎么办,它不会使所有扩展服务的努力变得毫无意义吗?是否有必要使用 Docker Swarm 设置负载均衡器,因为它有自己的路由网格?那么最终用户应该定位哪个节点?
如果您正在考虑使用 Docker Swarm,则无需担心 DNS 配置,因为它已由覆盖网络处理。假设您有三项服务:
一个 乙 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
创建所有服务后它们可以通过名称直接相互引用
这些请求针对该覆盖网络上容器的所有副本进行负载平衡。因此,A 始终可以通过引用“http://b”或仅通过调用主机名 B 来获取 B 的 IP。
当您在 Docker 中处理负载平衡时,群服务 已经 在内部进行了负载平衡。一旦你定义了一个服务来监听 8018 端口,所有 swarm 主机将监听 8018 端口,并以循环方式将其路由到容器。
但是,在主机发生故障时让应用程序负载平衡器位于主机前面仍然是最佳做法。