微服务设计模式

微服务可以对你的企业产生积极的影响。因此,值得了解如何处理 微服务架构(MSA)和一些微服务的设计模式,以及,微服务架构的一般目标或原则。以下是微服务架构方法中需要考虑的四个目标。

降低成本。MSA将降低设计、实施和维护IT服务的总体成本。
提高发布速度:MSA将提高从想法到部署服务的速度。
提高复原力。MSA将提高我们服务网络的弹性。
实现可视性。MSA支持对你的服务和网络有更好的可见性。
你需要了解微服务架构建立的原则有哪些:

可扩展性
可用性
弹性
灵活性
独立、自主
分散的治理
故障隔离
自动配置

通过DevOps持续交付
遵循上述原则会带来一些挑战和问题,同时使你的解决方案或系统投入使用。这些问题对许多解决方案来说是很常见的。这些问题可以通过使用正确和匹配的设计模式来克服。有一些微服务的设计模式,这些模式可以分为五个模式。每种模式都包含许多模式。

分解模式
按业务能力分解 微服务是关于使服务松散耦合和应用单一责任原则。它按业务能力进行分解。定义与业务能力相对应的服务。业务能力是业务架构建模的一个概念[2]。它是一个企业为了产生价值而做的事情。一个业务能力通常对应于一个业务对象,例如

订单管理是对订单负责
客户管理对客户负责

按子域分解
使用业务能力来分解一个应用程序可能是一个好的开始,但你会遇到所谓的 “上帝类”,这并不容易分解。这些类在多个服务中是通用的。定义对应于领域驱动设计(DDD)子域的服务。DDD将应用程序的问题空间–业务–称为域。一个域是由多个子域组成的。每个子域对应于业务的不同部分。子域可以分类如下。

核心–企业的关键差异化因素和应用中最有价值的部分
支持性的–与企业的业务有关,但不是一个差异化的因素;可以在内部实施或外包
通用型–与业务无关,最好是使用现成的软件来实施。
订单管理的子域包括:

产品目录服务
库存管理服务
订单管理服务
交付管理服务

通过事务/两阶段提交分解(2个)模式
这种模式可以将服务分解到交易中。那么系统中就会有多个交易。分布式交易中的一个重要参与者是交易协调人[3]。分布式交易由两个步骤组成。

准备阶段–在这一阶段,交易的所有参与者为提交做准备,并通知协调者他们已经准备好完成交易了
提交或回滚阶段–在这个阶段,交易协调人向所有参与者发出提交或回滚命令
2PC的问题是,与单个微服务的运行时间相比,它相当缓慢。协调微服务之间的交易,即使它们在同一个网络上,也会使系统变得很慢;所以这种方法通常不用于高负载的情况下。

绞杀者模式
你所经历的前三个设计模式是为Greenfield分解应用程序,但你所做的80%的工作是与brownfield应用程序,即大的、单一的应用程序(遗产代码库)。Strangler模式是一种救援或解决方案。这创造了两个独立的应用程序,它们在同一个URI空间中并肩生存。随着时间的推移,新重构的应用程序会 “扼杀 “或取代原来的应用程序,直到最后,你可以关闭这个单体应用程序。Strangler应用程序的步骤是转化、共存和消除[4]。

转变–用现代方法创建一个平行的新站点。
共存–让现有的网站暂时留在原地。从现有的网站重定向到新的网站,这样功能就可以逐步实现。
消除–从现有网站上删除旧的功能。

隔板模式
这种模式将一个应用程序的元素隔离到池中,这样,如果其中一个发生故障,其他的将继续运行。这种模式被命名为隔板,因为它类似于船体的分段隔板。根据消费者负载和可用性要求,将服务实例分成不同的组。这种设计有助于隔离故障,并允许你为一些消费者维持服务功能,甚至在故障期间。

