微软开源微服务运行时Dapr,赋能云原生应用开发

        Dapr 是一个可移植的、由事件驱动的 Serverless 运行时,用于跨云和边缘构建分布式应用程序。109日,正式以 MIT 协议开源。
Dapr 使开发人员能够轻松地构建弹性、无状态和有状态的微服务,让它们在云和边缘位置上运行,并包含了开发语言和框架的多样性。
Dapr 将构建微服务应用程序的最佳实践编纂成开放、独立的构建基块,使您能够使用您选择的语言(已同时发布.NET、Java、JS、Go、Python的SDK)和框架构建可移植应用程序。每个构建基块都是独立的,您可以在应用程序中使用其中一个、部分或全部。

为什么要用 Dapr

Dapr 在线程和状态一致性模型中是灵活的。如果愿意,则可以利用多线程,也可以选择不同的一致性模型。这种灵活性使得实现高级方案时没有人为的限制。您还可以选择使用其他 Actor 框架中熟悉的单线程调用。Dapr 是独一无二的,因为您可以在这些模型之间看似无问题地转换,而无需重写代码。
举例来说,在构建包含多项服务的电子商务应用程序时,大家可能希望使用有状态服务表示购物车功能,同时通过无状态服务实现付款与配送功能。编写这类应用程序往往需要使用多种语言、开发者框架以及基础设施平台,同时还必须与外部服务相集成。了解及管理如此复杂的技术栈需要占用大量时间与精力,导致开发人员无暇建立真正的商业价值。

 

640?wx_fmt=png

而Dapr 的目标正是要简化各种基础设施的集成过程和对系统的侵入,解决开发人员构建微服务应用程序所面临的难题,让开发人员更加专注于业务的实现。

 

Dapr:面向云端与边缘的微服务构建单元

Dapr是一套开源可移植事件驱动型运行时,能够帮助开发人员轻松构建起能够运行在云端及边缘位置的高弹性、微服务、无状态/有状态应用程序。Dapr当中包含多种编程语言与开发者框架,同时显著简化了应用程序(例如示例中提到的电子商务应用)的构建流程。
Dapr由一系列可通过标准HTTP或gRPC API由任意编程语言调用的基础构建单元组成。这些构建单元为开发人员提供行之有效的行业最佳实践,且各个组件之间彼此独立,供您根据需求任意选用。此外,Dapr属于开源项目,因此欢迎技术社区为项目添加新的构建单元或者贡献新的组件。Dapr具有全面的平台中立性,大家可以在任意Kuberenetes以及与Dapr集成的其他托管环境当中实现应用程序的原生运行。如此一来,开发人员即可快速构建起无需变更代码即顺畅运行在云端及边缘位置上的微服务应用程序。
经由标准API调用Dapr构建单元,开发人员即可使用任意语言及框架构建应用程序

640?wx_fmt=jpeg

目标

  • 使开发人员能够使用任何语言或框架编写分布式应用程序

  • 通过提供最佳实践构建块,解决开发人员构建微服务应用程序所面临的难题

  • 成为社区驱动、开放和供应商中立者,寻找新的贡献者

  • 通过开放式 API 提供一致性和可移植性

  • 跨云和边缘,与平台无关

  • 拥抱可扩展性,提供可插拔组件,无需供应商锁定

  • 通过高性能、轻量功能实现 IoT 和边缘方案

  • 从现有代码中增量采用,没有运行时依赖项

 

工作原理

        Dapr 将 side-car 式的(Service Mesh中代指无侵入地扩展能力)容器/进程注入每个计算单元。通过标准 HTTP 或gRPC 协议,side-car 式地与事件触发器交互并与计算单元通信。这使 Dapr 能够支持所有现有甚至未来的编程语言,而无需您导入框架和库。

        Dapr 通过标准HTTP 谓词或 gRPC 接口提供内置的状态管理、可靠的消息传递(至少一次传递)、触发器和绑定。这允许您按照相同的编程范例编写无状态、有状态和类似参与者的服务。您可以自由选择一致性模型、线程模型和消息传递模式。

        Dapr 在Kubernetes 上原生地运行,作为独立的二进制文件在您的机器上、 IoT 设备上、或作为容器运行,而不是将二进制文件注入到任何系统、云中或本地。

        Dapr 使用可插拔状态存储和消息总线(如 Redis 和 gRPC)来提供广泛的通信方法,包括使用 gRPC 直接dapr 对 dapr 方式和具有保证传递和至少一次语义的异步发布订阅(Pub-Sub)方式。

 

