Dapr 知多少 | 分布式应用运行时

Intro

Dapr 官方团队已于最近(2021.2.17)正式发布Dapr v1.0,Dapr已正式生产可用,可以部署到自托管环境或 Kubernetes 集群。对于绝大多数开发者来说,想必对Dapr只是有所耳闻,而具体是什么(What),可以解决什么样的问题(Why&How),有怎样的应用场景(Where),并不知悉。本文就尝试简要梳理下Dapr,并尝试回答以上问题。

What's Dapr

Distributed Application Runtime. An event-driven, portable runtime for building microservices on cloud and edge.分布式应用运行时。一个事件驱动、可移植的运行时用于在云上和边缘计算上构建微服务。

以上是Dapr官方GitHub仓库上对Dapr的简介。文字虽短,口气却很大,因为其除了涵盖了当前所有的技术热点:分布式、云、微服务,还自我标榜为:分布式应用运行时。分布式应用我们或多或少有些了解,运行时也听到不少,比如常见的语言运行时:Java 运行时,.NET 运行时,Go 运行时等等,那运行时又是什么东西?简要来说:运行时是程序运行依赖的执行环境。以.NET 程序运行时CLR为例,它为.NET应用程序提供了一个托管的代码执行环境负责应用程序在整个执行期间的内存管理、线程管理、安全管理、远程管理、即使编译等。

那分布式应用运行时,就是提供分布式应用运行所依赖的的执行环境。那运行分布式应用需要哪些环境依赖呢?回答这个问题,我们要先思考开发分布式应用的挑战是什么?明确了挑战,那就找到了答案。

从单机到分布式,是追求更快和更高的性能,但也带来了更多的不确定性。比如,不确定计算机何时异常,不确定磁盘何时损坏,不确定网络通信的延迟,也不确定消息是否被正常消费。这些不确定性构成了分布式应用的挑战,简而言之:

  1. 异构的机器与网络:稳定性问题

  2. 普遍的节点故障:可靠性问题

  3. 不可靠的网络:一致性问题

面对这些挑战,业界提出了诸多的分布式理论、协议,如CAP定理,BASE理论,一致性协议2PC/3PC/ZAB,来保证系统的正常运行。虽然问题貌似是有了解决方案,但是应用的复杂度升高了。应用除了需要实现业务需求,还要兼顾非业务需求,集成诸如服务发现、负载均衡、失效转移、动态扩容、数据分片、调用链路监控等分布式系统的核心功能,对应用有很强的侵入性,这就是以Spring Cloud为代表的微服务框架的常见做法。

那如何解决侵入性的问题呢?这个问题随着容器编排技术的成熟有了新的解法。Kubernetes可以不侵入应用层,在容器层解决问题,比如K8S Service就具有服务发现、负载均衡的能力,HPA具有动态扩容的能力。随着K8S的快速发展,云原生的概念,也就越来越深入人心,那如何利用好K8S提供的基座能力,将更多的分布式能力下沉,让应用开发回归业务呢?其中Service Mesh提出的Sidecar模式,就很好的解决了微服务架构中网络通信的问题。Sidecar主要就是用来处理诸如服务发现、负载均衡、请求熔断等一系列非业务需求,应用在部署时动态插入Sidecar,服务间的通信通过Sidecar进行代理,以完成对服务间网络通信的接管。

到这里,微服务开发在Service Mesh的帮助下,已经渐渐回归业务本身,让更多的开发者看到了一丝曙光。It's enough? 来看下Bilgin Ibryam在Multi-Runtime Microservices Architecture文章中提及的分布式应用的四大需求:

分布式应用的四大需求

从上图可以看出,除了网络(Networking)外,生命周期(Lifecycle)、状态(State)、捆绑(Binding)也是分布式应用要解决的问题之一。网络问题可以借由Service Mesh 比如Istio予以解决。那其他三个该如何解决呢?又要应用自行开发集成吗?显然不符合应用回归业务本身的诉求。这时,Dapr登场了,Dapr提出的分布式应用运行时就是实现了以上四个需求并将其下沉作为分布式应用的运行环境。

