书名:Dapr与.NET微服务实战
ISBN:978-7-115-61185-7
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 [意] 达维德·贝丁(Davide Bedin)
译 成海霞 等
审 校 敖小剑
责任编辑 秦 健
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
读者服务:
微信扫码关注【异步社区】微信公众号,回复“e61185”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。
Copyright ©Packt Publishing 2020. First published in the English language under the title Practical Microservices with Dapr and .NET(9781800568372).
All Rights Reserved.
本书由英国Packt Publishing公司授权人民邮电出版社有限公司出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。
版权所有,侵权必究。
本书通过开发微服务示例程序来讲解Dapr的各项功能,并介绍其众多构建块的功能及使用方法。本书首先介绍了Dapr的基础知识以及相关环境的配置工作,以帮助读者快速进入Dapr的世界。其次,介绍了Dapr的核心概念、发布/订阅机制、资源绑定构建块与虚拟actor模型等相关知识,让读者进一步了解Dapr的相关功能。最后,介绍了Dapr的实际运用,包括Dapr应用的部署与可观测性,以及在Kubernetes环境中对服务和actor等进行伸缩操作。本书可以帮助读者快速熟悉微服务架构,并运用Dapr来管理应用的复杂性和克服异构系统等问题。
本书适合希望探索微服务架构并在Dapr应用中通过Microsoft .NET Core来实现这些架构的开发人员阅读。
随着企业数字化潮流不断推进,企业在数字化技术上的投入也在不断扩大。业务应用的部署、开发团队的建设、技术体系的持续迭代都反映了这一趋势。云技术作为基础的计算设施也正在被企业IT团队、应用开发团队作为现代化应用开发、运行和创新的底座,以更好地支撑企业数字化发展。
IT团队承担着重要的职责:一方面需要确保应用得到快速开发和发布,以便跟上业务团队的节奏,这时追求的是效率;另一方面需要控制基础设施符合安全、可靠、可扩展、高灵活性、可管理等方面的要求,这时追求的是可控。IT团队面前摆放着云原生、微服务、容器化等一系列的专题,他们试图找到一条既兼顾效率、可控,又具有前瞻性的技术架构路线图,以便最大化平台的价值。
最近,我们经常听到IT基础设施管理部门和应用开发部门的同事们探讨Dapr。似乎Dapr是继Service Mesh热潮之后的一个新研讨话题。例如,Dapr是什么,Dapr和Kubernetes有什么关系,Dapr和Service Mesh、Istio有什么关系,它能解决我的什么问题,我会被它技术绑定吗……
令人兴奋的是,很多企业已经开始实践,希望看看Dapr到底有没有用。下面是一些团队成员的反馈。
一位来自企业内部CRM应用的架构师说:
“由于我们开发的微服务应用是由多编程语言(如Java、C#、Python)框架实现的,因此我们希望快速实现服务之间的调用,无论是在本地、Kubernetes集群中,抑或是跨集群的情况。新应用需要调用哪些应用集成是根据需求来确定的,是不可预知的。我们希望,开发人员可以根据情况选择编程语言,也不需要受到部署细节的约束,只要具有根App ID,就可以快速获取服务调用。Dapr的Service Invocation的特性就是我们想要的。”
一位ISV平台架构师说:
“我们的软件产品需要在客户企业的私有Cloud Tenant中部署。客户企业的监控工具各不相同,尤其是distributed tracing方面的工具更是五花八门。我们希望快速部署应用,快速和企业制定的tracing工具集成。当他们需要改动的时候,我们也能快速配置适应。这样可以提升我们的部署速度,减少部署时间。Dapr的Observability功能就符合我们的理念。”
一位企业DevOps平台负责人说:
“我们负责应用脚手架平台的搭建。我们的任务是让应用开发速度更快。我们公司的开发人员在思考开发第一个微服务前,可以知道其他服务该怎么调用,存储怎么访问,路由怎么配置,配置怎么访问,密钥怎么读取……查看关于Dapr的一套规范就可以了。开发人员即使不熟悉具体的技术实现也没关系,只要了解Dapr框架就可以。”
在他们的反馈中,我们可以发现一个共同元素,那就是“让开发速度更快”,无论是inner loop还是outer loop。企业的各个部门都期待更快的响应速度和更短的回馈时间,这正是我们的同事们开始积极参与Dapr实践的原因。
新技术需要更多的听众,听众也需要听到更多关于新技术的声音。我们的工程团队中主导翻译的同事们在应用开发现代化领域拥有多年的积累,他们是非常专业且资深的。所以,非常感谢我们的这些同事在大家不断追求卓越的云原生开发的路途中带来更多的新理念、新模式、新社区。希望这本书能为读者带来更多有价值的参考!
刘轶煜
微软首席研发经理
云计算平台带来了IT基础设施的巨大变革,而每一次变革都会促使开发人员思考如何充分发挥新平台优势的软件设计和开发方法。“云原生”就是一种可以让我们充分利用云计算的优点来构建和运行分布式应用的方法。云原生领域有几个很关键的节点,例如,Docker解决了应用打包和发布标准化的问题;Kubernetes为应用编排、资源调度带来了创新的解决方案。而在百花齐放的应用层,技术专家们也在尝试定义标准。
Dapr是第一个运行时多样化实践项目,它主张支持“任何编程语言、任何框架、云和边缘、任意平台”。Dapr将构建分布式应用所要处理的常见问题抽象并定义为标准的API集,与来自不同云厂商的云计算基础设施适配。从此用户可以面向标准API编程,达到应用与基础设施解耦的效果。
本书以电子商务网站为例,展示了Dapr的服务调用、状态管理、消息通信、可观测性等模块,同时探讨了应用部署和扩容等实践层面的常见问题。Dapr的公开文档和其他学习资源非常丰富,而本书贵在系统化,它将微服务的核心理念和Dapr的特性融汇于实际案例,以代码的形成呈现给大家。
分布式应用的复杂性不言而喻,层出不穷的技术革新令人兴奋。Dapr用一种新颖的方式从应用层解决云原生转型带来的挑战。我非常推荐相关的开发人员、架构师、IT从业人员去了解其中的思想。应用层的标准化到底能带来什么样的变革,我们拭目以待。
李榕
微软首席研发经理
企业的数字化转型进行得如火如荼,随之而来的是应用的现代化。现代化应用通常是通过微服务架构来构建的。纵观历史,软件架构经历了从早期的单体架构到分层架构,再到SOA、微服务等一系列演变。微服务技术也经历了Spring Cloud、服务网格(Service Mesh)、多运行时架构(Multi-Runtime),逐步确立了以应用为中心的云原生应用架构。
时至今日,微服务架构早已经历从概念到大规模应用的阶段。虽然微服务在提高团队和产品管理的复杂性方面具有很多好处,但是它给初学的开发人员和团队带来了很大的负担。作为云原生新时代的软件开发人员,不管你是从一开始就使用微服务,还是从分布式架构向微服务架构转型,都非常有必要深入学习微服务落地实践的方方面面。因此,我们急需一本理论与实践相结合,能够结合实际案例进行讲解的图书。本书的引进出版可以说填补了这一空缺。
之前我看过这本书的英文版。但是,当我拿到这本译作的样章时,在阅读的过程中有一种惊喜的感觉,因为这是目前为数不多的面向初学者的微服务架构实战类图书。当我读了本书的部分章节后,不仅能感受到几位译者为让这本书更加契合国人阅读在翻译过程中做出的细致调整,而且发现这还是一本学习曲线非常平滑,但又不失技术先进性和工程实战性的微服务实战入门书。
这本书使用了一个贯穿全书的虚构的电子商务网站场景来构建样例解决方案,将Dapr 的核心知识点与Kubernetes结合,做到了技术路径上的一脉相承。这本书既有理论体系上的庖丁解牛般、细致入微的分析和讲解,又有面向初学者的实战技术指导和具体实践说明,可以帮助读者对落地云原生应用的方案与实践有更全面、更体系化的认识。尽管这本书着重介绍了.NET编程,但是Dapr也为其他编程语言的开发者(如Python、Java)提供了同样的好处。可以说,这本书是软件开发人员系统性认识和实践微服务架构的应读佳作。
张善友
深圳市友浩达科技有限公司CEO,微软最有价值专家(MVP)
自计算机诞生起,软件开发模式一直处于变化中。从最初的穿孔卡片到汇编、操作系统、现代编程语言和框架,新的模式和理念不断涌现,而时下前沿主题之一当属“云原生”。新模式促使底层逻辑进一步被抽象化。开发人员只需要关心更核心的业务逻辑,而不用操心其他可以应用最佳实践的通用部分。Dapr应运而生。
时下企业上云已经司空见惯,容器和微服务也在不断发展,而面向云编程仍然是极具挑战的一件事。如何保证可伸缩性、弹性、可维护性?如何监控原生应用的运行状态?如何实现服务与服务的发现和调用?如何保证在不同云厂商之间进行平滑迁移?诸如此类的特性对于云原生应用非常重要,但并非应用的核心业务逻辑。如果开发者花费大量精力用于开发和维护这些特性,一是效率不高,二是浪费资源,并且很有可能无法做到足够好,而Dapr恰恰是应对这个挑战的一个优秀方案。
这本书的实践性非常强,样例几乎贯穿整本书。读者可以按照样例项目有条不紊地学习,并获得实际的上手经验。从基本的概念和架构介绍,到如何调试一个Dapr项目,再到Dapr核心构建块介绍,这本书涵盖了Dapr的核心内容。尤其是,这本书还描述了一些诸如部署、跟踪、压测以及可伸缩性等高级主题,甚至专门在附录中介绍了如何应用Dapr进行微服务编程。由此可以看出作者在内容编排上的用心和周到。
我从事软件开发工作多年,涉猎过Web前后端、嵌入式、云平台、大数据等多个领域,加入微软公司之后致力于开发者体验,对技术的趋势拥有自己的见解。我在微软开发者事业部的Flexible Friday活动(一个在工作时间可以做自己的项目的活动)中发现了关于Dapr的项目,眼前为之一亮,自此毫不犹豫地加入这本书的翻译项目。在翻译这本书的过程中,我们在追求保持英文语义准确的基础上,针对中国人的阅读习惯对内容进行了调整。由于个人水平有限,书中难免存在错漏和不当,烦请大家见谅和指正,在此表示感谢。
何儒
微软开发者事业部软件工程师
我和这本书翻译工作的渊源要从微软开发者事业部(DevDiv China)的Flexible Friday活动说起。2020年10月我从苏州微软SharePoint加入到微软开发者事务部以后,在赵晓燕(DevDiv China GM)、焦祯、李榕和其他领导及同事的大力支持下,于2021年11月开始Flexible Friday活动的试运行。
Flexible Friday活动聚焦于为同事们提供一个学习、创新和展示自身能力的平台。在试运行的6个月中,同事们可以利用每个月中一个周五的时间自由安排自己的工作,与小伙伴们一起充分协同、紧密配合完成所设计的项目。
虽然在准备阶段我心里没有底,但是当看到同事们注册的项目的时候,彻底被项目的多样性和广度震惊到。其中,成海霞及其项目团队对于这本书的翻译就是最耀眼的项目之一。在技术上,Dapr是助力企业上云的解决方案,能够让分布式系统的构建更加简单,并且可以支持多种平台和设备。相信这本书的翻译出版一定可以给广大的用户带来帮助。除此之外,这本书的翻译团队花了大量的时间来处理琐碎的事情,从最开始的分工安排,到联系出版社,再到邀请业界领域大拿来做导师,以及全书语言风格统一、遣词造句,等等。翻译一本书的工作比较烦琐,同事们克服了很多翻译过程中的艰辛,付出了不懈的努力、热情和坚持,少了哪一点,读者不可能看到这本书中文版的面世。在这个过程中,相信大家也学到了很多,例如团结、协作以及对前沿技术不断钻研和创新的精神,这也正是Flexible Friday活动的初衷。
非常感激这些优秀的同事,和他们一起工作是一件很享受的事情,也希望大家能够和我一样喜欢这本凝聚了热情和汗水的书。
张怡
微软开发者事业部首席开发经理
企业上云的浪潮一波接着一波,伴随这一趋势,我们看到企业开始向云原生架构转型。而这些基于云原生系列技术开发的应用往往是通过微服务架构构建的——这些应用可以是有状态和无状态的微服务。它们运行在云和边缘中,由多种编程语言和不同的框架开发而成。在向云原生架构转型的过程中,企业无疑获得了巨大的规模效应和更加高效的产品,但也面临着巨大的挑战——分布式系统专家的担子落在企业开发者身上,这就要求开发者能够在学会多种编程语言、开发框架和技术的同时提高工作效率。通常还要求他们开发的应用可以跨云和边缘或者跨不同的公共云供应商进行移植。企业正在寻找能够让开发者专注于业务逻辑,同时也能够为应用注入云原生架构具备的伸缩性、可恢复性、可维护性、弹性的开发模式和平台。
当我们观察到向云原生转型的趋势并希望解决随之而来的问题时,Dapr 诞生了。Dapr最初的名字叫Actions,它源自Azure CTO办公室的一个孵化项目,后来在技术专家Haishi Bai和Yaron Schneider的创造性探索中应运而生。我们开发Dapr的理念是为构建分布式系统的企业开发者提供一个能处理分布式系统所有工作的“管家”,这样他们就可以专注于应用和业务逻辑。Dapr图标中的大礼帽正是受“管家”理念启发而设计的。为此,我们定了个目标:我们希望构建一个以企业开发者为中心的微服务开发平台,使其能够支持“任何编程语言、任何框架、云和边缘、任意平台”,从而使得分布式应用的构建变得更加容易,真正拥抱编程语言和软件框架的多样性,并且可以跨任何基础设施移植——从公共云到边缘,甚至是到单节点物联网设备。
为了更广泛地支持不同类型的应用,Actions需要具有如下特性:可以跨任何基础设施运行,包括未来新的基础设施平台以及用于与外部事件源和服务集成的可扩展系统;支持任何编程语言;具有微服务架构内置的发布/订阅机制和服务调用语义;支持无状态和有状态的微服务。由于Actions支持多种编程语言和框架,因此我们可以看到“管家”的惊人价值——它具有开箱即用的基础设施功能,提供与编程语言和平台无关的接口,使得不同的应用能够通过Dapr标准的接口与底层云原生基础设施集成。“管家”让开发者获得了如下能力:他们能够轻松地用最合适的技术来构建微服务应用(如函数、容器、Web Service等),并使用相同的语义与通用的Dapr编程底层进行协调。2019年10月我们将Actions项目命名为Dapr,并发布了0.1版本。
从发布Dapr预览版以来,我们得到开发者社区的积极响应,并收到来自微软公司外部的500多个贡献。我们在2021年初发布了Dapr v1.0,这个版本侧重于为生产做准备,并将项目转向开放治理,以便企业有信心在关键业务中应用Dapr。我们希望你能够专注于核心业务价值的创造以获得更大的影响力,剩下的事情就交给Dapr来解决。同时,我们非常欢迎你加入Dapr社区。
Mark Russinovich
Azure首席技术官,微软公司技术院士
本书通过讲解使用Dapr开发微服务示例程序来帮助读者探索Dapr的强大能力。本书的每一章都使用了Dapr的众多构建块。
在过去的10年里,代码量庞大的单体应用开始大量迁移到小型、可独立部署的微服务。Dapr是微软公司的一个新的开源项目,它为开发现代应用提供了成熟的技术和经验。它提供了一系列平台无关功能,使你的应用能够在公有云平台、本地设备甚至是边缘设备上运行。
本书旨在帮助读者快速熟悉微服务架构,并运用Dapr来管理复杂的应用,同时克服异构系统的问题。在本书中,你还会看到Dapr的易用性和开放性,并学会将Dapr与多种编程语言和多个平台相结合。本书将会通过讲解Dapr运行时、服务、构建块和SDK等内容来探索Dapr如何简化具备弹性和可移植性的微服务的创建过程。
Dapr提供了事件驱动的运行时功能以支持构建微服务,如服务调用、状态管理、消息发布和订阅机制等。通过这本实用的学习指南,你不仅可以学习这些功能,而且可以探索Dapr更高级的功能。
本书将指导你基于Dapr创建微服务应用,并将其部署到Kubernetes中。在Kubernetes环境中,你将会学习如何使用Zipkin、Prometheus和Grafana来监控Dapr应用。最后,你还会学习如何给运行在Kubernetes中的Dapr应用做负载测试。
学完本书,你将能使用自己擅长的编程语言和框架来开发微服务,并运用行业优秀实践经验来解决与分布式系统相关的问题。
本书适合正在探索微服务架构并希望使用Microsoft .NET上的示例程序在Dapr中构建微服务的开发者阅读。无论你是初次接触微服务还是已经掌握微服务架构,这本书都可以帮助你获得Dapr的实战经验。熟悉.NET有助于你快速理解本书的C#示例程序和代码。
第1章介绍了Dapr的基础知识。该章简要介绍了Dapr的功能——这些功能使得Dapr受到新的云原生应用以及正在重构为微服务架构的应用的欢迎。
第2章介绍了如何在VS Code中配置Dapr的开发环境,并在本地开发环境中调试Dapr应用。
第3章解释了在Dapr运行环境中服务是如何被发现和相互调用的。通过学习示例程序,你将学会构建微服务,并在Dapr能识别的组件或Dapr不能感知的外部客户端中调用这些服务。
第4章涵盖了Dapr的核心概念——服务的状态管理和actor的状态管理。该章阐述了Dapr解决方案是如何通过不同的存储方式来管理状态的。
第5章介绍了发布/订阅机制——消息驱动模式,Dapr通过它来解耦组件之间的交互。你将会了解消息驱动模式的好处以及如何在Dapr应用中实现这种机制。
第6章介绍了Dapr的资源绑定构建块。通过该构建块,你可以设计事件驱动的微服务,以便使用可插拔的配置方式来调用外部资源。
第7章介绍了Dapr强大的虚拟actor模型。该章阐述了如何在微服务式架构中运用虚拟actor模型,以及不同运用方法的优缺点。
第8章介绍了将Dapr应用部署到本地自托管环境和Kubernetes中的运维区别。该章着重介绍如何将由多个微服务构成的Dapr示例程序部署到Azure Kubernetes Service。
第9章介绍了Dapr应用的可观测性,并探索了在Dapr运行环境中traces、logs和metrics是如何产生的及如何通过Zipkin、Prometheus和Grafana等工具收集它们。
第10章介绍了可伸缩的Dapr服务和actor是如何在Kubernetes环境中工作的。通过自动伸缩系统你可以根据指标来扩容和缩容。你也将学会如何使用Locust测试工具模拟用户行为以便给Dapr解决方案实施负载测试。
附录A从微服务架构的相关特性出发,探讨Dapr如何简化微服务的构建过程。
本书的示例程序基于Windows 10操作系统开发,采用跨平台的技术栈,包括VS Code、.NET 5、Dapr、Kubernetes和Locust。
本书用到的软件和硬件 |
---|
Docker Engine新版本 |
.NET 5 |
Dapr 1.1及新版本 |
VS Code新版本 |
Python 3.8 |
Azure CLI-2.5.1及新版本 |
Locust 1.3.1及新版本 |
在Windows 10操作系统中,推荐安装WLS2并在Docker中启用WLS2引擎。配置环境的详细向导请参考第1章的内容。
Dapr运行时从2021年2月发布的1.0版本起达到产品可用级别,公告详情请访问Dapr网站。本书的示例程序和代码在Dapr v1.5中测试通过。
以下是贯穿本书的体例。
代码段示例:
"compounds":
[
{
"name": "webApi + webApi2 w/Dapr",
"configurations": [".NET Core Launch w/Dapr (webapi)",
".NET Core Launch w/Dapr (webapi2)"]
}
]
加粗代码段的关键部分以吸引你的注意力,如加粗相关的单词或整行代码:
{
"appId": "hello-world",
"appPort": 5000,
"httpPort": 5010,
"grpcPort": 50010,
"label": "daprd-debug",
"type": "daprd",
"dependsOn": "build"
}
命令行的输入和输出如下:
$ mkdir css
$ cd css
正文中的粗体字:表示新的术语、非常重要的词汇或句子。示例“在管理面板中选择系统信息”。
重要提示:
或者以这种形式出现。
Davide Bedin是云原生架构的爱好者,他在云计算领域拥有丰富的经验。
作为独立软件开发商的首席技术官,Davide引领企业进行数字化转型,探索出基于Microsoft Azure云服务的新解决方案。
Davide尤其关注分布式计算向面向服务的架构及最终的微服务架构的发展和演进过程。他大部分的开发生涯都投入到与网络服务相关的研发工作中。
作为微软公司的云解决方案架构师,Davide主要为企业客户上云提供指导和支持,助力企业数字化转型。
“我非常感谢Jessica Tibaldi[1]和Paola Annis[2]在编写本书时提供的宝贵意见。此外,我的职业生涯中有幸得到过许多老师无私的帮助,在此无法一一列举,不胜感激。”
[1]Jessica Tibaldi,2014年加入微软公司,从事Microsoft Azure、GitHub、Dapr等多个产品的研发。2021年加入谷歌云,成为谷歌公司的Partner Engineer,从事Kubernetes等云原生技术的研发。——译者注
[2]Paola Annis,微软公司高级研发经理,专注于云计算、Azure、DevOps和云原生系列技术。——译者注
Senthil Kumar是Microsoft Visual Studio系列技术的微软最有价值专家[3],Windows 10 Development Recipes Using JavaScript and CSS的合著者。Senthil在IT领域耕耘10多年,深入接触过多种编程语言,包括C#、JavaScript、PHP等。
[3]Microsoft MVP(Microsoft Most Valuable Professional,微软最有价值专家)是微软公司的一个年度奖项。MVP是具备一种或多种微软公司技术专业知识,并且积极参与线上或线下的社群活动的专家,他们经常与其他专业人士分享知识和专业技能,受人尊敬、信任,而且平易近人。——译者注
成海霞
微软公司开发者事业部软件工程师,专注于Java EE/Jakarta EE云原生解决方案的设计和研发。云原生系列技术爱好者,Dapr中文社区源码解析小组核心成员。
何儒
微软公司开发者事业部软件工程师、高级系统架构设计师。2011年东南大学本科毕业,上海交通大学安泰MBA在读。长期从事软件研发工作,涉猎领域包括云计算与大数据、机器学习、Web前后端开发、高性能编程、开发者体验等。
常峥
微软公司开发者事业部软件工程师,专注于Java EE/Jakarta EE云原生解决方案的设计和研发。云原生系列技术爱好者,曾就职于亚马逊、菜鸟网络等公司,有多年后端研发经验。
刘吉安
微软公司云计算与人工智能事业部软件工程师,Kubernetes社区成员,长期活跃于容器编排领域,参与Dapr Extension for Azure Kubernetes Service的开发与维护。
程辙
微软公司开发者事业部软件工程师,云原生系列技术爱好者,专注于Terraform、Kubernetes、Serverless等领域,参与Dapr与Azure Container Apps Service集成的开发工作。
朱佳豪
微软公司开发者事业部软件工程师,云原生系列技术爱好者,长期活跃于容器编排领域,有多年后端研发经验。
本书由异步社区出品,社区(https://www.epubit.com)为您提供相关资源和后续服务。
您还可以扫码二维码, 关注【异步社区】微信公众号,回复“e61185”直接获取,同时可以获得异步社区15天VIP会员卡,近千本电子书免费畅读。
本书提供如下资源:
● 示例代码;
● 书中彩色图片。
要获得以上配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
如果您是教师,希望获得教学配套资源,请在社区本书页面中直接联系本书的责任编辑。
作者、译者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“发表勘误”,输入错误信息,单击“提交勘误”按钮即可,如右图所示。本书的作者和编辑会对您提交的错误信息进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
扫描下方二维码,您将会在异步社区微信服务号中看到本书信息及相关的服务提示。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区投稿(直接访问www.epubit.com/contribute即可)。
如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发送给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT图书的品牌,依托于人民邮电出版社几十年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。
异步社区
微信服务号
本部分概述Dapr是什么及其主要的特性和组件。
本部分的内容如下:
● Dapr简介;
● 调试Dapr解决方案。
本章将会介绍分布式应用运行时(Distributed Application Runtime,Dapr)项目,帮助你了解Dapr的架构的核心概念,以及如何使用Dapr进行开发。
Dapr加速了新的云原生应用的开发,并且简化了采用微服务架构的步骤。本章涵盖的主题如下:
● Dapr概述;
● Dapr架构;
● 设置Dapr启动环境;
● 开发第一个Dapr示例程序。
通过学习上述要点有助于我们理解Dapr的架构及其在微服务架构方面的设计。我们首先探索Dapr,理解它是如何工作的。
示例程序的代码可以按照本书的“资源与支持”的说明去下载。本节的示例程序的代码在压缩包的chapter01文件夹中。
在本章中,脚本和代码文件统一存放在目录<repository path>\chapter01\中。我的本地目录是C:\Repos\dapr-samples\chapter01。
请参考1.4节配置开发Dapr并运行示例程序需要的工具。
Dapr是由微软公司发起的一个事件驱动的、可移植的开源运行时项目,在编写本书时,该项目仍处于活跃开发中。
事件驱动在微服务架构中扮演了非常重要的角色,它也是 Dapr 的定义中强调的机制。通过事件驱动,我们不仅可以将应用设计成能有效响应来自外部系统的事件和解决方案其他服务的事件,还可以让应用本身产生事件,向其他服务通知新的变化,事件驱动是异步的,其他服务不必马上响应事件,可以在后续阶段处理。
Dapr是可移植的,它可以以自托管模式运行在本地开发环境中,也可以部署到边缘设备或Kubernetes中。
图1.1展示了Dapr架构的不同构建块。
图1.1 Dapr架构的不同构建块
基于可移植性,Dapr应用也可以延伸到托管环境之外。虽然Dapr是微软公司发起的项目,但是,它除可以运行在自有Kubernetes环境中以外,还可以运行在Microsoft Azure、Amazon AWS、GCP(Google Cloud Platform,谷歌云)或任何其他云供应商的Kubernetes环境中。
Dapr的构建得益于微软公司在开发超大规模云原生应用方面的丰富经验,它受到Orleans和Service Fabric设计的启发,反过来又帮助许多Microsoft Azure云服务能够以弹性且大规模的方式运行。
基于微服务架构,Dapr为开发者提供了一种设计构建工具和应用的运行时的方法。
微服务虽然具有大量优势,但同时也增加了团队和产品管理的复杂性。通常这给初学微服务开发的开发人员和团队带来了很大的负担。
如果使用诸如Dapr之类的运行时来帮助了解构建微服务过程中需要采用的常见模式,这会不会简化工作呢?
图1.2展示了Dapr的两种托管模式。
图1.2 Dapr的两种托管模式
在图1.2中,Dapr运行时在sidecar进程中运行,将大部分复杂性从应用移至另一个单独的环境,这极大地简化了开发和运维的难度。这些sidecar进程可以在本地开发环境中运行,也可以作为容器在Kubernetes的pod中运行。
从应用的视角来看,Dapr是一个应用程序接口(Application Programming Interface,API),可以通过HTTP或gRPC远程过程调用直接访问,或使用更简单的方式——通过任意一种软件开发套件(Software Development Kit,SDK)。在撰写本书时,这些SDK包括.NET、Java、Go、Python、C++、JavaScript和Rust。
在后面的内容中,我们不必在应用中集成Dapr SDK,只需要一个简单的HTTP调用就可以访问Dapr服务,例如http://localhost:3500/v1.0/invoke/<app-id>/method/<method name>。不过,SDK确实提供了很多好处,尤其是在开发Dapr服务或使用Dapr actor模型时。
通过前面的内容你应该已经简单了解Dapr并且产生继续阅读本书的兴趣。当我与他人分享关于Dapr的知识时,经常发现对方有很多关于Dapr的误区。如下这些说明可以帮助你消除很多对于Dapr所做工作的误解。
● Dapr的目标不是强迫开发者接受某种有严格规则和限制的编程模型。恰好相反,当开发者从微服务架构的烦琐中被 Dapr 解放出来后,他们不会被强制要求如何编写应用。例如,管理存储状态的数据库的连接池是Dapr的责任,而且在后面的内容中我们将会看到,这种管理对微服务应用的代码来说是透明的。
● Dapr不是service mesh(服务网格)。尽管service mesh和Dapr的很多目标都有相似之处,但是Dapr在应用层提供这些好处,而service mesh则运行在基础设施层。例如,Dapr 在与状态存储和服务的交互中采用重试逻辑,但当有冲突或间歇故障时,则需要由开发者决定如何处理Dapr可能返回的报错:是直接将错误返回给客户端,补偿操作,还是接受重试策略(也许使用.NET Core中的Polly)。
● 当然Dapr也可以与service mesh(例如Istio)进行集成,但这不在本书的讨论范围内。
● Dapr 不是微软公司提供的云服务。Dapr确定能够帮助开发者构建云端的微服务应用,同时提供很多与Azure云服务集成的功能,但它同样支持AWS、GCP和其他服务的组件。这也表明Dapr在Azure中运行并不会比在其他云Kubernetes环境中运行的效果更好。我希望能说服你相信Azure Kubernetes Service(AKS)是云服务领域管理得最好的Kubernetes服务,不过这是另一个话题了。
重要提示:
尽管本书着重介绍了.NET Core编程语言,但是Dapr也为其他编程语言的开发者(如Python)提供了同样的好处,这是因为Dapr具有关于Dapr和Dapr actor的SDK,支持macOS以及Kubernetes——Dapr以一种供应商中立和开源的方式欢迎所有开发者。
1.3节将重点介绍Dapr架构。
Dapr从一开始就被设计成由一套可插拔的构建块组成:开发者可以创建一个依赖很多设施的应用,而运维人员只需要简单设置就可以让应用适配托管环境。Dapr完整的工具组件如下。
● Dapr CLI(Command-Line Interface,CLI):它是一款跨平台的命令行工具,可以用来配置、管理和监控Dapr环境,也可以用来调试本地环境中的Dapr应用。
● Dapr API:这套API定义了应用与Dapr运行时的交互方式,以便应用使用Dapr的构建块。
● Dapr runtime:它是Dapr的核心,实现了Dapr API。如果你好奇,可以在Dapr的代码仓库中浏览使用Go语言开发的源代码。
● Dapr主机:在本地开发机器上,Dapr作为单独的进程运行;在Kubernetes中,它运行在应用所在pod的sidecar容器中。
● Dapr operator:仅针对Kubernetes模式,此operator用于管理资源绑定和配置。
● Dapr sidecar injector:一旦完成Kubernetes模式下的配置后,它会把Dapr sidecar注入应用的pod中。
● Dapr Placement服务:该服务的目标是在Dapr pod之间分发(安置)actor实例。
● Dapr Sentry:它是Dapr内置的证书颁发机构(Certificate Authority,CA),用于颁布和管理Dapr用到的证书,以提供透明的双向传输层安全协议(mutual Transport Layer Security,mTLS)。
微服务应用开发者可以根据需要选择使用Dapr提供的众多构建块。这些构建块如下。
● 服务调用:通过服务间的调用,代码能够调用同一托管环境的其他服务,同时处理重试策略。第3章将详细介绍该构建块。
● 状态管理:通过简单的键值对(Key-Value Pair,KVP)的方式高效管理应用状态,解除有状态/无状态服务对于不同背景的支持。Dapr提供的众多状态存储,包括Redis、Azure Cosmos DB、Azure SQL Server和PostgreSQL,都可以通过配置插入。在第4章中你将学到关于此构建块的内容。
● 发布/订阅(pub/sub):发布/订阅通过交换消息的方式解耦微服务。该方式依赖服务总线。服务总线可以在生产者和消费者之间路由消息。在第5章中我们将讨论此构建块。
● 资源绑定:这是Dapr的事件驱动特性的闪光之处。通过绑定,应用可以被Twilio(短消息服务领域的活跃企业)的短消息服务(Short Message Service,SMS)触发。此构建块的细节在第6章中详细讨论。
● actor:actor模型用于简化高并发场景。它通过将所有的请求负载分散给巨大数量的计算单元(actor)来实现目的。每个actor通过在单位时间内处理较小但独立范围的工作来完成请求,Dapr在这个领域提供了巨大的好处。可以在第7章学习关于此构建块的知识。
● 可观测性:Dapr 允许开发人员和运维人员在无需额外工作的前提下观察系统服务和应用的行为。此构建块在第9章中详细讨论。
● secret(秘密):将机密信息保存在代码的安全距离之外是很正常的需求,也是很合理的操作,尽管有时这样做仅仅是为了防止在开发环境中意外访问生产环境。Dapr允许储存机密信息到Kubernetes、Azure Key Vault等存储空间,并在Dapr组件中引用它们。
学习Dapr的架构和组件后,我们将介绍如何在开发环境中配置Dapr。
Dapr支持多种平台和多种编程语言。本书将结合Visual Studio Code(VS Code),使用C#和.NET框架进行开发。本书中的代码适合任何有编程语言背景的开发人员,不过更适合具有.NET开发经验的开发人员阅读。
本书使用的开发环境是Windows 10操作系统。尽管命令行界面、配置和文件都是相同的,但如果你需要关于如何在Linux或macOS操作系统下进行操作的更详细的指导,请阅读Dapr网站上的文档。
重要提示:
2021年2月发布的Dapr v1.0是可以用于生产的版本。本书中的示例程序和脚本已经针对Dapr v1.5进行升级并测试。
由于Dapr需要用到本地开发环境中的Docker,因此请确保本地开发环境中已经安装Docker。如果本地开发机器使用的是Windows操作系统,那么Docker必须运行在Linux容器模式下。
我们马上将要开始使用Dapr,首先安装必要的工具。Dapr及其工具可以在GitHub网站关于Dapr的页面中找到。在Windows操作系统下,推荐执行以下命令将CLI安装在%USERPROFILE%\.dapr\目录下,并将其加入用户PATH环境变量,以便可以通过命令行的方式使用这些工具:
powershell -Command "iwr -useb https://raw.githubusercontent.
com/dapr/cli/master/install/install.ps1 | iex"
以上命令用于安装Dapr CLI的候选版(Release Candidate,RC)。本章后面的内容会介绍如何在本地开发机器上初始化Dapr。
要安装.NET 5,请先访问微软官方网站并下载最新安装包。
推荐在本地开发机器上安装包含运行时的完整版SDK。安装完成后,打开一个新的命令行窗口(Command Prompt)并运行dotnet --info命令,你应该看到下列输出:
PS C:\Repos\dapr-samples\chapter01> dotnet --info
.NET SDK (reflecting any global.json):
Version: 5.0.202
Commit: db7cc87d51
Runtime Environment:
OS Name: Windows
OS Version: 10.0.19042
OS Platform: Windows
RID: win10-x64
Base Path: C:\Program Files\dotnet\sdk\5.0.202\
Host (useful for support):
Version: 5.0.5
Commit: 2f740adc14
…
这表示已经安装.NET,并且能正常工作。
VS Code是微软公司出品的多平台代码编辑器,可以按照visualstudio网站上的相关指示进行安装。
Dapr提供面向VS Code的插件。该插件可以导览本地Dapr环境,简化调试配置——强烈推荐安装。请按照Dapr网站上的相关指示进行安装。
我非常喜欢新版本的Windows终端,它变得更易用和配置。在接下来的内容中,我们经常需要同时运行多个命令和工具。推荐使用支持多标签特性的Windows终端。
Dapr可以使用两种模式初始化——自托管(或单机)和Kubernetes托管模式。
自托管模式仅用于开发环境,此模式能够在本地开发环境中安装Redis、Dapr placement服务和Zipkin。在本地初始化Dapr的命令如下:
dapr init
在本地开发环境中,可能会发生Dapr安装的Redis要使用的端口(这里仅用于举例目的)已经被占用的情况。这种情况下你需要定位并修改使用这些端口的进程和容器。
运行init命令后,可以看到下列信息:
PS C:\Repos\dapr-samples\chapter01> dapr init
Making the jump to hyperspace...
Downloading binaries and setting up components...
Downloaded binaries and completed components set up.
daprd binary has been installed to C:\Users\dabedin\.dapr\bin.
dapr_placement container is running.
dapr_redis container is running.
dapr_zipkin container is running.
Use `docker ps` to check running containers.
Success! Dapr is up and running. To get started, go here:
https://aka.ms/dapr-getting-started
可以使用命令docker ps检查新初始化的Dapr环境,命令如下:
PS C:\Repos\dapr-samples\chapter01> docker ps --format "{{.
ID}}: {{.Image}} - {{.Ports}} - {{.Names}}"
2082b7f0eda4: daprio/dapr - 0.0.0.0:6050->50005/tcp - dapr_
placement
6c68d869cea7: redis - 0.0.0.0:6379->6379/tcp - dapr_redis
e4c8eae6992d: openzipkin/zipkin - 9410/tcp, 0.0.0.0:9411->9411/
tcp - dapr_zipkin
上述输出展示了在本地开发机器上运行的Docker容器信息。
Dapr最重要的目的是运行在Kubernetes中。如果开发环境中安装了Dapr CLI,则可以在Kubernetes中设置Dapr,命令如下:
dapr init -k
或者,可以使用命令Helm v3 chart将Dapr安装在Kubernetes上。更多细节请参考Dapr网站。
重要提示:
你可以定义一个持续集成/持续部署(Continuous Integration/Continuous Deployment,CI/CD)的自动化流程用于解决Dapr在Kubernetes中的安装问题。不过这种方法不在本章讨论的范围内。
运行以下命令检查是否成功安装:
kubectl get pods --namespace dapr-system
上述命令将检查dapr-system命名空间下的pod。
如果使用的Windows操作系统开发机器已经安装旧版本的Dapr,那么使用powershell命令可以更新Dapr CLI的版本,命令如下:
PS C:\Repos\dapr-samples\chapter01> powershell -Command "iwr
-useb https://raw.githubusercontent.com/dapr/cli/master/
install/install.ps1 | iex"
WARNING: Dapr is detected - c:\dapr\dapr.exe
CLI version: 1.0.1
Runtime version: 1.0.0
Reinstalling Dapr...
Creating c:\dapr directory
Downloading https://api.github.com/repos/dapr/cli/releases/
assets/34341976 ...
Extracting c:\dapr\dapr_windows_amd64.zip...
CLI version: 1.1.0
Runtime version: 1.0.0
Clean up c:\dapr\dapr_windows_amd64.zip...
Try to add c:\dapr to User Path Environment variable...
Skipping to add c:\dapr to User Path - …此处省略…
Dapr CLI is installed successfully.
To get started with Dapr, please visit https://docs.dapr.io/
getting-started/ .
Ensure that Docker Desktop is set to Linux containers mode when
you run Dapr in self hosted mode.
更新Dapr和安装Dapr的步骤类似,但我们需要先卸载Dapr,命令如下:
PS C:\Repos\dapr-samples\chapter01> dapr uninstall
Removing Dapr from your machine...
Removing directory: C…
Removing container: dapr_placement
Dapr has been removed successfully
执行命令dapr init后,将检查本地开发环境中的Dapr版本。可以看到,Dapr CLI和运行时版本都由1.0更新到1.1,命令如下:
PS C:\Repos\dapr-samples\chapter01> dapr --version
CLI version: 1.1.0
Runtime version: 1.1.1
Dapr测试环境已经配置完成并正常运行。现在我们已经准备好运行第一个Dapr示例程序。
是时候在开发中使用Dapr了:我们将开发一个返回Hello World消息的Web API。我将本书所有的示例程序都在我的计算机的文件夹C:\Repos\dapr-samples\中,我为第一个示例程序创建的文件夹是C:\Repos\dapr-samples\chapter01。我们将采取如下步骤。
步骤1:创建一个基于.NET的Web API项目。命令如下:
PS C:\Repos\dapr-samples\chapter01> dotnet new webapi -o
dapr.microservice.webapi
步骤2:然后将Dapr SDK引用添加到ASP.NET中。当前版本是1.0.0,可以在NuGet上找到版本号并使用dotnet add package命令完成操作,命令如下:
PS C:\Repos\dapr-samples\chapter01> dotnet add package
Dapr.AspNetCore --version 1.1.0
步骤3:需要对模板做一些修改才能完成项目。通过VS Code来做会简单很多——使用<directory>\code .命令,我们可以打开项目文件夹。
步骤4:为了在ASP.NET中支持Dapr,这里对代码做了一些修改,在Startup.cs中将ConfigureServices方法改为services.AddControllers().AddDapr()。
在Configure中,我也加入了endpoints.MapSubscribeHandler()。对本节的示例程序来说,这不是必需的,因为我们没有使用Dapr的发布/订阅功能。尽管如此,将endpoints. MapSubscribeHandler()作为ASP.NET项目的默认设置也是很有好处的,方便后期使用。最后,为了简化代码,我移除了app.UseHttpsRedirection()。修改过的Startup.cs类代码如下:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace dapr.microservice.webapi
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
//此方法由运行时调用,使用此方法向容器中添加服务
public void ConfigureServices
(IServiceCollection services)
{
services.AddControllers().AddDapr();
}
//此方法由运行时调用,使用此方法配置HTTP请求管线
public void Configure(IApplicationBuilder app,
IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapSubscribeHandler();
endpoints.MapControllers();
});
}
}
}
在上面的代码中,Dapr使用了ASP.NET框架的Model-View-Controller (MVC)设计模式。对于在ASP.NET中使用Dapr,一种替代方案是通过ASP.NET Core路由的MapGet(...)和MapPost(...)来实现。
步骤5:添加HelloWorldController.cs控制器。代码如下:
using Dapr;
using Microsoft.AspNetCore.Mvc;
using System;
namespace dapr.microservice.webapi.Controllers
{
[ApiController]
public class HelloWorldController : ControllerBase
{
[HttpGet("hello")]
public ActionResult<string> Get()
{
Console.WriteLine("Hello, World.");
return "Hello, World";
}
}
}
在以上代码中可以看到[HttpGet("hello")]:Dapr会通过这个ASP.NET属性识别对应路径的方法名。
步骤6:通过命令运行Dapr应用。具体如下:
dapr run --app-id <your app id> --app-port <port of the
application> --dapr-http-port <port in Dapr> dotnet run
我使用了ASP.NET的默认端口5000,但是将Dapr HTTP端口修改为5010。使用以下命令启动Dapr应用:
PS C:\Repos\dapr-samples\chapter01\dapr.microservice.
webapi> dapr run --app-id hello-world --app-port 5000
--dapr-http-port 5010 dotnet run
Starting Dapr with id hello-world. HTTP Port: 5010. gRPC
Port: 52443
初始化信息提示Dapr将使用5010作为HTTP端口,如同配置的那样,而gRPC将使用自动选择的可用接口。
Dapr的日志显示了丰富的信息。如果要确定你的应用在Dapr中是否成功启动,可以试图找到如下日志:
Updating metadata for app command: dotnet run
You're up and running! Both Dapr and your app logs will appear here.
到了这个阶段,ASP.NET在监听本地5000端口,而Dapr监听本地5010端口。可以使用命令curl来测试Dapr应用。当然,你也可以使用浏览器,命令如下:
PS C:\Repos\dapr-samples\chapter01> curl http://
localhost:5010/v1.0/invoke/hello-world/method/hello
Hello, World
这条响应消息来自Dapr。Dapr将来自客户端的请求传递到ASP.NET Web API后端进行处理。你应该可以看到已写入日志的响应消息,因为Console.WriteLine将它输出到Dapr CLI窗口,如下:
== APP == Hello, World.
步骤7:通过另一个窗口验证Dapr服务详情。并非运行命令dapr list,而是使用以下命令来打开Dapr仪表板:
PS C:\Windows\System32> dapr dashboard
Dapr Dashboard running on http://localhost:8080
可以通过访问http://localhost:8080来打开仪表板。
如图1.3所示,Dapr仪表板展示了hello-world应用的详情。
图1.3 Dapr仪表板中显示的hello-world应用
在这种情况下,Dapr仪表板仅仅显示了运行在本地开发机器中的示例程序。在Kubernetes环境下,它将展示运行中的微服务与其他组件。
Dapr仪表板也展示了主机环境中配置的组件,如图1.4所示。
图1.4 Dapr仪表板中的组件
在图1.4中,Dapr仪表板展示了本地开发环境中安装的Redis被配置为状态存储组件和发布/订阅组件,以及已经部署和集成的Zipkin[1]。
[1]若dashboard没显示Zipkin,请在component目录配置类型为exporters.zipkin的Zipkin导出器,具体方法可参考GitHub网站上的文章“Set up distributed tracing with Zipkin”。自托管模式下,exporterAddress值为http://localhost:9411/api/v2/spans。——译者注
本章的介绍到此结束,我们完成了第一个Dapr示例程序的开发。
在本章中,我们学习了Dapr及其组件、构建块和sidecar模式。我们将会在接下来的内容中逐个探索这些概念。现在你已经可以在本地开发机器上配置Dapr,准备好必要的工具来提升学习体验了。
同时,我们也学习了如何创建一个简单的ASP.NET项目,以及如何配置和检查Dapr。我们也简单了解了Dapr仪表板——它可以帮助我们全面并仔细地了解Dapr环境。
在第2章中,我们将使用新创建的开发环境来学习如何调试Dapr。
读者服务:
微信扫码关注【异步社区】微信公众号,回复“e61185”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。