特征

  • 事件驱动的 Pub-Sub 系统,利用可插拔的组件和“至少一次语”义实现

  • 具有可插拔组件的输入和输出绑定

  • 具有可插拔数据存储的状态管理

  • 一致的服务到服务(service-to-servic)的发现和调用

  • 可选择的有状态模型:强/最终一致性,或者首次写入/最后写入获胜方式

  • 跨平台虚拟Actor(类似Orleans

  • 具有流量限制功能

  • 内置了使用开放式遥测(Open Telemetry)进行分布式跟踪

  • 利用专用 Operator CRD Kubernetes 原生运行

  • 通过 HTTP 和 gRPC 支持所有编程语言

  • 支持混合云,适配来自 Azure、AWS、GCP 的各种开放组件(绑定、pub-sub、状态)

  • 可在任何地方运行——以进程或容器化的方式

  • 轻量(58MB 二进制文件,4MB 物理内存)

  • 作为Side Car运行——无需特殊的 SDK 或库

  • 专用 CLI——易于调试,拥有开发人员友好的体验

  • 拥有.NETJavaDotnetGoJava脚本和Python的客户端

拥有可移植性与可扩展性的标准API

那么,我们要如何使用这些Dapr构建单元?举例来说,假设大家正在使用一款已经部署在Kubernetes集群中的微服务应用程序内的Azure Functions运行时,且希望利用发布/订阅模式在不同服务之间传递消息,具体该怎样操作?目前,Azure Functions运行时尚不提供内置消息传递功能,但利用Dapr发布/订阅构建单元,大家完全可以经由http轻松实现这项新功能。领先一步,就这么简单!
此外,Dapr发布/订阅构建单元还提供一套可插拔组件模式,意味着大家可以动态选择不同的消息发送方式,且无需进行任何代码修改。举例来说,您可以根据喜好或需求随意选择Redis、Kafka或者Azure Service Bus作为Dapr发布/订阅组件。无论如何选择,您的代码都不会受到影响,消息收发机制本身可利用标准API在不同受支持基础设施之间直接移植。
为了同时实现可移植性以及与现有代码的轻松集成,Dapr通过http或gRPC提供标准API。与发布/订阅示例一样,以下节点代码所示为如何使用http://<myappaddress>/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}!'))

        作为比较,以下为使用UseStartup()处理程序从ASP.NET Core CreateWebHostBuilder() 处调用的C#代码。 

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<string>() { "TopicA", "TopicB" >;	await JsonSerializer.SerializeAsync(context.Response.Body, topicsToSubscribe);	});	// Route to handle events published to TopicA	endpoints.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 TopicB	endpoints.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即可。

Sidecar架构与受支持基础设施

Dapr将其API作为Sidecar架构以容器或者进程的形式公开,因此不需要在应用程序代码当中包含任何Dapr运行时代码。正因为如此,Dapr能够轻松与其他运行时相集成,同时通过应用程序逻辑分离显著提高了支持能力。
Dapr以side-car进程的形式运行

640?wx_fmt=png

        在Kubernetes等容器托管环境内,Dapr以side-car容器的形式运行在应用程序容器所在的Pod当中。

Dapr以side-car容器的形式运行在Kubernetes Pod当中

640?wx_fmt=png

Dapr的CLI使得上手体验更轻松,同时支持在开发者自有设备、任意Kubernetes集群(包括minikube),以及IoT Edge、Service Fabric等现有或即将推出的基础设施平台之上运行。要开始您的Dapr之旅,只需要运行:

dapr init                                (for local deployment)dapr init --kubernetes      (for Kubernetes deployment)

开发者语言SDK与框架

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

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

