通过使用微服务,团队可以更快地响应变化,而无需改动整个应用程序。利用微服务,开发团队可以构建出具有鲁棒性和可扩展性的系统,从而适应当今应用程序的需求。
 
然而,使用微服务也带来了一系列挑战。在本文中,我们将就此展开讨论。
 
软件工程师和架构师正在远离基于单一、庞大的代码库的单体应用程序。由于公司需要在全球范围内运营,昼夜不停地开展业务,加上工作中对敏捷性和客户需求响应能力的要求也越来越高,因此对单体应用程序的管理和扩展变得越来越难。
 
微服务架构作为一种新的方式,其出现填补了这一空缺。企业的软件团队已经从他们的领域驱动设计(Domain Driven Design)经验中有所收获,并已经接受了持续集成和持续交付(CI/CD)有着帮助软件更高效地投入生产的能力。
 
通过使用微服务,团队可以更快地响应变化,而无需改动整个应用程序。他们提倡根据服务的生命周期组建小型团队,并示范了如何构建出具有鲁棒性和可扩展性的系统,以便适应当今应用程序的需求。
 
 

 
01 向微服务迁移
 
微服务方法是建立在以往的所有实践经验和技术基础之上的。
 
微服务是通过多个小型且相互独立的进程来建构复杂的应用程序的。这些进程之间通过像是REST这样与语言无关的轻量级应用程序接口(API)进行相互沟通。
 
将这些微服务分布到多个服务器或设备镜像上,再根据扩展需要对这些服务器进行复制——这样,这些服务就可以达到扩展的目的。
 
这些服务好比小型的建筑模块,它们高度解耦,专注于执行小块任务,并促进了系统构建的模块化。这每一个服务模块都是独立部署和独立管理的。像是容器这类的技术正在逐步成为创建此类服务的默认选择。
 
从现存的单体应用向微服务迁移,其过程包括将单体应用程序的任务划分为微服务架构所具有的不同且独立的服务。之后,所有的或大多数的功能都将在微服务架构中实现。
 
您可以根据业务逻辑、前端和数据访问来拆分单体程序。根据模块拆分单体应用程序后,它将逐渐缩小。之后当再需要新功能时,相比在单体程序中写入更多代码,我们可以通过创建微服务来实现这些功能。
 
独立运行服务有着以下这些明显优势:
  • 适用于多种语言:只要服务的端点API返回所需的输出,您可以选择任何语言或技术来开发它。
  • 部署的乐趣:微服务的独立性使其更易于部署。与单体应用程序不同,微服务更新或扩展组件时不需要使整个应用程序离线。
  • 级联较少:同样,任何一项服务的故障都不会导致整个应用程序的级联故障。如果您没有遵循好的设计方法(例如Netflix方法),那么部分故障可能会出现,但是服务的独立性使得调试过程更加有针对性。
  • 循环利用:一旦走上微服务之路,服务代码可以轻松地被重复利用到其它项目中。

 
02 微服务应用程序面临的挑战
 
微服务架构在带来一些显著好处的同时,也带来了一些挑战。通过应用正确的方法可以解决许多挑战问题。
 
从一开始,非常重要的是为服务选择正确的功能。为单体的每个功能都创建微服务会带来不必要的复杂性。微服务的目标是分解应用程序,以实现敏捷应用程序的开发和部署。微服务领域的领先思想者山姆·纽曼(Sam Newman)倡导了一条有用的经验法则,那就是,如果代码库太大而无法由一个小团队管理时,就应该考虑将其分解了。
 
同样,如果实施不正确,服务间通信的成本也会很高。您需要从消息传递和RPC等选项中选择成本最低的方法来满足需求。
 
例如,向客户通知他们的出租车或包裹即将到达的通知仅需要一对一的单向请求,而不是一对多的通知;之后,该通知期望在指定时间范围内得到答复。
 
另一个挑战是复杂性。部署微服务应用程序通常需要一个分布式环境,该环境可以跨多个环境运行,从数据中心的不同服务器到完全分布式的环境(如云)。
 