简而言之:Dapr将分布式能力进行封装下沉作为运行时以简化分布式应用开发的技术复杂度。

How Dapr Works

那Dapr如何简化分布式应用的开发呢?下面我们来看一看Dapr的主要特性。一图胜千言:Dapr通过以HTTP/gRPC API这种与语言无关的方式暴露封装的分布式能力供应用调用,从而支持使用任意语言或框架进行开发集成。目前官方已经提供了Go,Node,Python,.NET,Java, C++,PHP,Rust,Javascript的Sdk,简化Dapr的集成。

其中Dapr的核心构建块(Building Block)就是用来提供各种不同的分布式能力,我们来分别看一看。

1. Service-to-service invocation(服务调用)

提到跨服务方法调用,这个大家肯定会想,这简单啊,不就是服务暴露API就好了嘛。是,但不完全是。比如nodeapp暴露了一个API:http://10.0.0.2:8000/neworder,按照传统的方式,直接HTTP POST这个API访问就得了,但在Dapr中,其提供了服务间方法调用的接口规范,需要按照POST/GET/PUT/DELETE http://localhost:<daprPort>/v1.0/invoke/<appId>/method/<method-name>的格式进行访问。那假设pythonapp需要访问nodeapp的方法,就需要POST一个请求到http://localhost:3500/v1.0/invoke/nodeapp/method/neworder。你可能会想为何多此一举呢?此举的意义何在呢?目的很简单,就是为了实现对服务间网络通信的控制以完成诸如服务发现、流量控制、重试熔断、安全访问等,而这相关的网络控制功能就是集成在Dapr的Sidecar中,以对应用透明的方式集成进来的。整体的服务调用流程如下图所示:

PS:如果对Istio熟悉的同学需要注意,二者虽然都是通过Sidecar的模式进行网络控制,但二者是有有区别的。Dapr是以API的方式,而Istio是以代理的方式(不改变HTTP请求URI)。

2. State management(状态管理)

在进行微服务开发时,绕不开的话题就是服务间的状态共享、并发一致性问题。对于状态共享,你可能会说,各个服务连接到同一个Redis实例就OK了。是,但不得不考虑潜在的更新冲突的问题。Dapr 以更友好的HTTP API的方式进行状态的存储和读取,同时支持通过ETags进行并发控制,并支持通过选项设置并发和一致性行为。

  • 存储:POST http://localhost:<daprPort>/v1.0/state/<storename>

  • 读取:GET http://localhost:<daprPort>/v1.0/state/<storename>/<key>

  • 删除:DELETE http://localhost:<daprPort>/v1.0/state/<storename>/<key>

以下是保存状态的举例:

  • concurrency用于指定并发选项:first-write-wins/last-write-wins(以第一次写入为准/以最后一次写入为准),默认以最后一次写入为准。

  • consistency用于指定一致性选项:strong/eventual(强一致性/最终一致性),默认为最终一致性。

curl -X POST http://localhost:3500/v1.0/state/starwars \-H "Content-Type: application/json" \-d '[{"key": "weapon","value": "DeathStar","etag": "xxxxx","options": {"concurrency": "first-write","consistency": "strong"}}]'

目前支持使用Azure CosmosDB、 Azure SQL Server、 PostgreSQL,、AWS DynamoDB、Redis 作为状态存储介质。

3. Publish and subscribe(消息发布及订阅)

发布订阅模式,老生常谈了,主要是用于微服务间基于消息进行相互通信。你可能也会说,这也要拿出来说,我搞个RabbitMQ/RocketMQ就是了。是的,但我还是要说,Dapr提供了一致性的消息发布、订阅API,而无需关注具体使用的是何种Message Broker,从而和底层基础设施解耦。

  • 发布:POST http://localhost:<daprPort>/v1.0/publish/<pubsubname>/<topic>[?<metadata>]

  • 获取可订阅主题:GET http://localhost:<appPort>/dapr/subscribe

  • 订阅:POST http://localhost:<appPort>/<path>