参考并翻译:
https://github.com/dapr/dapr/blob/master/README.md
https://cloudblogs.microsoft.com/opensource/2019/10/16/announcing-dapr-open-source-project-build-microservice-applications/

完。

640?wx_fmt=jpeg

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

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

相关文章

最大堆和最小堆

堆和栈的区别&#xff1a;一、堆栈空间分配区别&#xff1a;1、栈&#xff08;操作系统&#xff09;&#xff1a;由操作系统自动分配释放 &#xff0c;存放函数的参数值&#xff0c;局部变量的值等。其操作方式类似于数据结构中的栈&#xff1b;2、堆&#xff08;操作系统&…

认知的高度 = 人生的高度

大家好&#xff0c;我是Z哥。我们每个人&#xff0c;每天要和很多不同的人打交道。我相信下面的场景每个程序员都有遇到过&#xff0c;业务方在某个模块下新提出了一个功能&#xff0c;但是你希望做新功能之前先把这个模块的低质量代码重构一下。但是&#xff0c;不管你怎么摆事…

VSCode开发.NETCore项目入门(1)设置中文语言环境

安装VSCode最新地址&#xff1a;https://code.visualstudio.com/&#xff0c;下载后安装即可配置语言环境打开安装好的VSCode软件&#xff0c;可以看到刚刚安装的VSCode软件默认使用的是英文语言环境&#xff0c;如下图&#xff1a;使用快捷键【CtrlShiftP】来配置&#xff0c;…

微软100题第11题

参照&#xff1a;http://blog.csdn.net/caryaliu/article/details/8107089 参照&#xff1a;http://blog.csdn.net/lalor/article/details/7626678 把二叉树看成一个图&#xff0c;父子节点之间的连线看成是双向的&#xff0c;我们姑且定义"距离"为两个节点之间的个…

.NET Core 3.0】框架之十三 || 部署攻略

本文有配套视频&#xff1a;https://www.bilibili.com/video/av58096866/?p9一、部署1、WIN_独立部署感谢群里&#xff08;白云&#xff09;小伙伴&#xff0c;博主 小淋科技 提出的方案(需要 netcore2.1 )&#xff0c;我竟然忽略了&#xff0c;该打该打&#xff0c;官档都读…

Python import以及os模块

转自&#xff1a;http://jianpx.iteye.com/blog/486466 http://blog.chinaunix.net/uid-27838438-id-4087978.html Import: 1. import 实际上是python虚拟机把当前的globals()和locals()传进__builtins__.__import__内置函数了&#xff0c;所以实际上干活的是那个__import__函…

.Net Core3.0 配置Configuration

准备.NET core和.NET项目配置上有了很大的改变&#xff0c;支持的也更加丰富了比如命令行&#xff0c;环境变量&#xff0c;内存中.NET对象&#xff0c;设置文件等等。.NET项目我们常常把配置信息放到webConfig 或者appConfig中。配置相关的源码https://github.com/aspnet/Exte…

asp.net core 3.0 中使用 swagger

asp.net core 3.0 中使用 swaggerIntro上次更新了 asp.net core 3.0 简单的记录了一下 swagger 的使用&#xff0c;那个项目的 api 比较简单&#xff0c;都是匿名接口不涉及到认证以及 api 版本控制&#xff0c;最近把另外一个 api 项目升级到了 3.0&#xff0c;还是遇到了一些…

由微软100题“求和不用for while”引出的static类成员的知识

转自&#xff1a;http://www.cnblogs.com/gysm/archive/2011/09/16/2179277.html C类中谈到static,我们可以在类中定义static成员&#xff0c;static成员函数&#xff01;Cprimer里面讲过&#xff1a;static成员它不像普通的数据成员&#xff0c;static数据成员独立于该类的任意…

MCN是啥?了解一下这5个互联网热词

骗子刷量&#xff0c;黑吃黑半斤八两前几天一件事火爆了互联网圈&#xff0c;一场搞笑的骗局&#xff0c;一场蜂群传媒导演的“僵尸舞台剧”&#xff1a;一条一夜爆红的视频 流量却为0&#xff01;。一个电商商家卖产品有投放需求&#xff0c;找到了微博上一家 MCN 机构的一个女…

