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 ...
随机推荐
- Java中的Date类型无法赋值给数据库的datetime类型
因为Java中new Date()的结果是"Thu Aug 27 19:03:54 CST 2020",而mysql中的datetime不接受这样的日期格式,插入数据会报错. 解决 ...
- JavaScript学习总结(基础知识)
js代码引入 方式1: <script> alert('欢迎来到德玛西亚!') </script> 方式2:外部文件引入 src属性值为js文件路径 <script sr ...
- Java并发包源码学习系列:阻塞队列实现之LinkedBlockingQueue源码解析
目录 LinkedBlockingQueue概述 类图结构及重要字段 构造器 出队和入队操作 入队enqueue 出队dequeue 阻塞式操作 E take() 阻塞式获取 void put(E e ...
- Serverless对研发效能的变革和创新 云托管和Serverless应用差异
https://mp.weixin.qq.com/s/J4RXtKanh3IMr4fY7t0nyQ Serverless对研发效能的变革和创新 杨皓然(不瞋) 阿里巴巴中间件 2020-10-23
- 源码 redis 分布式锁
https://github.com/SPSCommerce/redlock-py/tree/master/redlock
- 风险识别系统-大数据智能风控管理平台-企业风控解决方案– 阿里云 https://www.aliyun.com/product/saf
风险识别系统-大数据智能风控管理平台-企业风控解决方案– 阿里云 https://www.aliyun.com/product/saf
- day133:2RenMJ:TypeScript的变量&函数&类&接口
目录 1.变量 2.函数 3.类 4.接口 1.变量 1.变量的声明 // 1.即指定数据类型 也指定值 var 变量名:类型 = 值; eg:var username:string = " ...
- python 字典的用法,访问、增删合并等
python字典可以存储任意类型的对象,字典的每个键:值 冒号(:)分割,每个对直接逗号(,)分割,整个字典包含在{}中,例如:d = {key1 : value1, key2 : value2, k ...
- java导出xls
package com.spring.mvc.xls; import java.io.File;import java.io.FileInputStream;import java.text.Deci ...
- 远程url文件地址转成byte
public static byte[] urlTobyte(String url) throws MalformedURLException { URL ur = new URL(url); Buf ...