网易首页 > 网易号 > 正文 申请入驻

微软开源微服务构建软件Dapr:允许构建可同时在云端和边缘上运行的微服务,无需更改代码

0
分享至

  作者丨Dapr 项目主管

  译者丨Sambodhi

  随着越来越多的开发人员构建可扩展的云原生应用,利用托管服务来部署和运行这些云原生应用。在过去几年中,这一转变值得人们关注。随着这一转变,微服务架构已经成为构建云原生应用的标准,预计到 2022 年,将有 90% 的新应用采用微服务架构。微服务架构提供了极具说服力的好处,包括可扩展性、松散的服务藕合和独立部署等,但这种方法的成本可能很高,因为开发人员需要了解和熟练掌握分布式系统。

  开发人员希望专注于业务逻辑,频繁且增量地迁移遗留代码,同时依靠平台为他们的应用提供所需的规模、弹性、可维护性、灵活性和云原生架构的其他属性。然而,开发人员发现,在云端和边缘之间的可移植性有限,他们不断地解决相同的分布式系统问题,如状态管理、弹性方法调用和事件处理。此外,许多编程运行时通常具有狭隘的语言支持和严格控制的特性集,这使得构建微服务架构变得具有挑战性。

  为了使所有开发人员能够使用任何语言和框架轻松地构建可移植的微服务应用,无论是编写新代码还是迁移现有代码,我们很高兴地宣布将 Dapr 开源。

  1 构建事件驱动、无状态和有状态的应用

  例如,在构建由多个服务组成的电子商务应用时,你可能希望使用有状态的角色来表示购物车服务,并为支付和配送服务调用无状态函数。编写这个应用可能涉及到使用多种语言、开发框架和基础架构平台,以及与外部服务集成。而理解和管理如此复杂的技术栈,会分散开发人员对构建业务价值的注意力。

  2 Dapr:云端和边缘的微服务构建块

  Dapr 是开源的、可移植的、事件驱动的运行时,它使开发人员可以轻松地构建弹性的、微服务的无状态和有状态的应用,这些应用运行在云端和边缘之上。Dapr 支持所有编程语言和开发框架的多样性,并简化了构建应用的过程(如电子商务应用)。

  Dapr 是由一组标准 HTTP 或 gRPC API 访问的构建块组成,这些构建块可从任何编程语言调用。这些构建块为所有开发人员提供了经过验证的行业最佳实践,并且每个构建块都是独立的;你可以在应用中使用其中一个、一些或者全部构建块。此外,通过开源项目,我们欢迎社区添加新的构建块,并向现有构建块中贡献新的组件。Dapr 与平台完全无关,这意味着你可以在任何 Kubernetes 集群上,以及 Dapr 集成的其他托管环境中本地运行应用。这使得开发人员能够构建可以同时在云端和边缘上运行的微服务应用,而无需更改代码。

  通过在标准 API 上调用 Dapr 构建块,使用任何语言和框架来构建应用。

  3 Dapr 构建块的 alpha 版本

  在设计和构建微服务应用时需要许多功能。在 Dapr 的第一个开源 alpha 版本中,我们着重于提供一些最常用的构建块。

  服务调用:弹性服务与服务之间(service-to-service)调用可以在远程服务上启用方法调用,包括重试,无论远程服务在受支持的托管环境中运行在何处。

  状态管理:通过对键 / 值对的状态管理,可以很容易编写长时间运行、高可用性的有状态服务,以及同一个应用中的无状态服务。状态存储是可插入的,并且可以包括 Azure Cosmos 或 Redis,以及组件路线图上的其他组件,如 AWS DynamoDB 等。

  在服务之间发布和订阅消息:使事件驱动的架构能够简化水平可扩展性,并使其具备故障恢复能力。

  事件驱动的资源绑定:资源绑定和触发器在事件驱动的架构上进一步构建,通过从任何外部资源(如数据库、队列、文件系统、blob 存储、webhooks 等)接收和发送事件,从而实现可扩展性和弹性。例如,你的代码可以由 Azure EventHub 服务上的消息触发,并将数据写入 Azure CosmosDB。

  虚拟角色:无状态和有状态对象的模式,通过方法和状态封装使并发变得简单。Dapr 在其虚拟角色(Virtual Actors)运行时提供了许多功能,包括并发、状态、角色激活 / 停用的生命周期管理以及用于唤醒角色的计时器和提醒。

  服务之间的分布式跟踪:使用 W3C 跟踪上下文(W3C Trace Context)标准,轻松诊断和观察生产中的服务间调用,并将事件推送到跟踪和监视系统。

  4 用于可移植性和可扩展性的标准 API

  那么,如何使用这些 Dapr 构建块呢?例如,假设你正在已部署到 Kubernetes 集群中的微服务应用中使用 Azure Functions 运行时,你希望利用 pub/sub 模式在服务之间发送消息。现在,Azure Functions 运行时尚未内置这种功能,但通过在 http 上使用 Dapr pub/sub 构建块,你可以轻松添加这个新功能。于是你有了新的开发能力!

  此外,Dapr pub/sub 构建块具有可插入的组件模型,这意味着你可以动态选择不同的实现来发送消息,而无需更改任何代码。例如,你可以根据自己的喜好来选择 Redis、Kafka 或 Azure Service Bus pub/sub Dapr 组件。在这两种情况下,代码都保持不变,包括通过使用标准 API 在不同的受支持的基础设施之间进行移植。

  为了实现可移植性与现有代码的轻松集成,Dapr 通过 http 或 gRPC 提供标准 API。以 pub/sub 为例,下面的节点代码现实如何使用“http:// /dapr/subscribe”端点订阅名为“A”和“B”的主题,然后在消息发布到这些主题时通知你的应用。

  const express = require('express');const bodyParser = require('body-parser');const app = express();app.use(bodyParser.json());const port = 3000;app.get( '/dajgr/subscribe', (_req, res) => {res.json(['A','B']);});app.post('/A', (req, res) => {console.log("A:", req.body);res.sendStatus(200);});app.post('/B', (req, res) => {console.log("B:", req.body);res.sendStatus(200);});app.listen(port, () => console.log('Node App listening on port \${port}!'))

  为了进行比较,下面是用 C# 编写的相同代码,使用的是从 ASP.NET Core CreateWebHostBuilder() 调用的 UseStartup() 处理程序。

  using System.Collections.Generic;using System.Text.Json;using System.Linq;using System.Threading.Tasks;using Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.AspNetCore.Http;using Microsoft.Extensions.Dependencylnjection;using Microsoft.Extensions.Hosting;using System.IO;namespace DaprPubSub{public class Startup{// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env){app.UseRouting();app.UseEndpoints(endpoints =>{// Route called by Dapr runtime to get topics this app subscribes to.endpoints.MapGet("dagr/subscribe", async context =>{// Returns list of topics to subscribe to as json in response.var topicsToSubscribe = new List() { "TopicA", "TopicB" >;await JsonSerializer.SerializeAsync(context.Response.Body, topicsToSubscribe);});// Route to handle events published to TopicAendpoints.MapPost("A", async context =>{// Read the event form request body.using (var streamReader = new StreamReader(context.Request.Body)){var json = await streamReader.ReadToEndAsync();Console.WriteLine("Received event for TopicA.");Console.WriteLine(\$"Event Data: {json}');}});// Route to handle events published to TopicBendpoints.MapPost("B", async context =>{// Read the event form request body.using (var streamReader = new StreamReader(context.Request.Body)){var json = await streamReader.ReadToEndAsync();Console.WriteLine("Received event for TopicB.");Console.WriteLine(\$"Event Data: {json}");}});});}}}

  向订阅这些主题的服务发布事件非常简单,只需使用主题和有效负载的名称调用 Dapr 本地 http 发布 API 一样简单。下面的示例节点代码展示了如何使用 Dapr 发布 API(在本地端口 3500 上),这也可以使用 curl 命令来完成:

  curl -X POST http://localhost:3500/vl.0/publish/A \\ -H "Content-Type: application/json" \\ -d '{"status": "completed"}'const express = require('express'’);const path = require('path');const request = require('request');const bodyParser = require('body-parser');const app = express();app.use(bodyParser.json());const port = 8080;const daprllrl = 'http://localhost:\${process.env.DAPR_HTTP_PORT || 3500}/vl.0';app.post('/publish', (req, res) => {console.log("Publishing: ", req.body);const publishUrl = '\${daprUrl}/publish/\${req.body.messageType}';request( { uri: publishUrl, method: ’POST', json: req.body } );res.sendStatus(200);});app.listen(process.env.PORT || port, () => console.log('Listening on port \${port}!'));

  如这些示例代码所示,在服务中使用 Dapr 并不需要获取编译时依赖项,只需简单地使用消息体创建 URL 即可。

  5 Sidecar 架构与支持的基础设施

  Dapr 将它的 API 作为 Sidecar 架构予以公开,无论是作为容器还是作为进程,都不需要应用代码包含任何 Dapr 运行时代码。这使得与 Dapr 的集成从其它运行时变得很容易,并且提供了应用逻辑的分离,从而提高了可支持性。

  Dapr 作为 Sidecar 进程运行。

  在 Kubernetes 这样的容器托管环境中,Dapr 作为 Sidecar 容器运行,应用程序容器位于同一个 pod 中。

  Dapr 作为 Sidecar 容器在 Kubernetes pod 中运行。

  Dapr 有一个命令行界面,使入门变得轻松,并支持在开发人员机器、任何 Kubernetes 集群(包括 Minikube)以及其他基础设施平台(如 IoT Edge)和路线图上的 Service Fabric 上本地运行。要开始使用 Dapr,只需运行:

  dapr init (for local deployment)dapr init --kubernetes (for Kubernetes deployment)6 开发语言 SDK 和框架

  为了使 Dapr 在不同语言中的使用更加自然,它还包括了用于 Go、Java、JavaScript、.NET 和 Python 的特定语言 SDK。这些 SDK 通过类型化的语言 API 而不是调用 http/gRPC API 来公开 Dapr 构建块中的功能,例如保存状态、发布事件和创建角色。这使得开发人员能够用他们所选择的语言来编写无状态和有状态函数和角色的组合。因为这些 SDK 共享 Dapr 运行时,你甚至可以获得跨语言的角色和函数支持!

  此外,Dapr 还可以与任何开发框架集成。例如,在 Dapr .NET SDK 中,你将发现 ASP.NET Core 集成,它带来了状态路由控制器,可以响应来自其他服务的 pib/sub 事件,使 ASP.NET Core 成为构建微服务 Web 应用的更好框架。

  https://cloudblogs.microsoft.com/opensource/2019/10/16/announcing-dapr-open-source-project-build-microservice-applications/

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
好疯!31+27!他破了58年的纪录!

好疯!31+27!他破了58年的纪录!

柚子说球
2026-03-21 21:09:50
湖人绝杀并非运气好,球队助教是幕后功臣,立足防守封锁多名巨星

湖人绝杀并非运气好,球队助教是幕后功臣,立足防守封锁多名巨星

谢说篮球
2026-03-22 16:37:43
“困”在霍尔木兹海峡的人: 炮火连天、缺水断菜、口粮告急,通航遥遥无期⋯⋯

“困”在霍尔木兹海峡的人: 炮火连天、缺水断菜、口粮告急,通航遥遥无期⋯⋯

每日经济新闻
2026-03-21 08:44:06
小米新机突然曝光:3月22日,这把我看懵了

小米新机突然曝光:3月22日,这把我看懵了

手机讲坛
2026-03-22 18:47:41
两会一声响,辅警这份工作,2026年可能会迎来新的变化!

两会一声响,辅警这份工作,2026年可能会迎来新的变化!

南宗历史
2026-03-21 14:27:39
再爆大冷4-6!世界第1无缘决赛,火箭争冠对手有变,吴宜泽获盛赞

再爆大冷4-6!世界第1无缘决赛,火箭争冠对手有变,吴宜泽获盛赞

小火箭爱体育
2026-03-21 23:33:31
拔出萝卜带出泥!路虎8次别停奔驰事件反转,炸出一堆牛鬼蛇神

拔出萝卜带出泥!路虎8次别停奔驰事件反转,炸出一堆牛鬼蛇神

悄悄史话
2026-03-20 11:05:09
1992年夏天,15岁的我被邻居大姐姐喊去看碟片,屋里只有我们俩

1992年夏天,15岁的我被邻居大姐姐喊去看碟片,屋里只有我们俩

千秋文化
2026-03-19 21:15:31
随着莱斯特城0-0,48岁兰帕德率队3-0,英冠最新积分榜出炉

随着莱斯特城0-0,48岁兰帕德率队3-0,英冠最新积分榜出炉

侧身凌空斩
2026-03-22 03:19:30
前皇马青训:我无意间踢到C罗,那一年我再也没去一线队训练

前皇马青训:我无意间踢到C罗,那一年我再也没去一线队训练

懂球帝
2026-03-22 09:48:04
西甲争冠关键战:巴萨午后迎战巴列卡诺,能否打破午餐时间魔咒?

西甲争冠关键战:巴萨午后迎战巴列卡诺,能否打破午餐时间魔咒?

星耀国际足坛
2026-03-22 12:02:02
突发! 大批澳洲人改道上海, 广州, 加价绕路也要去! 机票价格猛涨, 一天一个样

突发! 大批澳洲人改道上海, 广州, 加价绕路也要去! 机票价格猛涨, 一天一个样

澳微Daily
2026-03-22 14:42:07
默多克过95岁生日,只邀请了3个孩子,邓文迪陪两个女儿盛装出席

默多克过95岁生日,只邀请了3个孩子,邓文迪陪两个女儿盛装出席

小书生吃瓜
2026-03-22 16:43:35
A股,利好来了!支持中长期资金入市!宇树科技IPO获受理!下周市场稳了?

A股,利好来了!支持中长期资金入市!宇树科技IPO获受理!下周市场稳了?

证券市场周刊
2026-03-22 15:43:13
奥巴马亲自站台,美国民主党720万广告砸向公投,却仍遭选民冷眼

奥巴马亲自站台,美国民主党720万广告砸向公投,却仍遭选民冷眼

小陆搞笑日常
2026-03-22 18:03:02
两性关系:中年女人喜欢的男人,多半不是别人,而是这三种熟人

两性关系:中年女人喜欢的男人,多半不是别人,而是这三种熟人

奇怪的鲨鱼们
2026-03-03 10:22:52
马科斯彻底摊牌:不仅不承认中国南海主权,还明抢中国领土!

马科斯彻底摊牌:不仅不承认中国南海主权,还明抢中国领土!

冒泡泡的鱼儿
2026-03-22 16:41:33
“算电协同”,酝酿万亿投资机遇

“算电协同”,酝酿万亿投资机遇

证券市场周刊
2026-03-22 11:52:11
美专家预判:一旦台湾宣布“独立”,中国大陆将会动手解放了?

美专家预判:一旦台湾宣布“独立”,中国大陆将会动手解放了?

花漾夜雨飘雪
2026-03-18 02:02:18
以军称正打击德黑兰中心地带“伊朗政权目标”

以军称正打击德黑兰中心地带“伊朗政权目标”

新京报
2026-03-22 09:05:06
2026-03-22 19:39:00
InfoQ incentive-icons
InfoQ
有内容的技术社区媒体
12191文章数 51815关注度
往期回顾 全部

科技要闻

嫌台积电太慢 马斯克要把芯片产能飙升50倍

头条要闻

以色列防空神话被击穿损失惨重核圈失守 伊朗表态

头条要闻

以色列防空神话被击穿损失惨重核圈失守 伊朗表态

体育要闻

郑钦文连续迎战大满贯冠军 “双教练”团队正式亮相

娱乐要闻

今晚首播!央视年代剧《冬去春来》来了

财经要闻

睡梦中欠债1.2万?这只“虾”杀疯了

汽车要闻

14.28万元起 吉利银河星耀8远航家开启预售

态度原创

艺术
亲子
数码
教育
公开课

艺术要闻

Alexander Bobrov | 印象风景写生(二)

亲子要闻

71岁成龙自曝患多动症!研究表明:调节肠道菌群或能改善多动症!

数码要闻

飞利浦复古耳机来了,配色亮了

教育要闻

神奇的父子定律,准到让人惊叹

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版