Sidecar模式
这种模式将应用程序的组件部署到一个单独的处理器容器中,以提供隔离和封装。这种模式也可以使应用程序由异构的组件和技术组成。这种模式被命名为Sidecar,因为它类似于摩托车上的副车。在该模式中,副车连接到父级应用,并为该应用提供支持功能。侧车也与父级应用共享相同的生命周期,与父级应用一起被创建和退役。sidecar模式有时被称为sidekick模式,是我们在文章中展示的最后一种分解模式。

集成模式
API网关模式 当一个应用程序被分解成较小的微服务时,有几个问题需要解决

API网关是任何微服务调用的单一入口点:
它可以作为代理服务工作,将请求路由到相关的微服务。
它可以汇总结果,并将其发回给消费者。
这个解决方案可以为每个特定类型的客户端创建一个细粒度的API。
它还可以转换协议请求和响应。
它还可以卸载微服务的认证/授权责任。

聚合器模式
当把业务功能分解成几个较小的逻辑代码片断时,就有必要考虑如何协作处理每个服务返回的数据。这个责任不能由消费者来承担。

Aggregator模式有助于解决这个问题。它讲述了我们如何聚合来自不同服务的数据,然后将最终的响应发送给消费者。这可以通过两种方式完成[6]。

一个复合微服务将调用所有需要的微服务,整合数据,并在发送回之前转换数据。
API网关也可以将请求分割给多个微服务,并在将数据发送给消费者之前将其汇总。
如果要应用任何业务逻辑,那么建议选择一个复合微服务。否则,API网关是既定的解决方案。代理模式的API网关只是通过API网关暴露了微服务。在这个例子中,API网关有三个API模块。

移动API,它实现了FTGO移动客户端的API。
浏览器API,它实现了在浏览器中运行的JavaScript应用程序的API。
公共API,为第三方开发者实现API。

网关路由模式
API网关负责请求的路由。一个API网关通过将请求路由到相应的服务来实现一些API操作。当它收到一个请求时,API网关会查询一个路由图,指定将请求路由到哪个服务。例如,路由图可以将HTTP方法和路径映射到服务的HTTP URL。这个功能与NGINX等Web服务器提供的反向代理功能相同。

链式微服务模式
单个服务或微服务会有多个依赖关系,例如:销售微服务会依赖产品微服务和订单微服务。链式微服务设计模式将帮助你为你的请求提供综合结果。

一个微服务收到的请求:1,然后与微服务2进行通信,它可能与微服务3进行通信。所有这些服务都是同步调用。

分支模式
一个微服务可能需要从多个来源获得数据,包括其他微服务。Branch微服务模式是Aggregator和Chain设计模式的混合体,允许从两个或多个微服务同时进行请求/响应处理。被调用的微服务可以是微服务的链。分支模式也可用于调用不同的微服务链,或根据你的业务需求调用单一的链。

客户端UI组成模式
当通过分解业务能力/子域来开发服务时,负责用户体验的服务必须从几个微服务中提取数据。在单体世界中,过去只有一个从UI到后台服务的调用,以检索所有数据并刷新/提交UI页面。然而,现在情况就不一样了。有了微服务,UI必须被设计成一个具有多个部分/区域的屏幕/页面的骨架。每个部分都会调用一个单独的后台微服务来获取数据。像AngularJS和ReactJS这样的框架可以很容易地做到这一点。这些屏幕被称为单页应用程序(SPA)。每个团队开发一个客户端UI组件,如AngularJS指令,为他们的服务实现页面/屏幕的区域。一个UI团队负责实现页面骨架,通过合成多个特定服务的UI组件来构建页面/屏幕。

数据库模式
定义微服务的数据库架构时,我们需要考虑以下几点:

服务必须是松散耦合的。它们可以被独立开发、部署和扩展。
业务事务可以执行跨越多个服务的不变性。
一些业务交易需要查询由多个服务拥有的数据。
数据库有时必须被复制和共享,以便进行扩展。
不同的服务有不同的数据存储要求。

每个服务的数据库
为了解决上述问题,必须为每个微服务设计一个数据库;它必须是只属于该服务的。它应该只被微服务的API访问。它不能被其他服务直接访问。例如,对于关系型数据库,我们可以使用private-tables-per-service,schema-per-service,或者database-server-per-service。

