第 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. 【赵渝强老师】大数据工作流引擎Oozie

    一.什么是工作流? 工作流(WorkFlow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算.工作流要解决的主要问题是:为实现某 ...

  2. 分布式缓存 - 缓存服务器 - redis

    如果一般的缓存可以解决问题,就不必使用分布式缓存 : 一般使用分布式缓存 都是使用 redis : 使用教程: 1. 安装包 Microsoft.Extensions.Caching.StackExc ...

  3. Docker升阶

    一.Docker镜像 镜像的定义:镜像是一种轻量级.可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码.运行时需要的库以及环境变量和 ...

  4. 霍夫(Hough)直线变换(直线检测)

    0 原理 霍夫变换在检测各种形状的的技术中非常流行,如果你要检测的形状可以用数学表达式写出,你就可以是使用霍夫变换检测它.及时要检测的形状存在一点破坏或者扭曲也可以使用.我们下面就看看如何使用霍夫变换 ...

  5. 使用VMware Workstation创建的虚拟机无法连接网络解决方法

    引言:最近打开虚拟机老是连接不上网络,在网上找这前两个方法试还是一直不行,最后才知道忘记重启DHCP service和NAT service 1.查看虚拟机的设置,确保虚拟机网络连接的方式勾选的是NA ...

  6. CentOS环境下OpenSSH9.8p1升级实践

    安装Telnet服务 为了避免升级OpenSSH导致服务器不可连接.需要先下载安装Telnet组件.升级期间使用Telnet作为升级期间的服务器连接方式. 先查询telnet是否安装 rpm -qa ...

  7. SVN上的修改提交时间、作者以及简单的SVN操作说明

    情况说明 因为部分SVN记录上传时间不符合规范,需要修改因此有这个需求.默认情况下SVN是不允许修改时间和作者信息,需要服务器进行配置. 一.服务的配置变更 我用的是Windows版本,在这个地方配置 ...

  8. 对于特定的游戏问题使用启发式算法可以取得比AI算法更好的表现

    相关: Using A.I. to DOMINATE NERDS in TETRIS 有些问题的求解可以通过建模将其转换为强化学习问题,然后再使用强化学习算法对其进行求解,但是很多问题如果不建模为强化 ...

  9. Windows系统DOS命令详解

    一. DOS 的历史 DOS(Disk Operating System),磁盘操作系统 1980 年,西雅图程序员蒂姆-帕特森,86-DOS 1981 年由微软公司购买并改进,更名为 MS-DOS ...

  10. 关于Requests交互超时的处理方式

    拿 https://aes.cryptohack.org/ecb_oracle 这道题来做示范. 由于这个链接的本地服务器在外国,因此我们很容易就会连接超时. 如下一个脚本: import reque ...