这些分布式环境随后将需要使用容器编排工具(例如Kubernetes)进行管理。仔细考虑好如何利用Kubernetes创建的新容器之类来实现流程自动化可以消除严重的扩展难题。
 
除此之外,您还必须考虑如何逐步测试和管理应用程序。由于涉及的服务与平台的数量之多及其相互依赖性,微服务端到端的测试可能具有挑战性。尽管面临各种挑战,您的应用程序复杂且多变,微服务仍将为您的企业不断效劳。
 
 

 
03 微服务和数据
 
除了应用程序的进程之外,对由此产生的数据进行分析也很重要。每个微服务可以是无状态的,也可以是有状态的。这意味着无状态的微服务不会在调用之间维护服务内的任何状态信息。该服务会接收请求,处理请求并发回响应,但不会保留任何状态信息以备将来调用。
 
有状态的微服务将以某种形式持久化以使其正常运行。使用微服务的系统通常会混合使用无状态组件和有状态组件——例如,用于更改文件的服务可能不需要随时保留该文件的副本,而客户服务应用程序的组件则会产生必须存储的数据。
 
当您需要状态信息时,不要把它放在内部存储;把它放在外部的数据存储中会更容易些。用于保留状态的数据存储类型将取决于您的需求以及随着时间的推移您预计产生的数据量。
 
您可以选择传统的关系数据库管理系统(RDBMS),NoSQL数据库或某种类型的云存储。在外部保留状态信息可以为之提供可用性,可靠性、可伸缩性和一致性。
 
对于产生大量数据的应用程序,如果这些数据要求被有效地编排组织,数据库通常比对象存储或云存储更好。对于涉及事务或客户服务的应用程序,规模性能也很重要。您可以了解一下NoSQL数据库(例如Apache Cassandra)可能在这方面提供的帮助。
 
由于Apache Cassandra可以通过添加节点来线性扩展,它已成为微服务应用程序中流行的持久数据存储选择。
 
例如,在Monzo公司,微服务和Cassandra的结合使得这个银行领域的挑战者每年都能将客户群增加四倍,而不会遇到任何问题。Monzo公司表示,在高峰时期,它可以在银行中现有的1,500种微服务中每秒处理300,000次读取,所有这些微服务都连接到其Apache Cassandra集群。
 
在微服务应用程序面临很多不定因素的情况下,支持该应用程序的任何数据库实施都必须能够轻松扩展并连接到所有组件。
 
使用Kubernetes之类的容器编排工具来管理应用程序和数据库实例可以实现这一点。使用Kubernetes Operator进行管理,在需要时添加数据库节点,可以避免扩展数据库方面的很多管理问题。
 
同样值得考虑的是数据一致性和弹性问题。在分布式计算环境中,可以重播丢失的消息并重新创建事务。
 
这在分布式数据库中并不是那么简单,因此需要研究如何处理数据一致性的问题。Cassandra根据Paxos原则和最终一致性进行处理——这确保了所有数据副本在每个节点上都是一致的。
 
对于需要ACID事务的应用程序,可能需要一个单独的数据库实例;对于绝大多数应用程序,数毫秒内即可达到的最终一致性是足够支持正常运行的。
 
 

 
04 微服务的未来
 
微服务可满足当今IT的需求。它们可以驻留在世界各地的多个数据中心环境中,也可以在混合云部署中实施,以提供足够的规模和对数据的即时访问。
 
这样就可以满足应用程序的需求,例如连续可用性和无延迟。考量微服务应用程序也意味着考量应用程序将产生的数据。
 
使用分布式NoSQL数据库可提供同样的应用程序设计方法——广泛分布、可伸缩并能够在多个环境中运行。同时考量应用程序设计和数据库设计将使您能够更加充分地享受微服务带来的好处。

