第 4 章 交通管制示例应用

Introduction to the Traffic Control sample application | Microsoft Docs

在前面的章节种,你已经学习了基本的 Dapr 概念。见识了 Dapr 如何帮助你和你的团队在构建分布式应用的时候,降低架构和操作的复杂性。本章介绍你可以用来探索 Dapr 构建块的示例应用。

注意:

Dapr Traffic Control Github repo 下载示例应用。该仓库包含如何在你的机器上运行该示例应用的详细说明。

交通管制示例应用模拟高速公路的交通管制系统。它的目的是检测超速的汽车并给违章司机开罚款单。这类应用在现实中存在,这里是它是如何工作的。一组摄像头 (每条车道一个) 安装在一段没有出入口的高速公路的起始和结束点 (例如 10 公里) 。在汽车通过摄像头下方的时候,对该汽车拍照。使用光学字符识别 ( OCR ) 系统软件,从照片中提取汽车牌照号码。如果平均速度高于高速公路的限速,系统提取驾驶员信息,并自动开发罚单。

尽管该仿真系统很简单。系统的职责可以分为多个微服务。图 4-1 展示了应用程序中每个服务的概览。

图 4-1 示例应用中的服务

  • 摄像头仿真 是一个 .NET Core 的控制台应用程序,模拟汽车并发送消息到流量管控服务。每辆仿真的汽车都会调用进入和离开端点服务两者。
  • 交通管控服务 是一个 ASP.NET Core Web API 应用程序,提供 /entrycam/exitcam 两个端点。调用其中的一个端点服务可以模拟汽车分别通过旗下的入口或出口。请求消息中简单地包含了汽车牌照 ( 没有实现实际的 OCR )
  • FineCollection 服务 是一个 ASP.NET Core Web API 应用程序,只提供一个端点服务 /collectfine。调用此端点将发送罚款提示给超速汽车的驾驶员。请求的内容包含超速违章的所有信息
  • VehicleREgistration 服务 是一个 ASP.NET Core Web API 应用程序,提供一个端点 /vehicleinfo/{licensenumber}。通过在 URL 中提供的汽车牌照号码,获取超速汽车和汽车所有者的信息。

图 4-2 中的序列图展示了仿真的流程。

图 4-2 仿真流的序列图

服务之间的通讯通过直接调用其它的 API 实现。该设计可以使用,但是存在一些缺陷。

最大的问题是,如果调用链中的服务之一离线,那么整个调用链将中断。通过将解耦的服务之间的直接调用替换为异步消息可以解决该问题。异步消息通常使用消息中间件来实现,比如:RabbitMQ 或者 Azure Service Bus。

还有其它的缺陷,在流量管控系统中,汽车的状态信息是存储在内存中。当服务升级或者崩溃,而导致重新启动的时候,状态将会丢失。状态应当存储在服务之外。

使用 Dapr 构建块

Dapr 的一个目标就是对于微服务应用程序提供云原生的能力。该流量管控应用程序使用 Dapr 构建块来增强鲁棒性,并降低前面段落中提到的设计缺陷。图 4-3 展示了一个启用 Dapr 版本的流量管控应用程序。

