微服务架构开发实战:如何实现微服务的自动扩展?

程序员高级码农II 2020-09-25 07:25:00

如何实现微服务的自动扩展

前面讲了一些关于自动扩展的理论知识,但如何实现自动扩展,并不是三言两语就能够说得清楚的。特别是为了实现前面提到的那些自动扩展的模式及策略,在操作系统级别方面会需要大量的执行脚本。在自动扩展方面,SpringCloud框架也并没有给出确切的答案。

随着微服务架构的流行,以Docker等为首的容器技术开始火热发展。Docker 是实现自动扩展非常好的基础,因为它提供了一个统一-的容 器处理方式,而不管微服务所使用的技术如何。它还帮助用户隔离微服务,以避免相邻的服务之间产生资源的竞争。

但是,Docker 和脚本只能部分解决问题。在大规模Docker部署的情况下,仍然需要回答如下问题。

●如何管理数千个容器?

●如何监控他们?

●在部署工件时,如何应用规则和约束?

●如何确保能够正确地利用容器来获得资源效率?

●如何确保至少有一定数量的最小实例正在运行?

如何确保依赖服务正常运行?

●如何进行滚动升级和优雅的迁移?

●如何回滚错误的部署?

所有这些问题都指出需要有一个解决方案来解决以下两个关键功能。

●一个容器抽象层,在许多物理或虚拟机上提供统一的抽象 。

●容器编排和初始化系统在集群抽象之上智能管理部署。

本节将会重点讨论这两点。

容器编排

容器编排工具为开发人员和基础架构团队提供了一个抽象层来处理大规模的集装箱部署。容器编排工具提供的功能因供应商而异。然而,他们都提供了共同的功能,其中包括发现、资源管理、监控和部署。

1.容器编排的重要性

编排很重要,是因为在微服务的架构里面,应用程序被拆分成不同的微服务应用,因此需要更多的服务器节点进行部署。为了正确管理微服务,开发人员倾向于为每个虚拟机部署一个微服务 ,这在一定程度上:降低了资源利用率。在很多情况下,这会导致CPU和内存的过度分配。

在大型系统的部署中,微服务的高可用性要求迫使运维人员会添加越来越多的服务实例以实现冗余。实际上,虽然它提供了所需的高可用性,但这会导致未充分利用的服务器实例。一般来说,与单一应用程序部署相比,微服务部署需要更多的基础设施。由于基础设施成本的增加,反而令许多组织看不到微服务的价值。如图14-9 所示,为了实现系统的高可用性,每个微服务都会部署多个实例。

为了解决图14-9 中所述的问题,首先需要一个能够执行以 下操作的工具。

●自动执行一些活动。例如,高效地将容器分配给基础设施,这对开发人员和管理员来说是透明的。

●为开发人员提供一个抽象层,以便他们可以将其应用程序部署到数据中心,而无须关心到底应用是要使用哪台机器。

可以是最少的人为交互。

●通过最大限度地利用可用资源来高效构建、部署和管理应用程序。

容器正是能够胜任上述工作的有力工具。使用容器,就可以以统一的方式来处理应用程序, 而无须关心微服务具体是使用了哪种技术。

2.容器编排的工作职责

典型的容器编排工具有助于虚拟化- -组计算机并将其作为- -个集群进行管理。容器协调工具还有助于将工作负载或容器移动到对用户透明的机器上。

对于容器编排,业界并没有统-的术语,常见的称呼有容器编排、集群管理、数据中心虚拟化、容器调度、容器生命周期管理、数据中心操作系统等。

容器编排工具是为了帮助自助服务和配置基础设施,而不是要求基础设施团队按照预定义的规格分配所需的机器。在这种自动化的容器编排方法中,机器不再是预配置并预先分配给应用程序。

一些容器编排工具还可以帮助跨多个异构机器,甚至可以跨多个虚拟化数据中心,并创建-一个弹性的私有云式基础架构。

容器编排工具目前没有标准的参考模型。因此,不同的供应商可能实现的功能各不相同。

容器编排软件一般都会具备以下关键功能。

●集群管理:将一个虚拟机和物理机集群作为- -台大型机器进行管理。这些机器在资源能力方面可能是异构的,但基本上还是以Linux 为主要操作系统的机器。这些虚拟集群可以在云端,也可以是在本地,或者是两者的组合。

●自动部署:它支持应用程序容器的多个版本,并支持在大量集群机器上进行滚动升级。这些工具也能够处理错误,并且可以回滚到可用的版本。

●可伸缩性:这样可以根据需要处理应用程序实例的自动和手动可伸缩性,并将其作为主要目标进行优化利用。

● 运行状况监控:适用于管理集群、节点和应用程序的运行状况。它可以从集群中删除有故障的机器和应用程序实例。