发布订阅

4. Resource bindings and triggers (资源绑定及事件触发)

Dapr的Bindings与Azure Functions很类似,其是建立在事件驱动架构的基础之上的。通过建立触发器与资源的绑定,可以从任何外部源(例如数据库,队列,文件系统等)接收和发送事件,而无需借助消息队列,即可实现灵活的业务场景。Dapr的Bindings分为两种:

  1. Input Bindings(输入绑定):当外部资源的事件发生时,借助输入绑定,你的应用即可通过特定的API:POST http://localhost:<appPort>/<name>收到外部资源的事件,用于处理特定逻辑。

  2. Output Bindings(输出绑定):输出绑定允许你调用外部资源。比如,在订单处理场景中,在订单创建成功后,可以将订单信息通过Dapr的绑定API:POST/PUT http://localhost:<daprPort>/v1.0/bindings/<name>输出到Kafka特定队列上。

资源绑定及事件触发

5. Actors

Dapr中的Actor模型,和Orleans的Virtual Actor一脉相传,之前写过一篇文章.NET分布式框架 | Orleans 知多少介绍过。简单来讲:Actor模型 = 状态 + 行为 + 消息。一个应用/服务由多个Actor组成,每个Actor都是一个独立的运行单元,拥有隔离的运行空间,在隔离的空间内,其有独立的状态和行为,不被外界干预,Actor之间通过消息进行交互,而同一时刻,每个Actor只能被单个线程执行,这样既有效避免了数据共享和并发问题,又确保了应用的伸缩性。

Actor模型大大简化了并发编程的复杂度,Dapr在Actor运行时中提供了许多功能,包括并发控制,状态管理,生命周期管理如Actor的激活/停用以及用于唤醒Actor的Timer(计时器)和Reminder(提醒)。这些功能同样也是通过API的方式予以提供。

  • 调用Actor 方法:POST/GET/PUT/DELETE http://localhost:3500/v1.0/actors/<actorType>/<actorId>/method/<method>

  • 创建 Timer:POST/PUT http://localhost:3500/v1.0/actors/<actorType>/<actorId>/timers/<name>

  • 创建 Reminder:POST/PUT http://localhost:3500/v1.0/actors/<actorType>/<actorId>/reminders/<name>

6. Observability(遥测)

Dapr记录指标,日志,链路以调试和监视Dapr和用户应用的运行状况。Dapr支持分布式跟踪,其使用W3C跟踪上下文标准和开放式遥测技术,可以轻松地诊断在生产环境中服务间的网络调用,并发送到不同的监视工具,如Prometheus。

7. Secrets(安全)

Dapr 提供了Secret管理,不过不同于K8S中的Secret,其支持与公有云和本地的Secret存储集成,以供应用检索使用。

What Can We Do With Dapr

了解了Dapr是什么,以及其提供的特性,那Dapr的应用场景就一目了然了。也就是官网首页的Slogan:Simplify cloud-native application development--Focus on your application’s core logic and keep your code simple and portable。简化云原生应用的开发,确保应用专注于业务,并保证代码简单可移植。

因此,在考虑云原生应用开发的技术选型时,尽情尝试吧,目前在国内阿里云也已采用。

Last

在云原生如火如荼发展之际,Dapr V1.0 的正式发布,为开发者指明了云原生时代微服务的开发方向。相信Dapr 在未来的微服务架构选型中必将占有一席之地!

参考:

什么是分布式系统,如何学习分布式系统

Mecha:将Mesh进行到底

Multi-Runtime Microservices Architecture

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

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

相关文章

使用.NET中的XML注释(一) -- XML注释标签讲解

一.摘要 .Net允许开发人员在源代码中插入XML注释&#xff0c;这在多人协作开发的时候显得特别有用。 C#解析器可以把代码文件中的这些XML标记提取出来&#xff0c;并作进一步的处理为外部文档。 这篇文章将展示如何使用这些XML注释。 在项目开发中&#xff0c;很多人并不乐意写…