每个服务共享数据库
我们已经谈论过每个服务一个数据库是微服务的理想选择。这对微服务来说是一种反模式。但是,如果应用程序是一个单体,并试图分解成微服务,反规范化就不那么容易了。在后期阶段,我们可以转到每个服务的数据库模式。每个服务共享一个数据库并不理想,但这是上述情况下的工作方案。大多数人认为这是对微服务的反模式,但对于棕地应用来说,这是一个很好的开始,可以将应用分解成更小的逻辑片段。这不应该应用于绿地应用。

命令查询责任隔离(CQRS)
一旦我们实现了每个服务的数据库,就有了查询的要求,这需要从多个服务中联合获取数据,这是不可能的。CQRS建议将应用程序分成两部分–命令端和查询端。

命令端处理创建、更新和删除请求。
查询端通过使用物化视图来处理查询部分。
事件源模式通常与它一起使用,为任何数据变化创建事件。物化的视图通过订阅事件流来保持更新。事件源 大多数应用程序都与数据打交道,典型的方法是让应用程序保持当前状态。例如,在传统的创建、读取、更新和删除(CRUD)模型中,一个典型的数据过程是从存储中读取数据。它包含了锁定数据的限制,经常使用事务。

事件源模式
事件源模式定义了一种处理数据操作的方法,该方法由一连串的事件驱动,每一个事件都记录在一个仅有的存储器中。应用程序代码发送一系列的事件,这些事件必须描述发生在数据上的每一个动作,在那里它们被持久化。每个事件代表了一组对数据的变化(如AddedItemToOrder)。这些事件被持久化在一个作为记录系统的事件存储中。事件存储所发布的事件的典型用途是维护实体的物化视图,因为应用程序中的操作改变了它们,并与外部系统集成。例如,一个系统可以维护一个所有客户订单的物化视图,用来填充用户界面的部分内容。当应用程序添加新的订单,添加或删除订单上的项目,以及添加运输信息时,描述这些变化的事件可以被处理并用于更新物化视图。图中显示了该模式的概述。

Saga模式
当每个服务都有自己的数据库,而一个业务交易跨越多个服务时,我们如何确保跨服务的数据一致性?每个请求都有一个补偿性请求,在请求失败时执行。它可以通过两种方式实现。

编排(Choreography)–当没有中央协调时,每个服务产生并监听另一个服务的事件,并决定是否应该采取某种行动。编排是一种指定两方或多方的方式;其中没有任何一方对其他方的流程有任何控制,或者也许对这些流程有任何可见性–可以协调他们的活动和流程以分享信息和价值。当需要跨领域的控制/可见性的协调时,使用编排。在一个简单的场景中,你可以把编排想成是一个网络协议。它规定了各方之间可接受的请求和响应模式。

协调 – 一个协调者(对象)负责一个传奇的决策和排序业务逻辑。当你对一个流程中的所有角色都有控制权时,当他们都在一个控制域中,你可以控制活动的流程时。当然,这是最常见的,当你指定一个将在你所控制的一个组织内颁布的业务流程。

可观察性模式
日志聚合 考虑一个由多个服务组成的应用程序的用例。请求通常跨越多个服务实例。每个服务实例都会以标准化的格式生成一个日志文件。我们需要一个集中的日志服务,将每个服务实例的日志聚合起来。用户可以搜索和分析这些日志。他们可以配置警报,当某些消息出现在日志中时,就会触发警报。例如,PCF确实有日志聚合器,它从PCF平台的每个组件(路由器、控制器、Diego等)和应用程序中收集日志。AWS Cloud Watch也有同样的功能。性能指标 当服务组合因微服务架构而增加时,对交易进行监控变得非常关键,这样就可以监控模式,并在问题发生时发出警报。需要一个指标服务来收集关于单个操作的统计数据。它应该聚集一个应用服务的度量,提供报告和警报。有两种聚合度量的模式。

推送–服务将指标推送给指标服务,例如NewRelic、AppDynamics。
拉–指标服务从服务中提取指标,例如Prometheus。

