【愚公系列】2023年01月 Dapr分布式应用运行时-交通控制应用程序-01项目说明

举报
愚公搬代码 发表于 2023/01/31 21:35:05 2023/01/31
【摘要】 前言本文主要是讲解《面向 .NET 开发人员的 Dapr》实例程序的实操。有兴趣可以详看这本书。 1.交通控制应用程序业务说明交通控制示例应用程序模拟高速公路交通控制系统。 其用途是检测超速车辆,并向违规司机发送罚款通知。 这些系统实际上存在于现实生活中,下面是它们的工作原理。 一组摄像头(每个车道上方各一个)被放置在高速公路的起点和终点(假设该路段为 10 公里),没有上匝道或下匝道。 ...

前言

本文主要是讲解《面向 .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 缓存中。 当出口摄像头记录到车辆时,会调用该执行组件。 执行组件随后会计算平均车速,并可能得出超速违规结果。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。