女主宣言

本文旨在让大家了解微服务体系结构的设计模式以克服微服务所带来的挑战。文章会分为上下两篇,上篇包含1、分解模式2、集成模式,下篇包含3、数据库模式4、可观测性模式5、横切关注点的模式。

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

微服务体系结构已经成为现代应用程序开发的实际选择。虽然它解决了某些问题,但它不是一颗银弹。它也有一些缺点,在使用这种体系结构时,有许多问题必须解决。这就需要学习这些问题中的通用模式,并使用可重用的解决方案来解决它们。因此,需要讨论微服务的设计模式。在深入研究设计模式之前,我们需要了解微服务体系结构的构建原则:

  1. 可伸缩性

  2. 可用性

  3. 弹性

  4. 独立的,自主的

  5. 分散治理

  6. 故障隔离

  7. 自动预配

  8. 通过DevOps持续交付

应用所有这些原则带来了一些挑战和问题。让我们讨论这些问题和它们的解决方案。

1

分解模式

a、根据业务能力分解

问题

微服务就是让服务松散耦合,应用单一职责原则。然而,将应用程序分解成更小的部分必须逻辑地完成。如何将应用程序分解为小型服务?

解决方案

一种策略是根据业务能力分解。业务能力是企业为了产生价值而做的事情。给定业务的功能集取决于业务类型。例如,保险公司的能力通常包括销售、营销、承保、理赔处理、开票、合规等。每个业务能力都可以被看作是一种服务,只是它是面向业务的,而非技术性的。

b、根据子域分解

问题

使用业务功能分解应用程序可能是一个很好的开始,但是您会遇到所谓的“上帝类”,它们不容易分解。这些类在多个服务中很常见。例如,Order类将用于Order管理、Order收入、Order交货等等。我们如何分解它们?

解决方案

对于“上帝类”问题,DDD(领域-驱动 设计)起到了拯救作用。它使用子域和有界上下文概念来解决这个问题。DDD将为企业创建的整个领域模型分解为子领域。每个子域都有一个模型,该模型的作用域称为有界上下文。每个微服务都将围绕有界上下文开发。

备注:识别子域并不是一项简单的任务。这需要对业务有所了解。与业务功能一样,子领域是通过分析业务及其组织结构以及识别不同的专业领域来识别的。

c、扼杀者模式

问题

到目前为止,我们讨论的设计模式是对greenfield的应用程序进行分解,但是我们所做的80%的工作是对brownfield应用程序进行分解,brownfield应用程序是大型的、单一的应用程序。将上面所有的设计模式应用到它们上是很困难的,因为将它们分解成更小的部分同时使用是一个很大的任务。

解决方案

勒死人的模式来了。勒死人的模式是基于一种藤蔓的类比,藤蔓缠绕着一棵树。这个解决方案很适合web应用程序,在web应用程序中,一个调用来回进行,对于每个URI调用,可以将服务分解为不同的域并作为独立的服务托管。我们的想法是一次做一个领域。这将创建两个独立的应用程序,它们并排放在同一个URI空间中。最终,新重构的应用程序将“扼杀”或替换原始应用程序,直到您最终可以关闭单片应用程序为止。

2

集成模式

a、API网关模式

问题

当应用程序分解为更小的微服务时,有几个问题需要解决:

  1. 如何调用多个微型服务来提取生产者信息。

  2. 在不同的通道(如桌面、移动设备和平板电脑)上,应用程序需要不同的数据来响应相同的后端服务,因为UI可能不同。

  3. 不同的使用者可能需要不同格式的可重用微服务的响应。谁将进行数据转换或字段操作?

  4. 如何处理不同类型的协议,有些协议可能不受生产者微服务的支持。

解决方案

API网关有助于解决微服务实现引起的许多问题,而不仅仅局限于上述问题。

  1. API网关是任何微服务调用的单一入口点。

  2. 它可以作为代理服务将请求路由到相关的微服务,抽象生产者的详细信息。

  3. 它可以将请求分散到多个服务,并聚合结果发送回消费者。

  4. 一刀切的api不能解决所有用户的需求;该解决方案可以为每种特定类型的客户机创建细粒度的API。

  5. 它还可以将协议请求(例如AMQP)转换为另一个协议(例如HTTP),反之亦然,以便生产者和消费者能够处理它。

  6. 它还可以减轻微服务的身份验证/授权责任。

b、聚合器模式

问题

我们已经讨论了如何解决API网关模式中的聚合数据问题。然而,我们将在这里整体地讨论它。在将业务功能分解为几个较小的逻辑代码片段时,有必要考虑如何协作每个服务返回的数据。这种责任不能留给消费者,因为那时它可能需要了解生产者应用程序的内部实现。

解决方案

聚合器模式有助于解决这个问题。它讨论了我们如何聚合来自不同服务的数据,然后将最终的响应发送给消费者。这可以通过两种方式实现:

  1. 复合微服务将调用所有所需的微服务,合并数据,并在发送回之前转换数据。

  2. API网关还可以将请求划分为多个微服务,并在将数据发送给使用者之前聚合数据。

如果要应用任何业务逻辑,建议选择组合微服务。否则,API网关就是已建立的解决方案。

c、客户端UI组合模式

问题

当通过分解业务功能/子域来开发服务时,负责用户体验的服务必须从多个微服务中提取数据。在单片世界中,从UI到后端服务只有一个调用来检索所有数据并刷新/提交UI页面。然而,现在情况就不一样了。我们需要知道怎么做。

