草庐IT

微服务架构下 | 你不得不知的3种部署策略

JAVA旭阳 2023-03-28 原文

前言

不知道大家有了解过你们公司的软件产品是如何部署的么?采用的什么部署策略?其实在软件开发生命周期中,部署是非常关键的一环,你需要考虑多方面的因素,如何保证你部署对用户无感知?如何把影响范围控制到最小?如何出现问题快速的实现回滚?

现在的大多数应用程序都是云原生、微服务的方式。例如,淘宝,它就是由许许多多的子服务组成的。服务数量越多,意味着出现问题的可能性更大。那么部署的策略极为关键,高效部署的期望达成的目标有如下几点:

  1. 零停机
  2. 快速部署
  3. 客户对新版本的快速反馈
  4. 出现问题容易回滚
那么本文和大家分享3种微服务部署比较常见的3种部署策略,滚动部署、蓝绿部署和金丝雀部署。

滚动部署

上图显示了部署模式:旧版本以蓝色显示,新版本在集群中的每个服务器上以绿色显示

在滚动部署中,应用程序的新版本逐渐替换旧版本。实际部署发生在一段时间内。在此期间,新旧版本将共存,不会影响功能使用和用户体验。此过程可以更轻松地回滚与旧组件不兼容的任何新组件。

优点:

  1. 减少停机时间:滚动部署允许以增量方式部署更新,从而减少应用程序的整体停机时间。这是因为应用程序在部署过程中对用户仍然可用。
  2. 更好的风险管理:通过逐步更新一部分服务器,滚动部署可以实现更好的风险管理。如果在更新期间出现任何问题,可以及早检测到并在将更新推广到所有服务器之前缓解这些问题。
  3. 提高可靠性:滚动部署可以通过降低广泛故障的风险来帮助提高应用程序的可靠性。由于更新是针对一部分服务器推出的,因此可以在问题影响整个系统之前检测并解决问题。
  4. 简化回滚:如果在部署过程中出现问题,滚动部署可以更轻松地回滚更新。由于更新是增量部署的,回滚到以前的版本只需要回滚已更新的服务器子集。
缺点:

  1. 复杂性: 滚动部署的设置和管理可能很复杂,尤其是对于具有许多服务器的大型应用程序。它需要仔细规划和协调,以确保以正确的顺序推出更新,并及时更新所有服务器。
  2. 更长的部署时间:滚动部署可能需要比其他部署策略更长的时间才能完成,因为更新是逐步推出的。这可能会导致更长的部署时间,这可能不适合对正常运行时间有严格要求的应用程序。
  3. 增加资源使用:滚动部署可能需要更多资源,因为更新会在部署到所有服务器之前先部署到一部分服务器。这可能会导致资源使用量增加和成本增加。
  4. 兼容性问题的风险:滚动部署会增加在不同服务器上运行的不同版本的应用程序之间出现兼容性问题的风险。这可以通过在推出更新之前彻底测试应用程序情况的兼容性来缓解。

蓝绿部署

在蓝绿部署中,有两个相同的环境(或资源集)用于部署和测试新版本的软件。一个环境被认为是“蓝色”环境,而另一个被认为是“绿色”环境。

当前版本的软件在蓝色环境中运行,新版本在绿色环境中进行部署和测试。一旦新版本在绿色环境中被认为稳定且功能齐全,流量可以从蓝色环境切换到绿色环境,使新版本成为当前版本。

这种方法的优点是它最大限度地降低了部署新版本软件可能导致的停机或错误的风险。如果在部署或测试过程中出现问题,可以快速切换回蓝色环境,而不会对用户造成任何干扰。这使得蓝绿部署成为需要高可用性和正常运行时间的公司的热门选择。

优点:

  1. 停机时间最短:蓝绿部署允许零停机更新,因为新版本的应用程序在切换到蓝色环境之前部署到绿色环境,这可以导致停机时间最少。
  2. 降低风险:由于新版本的应用部署到绿色环境,部署过程中出现的任何问题都与绿色环境隔离,降低了大范围故障的风险。
  3. 简化回滚:如果部署过程中出现问题,很容易回滚到以前的版本,因为蓝色环境仍然运行以前的版本。
  4. 提高可靠性:由于蓝色和绿色环境相同,蓝绿部署可以帮助确保应用程序可靠和稳定。
缺点:

  1. 复杂性增加: 蓝绿部署的设置和管理可能很复杂,尤其是对于具有许多组件的大型应用程序。它需要仔细规划和协调,以确保正确设置绿色环境,并确保从蓝色环境到绿色环境的无缝切换。
  2. 增加资源使用:运行两个相同的环境可能需要更多资源,这会导致成本增加。
  3. 更长的部署时间: 蓝绿可能需要更长的部署时间,因为新版本的应用程序需要先部署到绿色环境,然后才能切换到蓝色环境。
  4. 配置漂移的风险:由于两个相同的环境同时运行,如果更改一个环境而不更改另一个环境,则存在配置漂移的风险。通过使用自动化和配置管理工具来确保环境保持相同,可以减轻这种风险。