图 4-3 使用 Dapr 构建块的流量管控应用该程序

  1. Service invocation Dapr 服务调用构建块处理 FineCollectionService 与 VehicleRegistrationService 之间的请求/响应通讯。由于该调用是一个查询,用来提取必须的数据来完成操作,同步调用是可以接受的。服务调用构建块提供服务发现。FineCollection 服务不再需要知道 VehicleRegistration 服务位于何处,它也实现了在 VehicleRegistration 服务离线时的自动重试。
  2. Publish & subscrit 发布和订阅构建块处理异步消息,用于从 TrafficControlService 发送超速违章到 FineCollectionService 服务。如果 FineCollectionService 服务暂时失效,数据将会累计在队列中,并在随后的事件重新恢复处理。RabbitMQ 作为当前的消息中间件,将消息从生产者传递给消费者。由于 Dapr 的 pub/sub 构建块抽象了消息中间件,开发人员不需要学习 RabbitMQ 客户端库的内部细节。切换到其它的消息中间件也不需要代码变更,只需要修改配置。
  3. State management TrafficControl 服务使用状态管理构建块在服务之外的 Redis 缓存中持久化汽车状态。与 pub/sub 类似,开发人员也不需要学习 Redis 特定的 API,切换到其它数据存储也不需要修改代码。
  4. Output binding FineCollection 服务通过电子邮件将罚单发送给超速汽车的所有者。Dapr SMTP 输出绑定抽象了基于 SMTP 协议的电子邮件传输细节。
  5. Input binding CameraSimulation 使用 MQTT 协议将模拟的汽车消息发送给 TrafficControll 服务。它使用 .NET MQT 库发送消息到 Mosquito - 这是一个轻量级的 MQTT 中间件。TrafficControl 服务使用 Dapr 的 MQTT 绑定来订阅 MQTT 中间件,并接收消息。
  6. Secrets management FineCollectionService 需要认证才能连接到 SMTP 服务器,而且罚款计算组件也需要一个内容的授权码。这里使用密钥管理构建块来获取认证凭据和授权码。
  7. Actors TrafficControlService 有一个基于 Dapr 执行人的替换实现。在该实现中,TrafficControl 服务针对每个入口摄像机的企业创建一个新的执行人。汽车的牌照号码赋予 Actor ID。执行人封装了该汽车的状态。它被持久在 Redis 缓存中。当汽车被离开摄像头登记的时候,调用该执行人。执行人然后计算出平均速度,并可能开出超速罚单。

图 4-4 展示了所有 Dapr 构建块的执行序列图

图 4-4 Dapr 构建块的执行序列图

本书后面的每一章将专门针对一个 Dapr 构建块。每章将深入说明该构建块是如何工作、如何配置、以及如何使用它。每章说明在流量管控应用程序中是如何使用该构建块的。

托管

流量管控应用程序既可以运行在自寄宿模式,也可以运行在 Kubernetes 中。

自寄宿模式

在示例的仓储中,包含了在你的本地机器上,以 Docker 容器的方式,启动基础服务架构的 PowerShell 脚本 (Redis, RabbitMQ, and Mosquitto)。脚本位于 src/Infrastructure 文件夹中。对于应用程序中的每个应用程序服务,在仓储中对应一个独立的文件夹,每个文件夹中包含一个名为 start-selfhosted.ps1 的 PowerShell 脚本,用来启动 Dapr 服务。

Kubernetes 模式

示例仓储中的 src/k8s 文件夹中包含了在 Kubernetes 中使用 Dapr 运行应用程序的 Kubernetes 说明文件 ( 包括基础架构服务 )。 该文件夹中还包括了用来在 Kubernetes 中启动和停止解决方案的 start.ps1stop.ps1 PowerShell 脚本。所有的服务都运行在 dapr-trafficcontrol 命名空间中。

总结

流量管控示例应用程序时一个微服务应用程序,用来模拟高速公路的超速管理。

该应用程序使用多个 Dapr 构建块来变得更稳健和云原生。示例尽可能简化以主要关注于 Dapr。

后继的章节将使用该示例应用程序来介绍 Dapr 构建块。

参考