mysql tddl_TDDL思考总结

单机数据库分布式数据库TDDL原理与最佳实践1. 数据库的结构1.1. KV存储(id是K)1.2. B树与红黑树B树的特点是叶子节点是块状&#xff0c;一个叶子里面有多个数据&#xff0c;相邻数据是存在一起的&#xff0c;123&#xff0c;456起等&#xff0c;而磁盘也是按块的&#xff0c;B树…

c# winform中窗体切换后释放及防止重复生成

问题1&#xff1a;窗体切换后如何关闭,并释放资&#xff1f;c# winform中,2个窗体,form1和form2,互相切换的时候执行this.Hide(); Form2 form2 new Form2();form2.Show();此时你会发现当Form2显现时&#xff0c;Form1隐藏了&#xff0c;但当你关闭Form2时&#xff0c;其进程并…

2018程序员必备碎片化学习工具(年度精选)

2017马上就要过去了&#xff0c;2018来了。工作、生活节奏超快的今天&#xff0c;想要不断提升自我&#xff0c;碎片化阅读学习是你最佳的选择&#xff0c;如果你有一颗学习的心&#xff0c;那这些学习型的公众号&#xff0c;绝对会让你受益匪浅。小编为你精选了技术领域几个精…

mfc 找到字符串中字符_[LeetCode] 467. 环绕字符串中唯一的子字符串

题目链接&#xff1a; https://leetcode-cn.com/problems/unique-substrings-in-wraparound-string难度&#xff1a;中等通过率&#xff1a;35.6%题目描述:把字符串 s 看作是"abcdefghijklmnopqrstuvwxyz"的无限环绕字符串&#xff0c;所以 s 看起来是这样的&#xf…

ntopng mysql_网络流量监控工具与分析Ntop和Ntopng

Ntop工具NtopNtop是一种监控网络流量工具&#xff0c;用ntop显示网络的使用情况比其他一些网络管理软件更加直观、详细。Ntop甚至可以列出每个节点计算机的网络带宽利用率。Ntop工作方式1. 命令行界面2. web界面Ntop的功能1. 可以自动从网络中获取有用的信息2. 可以将获取的数据…

一文读懂背包问题

转自&#xff1a;刘毅https://www.61mon.com/index.php/archives/188/问题展开有 N 件物品和一个容量为 V 的背包。第 i 件物品的体积是 Ci&#xff0c;其价值是 Wi。求解&#xff0c;在不超过背包容量情况下&#xff0c;将哪些物品装入背包可使价值总和最大。基本思路这是最基…

小米造车是智能手机进入红海后的突围之举

日前&#xff0c;媒体报道小米已确定造车&#xff0c;并视其为战略级决策。此前&#xff0c;雷静曾多次考虑造车&#xff0c;但未下定决心&#xff0c;而是选择了投资蔚来和小鹏&#xff0c;而且并未占多少股权&#xff0c;小米在两家公司上市时的持股份额均不到 5%&#xff0c…

群论的创立:两个少年天才的接力

我们生活的世界中&#xff0c;美丽的对称无处不在。不过喜欢认死理的数学家&#xff0c;则硬要用他们独特的语言来定义对称。在数学上&#xff0c;对称与群相关联。随着数论、代数方程和几何等研究方向的发展&#xff0c;“群论”这个无比重要的数学领域被开创建立。而这一伟大…

普通程序员转型深度学习指南

AI领域人才奇缺&#xff0c;炙手可热的AI专业应届生年薪30万起步&#xff0c;AI毕业生基本不用找工作&#xff0c;都已经被企业早早预定。AI人才究竟有多紧缺&#xff1f;据腾讯研究院《全球人工智能人才白皮书》报告数据&#xff0c;目前全球AI领域人才仅约30万&#xff0c;全…

sm缩写代表什么意思_pe、PE在电气有代表什么意思,你发现没有,电气技术很有意思...