Apache Cassandra——可扩展微服务应用程序的持久数据存储的更多相关文章

  1. 基于 Apache APISIX 的下一代微服务架构

    2019 年 12 月 14 日,又拍云联合 Apache APISIX 社区举办 API 网关与高性能服务最佳实践丨Open Talk 广州站活动,Apache APISIX PPMC 温铭做了题为 ...

  2. 推荐一个基于Dapr的 Red Dog 的完整微服务应用程序

    微服务尽管构建起来非常困难,但它们已成为一种越来越流行的架构模式.随着开发人员开始将他们现有的单体代码库迁移到微服务系统,他们花费大量时间来处理分布式应用程序带来的固有挑战,例如状态管理和服务调用.通 ...

  3. Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  4. Taurus.MVC 微服务框架 入门开发教程:项目部署:3、微服务应用程序版本升级:全站升级和局部模块升级。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  5. Taurus.MVC 微服务框架 入门开发教程:项目部署:4、微服务应用程序发布到Docker部署(上)。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  6. Taurus.MVC 微服务框架 入门开发教程:项目部署:5、微服务应用程序发布到Docker部署(下)。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  7. Taurus.MVC 微服务框架 入门开发教程:项目部署:6、微服务应用程序Docker部署实现多开。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...

  8. .NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.预备知识:数据一致性 关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认 ...

  9. .NET Core微服务之基于MassTransit实现数据最终一致性(Part 2)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.案例结构与说明 在上一篇中,我们了解了MassTransit这个开源组件的基本用法,这一篇我们结合一个小案例来了解在ASP.NET C ...

随机推荐

  1. [从源码学设计]蚂蚁金服SOFARegistry之消息总线

    [从源码学设计]蚂蚁金服SOFARegistry之消息总线 目录 [从源码学设计]蚂蚁金服SOFARegistry之消息总线 0x00 摘要 0x01 相关概念 1.1 事件驱动模型 1.1.1 概念 ...

  2. C#.NET 强大的LINQ

    LINQ 是 Language INtegrated Query 单词的首字母缩写,翻译过来是语言集成查询.它为查询跨各种数据源和格式的数据提供了一致的模型,所以叫集成查询.由于这种查询并没有制造新的 ...

  3. Java 命名之道

    为什么需要重视命名? 好的命名即是注释,别人一看到你的命名就知道你的变量.方法或者类是做什么的! 好的命名对于其他人(包括你自己)理解你的代码有着很大的帮助! 简单举个例子说明一下命名的重要性. &l ...

  4. 并发编程实战-J.U.C核心包

    J.U.C - AQS java.util.concurrent(J.U.C)大大提高了并发性能,AQS 被认为是 J.U.C 的核心.它核心是利用volatile和一个维护队列. AQS其实就是ja ...

  5. 软工团队作业--Scrum冲刺集合贴

    软工团队作业--Scrum冲刺集合贴 团队 团队名称:广东靓仔六强选手 团队成员: 黄清山 黄梓浩 钟俊豪 周立 邓富荣 郑焕 博客链接 Scrum 冲刺 第一篇 Scrum 冲刺 第二篇 Scrum ...

  6. Codeforces Edu Round 66 A-E

    A. From Hero to Zero 通过取余快速运行第一步即可.由于\(a \% b (a >= b) <= \frac{a}{2}\).所以总复杂度不超过\(O(log_2n)\) ...

  7. Codeforces Edu Round 54 A-E

    A. Minimizing the String 很明显,贪心之比较从前往后第一个不一样的字符,所以可以从前往后考虑每一位,如果把它删除,他这一位就变成\(str[i + 1]\),所以只要\(str ...

  8. basic english

    color/visual see look color dark light beautiful shade black blue brown clear gray green orange red ...

  9. 最新快手抖音短视频源码web+APP架设教程+完整数据

    最新更新快手抖音短视频源码web+APP架设教程+完整数据完美运行 视频直播源码,好东西,反正有人要就是了. 下载地址:https://pan.baidu.com/wap/init?surl=POU5 ...

  10. SpringBoot如何利用Actuator来监控应用?

    目录 Actuator是什么? 快速开始 引入依赖 yml与自动配置 主程序类 测试 Endpoints 官方列举的所有端点列表 启动端点 暴露端点 配置端点 发现页面 跨域支持 实现一个定义的端点 ...