引言
随着云计算的普及,越来越多的企业正在将他们的应用程序迁移到云服务器。这种迁移提供了众多好处,包括可扩展性、弹性、降低成本和更快上市时间。迁移到云服务器也可能是一个复杂且具有挑战性的过程,尤其是当涉及到采用微服务架构时。微服务架构是一种软件开发方法,将应用程序分解成较小的、独立的、松散耦合的服务。这种方法可以提高应用程序的敏捷性、可维护性和可扩展性。它也使迁移到云服务器变得更加复杂,因为需要考虑服务的部署、管理和监控。在本文中,我们将讨论迁移到云服务器微服务架构的策略,以确保无缝过渡和最小化停机时间。我们将讨论以下主题:评估您的应用程序选择云服务提供商设计您的微服务架构迁移您的应用程序监控和管理您的应用程序
评估您的应用程序
在迁移到云服务器微服务架构之前,至关重要的是评估您的应用程序。这将帮助您确定应用程序是否适用于微服务架构,以及迁移的最佳方法。请考虑以下因素:应用程序的复杂性:微服务架构适用于复杂应用程序,这些应用程序可以分解成较小的、独立的服务。如果您的应用程序相对简单,则可能不需要微服务架构。应用程序的规模:微服务架构适用于需要高可扩展性的应用程序。如果您的应用程序规模较小,则可能不需要微服务架构。应用程序的可用性要求:微服务架构可以提高应用程序的可用性,但它也可能引入新的故障点。如果您需要高度可靠的应用程序,则需要仔细考虑微服务架构。
选择云服务提供商
选择正确的云服务提供商对于成功的迁移至关重要。请考虑以下因素:服务:云服务提供商应该提供一系列服务,以支持您的微服务架构,例如计算、存储、数据库和网络。定价:云服务提供商的定价应该符合您的预算。支持:云服务提供商应该提供良好的客户支持,以帮助您解决迁移和运行难题。
设计您的微服务架构
一旦您选择了云服务提供商,就可以开始设计您的微服务架构。以下是一些最佳实践:将应用程序分解成服务:将您的应用程序分解成较小的、独立的、松散耦合的服务。服务应该具有明确定义的接口和职责。使用 API 网关:使用 API 网关来管理对微服务的访问。API 网关可以提供身份验证、授权和流量管理功能。使用服务发现机制:使用服务发现机制来动态发现和注册微服务。这将使您的应用程序能够适应服务的添加和删除。实现负载均衡:实施负载均衡以将流量分布到微服务。这将提高应用程序的可扩展性和可用性。
迁移您的应用程序
一旦您设计了您的微服务架构,就可以开始迁移您的应用程序了。以下是一些提示:使用分阶段迁移:将应用程序迁移到云服务器时,请使用分阶段迁移。这将允许您在对生产系统造成最小影响的情况下测试和验证迁移。使用自动化脚本:使用自动化脚本来执行迁移任务。这将减少错误的可能性,并使迁移过程更加高效。监视迁移过程:在迁移过程中密切监视您的应用程序。这将使您能够快速识别并解决任何问题。
监控和管理您的应用程序
一旦您迁移了您的应用程序,您需要监控和管理它以确保其平稳运行。以下是一些提示:设置监控系统:设置监控系统以监控您的应用程序的性能和可用性。这将使您能够识别并解决问题。自动化运维任务:自动化运维任务,例如备份、更新和部署。这将节省时间并提高效率。制定灾难恢复计划:制定灾难恢复计划以应对应用程序中断。这将帮助您最大限度地减少停机时间并保护您的数据。
结论
迁移到云服务器微服务架构可以为您的应用程序提供众多好处。这是一个复杂且具有挑战性的过程。通过仔细规划和执行,您可以确保无缝过渡和最小化停机时间。本文概述的策略将帮助您成功地迁移您的应用程序到云服务器。
云服务器有哪些虚拟化技术?它们又有什么区别
全虚拟化技术,作为基于软件的虚拟化手段,能实现虚拟机与物理服务器的完全分离,无需修改虚拟机的操作系统和应用即可运行。
这类技术又可细分为硬件辅助虚拟化与基于二进制翻译的虚拟化两种。
硬件辅助虚拟化利用Intel VT和AMD-V指令集,增强虚拟机监控器对物理硬件资源的支持,性能高但有较高延迟。
而基于二进制翻译的虚拟化技术则利用虚拟机监视器进行二进制翻译,广泛应用于桌面、移动以及云主机等虚拟化领域,无需硬件支持,运行速度较快。
容器虚拟化技术是一种更轻量级的虚拟化方法,通过容器工具如Docker,创建虚拟化容器,并与底层操作系统共享应用程序及其所需库。
这种技术的优势在于运行速度快、启动时间短、资源消耗低,适用于小型应用程序、微服务和DevOps开发等场景。
Paravirtualization虚拟化技术旨在提升虚拟机性能,允许虚拟机直接访问虚拟化层提供的资源,通过修改操作系统使其可以直接与虚拟化管理程序通信。
相较于全虚拟化,Paravirtualization技术能在不损失性能的情况下,显著提升虚拟机的性能,尤其在I/O操作方面效果更为显著。
最后,Network Function Virtualization技术是将物理服务器的网络服务虚拟化到软件,无需专门硬件完成,使网络功能在物理架构中更加灵活。
这种技术不仅支持虚拟化环境中的应用程序独立运行,还能将网络服务、应用程序和安全功能等转移至虚拟化架构,提供高效、稳定、节省资源的运行效果。
综上所述,云服务器中的虚拟化技术各有千秋,选择合适的虚拟化技术需根据应用场景的需求,以实现高效、稳定、资源优化的运行效果。
「微服务架构」Medium的微服务架构实践
微服务¹架构的目标是帮助工程团队更快,更安全,更高质量地交付产品。
解耦服务允许团队快速迭代,对系统的其余部分影响最小。
在Medium,我们的技术堆栈始于2012年的单片应用程序。
我们已经构建了几个卫星服务,但我们还没有制定一个系统地采用微服务架构的策略。
随着系统变得越来越复杂并且团队不断发展,我们在2018年初转向了微服务架构。
在这篇文章中,我们希望分享我们有效地做到这一点并避免微服务综合症的经验。
首先,让我们花一点时间来思考微服务架构是什么,不是什么。
“微服务”是那些过载和混乱的软件工程趋势之一。
这就是我们在Medium认为它是什么:
该定义包括三个微服务设计原则:
Three Principles of Modeling Microservices
当我们对微服务进行建模时,我们应该遵守所有三个设计原则。
这是实现微服务架构全部潜力的唯一途径。
错过任何一个都会成为反模式。
没有一个目的,每个微服务最终会做太多事情,成长为多个“单片”服务。
我们不会从微服务架构中获得全部好处,我们也会支付运营成本。
如果没有松散耦合,对一个服务的更改会影响其他服务,因此我们无法快速安全地发布更改,这是微服务架构的核心优势。
更重要的是,紧密耦合引起的问题可能是灾难性的,例如数据不一致甚至数据丢失。
如果没有高凝聚力,我们将最终得到一个分布式单片系统 – 一组混乱的服务,必须同时进行更改和部署才能构建单一功能。
由于多个服务协调的复杂性和成本(有时跨多个团队),分布式单片系统通常比集中式单片系统差得多。
与此同时,了解 微服务不是什么 很重要:
在Medium,我们总是在做出重大产品或工程决策时会问“为什么现在?”这个问题。
“为什么?”是一个显而易见的问题,但它假设我们拥有无限的人,时间和资源,这是一个危险的假设。
当你想到“为什么现在?”时,你突然有了更多的限制 – 对当前工作的影响,机会成本,分心的开销等等。
这个问题有助于我们更好地优先考虑。
我们现在需要采用微服务的原因是我们的单片应用程序已经成为多个方面的瓶颈。
首先,最紧迫和最重要的瓶颈是其性能。
某些计算量很大且I / O很重的任务不适合.我们一直在逐步改进整体应用程序,但事实证明它是无效的。
它的低劣性能使我们无法提供更好的产品而不会使已经非常慢的应用程序变慢。
其次,整体应用程序的一个重要且有点紧迫的瓶颈是它会减慢产品开发速度。
由于所有工程师都在单个应用程序中构建功能,因此它们通常紧密耦合。
我们无法灵活地改变系统的一部分,因为它也可能影响其他部分。
我们也害怕做出重大改变,因为影响太大,有时难以预测。
整个应用程序作为一个整体进行部署,因此如果由于一次错误提交导致部署停滞,那么所有其他更改(即使它们完全正常工作)也无法完成。
相比之下,微服务架构允许团队更快地发货,学习和迭代。
他们可以专注于他们正在构建的功能,这些功能与复杂系统的其余部分分离。
更改可以更快地进入生产。
他们可以灵活地安全地尝试重大变革。
在我们新的微服务架构中,更改会在一小时内完成生产,工程师不必担心它会如何影响系统的其他部分。
该团队还 探索 了在开发中安全使用生产数据的方法²多年来一直是白日梦。
随着我们的工程团队的发展,所有这些都非常重要。
第三,单一应用程序使得难以为特定任务扩展系统或隔离不同类型任务的资源问题。
使用单一的单一应用程序,我们必须扩展和缩小整个系统,以满足更多资源需求的任务,即使这意味着系统过度配置用于其他更简单的任务。
为了缓解这些问题,我们对不同类型的请求进行分片,以分离进程。
它们在一定程度上起作用,但不会扩展,因为这些微单一版本的单片服务是紧密耦合的。
最后但同样重要的是,一个重要且即将成为紧迫的瓶颈是它阻止我们尝试新技术。
微服务架构的一个主要优点是每个服务都可以使用不同的技术堆栈构建,并与不同的技术集成。
这使我们能够选择最适合工作的工具,更重要的是,我们可以快速安全地完成工作。
采用微服务架构并非易事。
它可能会出错,实际上会损害工程生产力。
在本节中,我们将分享七个在采用早期阶段帮助我们的策略:
有人可能会认为采用新的服务器架构意味着产品开发的长时间停顿以及对所有内容的大量重写。
这是错误的做法。
我们永远不应该为了建立新的服务而建立新的服务。
每次我们建立新服务或采用新技术时,都必须具有明确的产品价值和/或工程价值。
产品价值应以我们可以为用户提供的利益为代表。
与在单片应用程序中构建值相比,需要一项新服务来提供值或使其更快地交付值。
工程价值应该使工程团队更好,更快。
如果构建新服务没有产品价值或工程价值,我们将其留在单一的应用程序中。
如果十年内Medium仍然有一个支持某些表面的单片应用程序,那就完全没了问题。
从单一应用程序开始实际上有助于我们战略性地对微服务进行建模。
建立具有明确价值的新服务
有人可能会认为采用新的服务器架构意味着产品开发的长时间停顿以及对所有内容的大量重写。
这是错误的做法。
我们永远不应该为了建立新的服务而建立新的服务。
每次我们建立新服务或采用新技术时,都必须具有明确的产品价值和/或工程价值。
产品价值应以我们可以为用户提供的利益为代表。
与在单片应用程序中构建值相比,需要一项新服务来提供值或使其更快地交付值。
工程价值应该使工程团队更好,更快。
如果构建新服务没有产品价值或工程价值,我们将其留在单一的应用程序中。
如果十年内Medium仍然有一个支持某些表面的单片应用程序,那就完全没了问题。
从单一应用程序开始实际上有助于我们战略性地对微服务进行建模。
单片持久存储被认为是有害的
建模微服务的很大一部分是对其持久数据存储(例如,数据库)进行建模。
跨服务共享持久数据存储通常似乎是将微服务集成在一起的最简单方法,然而,它实际上是有害的,我们应该不惜一切代价避免它。
这就是原因。
首先,持久数据存储是关于实现细节的。
跨服务共享数据存储会将一个服务的实现细节暴露给整个系统。
如果该服务更改了数据的格式,或者添加了缓存层,或者切换到不同类型的数据库,则还必须相应地更改许多其他服务。
这违反了松散耦合的原则。
其次,持久数据存储不是服务行为,即如何修改,解释和使用数据 。
如果我们跨服务共享数据存储,则意味着其他服务也必须复制服务行为。
这违反了高内聚的原则- 给定域中的行为泄露给多个服务。
如果我们修改一个行为,我们将不得不一起修改所有这些服务。
在微服务架构中,只有一个服务应该负责特定类型的数据。
所有其他服务应该通过负责服务的API请求数据,或者保留数据的 只读非规范(可能具体化)副本 。
这可能听起来很抽象,所以这是一个具体的例子。
假设我们正在构建一个新的推荐服务,它需要来自规范帖子表的一些数据,目前在AWS DynamoDB中。
我们可以通过两种方式之一为新推荐服务提供发布数据。
在单片存储模型中,推荐服务可以直接访问单片应用程序所执行的相同持久存储。这是一个坏主意,因为:
缓存可能很棘手。
如果推荐服务与单一应用程序共享相同的缓存,我们也必须在推荐服务中复制缓存实现细节;如果推荐服务使用自己的缓存,当单片应用更新帖子数据时,我们将不知道何时使其缓存无效。
如果单片应用程序决定更改为使用RDS而不是DynamoDB来存储帖子数据,我们将不得不重新实现推荐服务中的逻辑以及访问帖子数据的所有其他服务。
单片应用程序具有解释帖子数据的复杂逻辑 ,例如,如何确定帖子是否应该对给定用户不可见。
我们必须在推荐服务中重新实现这些逻辑。
一旦整体应用程序更改或添加新逻辑,我们也需要在任何地方进行相同的更改。
即使推荐服务是自己的数据访问模式的错误选项,推荐服务仍然停留在DynamoDB上。
在解耦存储模型中,推荐服务不能直接访问发布数据,也不能直接访问任何其他新服务。
发布数据的实现细节仅保留在一个服务中。
有不同的方法来实现这一目标。
Option A理想情况下,应该有一个拥有帖子数据的Post服务,其他服务只能通过Post服务的API访问邮政数据。
但是,为所有核心数据模型构建新服务可能是一项昂贵的前期投资。
当人员配置有限时,还有一些更实用的方法。
根据数据访问模式,它们实际上可能是更好的方式。
在 选项B 中,单一应用程序可让推荐服务知道何时更新相关的帖子数据。
通常,这不必立即发生,因此我们可以将其卸载到排队系统。
在 选项C 中,ETL管道生成推荐服务的发布数据的只读副本,以及可能对推荐有用的其他数据。
在这两个选项中,推荐服务完全拥有其数据,因此它可以灵活地缓存数据或使用最适合的数据库技术。
解耦“建立服务”和“运行服务”
如果构建微服务很难,那么运行服务往往更难。
当运行服务与构建每个服务相结合时,它会减慢工程团队的速度,团队必须不断重新发明这样做。
我们希望让每项服务都专注于自己的工作而不用担心如何运行服务的复杂问题,包括网络,通信协议,部署,可观察性等。
服务管理应该与每个服务的实现完全分离。
由于最近在 容器化,容器编排,服务网格,应用程序性能监 控等方面的技术进步,“运行服务”的解耦变得比以往更容易实现。
网络。
网络(例如,服务发现,路由,负载平衡,流量路由等)是运行服务的关键部分。
传统方法是为每种平台/语言提供库。
它工作但不理想,因为应用程序仍然需要非常繁琐的工作来集成和维护库。
通常,应用程序仍然需要单独实现某些逻辑。
现代解决方案是在Service Mesh中运行服务。
在Medium,我们使用 Istio和Envoy作为边车代理 。
构建服务的应用工程师根本不需要担心网络问题。
通信协议 。
无论您选择哪种技术堆栈或语言来构建微服务,从一个高效,类型化,跨平台且需要最少开发开销的成熟RPC解决方案开始是非常重要的。
支持向后兼容性的RPC解决方案也使部署服务更加安全,即使它们之间存在依赖关系。
在Medium,我们选择了gRPC。
一种常见的替代方案是基于HTTP的REST + JSON,它长期以来一直是服务器通信的福音解决方案。
但是,尽管该堆栈非常适合浏览器与服务器通信,但它对于服务器到服务器的 通信效率很低 ,尤其是当我们需要发送大量请求时。
如果没有自动生成的 存根和样板代码 ,我们将不得不手动实现服务器/客户端代码。
可靠的RPC实现不仅仅包装网络客户端。
另外,REST是“自以为是”,但总是让每个人都对每个细节都达成一致很困难,例如,这个调用真的是REST,还是只是一个RPC?这是一种资源还是一种操作?等等
部署。
拥有一致的方法来构建,测试,打包,部署和管理服务非常重要。
所有Medium的微服务都在容器中运行。
目前,我们的编排系统是AWS ECS和Kubernetes的混合体,但仅限于Kubernetes。
我们构建了自己的系统来 构建,测试,打包和部署 服务,称为BBFD。
它在一致地跨服务工作和为个人服务提供采用不同技术堆栈的灵活性之间取得平衡。
它的工作方式是让每个服务提供基本信息,例如,要监听的端口,构建/测试/启动服务的命令等,BBFD将负责其余的工作。
彻底和一致的可观察性
可观察性包括允许我们了解系统如何工作的过程,约定和工具,以及在不工作时对问题进行分类。
可观察性包括日志记录,性能跟踪,指标,仪表板,警报,并且对于微服务架构的成功至关重要。
当我们从单个服务迁移到具有许多服务的分布式系统时,可能会发生两件事:
我们失去了可观察性,因为它变得更难或更容易被忽视。
不同的团队重新发明了轮子,我们最终得到了零碎的可观察性,这实际上是低可观察性 ,因为很难使用碎片数据连接点或分类任何问题。
从一开始就具有良好且一致的可观察性非常重要,因此我们的DevOps团队提出了一致的可观察性策略,并构建了支持实现这一目标的工具。
每项服务都会自动获取详细的DataDog仪表板,警报和日志搜索,这些服务在所有服务中也是一致的。
我们还大量使用LightStep来了解系统的性能。
并非每一项新服务都需要从零开始构建
在微服务架构中,每个服务都做一件事并且做得非常好。
请注意,它与如何构建服务无关。
如果您从单一服务迁移,请记住,如果您可以从单片应用程序中剥离微服务并不总是必须从头开始构建。
在这里,我们采取务实的态度。
我们是否应该从头开始构建服务取决于两个因素:(1)适合该任务的程度如何;(2)在不同的技术堆栈中重新实现的成本是多少。
如果是一个很好的技术选项并且现有的实现很好,我们将代码从单片应用程序中删除,并用它创建一个微服务。
即使采用相同的实现,我们仍将获得微服务架构的所有好处。
我们的单片单片应用程序的架构使我们可以相对轻松地使用现有实现构建单独的服务。
我们将在本文稍后讨论如何正确构建单片。
尊重失败,因为他们会发生
在分布式环境中,更多的东西可能会失败,而且它们会失败。
如果处理不当,任务关键型服务的失败可能是灾难性的。
我们应该始终考虑如何测试故障并优雅地处理故障。
从第一天起避免使用微服务综合症
微服务不是灵丹妙药 – 它解决了一些问题,但创造了一些其他问题,我们将其称为“微服务综合症”。
如果我们从第一天开始就不去考虑它们,那么事情会变得很快,如果我们以后再照顾它们会花费更多。
以下是一些常见症状。
随着最近的技术创新,采用微服务架构要容易得多。这是否意味着我们都应该停止构建单一服务?
虽然新技术支持得更好,但微服务架构仍然存在高度复杂性和复杂性。
对于小型团队来说,单一的应用程序通常仍然是更好的选择。
但是,请花些时间来构建单片应用程序,以便以后在系统和团队成长时更容易迁移到微服务架构。
在Medium,我们在早期的单片应用程序中做出了一些很好的架构决策。
我们的单片应用程序由组件高度模块化,即使它已经发展成为一个非常复杂的应用程序,包括Web服务器,后端服务和离线事件处理器。
脱机事件处理器单独运行,但使用完全相同的代码。
这使得将一大块业务逻辑剥离到单独的服务相对容易,只要新服务提供与原始实现相同(高级)的接口即可。
我们的整体应用程序在较低级别封装了数据存储详细信息。
每种数据类型(例如,数据库表)具有两层实现:数据层和服务层。
这有助于我们采用微服务架构,因为一种类型数据的实现细节完全隐藏在代码库的其余部分。
创建新服务来处理某些类型的数据相对容易且安全。
单片应用程序还可以帮助我们对微服务进行建模,并使我们能够灵活地专注于系统中最重要的部分,而不是从头开始为所有微服务建模。
单片应用程序为我们服务了好几年,但它开始减慢我们从运送伟大的项目和快速迭代。
我们开始系统地和战略性地采用微服务架构。
我们仍处于这一旅程的早期阶段,但我们已经看到了它的优势和潜力 – 它大大提高了开发效率,使我们能够大胆地思考并实现大量的产品改进,并解锁了工程团队以安全地测试新技术。
加入Medium的工程团队是一个激动人心的时刻。
如果这听起来很有趣,请查看我们的工作页面 – 在Medium工作。
如果您对微服务架构特别感兴趣,您可能需要先了解这两个开头:高级全栈工程师和高级平台工程师。
原文 :讨论: 请加入知识星球【首席架构师圈】
运营商云化的理解
许多人对运营商云化的理解存在误区,认为运营商仅仅是购买大量服务器,搭建虚拟机,然后租给用户,让用户在虚拟机上运行原本在物理机上的应用,称之为云化。
然而,事情真的有这么简单吗?我曾在四年前也有过这样的误解,认为这对于用户来说并不如自己的IDC机房里的物理机好用,毕竟物理机可以看到主机的状态,至少是个白盒子,而现在虚拟机之下是个黑盒,用户的系统因为虚拟机的黑盒故障而无法应对,这种对云化的简单理解,让用户吃了不少苦头。
我们需要明确,虚拟化不等同于云,云也不只是简单的虚拟化。
虚拟化的表面目的是提高原有主机的利用率,使其不必再像传统的系统那样仅限于物理机上运行,而是占据整个主机。
然而,虚拟化的目的并不仅限于此,而是为了实现迁移。
当一台虚拟机出现故障时,可以将其复制并迁移到另一台虚拟机上,从而基本保证应用的持续运行。
为了更好地实现迁移,最好的方式是让虚拟机上运行的应用尽可能小,越轻越好。
当应用服务划分得足够小,我们发现服务这么多,该如何处理?这时,微服务框架应运而生,所有应用都以服务的形式对外提供,复杂的服务由微服务组合实现。
由于服务足够小,因此容易迁移。
我对云化的理解是,应用能够根据环境生成,在云中按需漂移,并在漂移过程中提供平滑无感知的服务过渡。
由于应用在云中漂移,因此在云内或多个云之间漂移时,必然会涉及到网络的调整。
这就是我所说的网随云动。
由于云代表应用,实际上就是网络随着应用而动,从技术实现角度来看,这属于广义的SDN范畴。
从竞争力的角度来看,运营商为应用提供的云化服务环境必然要具备网络服务的特点,因此部分网络服务,如安全处理、码流处理、DPI、内容缓存加速等,也应该以微服务的形态加入到运营商的云能力集中,这就是我所说的网入云中,部分网络功能也成为云中的能力。
这也是我认为对NFV应有的正确理解。
网随云动和网入云中,这两方面的内容有机结合,就是运营商网络云化的全部。
然而,运营商云化的根本目标是成为产业互联网运营商。
为了实现这一目标,运营商还应进一步思考:聚焦哪些行业?这些行业所需的云化服务除了通用的云网功能,是否还需要其他内容,如视频、物联网、大数据、AI等?只有以PaaS平台的形式,将这些服务完整提供,我们才能说运营商的云化架构初步完成。
运营商的云化并非易事,仅有硬件和简单的虚拟化是不足以完成这项工作的。
系统必须微服务化,网络必须具备为应用提供控制能力,部分网络服务必须微服务化并加入云能力集,架构设计必须全面考虑分布式处理和数据同步等问题。
当应用商能以最低成本基于运营商的云提供应用服务,当应用能按需在运营商提供的云中平滑运行时,我们才能说运营商真正实现了云化。