分布式跟踪
在微服务架构中,请求通常跨越多个服务。每个服务通过在多个服务中执行一个或多个操作来处理一个请求。虽然在故障排除中,值得拥有追踪ID,但我们还是要追踪一个请求的端到端。解决方案是引入一个交易ID。可以使用以下方法:

给每个外部请求分配一个唯一的外部请求ID。
将外部请求ID传递给所有的服务。
在所有的日志信息中包括外部请求ID。

健康检查
当微服务架构被实施后,有可能某个服务已经启动但无法处理事务。每个服务都需要有一个端点,可以用来检查应用程序的健康状况,如健康。这个API应该o检查主机的状态,与其他服务/基础设施的连接,以及任何特定的逻辑。

跨领域的关注模式
外部配置
一个服务通常也会调用其他服务和数据库。对于每个环境,如开发、QA、UAT、prod,端点URL或一些配置属性可能是不同的。这些属性中的任何一个变化都可能需要重新构建和部署服务。为了避免修改代码,可以使用配置。将所有配置外部化,包括端点URL和凭证。应用程序应该在启动时或在运行中加载它们。这些可以在启动时被应用程序访问,也可以在不重启服务器的情况下被刷新。

服务发现模式
当微服务进入画面时,我们需要解决在调用服务方面的一些问题。通过容器技术,IP地址被动态地分配给服务实例。每次地址改变时,消费者服务就会中断,需要手动改变。每个服务的URL都必须被消费者记住,并成为紧耦合的。需要创建一个服务注册表,它将保存每个生产者服务的元数据和每个服务的规范。一个服务实例在启动时应向注册表注册,在关闭时应取消注册。有两种类型的服务发现。

客户端:例如:Netflix Eureka。
服务器端:例如。AWS ALB。

断路器模式
一个服务通常会调用其他服务来检索数据,而下游的服务有可能会出现故障。这样做有两个问题:第一,请求会一直流向停机的服务,耗尽网络资源,并降低性能。第二,用户体验会很差,无法预测。消费者应该通过代理调用一个远程服务,其行为方式类似于一个断路器。当连续失败的次数超过阈值时,断路器就会跳闸,在超时期间,所有试图调用远程服务的尝试都会立即失败。超时结束后,断路器允许有限数量的测试请求通过。如果这些请求成功,断路器就会恢复正常运行。否则,如果出现了故障,超时期又开始了。这种模式适用于防止应用程序试图调用远程服务或访问共享资源,如果这种操作很可能失败。

蓝绿部署模式
通过微服务架构,一个应用程序可以有许多微服务。如果我们停止所有的服务,然后部署一个增强的版本,停机时间将是巨大的,并可能影响业务。此外,回滚将是一场噩梦。蓝绿部署模式避免了这一点。蓝绿部署策略的实施可以减少或消除停机时间。它通过运行两个相同的生产环境,即蓝色和绿色,来实现这一目标。让我们假设绿色是现有的实时实例,蓝色是应用程序的新版本。在任何时候,只有一个环境是实时的,实时环境为所有生产流量服务。所有的云平台都提供了实施蓝-绿部署的选项。

今天先到这儿,希望对云原生,技术领导力, 企业管理,系统架构设计与评估,团队管理, 项目管理, 产品管管,团队建设 有参考作用 , 您可能感兴趣的文章:

如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:

