使用 .NET 的 Dev Proxy 构建和测试弹性应用

https://devblogs.microsoft.com/dotnet/build-test-resilient-apps-dotnet-dev-proxy/

在构建连接到 API 的应用时,我们通常专注于让应用正常工作。但是,当 API 速度慢、返回错误或不可用时会发生什么?你最不想看到的就是当你的应用程序坏了时,一个愤怒的客户给你打电话。但是,当你不控制集成的 API 时,很难模拟你的应用将如何处理这些场景。除非您使用 Dev Proxy。

连接到 API 的难点

如今,很难想象一个应用程序没有连接到 API。我们将 API 用于所有事情:从获取数据到执行操作。但是,使用 API 不仅仅是发出请求并获得响应。您使用的 API 无法按预期工作只是时间问题。如果你没有考虑过,你会给自己带来麻烦。让我告诉你怎么做。

您发布了一个新的 Web 应用程序,它运行良好。但真的是这样吗?

假设您正在构建一个连接到 API 以获取产品的应用程序。您还可以与外部服务集成以获取其他产品信息。在开发中,你使用这两个 API 的开发版本,只有你和团队中的其他几个开发人员使用。您的应用既快速又可靠。它只是工作。然后,将应用部署到生产环境。它一炮而红。事实上,你的应用非常成功,以至于你集成的外部服务无法再处理负载并开始返回错误。您的应用中断了。客户不满意地离开并去找竞争对手。你能预料到这一点吗?您能否以不同的方式构建应用来处理这种情况?

模拟 API 错误和行为(如速率限制或限制)并非不可能,但很难。通常,你无法控制你集成的 API,所以为了模拟它们的不同行为,你最终会编写复杂的模拟——一堆你不会发布的代码。至少可以说,这是低效的,但这是唯一的方法,不是吗?差一点。

使用 Dev Proxy 模拟 API 行为

如果我告诉你,有一种方法可以让你测试你的应用如何处理你连接到的 任何 API 的任何行为,而不必更改应用中的一行代码,你会怎么样?

Dev Proxy 是一个 API 模拟器,可用于模拟不同的 API 行为,而无需更改应用的一行代码。没错。使用 Dev Proxy,您可以模拟错误、延迟、速率限制等。一直以来,您的应用程序都认为它已连接到真正的 API!Dev Proxy 允许你确保应用在连接到的 API 中断时不会惨遭失败。愤怒的客户或客户经理不再打来电话,要求你放下一切来灭火。

Dev Proxy 是如何工作的?

Dev Proxy 是在开发计算机上本地运行的 Web 代理。在启动它之前,您可以将其配置为监视对特定 URL 的请求。然后,定义它应该如何处理这些请求:它应该返回预定义的响应、引发错误、延迟响应或模拟速率限制,还是其他行为?当您启动 Dev Proxy 时,它会将自身注册为您的系统代理,并拦截与您配置的 URL 匹配的所有请求。然后,它会应用您定义的行为。你的应用不知道它没有与真正的 API 通信。它只是得到回应,就好像它是一样。这使它成为测试应用如何处理不同 API 行为的好方法。让我们看看如何使用 Dev Proxy 在示例 .NET Aspire 应用中模拟 API 行为。

示例案例:使用 Dev Proxy 改进 .NET Aspire 应用

请考虑使用 .NET Aspire 构建的此示例电子商务应用。它由多个服务组成,包括产品目录的 API。它实现默认的弹性模式。让我们使用 Dev Proxy 模拟不同的 API 行为来测试默认应用的配置,并提高应用的弹性。

让我们从启动应用程序开始,找出产品目录 API 的 URL。我们将配置 Dev Proxy 以拦截对此 URL 的请求并模拟不同的行为。产品目录 API 可在 http://localhost:5222 上获得。

模拟 API 限制

让我们启动 Dev Proxy 并将其配置为拦截对此 URL 的所有请求:

devproxy --urls-to-watch “http://localhost:5222/*”

