Dapr 交通流量控制示例

前面几篇文章都是从大的方面给大家分享Dapr 能帮助我们解决什么问题,微软从开源到1.0 也是经过2年的时间开发,因此我写了这几篇文章也只能是带领大家对Dapr 有个大的印象,真正对Dapr 有认知上的直观感受还是要从示例代码中去体验了,因此今天给大家分享一个交通控制的示例程序,帮助大家对Dapr 的理解更进一步。2020年的中国.NET开发者峰会朱永光有专门介绍了Dapr,他的演讲中也引用了这个示例,朱永光的演讲视频请看:https://live.csdn.net/room/dotnetconf/1v1d3YbH 。这个示例是github上的一位荷兰的 MVP 写的https://github.com/EdwinVW/dapr-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(用于发送超速罚单)

下面的序列图描述了仿真的工作方式:

  1. Simulation 模拟生成汽车车牌号并发送一个消息 VehicleRegistered (包含汽车车牌号, 一个随机的泳道 (1-3) 和时间戳) 到服务 TrafficControlService 的端点 EntryCam .

  2. TrafficControlService 调用 GovernmentService 服务的 RDW 的端点 检索对应的汽车号牌车辆的品牌和型号

  3. TrafficControlService 在 state-store 里 存储VehicleState (车辆信息和进入时间戳) .

  4. 一些随机间隔之后, Simulation 发送 VehicleRegistered 消息到 TrafficControlService 服务的端点 ExitCam (含有在步骤1中产生的汽车号牌,随机出口车道(1-3)和出口时间戳).

  5. TrafficControlService 从state-store中获取 VehicleState .

  6. TrafficControlService使用 进入和出去的时间戳 计算平均速度.

  7. 如果平均速度高于速度极限时, TrafficControlService 将发送 SpeedingViolationDetected 消息 (包含车辆的车票,路面的标识符,高速化违反KMH和违规的时间戳) 到 GovernmentService 的端点 CJIB .

  8. GovernmentService 计算超速违章罚款和模拟发送超速票给车主

在执行过程中,此序列中描述的所有操作都会记录到控制台,因此您可以按照流程进行操作。

Dapr

此示例使用 Dapr 实现应用程序的多个方面。在下面的图中,看到的是架构概述

  1. 对于通信消息, 使用 发布和订阅 构建块来实现.

  2. 对于 request/response 型的服务通信 ,使用 服务到服务调用 构建块来实现.

  3. 对于车辆状态的存储,使用 状态管理 构建块来实现.

  4. 服务GovernmentService 中的 VehicleInfoController 有一个操作 GetVehicleInfo 使用VehicleInfoRepository 获取车辆数据. 这个 repository 的构造函数需要一个连接字符串作为参数。这个连接字符串存储在一个secrets 文件里。服务 GovernmentService 使用 secrets management 构建块带一个本地文件组件来获取连接字符串.

在这个例子里, Redis 组件既用于状态管理,又用于 pub/sub.

使用 Dapr 的 self-hosted 模式运行示例

执行以下步骤以在自托管模式下运行示例应用程序:

  1. 确保你已经在你的计算机上 安装Dapr的 self-hosted 模式,具体参考文档 Dapr documentation,中文的请看朱永光写的 Dapr微服务应用开发系列1:环境配置.

  2. 打开三个独立的命令行窗口.

  3. 在第一个命令行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
    
  4. 在第二个命令行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
    
  5. 在第三个命令行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:

相关文章:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值