金丝雀部署

金丝雀部署就像蓝绿部署,只是它风险更小。你无需一步从蓝色切换到绿色,而是使用一种分阶段的方法

通过金丝雀部署,您可以在生产基础设施的一小部分中部署新的应用程序代码。一旦应用程序被签署发布,只有少数用户被路由到新版本上,这样可以最大限度地减少任何影响。

在没有错误报告的情况下,新版本可以逐步推广到基础架构的其余部分。

优点:

  1. 降低风险: 金丝雀部署可以降低风险,因为新版本的应用程序被推出到一小部分用户或服务器,允许在问题影响更广泛的受众之前检测和缓解任何问题。
  2. 早期反馈: 金丝雀部署提供一小部分用户对新版本应用程序的早期反馈,这有助于在向更广泛的受众推出之前识别问题并改进应用程序。
  3. 提高可靠性:金丝雀部署有助于提高应用程序的可靠性,确保在问题影响更广泛的受众之前及早发现并解决任何问题。
  4. 受控推出:金丝雀部署允许受控推出新版本的应用程序,这有助于确保推出顺利并且不会导致任何意外问题。
缺点:

  1. 复杂性增加:金丝雀部署的设置和管理可能很复杂,尤其是对于具有许多组件的大型应用程序。它需要仔细规划和协调,以确保正确设置金丝雀版本并且无缝推出。
  2. 增加资源使用:运行两个版本的应用程序可能需要更多资源,这会导致成本增加。
  3. 更长的部署时间: 金丝雀部署可能需要更长的时间才能部署,因为新版本的应用程序需要在向更广泛的受众推出之前进行测试和监控。
  4. 金丝雀超载的风险:如果金丝雀子集太小或不能代表更广泛的受众,它可能会因流量或使用而超载,这可能会扭曲结果并影响应用程序的整体性能。

总结

总而言之,没有适用于所有情况的单一“最佳”部署策略,因为不同的方法可能更适合不同的场景、团队和应用程序。比如我们公司就是采用的停机部署,虽然提起来有点low,但是我们是TO B业务,这种方式成本最低,怎么简单怎么来。

总的来说,最佳部署策略将取决于多种因素,包括应用程序的规模和复杂性、团队的规模和专业知识、所需的风险和停机时间级别、资源和基础设施的可用性以及其他特定考虑因素给相关组织和应用程序。

重要的是要不断评估和试验不同的部署策略,以找到最适合你的团队和你的应用程序的策略,并且需要随着需求的变化,去不不断调整迭代你的部署策略,这才是正道。

有关微服务架构下 | 你不得不知的3种部署策略的更多相关文章

  1. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  2. ruby-on-rails - Ruby on Rails 可以部署在 Azure 网站上吗? - 2

    我可以在Azure网站上部署RubyonRails吗? 最佳答案 还没有。目前仅支持.NET和PHP。 关于ruby-on-rails-RubyonRails可以部署在Azure网站上吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12964010/

  3. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  4. jenkins部署1--jenkins+gitee持续集成 - 2

    前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. Ruby,使用包含 TK GUI 的 ocra 部署一个 exe - 2

    Ocra无法处理需要“tk”的应用程序require'tk'puts'nope'用奥克拉http://github.com/larsch/ocra不起作用(如链接中的一个问题所述)问题:https://github.com/larsch/ocra/issues/29(Ocra是1.9的"new"rubyscript2exe,本质上它用于将rb脚本部署为可执行文件)唯一的问题似乎是缺少tcl的DLL文件我不认为这是一个问题据我所知,问题是缺少tk的DLL文件如果它们是已知的,则可以在执行ocra时将它们包括在内有没有办法知道tk工作所需的DLL依赖项? 最佳答

  7. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  8. ruby-on-rails - NameError(未初始化常量 Unzipper::Zip)但仅在 Heroku 部署(Rails)上 - 2

    我有一个类unzipper.rb,它使用Rubyzip解压文件。在我的本地环境中,我可以成功解压缩文件,而无需使用require'zip'明确包含依赖项但是在Heroku上,我得到一个NameError(uninitializedconstantUnzipper::Zip)我只能通过使用明确的require来解决问题:为什么这在H​​eroku环境中是必需的,但在本地主机上却不是?我的印象是Rails自动需要所有gem。app/services/unzipper.rbrequire'zip'#OnlyrequiredforHeroku.Workslocallywithout!class

  9. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

  10. ruby-on-rails - 覆盖 Controller 中的 protect_from_forgery 策略 - 2

    我想使用两种不同的protect_from_forgery策略构建一个Rails应用程序:一种用于Web应用程序,一种用于API。在我的应用程序Controller中,我有这行代码:protect_from_forgerywith::exception为了防止CSRF攻击,它工作得很好。在我的API命名空间中,我创建了一个继承self的应用程序Controller的api_controller,它是API命名空间中所有其他Controller的父类,我将上面的代码更改为:protect_from_forgery:null_session.遗憾的是,我在尝试发出POST请求时遇到错误:“

随机推荐