【愚公系列】2023年01月 Dapr分布式应用运行时-交通控制应用程序
文章目录
前言
本文主要是讲解《面向 .NET 开发人员的 Dapr》实例程序的实操。
有兴趣可以详看这本书。
1.交通控制应用程序业务说明
交通控制示例应用程序模拟高速公路交通控制系统。 其用途是检测超速车辆,并向违规司机发送罚款通知。 这些系统实际上存在于现实生活中,下面是它们的工作原理。 一组摄像头(每个车道上方各一个)被放置在高速公路的起点和终点(假设该路段为 10 公里),没有上匝道或下匝道。 当车辆在摄像头下方经过时,摄像头会拍摄车辆照片。 使用光学字符识别 (OCR) 软件,从照片中提取车辆的车牌号。 系统使用每个车辆的入口和出口时间戳来计算该车辆的平均速度。 如果平均速度高于高速公路的最大速度限制,系统会检索司机信息并自动发送罚款通知。
一、交通控制应用程序概述
所需环境
Attribute | Details |
---|---|
Dapr runtime version | v1.9.3 |
Dapr.NET SDK version | v1.9.0 |
Dapr CLI version | v1.9.1 |
Language | C# |
Platform | .NET 6 (SDK 6.0.402) |
Environment | Self hosted or Kubernetes |
1.架构说明
- 摄像头模拟是一种控制台应用程序,它模拟车辆并将消息发送到 TrafficControl 服务。 每个模拟汽车都会调用入口和出口服务终结点。
- TrafficControl 服务是一种 ASP.NET Core Web API 应用程序,它会公开 /entrycam 和/exitcam 终结点。 调用的终结点将模拟每个经过入口或出口摄像头的车。 请求消息有效负载仅包含车辆牌照(没有实现实际 OCR)。
- FineCollection 服务是一种 ASP.NET Core Web API 应用程序,它提供1个终结点:/collectfine。 调用此终结点将向超速车辆的司机发送罚款通知。 有效负载包含关于超速违规的所有信息。
- VehicleRegistration 服务是一种 ASP.NET Core Web API 应用程序,它提供 1个终结点:/vehicleinfo/{licensenumber}。 它用于根据URL中发送的牌照号码(例如/vehicleinfo/RV-752-S)获取超速车辆的车辆信息和车主信息。
2.流程说明
服务通过直接调用彼此的 API 进行通信。 此设计可以正常运作。
设计难点如下:
问题 | 解决方案 |
---|---|
如果其中一项服务处于脱机状态,则调用链将中断 | 通过将直接调用替换为异步消息传递来分离服务,可以解决此问题。 异步消息传送通常使用消息代理(如 RabbitMQ 或 Azure 服务总线)来实现。 |
每个车辆的车辆状态都存储在 TrafficControl 服务的内存中。 如果服务在更新或崩溃后重新启动,则此状态将丢失 | 要提高系统持久性,应将状态存储在服务外部。 |
3.dapr通信说明
Dapr 的目标之一是为微服务应用程序提供云原生功能。 交通控制应用程序使用 Dapr 构建基块来提高可靠性并缓解上文所述的设计缺陷所带来的影响。
- 服务调用 Dapr 服务调用构建块处理 FineCollectionService 和 VehicleRegistrationService 之间的请求/响应通信。因为该调用是检索完成操作所需数据的查询,所以此处可以接受同步调用。 服务调用构建基块提供服务发现。 FineCollection服务不再需要知道 VehicleRegistration 服务所在的位置。 如果 VehicleRegistration服务脱机,它还会实现自动重试。
- 发布 & 订阅 发布和订阅构建基块可处理异步消息传送,以便将 TrafficControl 服务中的超速违规信息发送到FineCollectionService。 此实现能分离 TrafficControl 和 FineCollection 服务。 如果FineCollectionService 暂时不可用,数据会在队列中累积,并在稍后恢复处理。 RabbitMQ是当前的消息代理,用于将消息从生成方传输到使用方。 因为 Dapr 发布/订阅构建基块将消息代理抽象化,所以开发人员无需了解RabbitMQ 客户端库的详细信息。 切换到另一个消息代理时,不需要更改代码,只需完成配置。
- 状态管理 TrafficControl 服务使用状态管理构建基块将车辆状态持久保存服务之外的 Redis 缓存中。与发布/订阅一样,开发人员无需了解 Redis 特定的 API。 切换到另一个数据存储时,不需要更改代码。
- 输出绑定 FineCollection 服务通过电子邮件将罚款信息发送给超速车辆的车主。 SMTP 的 Dapr 输出绑定使用 SMTP协议将电子邮件传输抽象化。
- 输入绑定 CameraSimulation 使用 MQTT 协议将包含模拟车辆信息的消息发送至 TrafficControl 服务。它使用 .NET MQTT 库将消息发送到 Mosquitto,Mosquitto 是轻量型的 MQTT 代理。TrafficControl 服务使用 MQTT 的 Dapr 输入绑定来订阅 MQTT 代理并接收消息。
- 机密管理 FineCollectionService 需要用于连接到 SMTP 服务器的凭据以及内部使用的罚款计算器组件的许可证密钥。它使用机密管理构建基块来获取凭据和许可证密钥。
- 执行组件 TrafficControlService 具有基于 Dapr 执行组件的替代实现。 在此实现中,TrafficControl服务会针对入口摄像头记录的每个车辆创建一个新的执行组件。 车辆的牌照号码构成唯一的执行组件 ID。执行组件封装车辆状态,并将其持久保存在Redis 缓存中。 当出口摄像头记录到车辆时,会调用该执行组件。 执行组件随后会计算平均车速,并可能得出超速违规结果。
二、交通控制应用程序测试
1.以Dapr自托管模式运行应用程序
在自托管模式下,一切都将在本地计算机上运行。为了防止端口冲突,所有服务都侦听不同的HTTP端口。使用Dapr运行服务时,需要额外的端口voor HTTP和gRPC与Sidecar通信。默认情况下,这些端口为“3500”和“50001”。但为了避免混淆,您将在分配中使用完全不同的端口号。服务将使用以下端口:
Service | Application Port | Dapr sidecar HTTP port | Dapr sidecar gRPC port |
---|---|---|---|
TrafficControlService | 6000 | 3600 | 60000 |
FineCollectionService | 6001 | 3601 | 60001 |
VehicleRegistrationService | 6002 | 3602 | 60002 |
相关文章
- windows以管理员身份运行服务bat
- arcgis runtime for android 100.13.0 入门系列,一、初步引入与运行
- 2.基于Containerd运行时搭建Kubernetes多控制平面集群实践
- 用python删除文件_python运行另一个py文件
- JMeter 测试笔记(二):组件及运行原理
- AI 对话模型被网友玩坏了!这次还可以运行 Docker 容器...
- Spark入门实战系列–6.SparkSQL(中)–深入了解SparkSQL运行计划及调优详解大数据
- Nodejs的运行原理-模块载入篇详解编程语言
- 探索Linux的不同运行模式(linux运行模式)
- 程序Linux实现Windows程序互通(让linux运行win)
- Linux 24小时不间断运行,连续挑战极限(linuxat24)
- MSSQL查询SQL日志:深入了解服务器运行情况(mssql查询sql日志)
- 命令行运行MySQL出现错误(cmd运行mysql错误)
- 追踪Redis集群运行的日志记录(redis集群的运行日志)