Dapr-4: 交通管制示例应用的更多相关文章

  1. Dapr 交通控制示例

    Dapr 已在塔架就位 将发射新一代微服务 牛年 dotnet云原生技术趋势 Dapr是如何简化微服务的开发和部署 前面几篇文章都是从大的方面给大家分享Dapr 能帮助我们解决什么问题,微软从开源到1 ...

  2. Dapr Java Http 调用

    版本介绍 Java 版本:8 Dapr Java SKD 版本:0.9.2 Dapr Java-SDK HTTP 调用文档 有个先决条件,内容如下: Dapr and Dapr CLI. Java J ...

  3. 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序

    上一篇:手把手教你学Dapr - 2. 必须知道的概念 注意: 文章中提到的命令行工具即是Windows Terminal/PowerShell/cmd其中的一个,推荐使用Windows Termin ...

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

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

  5. 技术分享:Dapr,让开发人员更轻松地构建微服务应用

    最近一直在学习微服务相关的技术.微服务架构已成为构建云原生应用程序的标准,并且可以预见,到2022年,将有90%的新应用程序采用微服务架构.微服务架构提供了令人信服的好处,包括可伸缩性,松散的服务耦合 ...

  6. 微软的分布式应用框架 Dapr

    微服务架构已成为构建云原生应用程序的标准,微服务架构提供了令人信服的好处,包括可伸缩性,松散的服务耦合和独立部署,但是这种方法的成本很高,需要了解和熟练掌握分布式系统.为了使用所有开发人员能够使用任何 ...

  7. dapr微服务.netcore sdk入门

    Actors入门 先决条件 .Net Core SDK 3.0 Dapr CLI Dapr DotNet SDK 概述 本文档描述如何在客户端应用程序上创建Actor(MyActor)并调用其方法. ...

  8. Dapr 运用之 Java gRPC 调用篇

    JAVA GRPC 服务与调用 安装协议编译器 下载对应的版本编译器,并把路径加入到环境变量中,执行以下命令生成代码 protoc -I=$SRC_DIR --java_out=$DST_DIR $S ...

  9. .NetCore集成Dapr踩坑经历

    该篇内容由个人博客点击跳转同步更新!转载请注明出处 前言 之前自己有个core2.2的项目一直是用的Surging作为微服务框架的,后来了解到了Dapr,发现比较轻量级,开发部署等也非常方便,故将自己 ...

  10. 通过示例学习rholang(下部:课程8-13)

    课程8——状态通道和方法 保存数据 到现在为止,你已经很擅长于发送数据到元组空间和从元组空间中获取数据.但是无论你在什么时候进行计算,你有时需要把一些数据放在一边晚点才使用.几乎所有编程语言都有变量的 ...

随机推荐

  1. AD域下,普通用户环境下安装软件需要管理员权限的解决办法

    原理:将AD域普通用户添加到管理组中,使其拥有管理员权限 做法: 1.切换到AD域管理员账户: 2.计算机 -> 管理 -> 用户和组 -> 组 -> Administrato ...

  2. MySQL笔记--数据库定时备份与恢复

    利用crontab定时.利用mysqldump备份 编写sh启动脚本时记得赋予执行权限(x) 如果没有mysqldump命令执行,基于centos7 yum -y install mysql-clie ...

  3. 简单粗暴的实现 Blazor Server 登录鉴权

    既然是简单粗暴,那么就不用关心诸如 IDentityServer4,OAuth 之类的组件,也不使用 AuthenticationStateProvider.IAuthService, razor 页 ...

  4. Android内存分析命令

    一.内存指标 Item 全称 含义 等价 USS Unique Set Size 物理内存 进程独占的内存 PSS Proportional Set Size 物理内存 PSS= USS+ 按比例包含 ...

  5. 一次生产 KubeSphere 日志无法正常采集事件解决记录

    作者:宇轩辞白,运维研发工程师,目前专注于云原生.Kubernetes.容器.Linux.运维自动化等领域. 前言 2023 年 11 月 7 号下午,研发同事反馈,项目线上日志平台某个服务无法查看近 ...

  6. 中国移动基于 Kubernetes 的物联网边缘计算应用实践

    作者:何毓川,中移物联网,云计算开发高级工程师 EdgeBox简介 中移物联网是中国移动集团在物联网方向的专业研发子公司,在各个垂直行业都有非常丰富和完成的解决方案. 本文通过中移物联网的物联网边缘计 ...

  7. jmeter使用beanshell完成签名计算,附与python代码对比

    签名计算过程: 1.ticket计算:时间戳加+随机数字拼接后md5加密 2.组装公共参数+ticket+时间戳+业务参数 beanshell代码实现: import java.util.*;impo ...

  8. 华为IPv6 GRE隧道

    IPv6 over IPv4 GRE封装隧道 实验目标: 该实验参考了华为官网案例配置 https://support.huawei.com/enterprise/zh/doc/EDOC1000097 ...

  9. 全局负载均衡、CDN内容分发的原理与实践

    CDN简介 CDN的全称是Content Delivery Network,即内容分发网络.CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发. ...

  10. javap和字节码

    javap 字节码的基本信息 public class Test { private int age = 10; public int getAge() { return age; } } 在 cla ...