Dapr-4: 交通管制示例应用
第 4 章 交通管制示例应用
Introduction to the Traffic Control sample application | Microsoft Docs
在前面的章节种,你已经学习了基本的 Dapr 概念。见识了 Dapr 如何帮助你和你的团队在构建分布式应用的时候,降低架构和操作的复杂性。本章介绍你可以用来探索 Dapr 构建块的示例应用。
注意:
从 Dapr Traffic Control Github repo 下载示例应用。该仓库包含如何在你的机器上运行该示例应用的详细说明。
交通管制示例应用模拟高速公路的交通管制系统。它的目的是检测超速的汽车并给违章司机开罚款单。这类应用在现实中存在,这里是它是如何工作的。一组摄像头 (每条车道一个) 安装在一段没有出入口的高速公路的起始和结束点 (例如 10 公里) 。在汽车通过摄像头下方的时候,对该汽车拍照。使用光学字符识别 ( OCR ) 系统软件,从照片中提取汽车牌照号码。如果平均速度高于高速公路的限速,系统提取驾驶员信息,并自动开发罚单。
尽管该仿真系统很简单。系统的职责可以分为多个微服务。图 4-1 展示了应用程序中每个服务的概览。

图 4-1 示例应用中的服务
- 摄像头仿真 是一个 .NET Core 的控制台应用程序,模拟汽车并发送消息到流量管控服务。每辆仿真的汽车都会调用进入和离开端点服务两者。
- 交通管控服务 是一个 ASP.NET Core Web API 应用程序,提供
/entrycam和/exitcam两个端点。调用其中的一个端点服务可以模拟汽车分别通过旗下的入口或出口。请求消息中简单地包含了汽车牌照 ( 没有实现实际的 OCR ) - FineCollection 服务 是一个 ASP.NET Core Web API 应用程序,只提供一个端点服务
/collectfine。调用此端点将发送罚款提示给超速汽车的驾驶员。请求的内容包含超速违章的所有信息 - VehicleREgistration 服务 是一个 ASP.NET Core Web API 应用程序,提供一个端点
/vehicleinfo/{licensenumber}。通过在 URL 中提供的汽车牌照号码,获取超速汽车和汽车所有者的信息。
图 4-2 中的序列图展示了仿真的流程。

图 4-2 仿真流的序列图
服务之间的通讯通过直接调用其它的 API 实现。该设计可以使用,但是存在一些缺陷。
最大的问题是,如果调用链中的服务之一离线,那么整个调用链将中断。通过将解耦的服务之间的直接调用替换为异步消息可以解决该问题。异步消息通常使用消息中间件来实现,比如:RabbitMQ 或者 Azure Service Bus。
还有其它的缺陷,在流量管控系统中,汽车的状态信息是存储在内存中。当服务升级或者崩溃,而导致重新启动的时候,状态将会丢失。状态应当存储在服务之外。
使用 Dapr 构建块
Dapr 的一个目标就是对于微服务应用程序提供云原生的能力。该流量管控应用程序使用 Dapr 构建块来增强鲁棒性,并降低前面段落中提到的设计缺陷。图 4-3 展示了一个启用 Dapr 版本的流量管控应用程序。

