Dapr 交通控制示例
前面几篇文章都是从大的方面给大家分享Dapr 能帮助我们解决什么问题,微软从开源到1.0 也是经过2年的时间开发,因此我写了这几篇文章也只能是带领大家对Dapr 有个大的印象,真正对Dapr 有认知上的直观感受还是要从示例代码中去体验了,因此今天给大家分享一个交通控制的示例程序,帮助大家对Dapr 的理解更进一步。
这个示例是github上的一位荷兰的 MVP 写的https://github.com/EdwinVW/akka-net-traffic-control ,我把它翻译成中文介绍给大家,示例的场景是用于使用 Dapr 模拟流量控制系统。对于此示例,我们将使用超速摄像头装置,该装置可在多个荷兰高速公路上找到。在某条高速公路的整个长度上,将测量车辆的平均速度,如果该平均速度高于该高速公路上的超速极限,则该车辆的驾驶员会收到超速罚单。
概述
这是我在此示例中模拟的虚构设置的概述:
每个泳道有1个进入相机和1个离开相机。当汽车通过入口摄像机时,将注册该汽车的车牌号。
在后台,通过调用汽车部门的Dvd服务(DMV(或荷兰语中的RDW))获取有关车辆的信息。
当汽车通过出口摄像机时,系统会对其进行记录。然后,系统根据进出时间戳记计算汽车的平均速度。如果检测到超速违规,则会向中央司法征收机构发送一条消息-CJCA(或荷兰语中的CJIB)会将超速罚单发送给车辆驾驶员。
模拟
为了在代码中进行模拟,可以使用以下服务:
- Simulation 是一个 .NET Core 控制台程序模拟过路车.
- TrafficControlService 是一个ASP.NET Core的WebAPI的应用程序,提供2个端点: Entrycam 和 ExitCam.
- Government 服务是一个ASP.NET Core的WebAPI的应用程序,提供2个端点:RDW(检索车辆信息)和CJIB(用于发送超速罚单)
下面的序列图描述了仿真的工作方式:
- Simulation 模拟生成汽车车牌号并发送一个消息 VehicleRegistered (包含汽车车牌号, 一个随机的泳道 (1-3) 和时间戳) 到服务 TrafficControlService 的端点 EntryCam .
- TrafficControlService 调用 GovernmentService 服务的 RDW 的端点 检索对应的汽车号牌车辆的品牌和型号
- TrafficControlService 在 state-store 里 存储VehicleState (车辆信息和进入时间戳) .
- 一些随机间隔之后, Simulation 发送 VehicleRegistered 消息到 TrafficControlService 服务的端点 ExitCam (含有在步骤1中产生的汽车号牌,随机出口车道(1-3)和出口时间戳).
- TrafficControlService 从state-store中获取 VehicleState .
- TrafficControlService使用 进入和出去的时间戳 计算平均速度.
- 如果平均速度高于速度极限时, TrafficControlService 将发送 SpeedingViolationDetected 消息 (包含车辆的车票,路面的标识符,高速化违反KMH和违规的时间戳) 到 GovernmentService 的端点 CJIB .
- GovernmentService 计算超速违章罚款和模拟发送超速票给车主
在执行过程中,此序列中描述的所有操作都会记录到控制台,因此您可以按照流程进行操作。
Dapr
此示例使用 Dapr 实现应用程序的多个方面。在下面的图中,看到的是架构概述
- 对于通信消息, 使用 发布和订阅 构建块来实现.
- 对于 request/response 型的服务通信 ,使用 服务到服务调用 构建块来实现.
- 对于车辆状态的存储,使用 状态管理 构建块来实现.
- 服务GovernmentService 中的
VehicleInfoController
有一个操作GetVehicleInfo
使用VehicleInfoRepository
获取车辆数据. 这个 repository 的构造函数需要一个连接字符串作为参数。 这个连接字符串存储在一个secrets 文件里。 服务 GovernmentService 使用 secrets management 构建块带一个本地文件组件来获取连接字符串.
在这个例子里, Redis 组件既用于状态管理,又用于 pub/sub.
使用 Dapr 的 self-hosted 模式运行示例
执行以下步骤以在自托管模式下运行示例应用程序:
确保你已经在你的计算机上 安装Dapr的 self-hosted 模式,具体参考文档 Dapr documentation,中文的请看朱永光写的 Dapr微服务应用开发系列1:环境配置.
打开三个独立的命令行窗口.
在第一个命令行Shell, 切换当前路径到 仓库 的 src/GovernmentService 文件夹 执行下面的命令行(使用Dapr CLI)运行 GovernmentService:
dapr run --app-id governmentservice --app-port 6000 --dapr-grpc-port 50002 --config ../dapr/config/config.yaml --components-path ../dapr/components dotnet run
在第二个命令行Shell, 切换当前路径到仓库的 src/TrafficControlService 文件夹 执行下面的命令(使用Dapr CLI) TrafficControlService:
dapr run --app-id trafficcontrolservice --app-port 5000 --dapr-grpc-port 50001 --config ../dapr/config/config.yaml --components-path ../dapr/components dotnet run
在第三个命令行Shell, 切换当前路径到仓库的 src/Simulation 文件夹 执行下面的命令运行 Simulation:
dapr run --app-id simulation --dapr-grpc-port 50003 --config ../dapr/config/config.yaml --components-path ../dapr/components dotnet run
现在,您应该会看到每个 shell 中的日志记录,类似于如下所示的日志记录:
Simulation:
TrafficControlService:
GovernmentService:
Dapr 交通控制示例的更多相关文章
- Struts2使用拦截器完成权限控制示例
http://aumy2008.iteye.com/blog/146952 Struts2使用拦截器完成权限控制示例 示例需求: 要求用户登录,且必须为指定用户名才可以查看系统中某个视图资源:否 ...
- 【C++ Primer 第十三章】4. 拷贝控制示例
拷贝控制示例 #include<iostream> #include<string> #include<set> #include<vector> us ...
- PID控制示例C编程
typedef struct PID_zhs { double P,I,D;//P.I.D系数 float curError;//当前误差 float lastError;//上次误差 float p ...
- C++ Primer : 第十三章 : 拷贝控制示例
/* Message.h */ #ifndef _MESSAGE_H_ #define _MESSAGE_H_ #include <iostream> #include <strin ...
- (Go)10.流程控制示例
package main import ( "math/rand" "fmt" ) func main() { //var n int n := rand.In ...
- 面向.NET开发人员的Dapr- actors 构建块
原文地址:https://docs.microsoft.com/en-us/dotnet/architecture/dapr-for-net-developers/actors The actor m ...
- SmartIDE v0.1.18 已经发布 - 助力阿里国产IDE OpenSumi 插件安装提速10倍、Dapr和Jupyter支持、CLI k8s支持
SmartIDE v0.1.18 (cli build 3538) 已经发布,在过去的Sprint 18中,我们集中精力推进对 k8s 远程工作区 的支持,同时继续扩展SmartIDE对不同技术栈的支 ...
- 为什么Dapr是比SpringCloud和Istio更优雅的微服务框架?
Dapr 是微软主导的云原生开源项目,2019年10月首次发布,到正式发布 V1.0 版本的不到一年的时间内,github star 数达到了 1.2万(现在已经超过1.7万星),超过同期的 kube ...
- TSR交通标志检测与识别
TSR交通标志检测与识别 说明: 传统图像处理算法的TSR集成在在ARM+DSP上运行,深度学习开发的TSR集成到FPGA上运行. 输入输出接口 Input: (1)图像视频分辨率(整型int) (2 ...
随机推荐
- Nginx(七):location的使用以及nginx关闭原理
上一篇中,我们了解了如何nginx的配置原则及解析框架,以及解析location配置的具体实现,相信大家对该部分已经有了比较深刻的认识. 本篇,我们进一步来了解下,解析之后的配置,如何应用到实际中的吧 ...
- .net code+vue 文件上传
后端技术 .net code 官方文档 https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/file-uploads?view=aspnet ...
- Windows和Linux下apache-artemis-2.10.0安装配置
window下安装配置 一.官网下载 http://activemq.apache.org/artemis/download.html 二.百度网盘下载 链接:https://pan.baidu.c ...
- 列出HBASE所有表的相关信息,如表名、创建时间等。
import java.io.IOException; import java.util.Collection; import java.util.Iterator; import org.apach ...
- 淘宝APP消息推送模型
为什么到了2020年,"统一推送联盟"依旧无法起显著作用? - 知乎 https://www.zhihu.com/question/370632447 https://mp.wei ...
- (转载)微软数据挖掘算法:Microsoft 时序算法(5)
前言 本篇文章同样是继续微软系列挖掘算法总结,前几篇主要是基于状态离散值或连续值进行推测和预测,所用的算法主要是三种:Microsoft决策树分析算法.Microsoft聚类分析算法.Microsof ...
- HDFS HBase Solr Which one? 从访问模式角度决策
HDFS 压缩性能最优.扫描速度最快:不支持随机访问,仅支持昂贵.复杂的文件查询 HBase适合随机访问 Solr 适合检索需求 HBase访问单个记录的时间为毫秒级别,而HDFS不支持随机访问. H ...
- 【转载】【GDB】GDB with Python
作者:薛定谔的喵链接:https://zhuanlan.zhihu.com/p/152274203来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 你还在用GDB调试程序 ...
- python中贪婪与非贪婪
Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符: 非贪婪则相反,总是尝试匹配尽可能少的字符. 在"*","?", ...
- 3分钟搞懂什么是WPF。
先推荐下猛哥(刘铁猛)的书籍 <深入浅出WPF>. 一直以来,完美的用户体验是桌面应用程序和Web应用程序中的一大障碍.许多开发人员绞尽脑汁将界面设计得美观炫丽些.互 动感强些,但费了九 ...