浅析 Dapr 里的云计算设计模式

Dapr 实际上是把分布式系统 与微服务架构实践的挑战以及k8s 这三个主题的全方位的设计组合,特别是Kubernetes设计模式 一书作者Bilgin Ibryam 提出的Multi-Runtime Microservices Architecture,中译参见敖小剑的博客: [译] 多运行时微服务架构。

分布式系统 和微服务架构实践的核心问题就是要解决系统复杂性这个难题,降低复杂性的通常做法就是分而治之,Dapr的最核心的设计就是Sidecar Pattern + Building Block,如下图:

图片来源:https://docs.microsoft.com/zh-cn/dotnet/architecture/dapr-for-net-developers/dapr-at-20000-feet

  • Sidecar Pattern: 通过职责分离与容器的隔离特性,降低应用程式的复杂度。

  • Building Block:  类似于乐高搭积木方法,通过Dapr 提供的核心组件(Component),分离与抽象化系统架构。

Dapr 设计上几乎和Bilgin Ibryam 提出的Multi-Runtime Microservices Architecture 不谋而合,它有几个核心的设计点:

  1. Sidecar

  2. Building Block & Component

  3. Service Invocation

  4. Middleware

  5. State

基于上面的这些核心设计,Dapr 有了多运行时微服务架构 的特性,以此延伸出底下的重要功能,或者说设计模式:

  1. Security

  2. Observability: tracing, metrics, logs and health

  3. Pub / Sub / Batch Process

  4. Actors

  5. Secret Management

  6. Config Management 正在开发中……

Sidecar

Sidecar是非常重要的云计算设计模式,下面这张图是 Sidecar 与Microservice 之间搭配后形成多个服务的关系图,这样的结构形成了服务网格的概念, Dapr 通过配置的方式,动态生成Sidecar ,随后伴随着App,一组Dapr Sidecar + App 的组合称为Dapr App

Dapr App 在K8s 里面的形态就是 Pod = (App_Container + Sidecar_Container)

同样的概念,如果Dapr App跑在k8s外面,也就是自承载模式。在自承载模式下,微服务和 Dapr sidecar 在没有容器业务流程协调程序(如 Kubernetes)的单独本地进程中运行。

每个Dapr App 都通过Sidecar 沟通,在通信之前,Dapr App 要知道的是对方在哪?所以服务发现和服务调用是Dapr App 要解决的第一个问题,知道彼此在哪了,然后就是通信模式,Dapr 支持HTTP / gRPC 两种通信模式。Dapr App 之间的默认的通信模式使用gRPC,也就是如果使用HTTP调用Dapr API,内部服务之间的通信也会转成gRPC。

gRPC 是一种新式的高性能框架,它通过 RPC (远程过程调用) 改进。gRPC 使用 HTTP/2 作为传输协议,该协议通过 HTTP RESTFul 服务提供显著的性能增强,包括:

  • 对通过同一连接发送多个并行请求的多路复用支持 - HTTP 1.1 将处理限制为一次处理一个请求/响应消息。

  • 双向全双工通信,用于同时发送客户端请求和服务器响应。

  • 内置流式处理,支持对大型数据集进行异步流式处理的请求和响应。

若要了解有关详细信息,请查看适用于 Azure 电子书的.NET Cloud-Native中的 gRPC概述。

Dapr Sidecar 有了服务调用、服务发现和通信模式之后,定义出来了一个Building Block (构建块)的概念,使用声明的方式,定义多个组件Component 扩展Sidecar的能力,这些能力正是分布式系统需要面对的问题。

构建块 和 组件

构建基块封装分布式基础结构功能。可以通过 HTTP 或 gRPC API 访问该功能,目前版本有如下构建块。

Buiding Block 是每个 Dapr Sidecar 可以扩展的概念,每个 Block 由多个 Components 组成,开发者可以自行设计、扩展 Component,然后贡献给社区,这里集中了社区贡献的组件 https://github.com/dapr/components-contrib。我们来看一下微软的.NET团队基于Dapr 设计的eshopondapr,图中每个Dapr标示都是一个Component ,一共标记了六种:

基于这样的设计,Dapr 把最核心的Component 提供了基于分布式系统的 最佳实践 (Best Practice)和 设计模式(Design Patterns)

  1. Input/Output Bindings:

  • 全部列表:Supported external bindings

  • Pub / Sub:

    • 全部列表:Supported pub/sub brokers Middleware: Dapr 的一种特殊 Components,后面介绍。

  • Service discovery name resolution: Dapr 的特殊 Components,后面介绍。

  • State Stores

    • 全部列表:Supported state stores

  • Secret Stores

    • 全部列表:Supported secret stores

    这些核心的设计可以通过代码仓库了解:

    仓库 https://github.com/dapr/components-contrib 是Dapr 官方开放的Component ,开发者可以通过 PR 提交来把 扩展的Component 贡献给社区,目前已经有70 多个Components 可以使用,使用的时候要注意版本的阶段性是在Alpha / Beta / GA,一定要做好风险评估。

    服务调用和服务发现

    这就是我们在微服务里面常说的服务治理,Dapr 作为一个分布式系统,多个Dapr app怎么知道彼此的存在,通过什么方式进行沟通,这就是Dapr的服务治理要解决的问题,Dapr的服务发现机制,按照架构的不同方式(k8s还是自托管)有不同的实现,官方文档(https://docs.dapr.io/zh-hans/developing-applications/building-blocks/service-invocation/service-invocation-overview/)里的这张图介绍了调用逻辑

    1. 服务 A 对服务 B 发起HTTP/gRPC的调用。

    2. Dapr 使用 name resolution component 发现 Service B’s 位置 取决于运行的环境 hosting platform.

    3. Dapr 将消息转发至服务 B的 Dapr 边车

      : Dapr 边车之间的所有调用考虑到性能都优先使用 gRPC。仅服务与 Dapr 边车之间的调用可以是 HTTP 或 gRPC

       

    4. 服务 B的 Dapr 边车将请求转发至服务 B 上的特定端点 (或方法) 。服务 B 随后运行其业务逻辑代码。

    5. 服务 B 发送响应给服务 A。响应将转至服务 B 的边车。

    6. Dapr 将消息转发至服务 A 的 Dapr 边车。

    7. 服务 A 接收响应。

    这里面有很多核心的概念:

    • Dapr 命名有Namespace 概念,基本格式为FQDN

    • Dapr 的Service Invocation 支持 gRPC / HTTP 两种方式,默认的 Service to Service 使用gRPC 通信。

    • Service to Service 使用mTLS 做传输层加密

    • 支持 Service 的ACL,可以个别控制每个API 与Method 的操作

    • 支持 Retry 机制

    • 可以使用其他service discovery 实现

    • RR load balancing with mDNS

    • 支持tracing 和 metric

    Middleware

    和ASP.NET Core 支持通过 middleware 处理 HTTP request / response 完成一些 Cross-Cutting (AoP) 的功能,Dapr 也支持 Middleware 的概念,如下图:

    Dapr 允许通过链接一系列中间件组件来定义自定义处理管道。请求在路由到用户代码之前经过所有已定义的中间件组件,然后在返回到客户机之前,按相反顺序经过已定义的中间件,如下图中所示。

    Actors

    Actor 模型 起源于Carl Hewitt  在 1973 年提出的作为并发计算的概念模型,这种形式的计算会同时执行多个计算。当时并没有高度并行的计算机,但多核 Cpu 和分布式系统的最新进步使得Actor 模型 变得流行。在Actor 模型中,Actor 是一个计算和状态独立的单元。Actors 完全彼此隔离,它们永远不会共享内存。Actors 使用消息相互通信。当一个Actor 收到消息时,它可以更改其内部状态,并将消息发送到其他 (可能是新的) Actors。

    Actor模型使得编写并发系统变得更简单的,它提供了基于 turn-based 的 (或单线程) 访问模型。多个Actors可以同时运行,但每个Actor 一次只处理一个接收的消息。这意味着,在任何时候,都可以确保在Actors 中最多有一个线程处于活动状态。这使得编写正确的并发系统和并行系统变得更加容易。

    Dapr 的实现基于 项目 "Orleans" 中引入的虚拟Actor模式。对于虚拟Actor模式,不需要显式的创建Actor。第一次将消息发送到Actor时,Actor将被隐式激活并放置在群集中的节点上。当不执行操作时,Actor 会以静默方式从内存中卸载。如果某个节点出现故障,Dapr 会自动将激活的Actor 移到正常的节点。除了在Actor之间发送消息以外,Dapr Actor模型还支持使用计时器和提醒调度将来的工作。

    虽然Actor模型 提供了很大的优势,但必须仔细考虑Actor的设计。例如,如果多个客户端调用相同的Actor,则会导致性能不佳,因为Actor  操作会按顺序执行。下面的检查清单是是否适用于 Dapr Actor的一些标准:

    • 问题空间涉及并发性。如果没有Actor,则需要在代码中引入显式锁定机制。

    • 可以将问题空间分区为小、独立和隔离的状态和逻辑单元。

    • 不需要低延迟的读取Actor 状态。  因为Actor 操作是按顺序执行,不能保证低延迟读取。

    • 不需要在一组Actor 之间查询状态。跨Actor 的查询效率低下,因为每个Actor 的状态都需要单独读取,并且可能会导致不可预测的延迟。

    满足这些条件的一种设计模式非常好,就是 基于业务流程的 saga 或 流程管理器 设计模式。Saga 管理必须执行的一系列步骤才能达到某些结果。Saga (或进程管理器) 维护序列的当前状态,并触发下一步。如果一个步骤失败,saga 可以执行补偿操作。利用Actor,可以轻松处理 saga 中的并发,并跟踪当前状态。 EShopOnDapr 参考应用程序使用 saga 模式和 Dapr Actor来实现排序过程。

    为了提供可伸缩性和可靠性,将在Actor服务的所有实例中对actor进行分区。Dapr placement  服务负责跟踪分区信息。启动Actor 服务的新实例时,Sidecar 会将支持的Actor 类型注册到placement 服务。placement 服务计算给定Actor 类型的更新分区信息,并将其广播给所有实例。

    总结

    分布式架构的门槛比较高,需要考虑的问题很多,通常我们都需要考虑如下问题。

    1. 服务治理:包含Service Invocation、Service Trusted and Authorization (服务的信任、认证与授权)、通信模式(HTTP / gRPC)、通信机制(Push / Pull)、状态管理(State Machine)

    2. 运维:高可用、扩展机制、Log 处理、分布式追踪、Metric

    3. 安全性:Data Encryption、Secret Management、KMS、Auth 集成

    4. 性能和可靠性:Rate Limit、降级、熔断…

    5. 可扩展的架构

    6. 如何提升开发团队的效能

    上述的这些东西,通常是一个有经验的、资深的软件工程师,如何在资源有限的情况下,可以快速开发、容易测试,是很多技术人的痛点所在。

    这些问题从个别来看,都有相当成熟的系统,如果个别看,有很多现成的实践可以参考。但是对于存在了几十年的祖传代码的系统架构而言,如果要进行微服务改造,往往都要伤筋动骨,让技术主管和架构师伤透脑筋,往往要面对新旧技术的整合,同时也要面对现实的团队需求的交互和对于新技术的学习门槛。对于开发应用程式的开发人员来讲,满足业务需求的开发已经够头痛了,还要考虑这么多系统架构层面的东西,这种事是无法靠热情填补的。Dapr 将一些经过验证的技术和最佳实践带到微服务开发中。它通过即插即用模型将90 年代的数据驱动的客户端/服务器应用程序的操作,应用于现代云原生应用程序所需的最常见服务,让我们集中于业务需求的开发,而不需要考虑系统架构层面的东西 。

    Dapr 正式发布已经过去了半年时间了,现在最新版本是1.3.0.  下图是技术采用生命周期,在早期采用者和早期大众的中间,有一个死亡之井,无法越过死亡之井,则死亡,Dapr已经跨过了死亡之井,你可以采用Dapr了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux Kickstart无人值守安装(上)

Linux Kickstart无人值守安装 在我们的网络维护生涯中,有不少朋友,感觉到自己在机械的做一件事情,在无聊、无趣和无奈中工作。尤其一些简单重复的操作更容易让大家感到工作的无趣。今天将给大家介绍如何大规模的部署RedHat Linux操作系统&…

path manipulation怎么解决_干货!终于!解决macOS下pyenv安装python3.8.2缺少tkinter模块的问题!...

前言:笔者不过是一个刚立下flag要学习Python的小白,(这也是笔者的第一篇网文、知乎文,如果没用,求轻虐),为此还冲动傻傻地配了一台2019款13寸的MacBook Pro。电脑配置(作为参考&…

如何给柱状图柱子添加阴影_【LeetCode日记】84. 柱状图中最大的矩形

题目描述 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2…

VMWare虚拟机NAT上网方法 亲测可用

首先虚拟机的网卡要选择NAT 然后 在Virtual Network Editor中一定选上DHCP功能。 还要主机的服务必须开启。主机的VMnet8对应NAT模式,这个VMnet8的配置保持默认不要改,默认会有IP,不要设置成自动获取。 在虚拟机Windows系统的网卡设置必须自动…

用MATLAB三步完成机器人搭建

全世界只有3.14 % 的人关注了爆炸吧知识如果说机器人是一粒种子,那么《机器人大擂台》这档节目就是那个播种人。节目中,不同选手操纵着机器人,在擂台上各显神威 —— 冲撞、翻滚、撬杠、喷火等各种技能,总能令人眼花缭乱&#xff…

可以备份服务器文件的软件哪个好,文件备份软件哪个好?

对于一个企业而言,文件的价值是无可比拟的,无论是重要的文件、文档还是会议记录等等都是不可丢失的。一般而言,企业为了让文件更加安全,会进行文件的备份,企业文件备份传统方式就是租用或者购买一台服务器来进行数据或…

太妙了!微软670页《dotnet官方手册》火了,完整PDF开放下载!

本文档由微软技术专家编写,从1.1版本持续维护升级至今,开篇就详细对比了各版本中的差异,内容包含了ASP.NET Core、Blazor、WebAPI、SignalR、gRPC、EF Core、云原生,既是最权威的,也是最全面的,是学习跨平台…

(译)如何使用cocos2d制作基于tile地图的游戏教程:第一部分

免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该翻译稿…

devexpress 中的checkboxlist怎么设置间距_HTML中怎么设置h1的字体样式你知道吗?关于设置h1标签的样式详解

本篇文章主要为大家讲解了html中的h1标签的样式解析,但是如果不用css样式来做的话,那就只能在html4.01中显示了,所以我们还是尽快学习css层叠样式表吧,好了,现在让我们来说说这篇文章吧。HTML中的H标签(H1,…

终端如何粘贴快捷键_11 个“原来可以这样”的 Linux 终端命令

1. 命令行日常系快捷键如下的快捷方式非常有用,能够极大的提升你的工作效率:CTRL U - 剪切光标前的内容CTRL K - 剪切光标至行末的内容CTRL Y - 粘贴CTRL E - 移动光标到行末CTRL A - 移动光标到行首ALT F - 跳向下一个空格ALT B - 跳回上一个空格…

2020应届生「求职图鉴」,扎心了!

一场疫情,开启了2020应届生求职的地狱模式:实习,辞了考研,凉了论文,废了春招,歇了......别说拿高薪,有份工作都难!当「想象」遇上「现实」,现在的你,还挺得住…

WCF发布到IIS7问题的解决方案

今天用VS2010开发了一个WCF服务进行一个简单测试,没想到这点小事竟然折腾了我2个小时。 为避免其他兄弟遇到相同的问题少走弯路做一下总结。 操作系统:Windows7 旗舰版 开发环境:VS2010 .NET Framework4.0 ASP.NET4.0 第一步:检查Windows7中IIS是否安装了…

flex布局_Flex布局,真香

作者: EcbJS https://blog.csdn.net/EcbJS/article/details/106466757?utm_sourceapp1.基本原理Flex 英文意思为,弯曲,屈伸,可以伸缩的布局,天生就是为了适配不同的分辨率。而且用法也很简单,首先只要告诉浏览器&…

字体编辑器_FontLab 7 ——字体编辑器

FontLab VI是一款专为Mac用户设计的字体编辑器。无论您是专家还是初学者,使用FontLab突破性的绘图工具和响应式轮廓操作都能够轻松设计,编辑和转换字体,让您的设计过程将更快,更高效!功能介绍一、画画 下一代绘图神器&…

分享一个理工男必学的撩妹姿势

随着气温越来越高,空气中恋爱的酸臭味也越来越浓。。。是的,这意味着一个由谐音演变而来的“传统佳节”,也终于迎来了它的高光时刻。520可以说是每个直男都要经历的考验,说是“我爱你”的谐音,过得好是520,…

Docker小白到实战之Dockerfile解析及实战演示,果然顺手

前言使用第三方镜像肯定不是学习Docker的最终目的,最想要的还是自己构建镜像;将自己的程序、文件、环境等构建成自己想要的应用镜像,方便后续部署、启动和维护;而Dockerfile就是专门做这个事的,通过类似简单编码的形式…

转换实体类_利用Java反射机制进行Map和JavaBean间转换

Java中利用反射进行Map和JavaBean间转换在日常工作中,有时候我们可能会遇到以下这样的情况发生。例如:(1)后端接受一个参数Map param(可能是前端form维护的一个对象...)。(2)将一个对象个别属性(key)和对应值(value)存放到Map对象中。(3).......针对上面…

python模拟键盘输入_这件神器,每个 Python入门学习者都值得一试

灰常实用的一篇文章,看完你会来点赞滴。 不论你是刚开始学 Python,还是正在啃数据分析的骨头,对你来说,不断在各种命令行窗口和编辑器里切来切去,或者不断打开各种窗口查看 matplotlib 的输出之类的繁琐操作&#xff0…

早上起床时需要的重力

1 我这一波操作怎么样?2 要趁垃圾桶不注意3 主人在厕所,我要守护她4 好歹给你留了一张,知足吧5 怎么吃这么小的榴莲6 不存在的7 早上起床时需要的重力8 求解你点的每个赞,我都认真当成了喜欢

一年几百亿的电费 中国移动再提5G功耗问题

最近,中移动高管表示,在5G网络建设中,中国移动将贯彻绿色发展的理念,利用节能技术,使功耗尽可能能够减少。之所以如此,原因之一是中国移动的网络功耗上受到一定程度的压力。在中国移动招股书中也反映出了5G…