图 4-3 使用 Dapr 构建块的流量管控应用该程序
- Service invocation Dapr 服务调用构建块处理 FineCollectionService 与 VehicleRegistrationService 之间的请求/响应通讯。由于该调用是一个查询,用来提取必须的数据来完成操作,同步调用是可以接受的。服务调用构建块提供服务发现。FineCollection 服务不再需要知道 VehicleRegistration 服务位于何处,它也实现了在 VehicleRegistration 服务离线时的自动重试。
- Publish & subscrit 发布和订阅构建块处理异步消息,用于从 TrafficControlService 发送超速违章到 FineCollectionService 服务。如果 FineCollectionService 服务暂时失效,数据将会累计在队列中,并在随后的事件重新恢复处理。RabbitMQ 作为当前的消息中间件,将消息从生产者传递给消费者。由于 Dapr 的 pub/sub 构建块抽象了消息中间件,开发人员不需要学习 RabbitMQ 客户端库的内部细节。切换到其它的消息中间件也不需要代码变更,只需要修改配置。
- State management TrafficControl 服务使用状态管理构建块在服务之外的 Redis 缓存中持久化汽车状态。与 pub/sub 类似,开发人员也不需要学习 Redis 特定的 API,切换到其它数据存储也不需要修改代码。
- Output binding FineCollection 服务通过电子邮件将罚单发送给超速汽车的所有者。Dapr SMTP 输出绑定抽象了基于 SMTP 协议的电子邮件传输细节。
- Input binding CameraSimulation 使用 MQTT 协议将模拟的汽车消息发送给 TrafficControll 服务。它使用 .NET MQT 库发送消息到 Mosquito - 这是一个轻量级的 MQTT 中间件。TrafficControl 服务使用 Dapr 的 MQTT 绑定来订阅 MQTT 中间件,并接收消息。
- Secrets management FineCollectionService 需要认证才能连接到 SMTP 服务器,而且罚款计算组件也需要一个内容的授权码。这里使用密钥管理构建块来获取认证凭据和授权码。
- Actors TrafficControlService 有一个基于 Dapr 执行人的替换实现。在该实现中,TrafficControl 服务针对每个入口摄像机的企业创建一个新的执行人。汽车的牌照号码赋予 Actor ID。执行人封装了该汽车的状态。它被持久在 Redis 缓存中。当汽车被离开摄像头登记的时候,调用该执行人。执行人然后计算出平均速度,并可能开出超速罚单。
图 4-4 展示了所有 Dapr 构建块的执行序列图