在此示例中,我们将使用默认的 Dev Proxy 配置,该配置模拟了几个常见的 API 错误,以及延迟和限制。您可以通过其配置文件和它包含的插件集合来控制 Dev Proxy 设置。

现在,让我们重新启动 .NET Aspire 应用,将其配置为使用开发代理作为系统代理。它将通过 Dev Proxy 将所有请求路由到产品目录 API,这将模拟不同的行为。

HTTP_PROXY=http://127.0.0.1:8000 dotnet run --project src/eShop.AppHost/eShop.AppHost.csproj

让我们从导航到产品目录开始。报错啦!

回到终端,我们可以看到 Dev Proxy 模拟了 429 个请求过多的错误,指示客户端回退 5 秒钟。虽然该应用程序内置了弹性功能,但它还是并行发出多个请求,这使得它看起来不遵循后退并导致 Dev Proxy 使请求失败。在几次尝试调用 API 失败后,应用放弃并在浏览器中显示原始堆栈跟踪。

我们如何提高应用的弹性以处理这种情况?首先,我们应该考虑捕获 API 异常并以用户友好的方式显示它。它不仅可以帮助我们处理限制,还可以帮助我们处理其他 API 错误。我们还应该考虑以不同的方式处理限制,以确保应用正确回退,并让 API 有时间恢复。

这只是可以使用 Dev Proxy 模拟的一个场景。您还可以模拟其他 API 行为,例如延迟、速率限制等。这样一来,你就可以测试应用如何处理不同的 API 行为,而无需更改应用的一行代码。使用 Dev Proxy 是测试弹性代码在最需要时是否按预期工作的好方法。

总结

当您连接到应用中的 API 时,您需要考虑的不仅仅是让应用正常工作。您使用的 API 失败只是时间问题。当他们这样做时,你要确保你的应用能够正确处理它,并且不会丢失你的客户数据。Dev Proxy 允许你轻松模拟不同的 API 行为,而无需更改应用的一行代码。借助 Dev Proxy,您可以放心地将应用部署到生产环境,而不必担心在应用出现故障时愤怒的客户会打电话给您。

在您的应用程序上 试用 Dev Proxy,并亲自查看如何改进它。

参考

