技术分享:Dapr,让开发人员更轻松地构建微服务应用
最近一直在学习微服务相关的技术。微服务架构已成为构建云原生应用程序的标准,并且可以预见,到2022年,将有90%的新应用程序采用微服务架构。微服务架构提供了令人信服的好处,包括可伸缩性,松散的服务耦合和独立部署,但是这种方法的成本很高,需要了解和熟练掌握分布式系统。学习过程中发现了一个开源的分布式应用运行时:Dapr (https://dapr.io/)
构建事件驱动,无状态和有状态应用程序
比如,当架构一个由多个服务组成的电子商务系统时,你可能会想到用一个有状态的Actor来表示购物车服务,并在支付与物流服务调用无状态函数。开发此系统可能需要使用多种语言、不同的开发框架和不同的平台,以及和第三方服务集成。理解与管理如此复杂的技术栈,开发人员可能无法为企业创造更多的价值。

为了使用所有开发人员能够使用任何语言和任何框架轻松地构建便携式微服务应用程序,无论是开发新项目还是迁移现有代码,我非常高兴的给大家分享并介绍这个分布式应用程序运行时 Dapr。
Dapr 介绍
Github: https://github.com/dapr/dapr
Dapr是一种可移植的,事件驱动的,无服务器运行时,用于构建跨云和边缘的分布式应用程序。
Dapr - Any language, any framework, anywhere

不过需要注意的是Dapr目前正处于Alpha阶段。在v1.0稳定版本发布之前,建议不要用于生产环境。
Dapr提供了最常用的构建块(官方名词:building blocks):
- 服务调用 - 弹性的服务到服务调用使方法调用(包括重试)可以在支持的托管环境中运行的任何远程服务上进行。
 - 状态管理 - 通过对键/值对的状态管理,可以轻松地编写长期运行,高可用的有状态服务以及同一应用程序中的无状态服务。状态存储是可插拔的,并且可以包括Azure Cosmos或Redis,以及组件路线图上的其他内容(例如AWS DynamoDB)。
 - 在服务之间发布和订阅消息传递 - 采用事件驱动的体系结构解决服务之间发布事件和订阅主题,以简化水平可伸缩性并使它们能够应对故障。
 - 事件驱动的资源绑定 - 资源绑定和触发器通过在事件驱动的体系结构上进一步构建规模,从而通过从任何外部资源(例如数据库,队列,文件系统,blob存储,webhooks等)接收事件或向其发送事件来实现规模和弹性。例如,可以触发代码通过Azure EventHub服务上的消息,然后将数据写入Azure CosmosDB。
 - 虚拟atcor - 种无状态和有状态对象的模式,通过方法和状态封装使并发变得简单。 Dapr在其虚拟actor运行时中提供了许多功能,包括并发,状态,用于actor激活/停用的生命周期管理以及计时器和提醒以唤醒actor。
 - 服务间的分布式追踪 - 使用W3C Trace Context标准轻松诊断和观察生产中的服务间调用,并将事件推送到跟踪和监视系统。
 
用于可移植性和可扩展性的标准API
那么,您如何使用这些Dapr构建块?
例如,假设您正在已部署到Kubernetes群集中的微服务应用程序中使用Azure Functions,并且您希望利用 pub / sub 模式在服务之间发送消息。目前,Azure Functions 尚未内置此功能,但是通过在http上使用Dapr pub / sub 构建块,可以轻松添加此新功能。
此外,Dapr pub / sub 构建块具有可插入的组件模型,这意味着您可以动态选择不同的实现方式来发送消息,而无需更改任何代码。例如,您可以根据自己的喜好选择Redis,Kafka或Azure Service Bus发布/订阅Dapr组件。而且在两种情况下,代码都保持不变,包括使用标准API在不同支持的基础架构之间可移植。
为了同时实现可移植性和与现有代码的轻松集成,Dapr通过http或gRPC提供了标准API。与pub / sub示例保持一致,下面的节点代码显示如何使用“ http//<myappaddress>/dapr/ subscribe”端点订阅名为“A”和“B”的主题,然后在何时通知您的应用程序消息将发布到这些主题。 
为了进行比较,这是使用从ASP.NET Core CreateWebHostBuilder()调用的UseStartup()处理程序,以C#编写的相同代码。

向订阅了这些主题的服务发布事件就像使用主题名称和有效负载调用Dapr本地http publish API一样简单。下面的示例节点代码显示了如何使用Dapr发布API(在本地端口3500上),也可以使用curl命令来完成此操作: 
如这些示例所示,在您的服务中使用Dapr不需要获取编译时间依赖性,仅需简单地使用消息主体编写URL即可。
Sidecar架构和支持的基础架构
Dapr将其API作为Sidecar体系结构(容器或进程)公开,不需要应用程序代码包含任何Dapr运行时代码。这使得与Dapr的集成易于与其他运行时集成,并提供了应用逻辑的分离,从而提高了可支持性。

在Kubernetes这样的容器托管环境中,Dapr可以作为边车容器运行,而应用程序容器位于同一容器中:

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(而不是调用http / gRPC API)公开了Dapr构建块中的功能,例如保存状态,发布事件或创建actor。这使开发人员可以使用他们选择的语言编写无状态和有状态功能以及参与者的组合。并且由于这些SDK共享Dapr运行时,您甚至可以获得跨语言的actor和功能支持!
此外,Dapr还可以与任何开发人员框架集成。例如,在Dapr .NET SDK中,您将找到ASP.NET Core集成,该集成带来了可响应其他服务的发布/订阅事件的状态路由控制器,从而使ASP.NET Core成为构建微服务Web应用程序的更好框架。
Dapr 相关资源
- Samples (Dapr 使用示例) https://github.com/dapr/samples
 - Docs (Dapr文档) https://github.com/dapr/docs
 - Dotnet-sdk (Dapr SDK for .NetCore) https://github.com/dapr/dotnet-sdk
 - Java-sdk (Dapr SDK for Java) https://github.com/dapr/java-sdk
 - Go-sdk (Dapr SDK for Go) https://github.com/dapr/go-sdk
 - Python-sdk (Dapr SDK for Python) https://github.com/dapr/python-sdk
 - JS-sdk (Dapr SDK for JavaScript) https://github.com/dapr/js-sdk
 
技术分享:Dapr,让开发人员更轻松地构建微服务应用的更多相关文章
- 十款让 Web 前端开发人员更轻松的实用工具
		
这篇文章介绍十款让 Web 前端开发人员生活更轻松的实用工具.每个 Web 开发人员都有自己的工具箱,这样工作中碰到的每个问题都有一个好的解决方案供选择. 对于每一项工作,开发人员需要特定的辅助工具, ...
 - So Easy!让开发人员更轻松的工具和资源
		
这篇文章给大家分享让开发人员生活更轻松的免费工具和资源.所以,如果你正在寻找一些为迅速解决每天碰到的设计和开发问题的工具和资源,不要再观望,试试这些工具吧.这些奇妙的工具不仅会加快您的生产,也让你的工 ...
 - 10款让WEB前端开发人员更轻松的实用工具
		
这篇文章介绍10款让Web前端开发人员生活更轻松的实用工具.每个Web开发人员都有自己的工具箱,这样工作中碰到的每个问题都有一个好的解决方案供选择. 对于每一项工作,开发人员需要特定的辅助工具,所以如 ...
 - 【转】十款让 Web 前端开发人员更轻松的实用工具
		
这篇文章介绍十款让 Web 前端开发人员生活更轻松的实用工具.每个 Web 开发人员都有自己的工具箱,这样工作中碰到的每个问题都有一个好的解决方案供选择. 对于每一项工作,开发人员需要特定的辅助工具, ...
 - 转:So Easy!让开发人员更轻松的工具和资源
		
Cascade Framework 很独特的 CSS 框架,进行了模块化划分,分类排版.表格.颜色.图标和打印样式等等. Mueller Grid System 一个模块化的网格系统,用于响应式或者固 ...
 - 设计师和开发人员更快完成工作需求的20个惊人的jqury插件教程(上)
		
[转] 设计师和开发人员更快完成工作需求的20个惊人的jqury插件教程(上) jquery的功能总是那么的强大,用他可以开发任何web和移动框架,在浏览器市场,他一直是占有重要的份额,今天,就给大家 ...
 - 通过Dapr实现一个简单的基于.net的微服务电商系统(二十)——Saga框架实现思路分享
		
今天这篇博文的主要目的是分享一下我设计Saga的实现思路来抛砖引玉,其实Saga本身非常的类似于一个简单的工作流体系,相比工作流不一样的部分在于它没有工作流的复杂逻辑处理机制(比如会签),没有条件分支 ...
 - 通过Dapr实现一个简单的基于.net的微服务电商系统(十四)——开发环境容器调试小技巧
		
之前有很多同学提到如何做容器调试,特别是k8s环境下的容器调试,今天就讲讲我是如何调试的.大家都知道在vs自带的创建项目模板里勾选docker即可通过F5启动docker容器调试.但是对于启动在k8s ...
 - 通过Dapr实现一个简单的基于.net的微服务电商系统
		
本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在.时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于da ...
 
随机推荐
- [Leetcode] 第307题 区域和检索-数组可修改
			
参考博客:(LeetCode 307) Range Sum Query - Mutable(Segment Tree) 一.题目描述 给定一个整数数组 nums,求出数组从索引 i 到 j (i ...
 - C++基础之迭代器
			
迭代器的分类 插入迭代器(insert iterator):绑定一个容器上后可以向容器中插入元素: 流迭代器(stream iterator):绑定在输入输出流中,可以遍历关联的流: 反向迭代器(re ...
 - 第九周java动手动脑
			
1.使用Files. walkFileTree()找出指定文件夹下所有扩展名为.txt和.java的文件. import java.io.IOException; import java.nio.fi ...
 - 深度学习论文翻译解析(五):Siamese Neural Networks for One-shot Image Recognition
			
论文标题:Siamese Neural Networks for One-shot Image Recognition 论文作者: Gregory Koch Richard Zemel Rusla ...
 - [经验栈]SQL语句逻辑运算符"AND"、"&&"兼容性
			
最近打算把博客转移到typecho平台,选了一个风格个人比较喜欢的主题,即Akina for Typecho 主题模板,在这里先感谢题主的开源分享,但是在使用过程中一开始就出现"500 Da ...
 - Python学习笔记整理总结【ORM(SQLAlchemy)】
			
一.介绍SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执 ...
 - C#实现请求唯一性校验支持高并发
			
使用场景描述: 网络请求中经常会遇到发送的请求,服务端响应是成功的,但是返回的时候出现网络故障,导致客户端无法接收到请求结果,那么客户端程序可能认为判断为网络故障,而重复发送同一个请求.当然如果接口中 ...
 - layDate——初步使用
			
layui系列中layDate的使用教程网址 https://www.layui.com/laydate/ 我这里简单举例: 1.引入js <script type="text/jav ...
 - Spring Cloud 版本控制
			
### 正常版本 ``` org.springframework.boot spring-boot-starter-parent 2.1.7.RELEASE ``` ### SpringCloud 版 ...
 - [LeetCode] 1108. Defanging an IP Address
			
Description Given a valid (IPv4) IP address, return a defanged version of that IP address. A defange ...