图 4-4 Dapr 构建块的执行序列图
本书后面的每一章将专门针对一个 Dapr 构建块。每章将深入说明该构建块是如何工作、如何配置、以及如何使用它。每章说明在流量管控应用程序中是如何使用该构建块的。
托管
流量管控应用程序既可以运行在自寄宿模式,也可以运行在 Kubernetes 中。
自寄宿模式
在示例的仓储中,包含了在你的本地机器上,以 Docker 容器的方式,启动基础服务架构的 PowerShell 脚本 (Redis, RabbitMQ, and Mosquitto)。脚本位于 src/Infrastructure 文件夹中。对于应用程序中的每个应用程序服务,在仓储中对应一个独立的文件夹,每个文件夹中包含一个名为 start-selfhosted.ps1 的 PowerShell 脚本,用来启动 Dapr 服务。
Kubernetes 模式
示例仓储中的 src/k8s 文件夹中包含了在 Kubernetes 中使用 Dapr 运行应用程序的 Kubernetes 说明文件 ( 包括基础架构服务 )。 该文件夹中还包括了用来在 Kubernetes 中启动和停止解决方案的 start.ps1 和 stop.ps1 PowerShell 脚本。所有的服务都运行在 dapr-trafficcontrol 命名空间中。
总结
流量管控示例应用程序时一个微服务应用程序,用来模拟高速公路的超速管理。
该应用程序使用多个 Dapr 构建块来变得更稳健和云原生。示例尽可能简化以主要关注于 Dapr。
后继的章节将使用该示例应用程序来介绍 Dapr 构建块。
参考
Dapr-4: 交通管制示例应用的更多相关文章
- Dapr 交通控制示例
Dapr 已在塔架就位 将发射新一代微服务 牛年 dotnet云原生技术趋势 Dapr是如何简化微服务的开发和部署 前面几篇文章都是从大的方面给大家分享Dapr 能帮助我们解决什么问题,微软从开源到1 ...
- Dapr Java Http 调用
版本介绍 Java 版本:8 Dapr Java SKD 版本:0.9.2 Dapr Java-SDK HTTP 调用文档 有个先决条件,内容如下: Dapr and Dapr CLI. Java J ...
- 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序
上一篇:手把手教你学Dapr - 2. 必须知道的概念 注意: 文章中提到的命令行工具即是Windows Terminal/PowerShell/cmd其中的一个,推荐使用Windows Termin ...
- 面向.NET开发人员的Dapr- actors 构建块
原文地址:https://docs.microsoft.com/en-us/dotnet/architecture/dapr-for-net-developers/actors The actor m ...
- 技术分享:Dapr,让开发人员更轻松地构建微服务应用
最近一直在学习微服务相关的技术.微服务架构已成为构建云原生应用程序的标准,并且可以预见,到2022年,将有90%的新应用程序采用微服务架构.微服务架构提供了令人信服的好处,包括可伸缩性,松散的服务耦合 ...
- 微软的分布式应用框架 Dapr
微服务架构已成为构建云原生应用程序的标准,微服务架构提供了令人信服的好处,包括可伸缩性,松散的服务耦合和独立部署,但是这种方法的成本很高,需要了解和熟练掌握分布式系统.为了使用所有开发人员能够使用任何 ...
- dapr微服务.netcore sdk入门
Actors入门 先决条件 .Net Core SDK 3.0 Dapr CLI Dapr DotNet SDK 概述 本文档描述如何在客户端应用程序上创建Actor(MyActor)并调用其方法. ...
- Dapr 运用之 Java gRPC 调用篇
JAVA GRPC 服务与调用 安装协议编译器 下载对应的版本编译器,并把路径加入到环境变量中,执行以下命令生成代码 protoc -I=$SRC_DIR --java_out=$DST_DIR $S ...
- .NetCore集成Dapr踩坑经历
该篇内容由个人博客点击跳转同步更新!转载请注明出处 前言 之前自己有个core2.2的项目一直是用的Surging作为微服务框架的,后来了解到了Dapr,发现比较轻量级,开发部署等也非常方便,故将自己 ...
- 通过示例学习rholang(下部:课程8-13)
课程8——状态通道和方法 保存数据 到现在为止,你已经很擅长于发送数据到元组空间和从元组空间中获取数据.但是无论你在什么时候进行计算,你有时需要把一些数据放在一边晚点才使用.几乎所有编程语言都有变量的 ...
随机推荐
- java使用正则表达式验证手机号和电话号码和邮箱号码的方法
验证手机号 我国的手机号一般是以1开头,后面跟着10位数字.因此,可以用如下正则表达式: public static boolean isValidPhoneNumber(String phoneNu ...
- 18 Transformer 的动态流程
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...
- Kubernetes 持久化存储之 NFS 终极实战指南
作者:运维有术星主 在 Kubernetes 生态系统中,持久化存储扮演着至关重要的角色,它是支撑应用稳定运行的基石.对于那些选择自建 Kubernetes 集群的运维架构师而言,选择合适的后端持久化 ...
- 听说过Paas、Saas和Iaas,那你听说过Apaas吗?
互联网行业就喜欢搞一些单词的缩写,在云计算行业,前者有SaaS.PaaS.IaaS,最近两三年APaaS的概念又开始被关注.APaaS到底是什么意思,有什么用,与前三者的区别是什么?本文将对这些问题进 ...
- 连接ORACLE数据库,是否必须要安装oracle客户端
公司升级Oracle版本(12g~19C),服务器端是DBA团队升级.客户端的升级工作由各个团队自己负责完成.突然想为什么Oracle提供的JDBC Driver需要客户端的软件.没有Oracle客户 ...
- Games104 现代游戏引擎 Picoolo环境搭建 vulkan配置
0 前言介绍 games104 现代游戏引擎课程是由 GAMES: Graphics And Mixed Environment Symposium 支持的一个课程. 如我们所视,Games并非的含义 ...
- Proteus中单片机IO口外接LED输出低电平时,引脚却一直保持高电平的问题(已解决)
前言 一个排阻接八个 LED,方便又省事,但出现了P1端口输出低电平后,仿真引脚却一直显示红色保持高电平不变,用电压表测量显示 2V 左右. 这是仿真的问题,在用开发板时是不会遇到的,为了仿真的显示效 ...
- ubuntu服务器上部署EMQX SLL
1. 安装MQTT的简易服务器集成环境EMQX $wget https://www.emqx.com/zh/downloads/broker/5.1.6/emqx-5.1.6-ubuntu18 ...
- 联邦学习开山之作Communication-Efficient Learning of Deep Networks from Decentralized Data
1 介绍 1.1 背景 越来越多的手机和平板电脑成为许多人的主要计算设备.这些设备上强大的传感器(包括摄像头.麦克风和GPS),加上它们经常被携带的事实,意味着它们可以访问前所未有的大量数据,其中大部 ...
- 4、oracle进程讲解
进程结构 server process服务器进程 前台进程(foreground process):server process(服务器进程) 用户连接到数据库实例以后,暂时可以认为是:对每一个用户连 ...