首页 文章

实践中的微服务

提问于
浏览
6

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

Quick refresher

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

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

微服务与集群和容器化技术密切相关,例如Docker . 每个微服务都可以打包为docker容器,以便在任何平台上运行它 . 集群的主要概念是服务发现,复制,负载 balancer 和容错 . Docker Swarm是一个集群工具,它协调这些容器化服务,将它们粘合在一起,并以声明的方式处理所有这些任务,保持集群的所需状态 .

理论上听起来既简单又简单,但我仍然不明白如何在实践中实现这一点,即使我非常了解Docker Swarm . 让我们看一个具体的例子 .

Here is the question

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

现在问题是,服务A不知道在哪里找到服务B,服务B也不知道在哪里找到数据库(因为它们可以部署在集群中的任何节点上),所以我不会找到如何设置这样的教程docker swarm中的系统 . 在Spring中为分布式 Cloud 部署配置连接参数的正确方法是什么?我研究过Spring Cloud项目,但这并不是解决这个难题的关键 .

我也很困惑应该如何部署数据库 . 他们是否应该居住在集群中,与服务一起部署(可能借助于docker compose),还是以更传统的方式使用固定IP进行管理?

最后一个问题是关于负载 balancer . 如果每个服务应该有多个负载 balancer 器,或者只有一个主负载均衡器,我会感到困惑 . 负载均衡器是否具有映射到域名的静态IP,并且所有用户请求都以此负载均衡器为目标?如果负载均衡器出现故障,它是否会尽一切努力扩展服务毫无意义?是否有必要使用Docker Swarm设置负载均衡器,因为它有自己的路由网格?那个节点最终用户应该针对哪个?

1 回答

  • 2

    如果您正在使用Docker Swarm,则无需担心DNS配置,因为它已由覆盖网络处理 . 假设您有三种服务:

    A B C.

    A是您的DB,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
    

    创建所有服务后 they can refer to each other directly by name

    这些请求针对该覆盖网络上容器的所有副本进行负载 balancer . 因此A总是可以通过引用“http://b”或仅通过调用主机名B获得B的IP .

    当您在Docker中处理负载 balancer 时,swarm服务已在内部进行负载 balancer . 一旦定义了要在端口8018上侦听的服务,所有群集主机都将侦听端口8018并以循环方式将其路由到容器 .

    但是,最佳做法是在主机发生故障时让应用程序负载 balancer 器位于主机前面 .

相关问题