解决方案

使用微服务,UI必须被设计成具有屏幕/页面的多个部分/区域的骨架。每个部分将调用单个后端微服务来提取数据。这被称为组合特定于服务的UI组件。像AngularJS和ReactJS这样的框架很容易做到。这些屏幕称为单页应用程序(SPA)。这使得应用程序能够刷新屏幕的特定区域,而不是整个页面。

总结

在本篇中,我们给大家介绍了分解模式和集成模式,在下篇文章中将会给大家带来数据库模式、可观测性模式和横切关注点的模式。希望对大家在理解微服务方面有所帮助。

HULK一线技术杂谈

由360云平台团队打造的技术分享公众号,内容涉及云计算、数据库、大数据、监控、泛前端、自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

微服务设计模式(上)相关推荐

  1. 微服务设计模式(下)

    女主宣言 本文旨在让大家了解微服务体系结构的设计模式以克服微服务所带来的挑战.文章会分为上下两篇,上篇包含1.分解模式2.集成模式,下篇包含3.数据库模式4.可观测性模式5.横切关注点的模式. PS: ...

  2. 微服务架构基本介绍与微服务设计模式

    微服务与传统单体服务 单体服务 一个项目中包含了所有的服务叫做单体服务 优点: 开发简单,对技术栈要求不高 部署.运维方便,只需要对一台机器.一个服务进行部署.运维 服务监控.问题排查简单,只需要对一 ...

  3. 【微服务】构建应用程序的顶级微服务设计模式

    在当今市场上,微服务已成为构建应用程序的首选解决方案.众所周知,它们可以解决各种挑战,但是,熟练的专业人员在使用此架构时经常面临挑战.因此,相反,开发人员可以探索这些问题中的常见模式,并可以创建可重用 ...

  4. 微服务优雅上下线的实践方法

    导语 本文介绍了微服务优雅上下线的实践方法及原理,包括适用于 Spring 应用的优雅上下线逻辑和服务预热,以及使用 Docker 实现无损下线的 Demo.同时,本文还总结了优雅上下线的价值和挑战. ...

  5. spring5企业级开发实战 pdf_终于总结出Spring全家桶+微服务设计模式+Netty+MySQL调优PDF...

    Spring源码深度解析(2020年1月第二版) Spring是一个源码开放的轻量级Java开发框架,旨在解决业务逻辑层和其他各层的松耦合问题! 自从2003年推出以来,Spring 逐渐发展成为事实 ...

  6. 当微服务遇上 Serverless | 微服务容器化最短路径,微服务 on Serverless 最佳实践

    简介: 阿里云Serverless应用引擎(SAE)初衷是让客户不改任何代码,不改变应用部署方式,就可以享受到微服务+K8s+Serverless的完整体验,开箱即用免运维. 前言 微服务作为一种更灵 ...

  7. 【微服务架构】微服务设计模式

    这是微服务架构系列文章的第 3 篇 高可用性.可扩展性.故障恢复能力和性能是微服务的特征.您可以使用微服务架构模式来构建微服务应用程序,从而降低微服务失败的风险. 模式分为三层: 应用模式 应用程序模 ...

  8. 微服务软件架构的认识和设计模式

    什么是微服务? 微服务存在多种定义. 如果搜索 Internet,会发现许多有用的资源,这些资源提供了自己的观点和定义. 但在微服务的以下大部分特性上,已广泛达成共识: 封装客户方案或业务方案. 你要 ...

  9. 微服务架构科普及设计模式

    -     微服务架构介绍    - 微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦.你可以将其看作是在架构 ...

最新文章

  1. keil c语言模块化编程,keil C模块化编程总结
  2. BZOJ 1036 [ZJOI2008]树的统计Count
  3. 计算机体系结构 第一章
  4. 如何让两个安装程序setup共享同一个component—— installing shared files(version:installshield develop8.0)...
  5. 中文电子病例命名实体识别项目
  6. STL和C++标准库
  7. 禁止存放到内存_暴雨 ! 神木能源局:关于煤炭运输及存放的通告
  8. 排序方法总结C++实现
  9. 上海消保委评饿了么“多等5分钟”功能:逻辑上有问题
  10. 对我帮助很大的ESXCLI命令
  11. 【转载】Sqlserver使用Convert函数进行数据类型转换
  12. vb中typename函数
  13. 目标检测->SSD算法
  14. 基于node+mysql的微信商城小程序全栈系统(vue后台管理系统+微信小程序+node服务端)
  15. 陈风莲(帮别人名字作诗)
  16. 静态单赋值(一)—gcc中的支配树
  17. 与Windows更新的抗争-取消Windows系统自动更新
  18. 04 分布式文件系统以及MapReduce入门程序
  19. 基于Open vSwitch的传统限速和SDN限速--实验
  20. TensorFlow实现非线性回归

热门文章

  1. 【转】ArcGIS Server安装
  2. [科技部与你共成长] 倒牛奶
  3. ASP.NET页面间数据传递的几种方法
  4. Python TypeError: descriptor '__init__' requires a 'super' object but received a 'str' 错误
  5. 常见的6种线程池及简单使用
  6. c语言格式化知识点(sscanf)
  7. 光源时间_D65光源对色灯箱的操作步骤及作业标准
  8. spring异常处理-HandlerExceptionResolver
  9. 标准日本语 05_003
  10. 调试方法和技巧(zz)