使用 .NET 的 Dev Proxy 构建和测试弹性应用的更多相关文章

  1. 如何利用Azure DevOps快速实现自动化构建、测试、打包及部署

    前两天有朋友问我,微软的Azure好用吗,适不适合国人的使用习惯,我就跟他讲了下,Azue很好用,这也是为什么微软云营收一直涨涨涨的原因,基本可以再1个小时内实现自动化构建.打包以及部署到Azure服 ...

  2. CoreCRM 开发实录——Travis-CI 实现 .NET Core 程度在 macOS 上的构建和测试 [无水干货]

    上一篇文章我提到:为了使用"国货",我把 Linux 上的构建和测试委托给了 DaoCloud,而 Travis-CI 不能放着不用啊.还好,这货支持 macOS 系统.所以就把 ...

  3. 基于soapUI构建WebService测试框架

    基于soapUI构建WebService测试框架 http://www.docin.com/p-775523285.html

  4. 测试驱动 ASP.NET MVC 和构建可测试 ASP.NET MVC 应用程序

    [测试驱动 ASP.NET MVC] http://t.cn/8kdi4Wl [构建可测试 ASP.NET MVC 应用程序]http://t.cn/8kdi4Wj

  5. selenium结合docker构建分布式测试环境

    selenium是目前web和app自动化测试的主要框架.对于web自动化测试而言,由于selenium2.0以后socker服务器由本地浏览器自己启动且直接通过浏览器原生API操作页面,故越来越多的 ...

  6. 使用Bitbucket Pipeline进行.Net Core项目的自动构建、测试和部署

    1. 引言 首先,Bitbucket提供支持Mercurial和Git版本控制系统的网络托管服务.简单来说,它类似于GitHub,不同之处在于它支持个人免费创建私有项目仓库.除此之外,Bitbucke ...

  7. Spring Boot -05- 多模块结构项目构建与测试(详细图文教程)IDEA 版

    Spring Boot -05- 多模块结构项目构建与测试(详细图文教程)IDEA 版 百度很多博客都不详细,弄了半天才把 Spring Boot 多模块项目构建开发整的差不多,特地重新创建配置,记录 ...

  8. 使用Maven构建和测试Java项目

    我们在创建项目时要学习的是如何使用 Maven 来创建一个 Java 应用程序.现在将学习如何构建和测试应用程序. 进入到 C:\MVN 目录我们准备创建来 java应用程序.打开 consumerB ...

  9. selenium 结合 docker 构建分布式测试环境 (初学者视角)

    前言:随着自动化测试越学越深,深深觉得有太多的东西需要总结. 1.记录下学习中遇到的坑,当做学习笔记.2.有前人路过看到文章中比较落后的做法,请务必一定要指教.(因为是初学者视角,很多东西只是走通而已 ...

  10. Java-Maven-Runoob:Maven 构建 & 项目测试

    ylbtech-Java-Maven-Runoob:Maven 构建 & 项目测试 1.返回顶部 1. Maven 构建 & 项目测试 在上一章节中我们学会了如何使用 Maven 创建 ...

随机推荐

  1. WebBrowser中打开新页面

    要求新打开的网页受控于WebBrowser 解决办法很简单,分两情况,一是在当前WebBrowser中打开新页面,二是在新Form中的WebBrowser中打开新页面: public Form1() ...

  2. 使用GRUB Multiboot2引导自制操作系统

    使用GRUB Multiboot2引导自制操作系统 前言 之前花了一周时间,从头学习了传统 BIOS 的启动流程.惊讶于背后丰富的技术细节的同时,也感叹 x86 架构那厚重的历史包袱.毕竟,谁能想到, ...

  3. USB总线-Linux内核USB3.0 Hub驱动分析(十四)

    1.概述 USB Hub提供了连接USB主机和USB设备的电气接口.USB Hub拥有一个上行口,至少一个下行口,上行口连接上一级的Hub的下行口或者USB主机,连接主机的为Root Hub,下行口连 ...

  4. 介绍一下 websocket

    一般的http请求都是短连接,而webpack的使用可以建立长连接 : 什么是 websocket websocket 是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双 ...

  5. kotlin集合——>集合操作概述、集合转换

    1. 集合操作概述: Kotlin 标准库提供了用于对集合执行操作的多种函数.这包括简单的操作,例如获取或添加元素,以及 更复杂的操作,包括搜索.排序.过滤.转换等 1.1 扩展与成员函数 集合操作在 ...

  6. FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频

    ​<FFmpeg开发实战:从零基础到短视频上线>一书的"5.1.2  把音频流保存为PCM文件"介绍了如何把媒体文件中的音频流转存为原始的PCM音频,在样例代码的转存过 ...

  7. HTML 中 script 标签的属性和加载顺序

    script 标签默认是阻塞加载的,也就是先下载src内容,然后执行src内容,然后再往后读文档 head 中的 script 按顺序加载执行,然后再加载 body 的元素. 把 script 移动到 ...

  8. nginx配置tomcat的负载均衡记录

    实现效果 (1)浏览器地址栏输入地址 http://192.168.17.129/edu/a.html,负载均衡效果,平均在 8080和 8081 端口中. 准备工作 (1)准备两台 tomcat 服 ...

  9. Python-提高-2

    阅读目录 1.多继承以及MRO顺序 2.再论静态方法和类方法 3.property属性-讲解 4.property属性-应用 5.魔法属性 6.面向对象设计 7.with与"上下文管理器&q ...

  10. 字符串、列表、元组、字典(python)

    文章目录 1.python字符串 1.1 python访问字符串中的值 1.2Python 字符串连接 1.3Python字符串运算符 2.python列表 2.1访问列表中的值 2.2更新列表 2. ...