●基础架构抽象:开发者不用担心关于机器、容量等。这完全是容器编排软件来决定如何计划和运行应用。这些工具还从开发者中抽象出机器的细节,如容量、利用率和位置等。对于应用程序所有者来说,这相当于- - 台几乎可以无限容量的大型机器。

● 资源优化:这些工具的固有行为是以高效的方式在一组可用机器上分配容器工作负载,从而降低成本,并提高机器的利用率。

●资源分配:根据应用程序开发人员设置的资源可用性和约束来分配服务器。资源分配将基于这些约束(如关联性规则、端口要求、应用程序依赖性、运行状况等)。

●服务可用性:确保服务在集群中的某处运行。在发生机器故障的情况下,容器编排通过在集群中的某个其他机器上重新启动这些服务来自动处理故障。

●敏捷性:敏捷性工具能够快速将工作负载分配给可用资源,或者在资源需求发生变化时将工作负载移至机器上。此外,还可以根据业务关键性、业务优先级等设置约束来重新调整资源。

●隔离:这些工具中有一些提供了开箱即用的资源隔离功能。因此,即使应用程序没有进行容器化,也可以实现资源的隔离。

3.资源分配的常用算法

从简单算法到具有机器学习和人工智能的复杂算法,在容器编排中,资源分配会使用各种算法。

比较常用的算法有传播( Spread)、装箱( Bin Packing )和随机( Random)。针对应用程序设置的约束,来设置基于资源可用性的默认算法。

图14-10~图14-12 显示了这些算法是如何用部署填充到可用的机器上的。在这种情况下,这里用两台机器进行演示。

资源分配的3种常用策略解释如下。

●传播:这将工作负载平均分配到可用的机器上,如图14-10所示。

●装箱: 这将试图通过机器填充机器,并确保机器的最大利用率。在按需付费的云服务中,装箱算法是特别好的。

随机:随机选择机器并在随机选择的机器上部署容器,如图14-12所示。

随着科技的发展,机器学习和协作过滤等手段可以更好地提高效率。例如,可以将未分配的资源分配给高优先级的任务( 这些任务意味着有更高的收益),以便充分利用现有资源,提高创收。

4.与微服务的关系

微服务的基础设施(如果配置不当)很容易导致基础设施过大,本质上导致成本的增加。正如前面部分所讨论的那样,在处理大规模微服务架构系统时,具有容器编排工具的类似云的环境对于实现成本效益至关重要。

在Spring Cloud 项目中利用Spring Boot来构建微服务,是利用容器编排技术的理想工具。由于基于Spring Cloud的微服务并不关心具体的位置,因此可以将这些服务部署到集群中的任何位置。

每当出现服务时,它都会自动注册到服务注册中心并通告其可用性。另外,消费者总是寻找服务注册表来发现可用的服务实例。这样,应用程序就可以支持完整的流体结构,而无须预先部署拓扑结构。使用Docker能够在抽象运行时,以便服务可以在任何基于Linux的环境中运行。

5.与虚拟化技术的关系

容器编排解决方案在许多方面与传统的服务器虚拟化解决方案有着比较大的差异。容器编排解决方案作为应用程序组件,运行在虚拟机或物理机器之上。

常用的容器编排技术

1. Docker Swarm

Docker Swarm是Docker的本地容器编排解决方案。Swarm 提供与Docker的本地和更深层次的集成,并有着与Docker的远程API兼容的API。它在逻辑上将- -组 Docker主机分组,并将它们作为一个大型的Docker虚拟主机进行管理。应用程序管理员和开发人员无须决定容器是在哪个主机上部署,这个决策将被委托给Docker Swarm。它将根据分组打包和扩展算法决定使用哪个主机。

由于Docker Swarm基于Docker的远程API,现有Docker用户的学习曲线与其他任何容器业务流程工具相比要少得多。然而,Docker Swarm是市场上较新的产品,仅支持Docker容器。

Docker Swarm使用管理器( manager)和节点( node)的概念。管理员通过管理器来与Docker容器进行交互和调度。节点则是Docker容器部署和运行的地方。

2. Kubernetes

Kubermetes ( k8s )来自Google 的工程设计,使用Go语言编写,并正在Google进行大规模部署的测试。与Swarm类似,Kubernetes帮助管理跨集群节点的容器化应用程序。它有助于自动化容器部署和容器的调度与可伸缩性。它支持许多有用的开箱即用功能,如自动逐步展开、版本化部署和容器弹性管理等。

Kubermetes 体系结构具有主节点( master)、节点(node)和pod等概念。主节点和节点一起被称为Kubernetes集群。主节点负责跨多个节点分配和管理工作负载,节点就是虚拟机或物理机器。

