热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

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

Kubernetes 託管的側車架構

图片来源: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)

Kubernetes 托管的 sidecar 体系结构

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

自承载 sidecar 体系结构

每个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 访问该功能,目前版本有如下构建块。

Dapr 构建基块

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

eShopOnDapr reference application architecture

基于这样的设计,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
  • 这些核心的设计可以通过代码仓库了解:

    image

    仓库 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/)里的这张图介绍了调用逻辑

    Diagram showing the steps of service invocation

    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 的概念,如下图:

    image

    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了。

    查看源图像


    推荐阅读
    • Istio是一个用来连接、管理和保护微服务的开放平台。Istio提供一种简单的方式来为已部署的服务建 ... [详细]
    • flowable工作流 流程变量_信也科技工作流平台的技术实践
      1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
    • 微服务之总体架构篇
      一、单体架构存在的问题缺点:1、难以维护:当单体应用业务不断迭代后代码量非常臃肿,模整个项目非常复杂,每次更改代码都可能带来新的bug;2、部署项目麻烦:庞大之后项目部署效率 ... [详细]
    • 云原生边缘计算之KubeEdge简介及功能特点
      本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
    • HTML学习02 图像标签的使用和属性
      本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
    • [翻译]微服务设计模式5. 服务发现服务端服务发现
      服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
    • 后台自动化测试与持续部署实践
      后台自动化测试与持续部署实践https:mp.weixin.qq.comslqwGUCKZM0AvEw_xh-7BDA后台自动化测试与持续部署实践原创 腾讯程序员 腾讯技术工程 2 ... [详细]
    • 都说Python处理速度慢,为何月活7亿的 Instagram依然在使用Python?
      点击“Python编程与实战”,选择“置顶公众号”第一时间获取Python技术干货!来自|简书作者|我爱学python链接|https:www.jian ... [详细]
    • [我们是谁?] ... [详细]
    • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
    • 如何去除Win7快捷方式的箭头
      本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
    • Webmin远程命令执行漏洞复现及防护方法
      本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
    • 如何实现JDK版本的切换功能,解决开发环境冲突问题
      本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
    • Tomcat安装与配置教程及常见问题解决方法
      本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
    • Annotation的大材小用
      为什么80%的码农都做不了架构师?最近在开发一些通用的excel数据导入的功能,由于涉及到导入的模块很多,所以开发了一个比较通用的e ... [详细]
    author-avatar
    手机用户2502937923
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有