pe、pe、pe这些是什么意思解说1&#xff0c;听小课堂电小二跟你讲PE是Protecting Earthing的缩写&#xff0c;简体中文名称称之为“保护导体”&#xff0c;也就是我们通常所说的“地线”&#xff0c;我国规定PE线为黄绿双色线 。1.PE线的应用PE线是专门用于将电气装置外露导电部…

java短信接口 调用_带你了解短信接口的调用

查看接口说明image.png注册账号注册成功的页面如下&#xff1a;image.png设置短信内容的签名比如&#xff1a;将短信签名设置为yzcimage.png查取短信接口密钥image.png设计Java程序短信发送客户端的代码如下&#xff1a;package day02;import org.apache.http.Header;import or…

抢鲜体验.NET6 Preview1,配上Docker简直停不下来!

新年复工后的第一件大事儿就是上周三重磅发布的.NET6 Preview1&#xff0c;发布了很多的新特性&#xff0c;让人欢欣鼓舞&#xff01;然而有些小伙伴儿却担心学不过来了&#xff0c;其实不用担心的&#xff0c;照常用你的.NET5&#xff0c;等11月份.NET6 LTS正式发布了&#xf…

实用金属材料手册_机械密封选用手册

《机械密封选用手册》较系统地介绍了机械密封的原理、结构、材料及辅助系统装置及安装、使用方法和故障分析等。内容以产品样本图册为主&#xff0c;并做了相应的结构说明。本书重点介绍了机械密封的选用方法&#xff0c;读者可根据介质、温度、压力、转速等工况条件选取合适的…

为什么在人工智能火爆的现在,我们还在做数据分析

这些年来&#xff0c;随着进入大数据时代&#xff0c;各行各业均有一个词频频被提到&#xff0c;那就是数据分析。那么数据分析究竟是什么呢&#xff1f;数据分析就是指用适当的统计分析方法对收集来的大量数据进行处理分析&#xff0c;提取有用信息并形成结论&#xff0c;从而…

web高德地图怎么加载离线地图_怎么验证全国离线卫星地图缓存文件的完整性

1. 概述自从我们发布了《如何离线浏览全国7137GB海量谷歌卫星离线影像》一文后&#xff0c;很多用户都在问下载海量数据的具体方法&#xff0c;为了解决大家的困惑&#xff0c;于是又分别发布了《如何一次性下载全国谷歌卫星影像地图数据的方法》和《如何一次性下载谷歌地球的全…

为什么程序员发现不了自己的BUG?

最近在朋友圈流行了这样的一个小学数学题&#xff0c;当然结果是“出乎意料”&#xff0c;看似简单的结果&#xff0c;几乎很少有人做对&#xff0c;而分析下来的原因无非是惯性思维下的粗心导致的完全错误&#xff0c;今天小编就带大家一起分析下思考过程。看图可知&#xff0…

IP代理在网络游戏中的应用

前些天同学开了打钱工作室&#xff0c;想玩外服魔兽打点游戏B赚点钱&#xff0c;可是不会上外国魔兽&#xff0c;叫我帮忙给看看怎么才能玩外服。现在我就来做个简单的教程&#xff0c;说明一下怎么玩外服吧。先说明一些现状&#xff1a;一些海外网络游戏服务器和带宽资源有限&…

【干货】人人都能看懂的LSTM

推荐阅读时间&#xff1a;8min~13min推荐理由&#xff1a;这是在看了台大李宏毅教授的深度学习视频之后的一点总结和感想。看完介绍的第一部分RNN尤其LSTM的介绍之后&#xff0c;整个人醍醐灌顶。10. 从RNN说起循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RN…

Csv数据库CsvDb

在工控领域&#xff0c;经常遇到断电关机数据库文件损坏的情况&#xff0c;SQLite如此&#xff0c;LiteDb也是这样。ZTO有数万自动化扫描设备&#xff0c;每天都有数百台设备因断电数据库损坏等原因&#xff0c;而不得不重装软件。因此&#xff0c;设计了CsvDb&#xff0c;用于…