Original: https://www.cnblogs.com/wintersun/p/16439646.html
Author: PetterLiu
Title: 微服务设计模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/553948/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL常用语句

    数据库设置 查看设置 `sql Original: https://www.cnblogs.com/1fengchen1/p/15781973.htmlAuthor: SonnyZ…

    技术杂谈 2023年6月21日
    098
  • 文档分享-Activiti 5.16 用户手册

    今天在翻看工作流相关的网页的时候,在开源中国上http://www.oschina.net/question/915507_149175发现activiti的中文文档:http:/…

    技术杂谈 2023年6月1日
    0100
  • 如何找回QQ聊天记录、语音、图片?

    多图长图预警,本教程适用于 安卓手机 认真仔细看完答案的成功几率翻倍哟! 请各位认真看答案!求您了~ 2020年/4/4日 更新 人民不会忘记,祖国不会忘记,我们不会忘记,先烈不朽…

    技术杂谈 2023年6月21日
    083
  • prim算法求最小生成树

    例题链接 最小生成树的含义是,假设给定n个点,m条边(m > n – 1),在m条边中选择n – 1条边将n个点连接成一个连通图,即一棵生成树。因为每…

    技术杂谈 2023年6月21日
    082
  • Playwright简单试用

    距上篇关于playwright文章过去有一年多了,主要是因为加上早期的playwright并不是很成熟,缺少我最常用到的直接通过CDP(chrome dev protocol)来连…

    技术杂谈 2023年5月31日
    098
  • NYOJ127 星际之门(一)【定理】

    描写叙述 公元3000年,子虚帝国统领着N个星系,原先它们是靠近光束飞船来进行旅行的,近来,X博士发明了星际之门,它利用虫洞技术。一条虫洞能够连通随意的两个星系,使人们不必再待待便…

    技术杂谈 2023年5月31日
    0102
  • Linux下的SELINUX

    理解Linux下的SELinux 长久以来,每当遇到授权问题或者新安装的主机,我的第一反应是通过 setenforce 0命令禁用SELinux,来减少产生的权限问题,但是这并不是…

    技术杂谈 2023年7月24日
    071
  • Hadoop(三)通过C#/python实现HadoopMapReduce

    MapReduce Hadoop中将数据切分成块存在HDFS不同的DataNode中,如果想汇总,按照常规想法就是,移动数据到统计程序:先把数据读取到一个程序中,再进行汇总。 但是…

    技术杂谈 2023年7月24日
    076
  • 如何引用 System.Runtime.Serialization.Json;

    今天新开的一个项目突然发现引用System.Runtime.Serialization.Json 提示 命名空间 不存在类型或命名空间名称 json 明明前段时间刚开发的WCF是很…

    技术杂谈 2023年7月11日
    083
  • Go-Gin 跨域处理

    跨域一般有两种方法: 网络代理层,如nginx层拦截处理; 后端服务处理; 这里简单说下Go Gin框架的解决办法 需要在 Gin 中提供了 middleware (中间件) 来处…

    技术杂谈 2023年5月31日
    080
  • 如何读书? 我一年读500本书,你呢?

    https://mp.weixin.qq.com/s/uP7uVpm5Zs1Rxn9ZYxhCuQ 你一年读多少本书? 大家对这句话肯定不会陌生。你身边标榜阅读量的同事、朋友,各种…

    技术杂谈 2023年5月31日
    097
  • iOS获取当前城市

    @property (nonatomic ,retain )CLLocationManager *locationManager; 4.開始定位 (void)locate //推断…

    技术杂谈 2023年5月31日
    063
  • 「Elasticsearch」ES重建索引怎么才能做到数据无缝迁移呢?

    背景 众所周知,Elasticsearch是⼀个实时的分布式搜索引擎,为⽤户提供搜索服务。当我们决定存储某种数据,在创建索引的时候就需要将数据结构,即Mapping确定下来,于此同…

    技术杂谈 2023年7月24日
    062
  • Windows通过修改注册表设置系统默认浏览器

    前段时间有个程序要求获取系统的默认浏览器,baidu、Google了好久,后又结合procmon.exe跟踪浏览器打开web页面的注册表操作信息,找到了最终的位置,这里做一个总结。…

    技术杂谈 2023年7月11日
    078
  • Kubernetes: Kubesphere 和 Rancher

    Kubesphere 和 Rancher 如何做抉择? – 掘金https://juejin.cn/post/7030740701260316702 (40条消息) k…

    技术杂谈 2023年6月1日
    055
  • linux开机自动挂载(/etc/fstab)

    fatab 介绍 通常情况,Linux 的 /etc/fstab 文件可能有如下内容: # /etc/fstab Created by anaconda on Fri Aug 18…

    技术杂谈 2023年7月24日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球