为什么我不建议你去外包公司?

前言在我离开上家公司之前&#xff0c;我的直属领导找我聊了一番。除了问候我有没有找好下家之外&#xff0c;还千叮咛万嘱咐我千万不要去外包公司&#xff0c;否则会在简历上留下无法磨灭的污点。当时的我对于外包公司的了解并不深&#xff0c;只是道听途说外包公司很坑&#…

友浩达优选上新,原生态农产品,买得安心,吃得放心

大闸蟹还在热卖&#xff0c;需要的同学可以访问 各位一直支持队长的朋友们友浩达优选上新了本着为大家推荐好东西的想法商城里上架的商品都是队长亲自挑选有质量保证的口碑好商品这次&#xff0c;来看看队长又给大家带了哪些好东西本次上新全是各地优选原生态农产品食品优质、安…

树莓派4上跑 .NET Core 3.0,这次,真·64位!

导语前不久我写了一篇《Gentoo由于 Windows 10 IoT Core &#xff08;以及上面的UWP们&#xff09;暴尸荒野而苟且偷生使用 Linux 的我&#xff0c;已经彻底开荤了。最近我发现有个叫 Gentoo 的 Linux 系统&#xff0c;支持树莓派4的64位CPU。项目地址&#xff1a;https://gith…

asp.net core 使用 AccessControlHelper 控制访问权限

asp.net core 使用 AccessControlHelper 控制访问权限Intro由于项目需要&#xff0c;需要在基于 asp.net mvc 的 Web 项目框架中做权限的控制&#xff0c;于是才有了这个权限控制组件&#xff0c;最初只是支持 netframework&#xff0c;后来 dotnetcore 2.0 发布了之后添加了对…

Caffe 增加自定义 Layer 及其 ProtoBuffer 参数

转载自&#xff1a;http://blog.csdn.net/kkk584520/article/details/52721838 http://blog.csdn.net/kkk584520 博客内容基于新书《深度学习&#xff1a;21 天实战 Caffe》&#xff0c;书中课后习题答案欢迎读者留言讨论。以下进入正文。 在使用 Caffe 过程中经常会有这样的…

.NET Core 3.0愈加成熟,微软将不再把.NET Framework API移植给它

目前 .NET Core 3.0 拥有的 API 总数约为 .NET Framework API 的 80%&#xff0c;剩下尚未从 .NET Framework 移植到 .NET Core 的 API&#xff0c;微软考虑以开源的形式发布。微软方面表示&#xff0c;通过 .NET Core 3.0&#xff0c;他们现在已具备轻松移植现代 workload 所需…

参加 JSConf China 2019 是怎样的体验?VS Code 和 TypeScript 都很火

JSConf China 2019 于 10 月 19-20 日于上海尚浦中心举行。很高兴作为讲师参加这次的 JSConf。Day 1在 Day 1 给大家聊了聊 The Beauty of TypeScript。简单总结下我讲的 TypeScript 的 session。千言万语&#xff0c;汇聚成下面两页的 PPT。TypeScript 的使用场景&#xff08;…

Caffe阅读代码并修改

这个教程是最好理解的了 http://city.shaform.com/blog/2016/02/26/caffe.html 主要分成四個部份來講。首先是整個 Caffe 的大架構&#xff0c;以及一些重要的元件。 其次&#xff0c;我也研究了如何自己新增一個 layer。 接下來&#xff0c;再重新回到 Caffe 做更深入的解析…

ABP v1.0正式发布

经过长时间的开发终于发布了ABP v1.0&#xff01;感谢为该项目做出了贡献的你~https://github.com/abpframework/abp/releases

Ubuntu下用eclipse调试caffe code

本文地址&#xff1a;http://blog.csdn.net/mounty_fsc/article/details/51089864 1 运行范例脚本train_lenet.sh Ubuntu下终端行执行train_lenet.sh可训练lenet-5&#xff08;详细情况参考其他教程&#xff09;&#xff0c;能直观地看到lenet训练起来带情况。 train_lenet.sh…