节点既可以被进一-步分割成pod,也可以托管多个pod。一个或多个容器在一个pod内分组并执行。

pod还有助于管理和部署共存服务以提高效率。Kubernetes 也支持标签的概念作为键值对,以便查询和查找容器。标签是用户定义的参数,用于标记执行常见类型工作负载的某些类型的节点,如前端Web服务器等。

部署在集群上的服务将获得- - 个IP/DNS用来访问该服务。Kubernetes 对Docker有开箱即用的支持。然而,Kubernetes 的学习曲线会比Docker Swarm更多。作为OpenShift 平台的一部分, RedHat为Kubernetes提供商业支持。

3. Apache Mesos

有关ApacheMesos的介绍,最早可追溯到BenjaminHindman等所写的技术白皮书Mesos:APlatform for Fine-Grained Resource Sharing in the Data Center (可以在线查看该文章htp://mesos.berkeley.edu/mesos_ tech_ reportpdf )。后来Benjamin Hindman加入了Twitter, 负责开发和部署Mesos。再后来Benjamin Hindman离开Twitter而去了Mesosphere, 着手建设并商业化以Mesos为核心的DC/OS (数据中心操作系统)。

Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核,使用内置Linux内核相同的原理,只是在不同的抽象层次。该Mesos内核运行在每个机器上,在整个数据中心和云环境内向应用程序(如Hadoop、Spark、 Kafka、 Elasticsearch 等)提供资源管理和资源负载的API接口。

Apache Mesos具备以下特性。

● 线性可扩展性:业界认可的可扩展到10000个节点。

●高可用性:使用ZooKeeper实现master和agent的容错,且实现了无中断的升级。

支持容器:原生支持Docker容器和AppC镜像。

●可拔插的隔离:对CPU、内存、磁盘、端口、GPU和模块实现自定义资源的一-等( first class )隔离支持。

●二级调度:支持使用可插拔调度策略来在相同集群中运行云原生和遗留的应用程序。

  • API: 提供HTTP API在操作集群、监控等方面开发新的分布式应用程序。
  • Web界面:内置Web界面查看集群的状态,并可以导航containersandbox(容器沙箱)
  • 跨平台:可以在Linux、OSX和Windows 上运行,并且与云服务提供商无关。

Mesos与以往的解决方案稍有不同。它更多的是依靠其他框架来管理工作负载执行的资源管理器。它位于操作系统和应用程序之间,提供了- -个逻辑的机器集群。

Mesos是一个分布式系统内核,将多台计算机逻辑分组并将其虚拟化为一台 大型机器。它能够将许多异构资源分组到一个统一资源集群 上,在这个集群上可以部署应用程序。基于这些原因,Mesos也被称为在数据中心建立私有云的工具。

Mesos具有主节点和从节点的概念。与早期的解决方案类似,主节点负责管理集群,而从节点负责运行工作负载。它在内部使用ZooKeeper进行集群协调和存储,也支持框架的概念。这些框架负责调度和运行非集装箱应用程序和容器。Marathon、 Chronos 和Aurora是应用程序调度和执行的流行框架。Netflix 的Fenzo是另一个开源的Mesos框架。有趣的是,Kubernetes 也可以用作Mesos框架。

Marathon支持Docker容器,以及非容器化的应用程序。Spring Boot可以直接配置在Marathon中。Marathon提供了许多开箱即用的功能,如支持应用程序依赖项用于扩展和升级服务的应用程序分组、实例的启动和关闭、滚动升级、回滚失败升级等。

Mesosphere作为DC/OS平台的一部分, 为Mesos和Marathon提供商业支持。

总结

Spring Cloud并没有提供现成的处理自动扩展的方案,但结合目前市面上常用的容器编排技术(如上文提到的Docker Swarm、Kubermetes、Apache Mesos等),能够方便地实现服务的自动扩展。

自动扩展在微服务架构中是一个相对复杂的问题,学习成本相对也比较高。由于自动扩展并非是Spring Cloud的核心话题,因此本文也只是给出了一些基本的概念和思路,不做深入的探讨。如果读者对这方面感兴趣,也可以自行查阅相关资料。以下是一些常用的学习链接地址。

Docker Swarm: htps://cs.docker.com/swarm

● Kubernetes : htps://kubermetes.io/docs/home/.

●Apache Mesos: htp:/m/esos.apache .org/documentation/latest。

本篇文章内容给大家讲解的是如何实现微服务的自动扩展

  1. 下篇文章给大家讲解的是微服务的高级主题一 熔断机制;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

微服务架构开发实战:如何实现微服务的自动扩展?相关推荐

  1. gradle 指定springcloud 版本_SpringCloud微服务架构开发实战:实现服务注册与发现

    实现服务的注册与发现 在前面分别用Eureka Server和Eureka Client来搭建了一台注册服务器,以及多个Eureka Client客户端.Eureka Client在启动后,就会将自己 ...

  2. 微服务架构开发实战:如何集成Zuul和实现API网关?

    如何集成 Zuul 本节将基于Zuul来实现API网关.作为Spring Cloud 的一部分,集成Zuul会变得非常简单. Zuul简介 路由是微服务架构中必需的一部分,如""可 ...

  3. 微服务架构开发实战:API网关意义和常见API网关的实现方式

    API网关意义 API网关旨在用一套单一且统一的API入口点,来组合一个或多个内部API. API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理是一样的.API网关统一服务入口,可方 ...

  4. 《Spring Cloud微服务架构开发实战》_董超笔记

    服务治理 一.服务治理说明 1.方便微服务实例的上线与下线,实现服务快速进行水平扩展. 2.为微服务架构提升应用弹性,当其中一个应用的一个服务提供者实例不可用或者出现问题时,服务治理可及时发现问题,在 ...

  5. springcloud微服务架构开发实战:分布式消息总线

    消息总线的定义 前面在1.4.2节中强调过,在微服务架构中,经常会使用REST 服务或基于消息的通信机制. 在3.6节中也详细介绍了消息通信的实现方式.消息总线就是一种基于消息的通信机制. 消息总线是 ...

  6. 微服务架构开发实战日志与监控:微服务日志管理将面临的挑战

    微服务的日志与监控:微服务日志管理将面临的挑战 日志来自正在运行的进程的事件流.对于传统的JavaEE应用程序而言,有许多框架和库可用于日志记录.Java Logging (JUL)是Java自身所提 ...

  7. spring cloud 日志_微服务架构开发实战:ElasticStack实现日志集中化

    常见日志集中化的实现方式 有许多现成的可用于实现集中式日志记录的解决方案,它们使用不同的方法.体系结构和技术.理解所需的功能并选择满足需求的正确解决方案非常重要. 日志托运 有一些日志托运组件可以与其 ...

  8. 微服务架构开发实战:分布式消息总线,实现配置信息的自动更新

    实现配置信息的自动更新 在上一篇文章中节演示了集成Spring Cloud Bus 的过程.在示例中,当微服务实例启动的时候,可以去加载最新的配置信息.当时这种做法有一定的局限性,即只有在应用启动的过 ...

  9. Java开发面试题目,微服务架构开发实战

    面试失败之后 在这之后的很长一段时间后,他没敢再去面试,觉得自己太丢人.技术太差不敢去谈论技术话题.后来他渐渐开始看网上的文章,知道要刷leetcode,看面经,然后之后一年多的时间,边上课,边刷题, ...

最新文章

  1. 微信小程序架构分析 (上)
  2. MyBatis缓存分为一级缓存和二级缓存
  3. 华南理工专科计算机随堂联系,华南理工大学网络教育计算机基础随堂练习第三章...
  4. c语言编程统计单词的个数,使用c语言如何统计单词个数
  5. 中国计算机学会推荐的国际学术刊物
  6. windows 开启/关闭本地连接的批处理程序
  7. c语言实现输入输出功能需要调用库函数,C语言学习笔记(二)
  8. Rocketmq介绍和安装
  9. Eclipse Scout架构商业应用开发的工具与环境
  10. .NET伪静态使用以及和纯静态的区别
  11. 全网首发:解决办法:shmget()一直失败,errno=-22
  12. CentOS7恢复rm -rf 误删的xfs系统
  13. 开关电源电路图及原理12v分析-详细版
  14. PAT Basic 1055
  15. cookie的工作原理、cookie的重要性
  16. Spring Boot整合Shiro + Springboot +vue
  17. Linux ubuntu下载deb包的推荐网站
  18. mysql学习笔记-索引优化【1】-索引失效原因
  19. ubuntu 拨号上网
  20. Maven账户设置非明文密码

热门文章

  1. 手写 Promise.race
  2. 力扣110. 平衡二叉树(JavaScript)
  3. 机器算法有哪几种 python_8种顶级Python机器学习算法-你必须学习
  4. mysql统计每个科目平均成绩_No.03 数据库经典面试之如何取出每科成绩的前三名...
  5. C++之初始化列表的一个笔记
  6. 刀片服务器虚拟化哪家好,刀片服务器TOP5 细数虚拟化时代利器
  7. 新思路计算机一级百度云,新思路全国计算机一级考试选择题(含解析和答案)合并(1)...
  8. centos 计算器_Linux学习之CentOS(十五)--Linux常用命令之bc、man、shutdown...
  9. java时间戳龙_Java时间戳与日期格式字符串的互转
  10. mybatis 多表查询-一对多(方法一 常用)