前面几篇文章都是从大的方面给大家分享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个端点: EntrycamExitCam.
  • 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:

Dapr 交通控制示例的更多相关文章

  1. Struts2使用拦截器完成权限控制示例

    http://aumy2008.iteye.com/blog/146952 Struts2使用拦截器完成权限控制示例 示例需求:    要求用户登录,且必须为指定用户名才可以查看系统中某个视图资源:否 ...

  2. 【C++ Primer 第十三章】4. 拷贝控制示例

    拷贝控制示例 #include<iostream> #include<string> #include<set> #include<vector> us ...

  3. PID控制示例C编程

    typedef struct PID_zhs { double P,I,D;//P.I.D系数 float curError;//当前误差 float lastError;//上次误差 float p ...

  4. C++ Primer : 第十三章 : 拷贝控制示例

    /* Message.h */ #ifndef _MESSAGE_H_ #define _MESSAGE_H_ #include <iostream> #include <strin ...

  5. (Go)10.流程控制示例

    package main import ( "math/rand" "fmt" ) func main() { //var n int n := rand.In ...

  6. 面向.NET开发人员的Dapr- actors 构建块

    原文地址:https://docs.microsoft.com/en-us/dotnet/architecture/dapr-for-net-developers/actors The actor m ...

  7. SmartIDE v0.1.18 已经发布 - 助力阿里国产IDE OpenSumi 插件安装提速10倍、Dapr和Jupyter支持、CLI k8s支持

    SmartIDE v0.1.18 (cli build 3538) 已经发布,在过去的Sprint 18中,我们集中精力推进对 k8s 远程工作区 的支持,同时继续扩展SmartIDE对不同技术栈的支 ...

  8. 为什么Dapr是比SpringCloud和Istio更优雅的微服务框架?

    Dapr 是微软主导的云原生开源项目,2019年10月首次发布,到正式发布 V1.0 版本的不到一年的时间内,github star 数达到了 1.2万(现在已经超过1.7万星),超过同期的 kube ...

  9. TSR交通标志检测与识别

    TSR交通标志检测与识别 说明: 传统图像处理算法的TSR集成在在ARM+DSP上运行,深度学习开发的TSR集成到FPGA上运行. 输入输出接口 Input: (1)图像视频分辨率(整型int) (2 ...

随机推荐

  1. 30分钟带你理解 Raft 算法

    为什么需要 Raft? Raft 是什么? Raft 的目标 前置条件:复制状态机 Raft 基础 Leader 选举(选举安全特性) 日志复制(Leader只附加.日志匹配) 安全 学习资料 使用 ...

  2. 开心!再也不用担心 IntelliJ IDEA 试用过期了

    背景 前段时间 Review 团队小伙伴代码,发现当他把鼠标挪到一个方法上时,就自动显示了该方法的所有注释信息,像下图这样,他和我用的 IDE 都是 IntelliJ IDEA. 而我还按古老的方式, ...

  3. 前端面试之JavaScript中数组的方法!【残缺版!!】

    前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...

  4. jQuery 点击当前展开其他隐藏

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  5. Go Proverbs

    https://github.com/go-proverbs/go-proverbs.github.io Go Proverbs Simple, Poetic, Pithy Don't communi ...

  6. Vue技术点整理-指令

    我们通常给一个元素添加 v-if / v-show 来做权限管理,但如果判断条件繁琐且多个地方需要判断,这种方式的代码不仅不优雅而且冗余. 针对这种情况,我们可以通过全局自定义指令来处理:我们先在新建 ...

  7. JVM详解总结

    JVM详解总结 1.JVM内存模型 1.1 运行时数据区内存分布实例 1.2 类加载的生命周期 2.物理内存与虚拟内存 3.Java中需要使用内存的组件 3.1 Java堆 3.2 线程 3.3 类和 ...

  8. Spark-1.6.1 Hadoop-2.6.4 VMware Ubuntu 分布式集群搭建 全过程

    本文从头开始零基础完全配置,适合小白. 本文在vmware中配置三台虚拟机,一台做Master,两台Worker,hadoop 和spark只需要在Master上配置,然后cp到worker上,包括配 ...

  9. Linux忽略大小写的查找技巧(转)

    1.vim 中的查找 Linux 下 vim搜索文件内容时加上 \c 参数可以忽略搜索字符的大小写. 比如用vim 搜索文件中的 China 时 可用 :/china\c 2. find 查找 Lin ...

  10. pytest内核测试平台落地初体验

    测试平台,有人说它鸡肋,有人说它有用,有人说它轮子,众说纷纭,不如从自身出发,考虑是否要做测试平台: 第1阶段,用Python+requests写接口自动化. 第2阶段,选择unitttest或pyt ...