使用 .NET 的 Dev Proxy 构建和测试弹性应用
使用 .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 构建和测试弹性应用的更多相关文章
- 如何利用Azure DevOps快速实现自动化构建、测试、打包及部署
前两天有朋友问我,微软的Azure好用吗,适不适合国人的使用习惯,我就跟他讲了下,Azue很好用,这也是为什么微软云营收一直涨涨涨的原因,基本可以再1个小时内实现自动化构建.打包以及部署到Azure服 ...
- CoreCRM 开发实录——Travis-CI 实现 .NET Core 程度在 macOS 上的构建和测试 [无水干货]
上一篇文章我提到:为了使用"国货",我把 Linux 上的构建和测试委托给了 DaoCloud,而 Travis-CI 不能放着不用啊.还好,这货支持 macOS 系统.所以就把 ...
- 基于soapUI构建WebService测试框架
基于soapUI构建WebService测试框架 http://www.docin.com/p-775523285.html
- 测试驱动 ASP.NET MVC 和构建可测试 ASP.NET MVC 应用程序
[测试驱动 ASP.NET MVC] http://t.cn/8kdi4Wl [构建可测试 ASP.NET MVC 应用程序]http://t.cn/8kdi4Wj
- selenium结合docker构建分布式测试环境
selenium是目前web和app自动化测试的主要框架.对于web自动化测试而言,由于selenium2.0以后socker服务器由本地浏览器自己启动且直接通过浏览器原生API操作页面,故越来越多的 ...
- 使用Bitbucket Pipeline进行.Net Core项目的自动构建、测试和部署
1. 引言 首先,Bitbucket提供支持Mercurial和Git版本控制系统的网络托管服务.简单来说,它类似于GitHub,不同之处在于它支持个人免费创建私有项目仓库.除此之外,Bitbucke ...
- Spring Boot -05- 多模块结构项目构建与测试(详细图文教程)IDEA 版
Spring Boot -05- 多模块结构项目构建与测试(详细图文教程)IDEA 版 百度很多博客都不详细,弄了半天才把 Spring Boot 多模块项目构建开发整的差不多,特地重新创建配置,记录 ...
- 使用Maven构建和测试Java项目
我们在创建项目时要学习的是如何使用 Maven 来创建一个 Java 应用程序.现在将学习如何构建和测试应用程序. 进入到 C:\MVN 目录我们准备创建来 java应用程序.打开 consumerB ...
- selenium 结合 docker 构建分布式测试环境 (初学者视角)
前言:随着自动化测试越学越深,深深觉得有太多的东西需要总结. 1.记录下学习中遇到的坑,当做学习笔记.2.有前人路过看到文章中比较落后的做法,请务必一定要指教.(因为是初学者视角,很多东西只是走通而已 ...
- Java-Maven-Runoob:Maven 构建 & 项目测试
ylbtech-Java-Maven-Runoob:Maven 构建 & 项目测试 1.返回顶部 1. Maven 构建 & 项目测试 在上一章节中我们学会了如何使用 Maven 创建 ...
随机推荐
- SQL数据库书的配套资源
<SQL基础教程(视频教学版)>代码.课件.教学视频 https://pan.baidu.com/s/1QA5m5HN159wi3FX_KNDQzA 提取码: 4m9e <SQL S ...
- 利用cv2.morphologyEx提取图像边界
cv2.morphologyEx(image, cv2.MORPH_GRADIENT, SE)可以参考这篇博客cv2.MORPH_GRADIENT:形态学梯度(morph-grad),可以突出团块(b ...
- 使用 reduce 统计字符串每个字母出现的次数
// 统计字符串每个字母出现的次数 let str = 'asdfssaaasasasasaa' let obj = str.split('').reduce(function (prev, item ...
- vue axios的使用及操作
引入axios 并设置原型 Vue.prototype.$axios = axios; 在其他地方就可以this.$axios使用了 let param = _this.$qs.string ...
- Pandas 空值数据的索引 位置 行号
前言 先说一下什么是pandas, 这个东西其实就是一个处理表格数据的一个库.可以把它看做是一个没有图形化界面的Excel. Pandas中的空值是非常多的,这体现了数据搜集的一个不可避免的方面.由于 ...
- AI赋能-《用ChatGPT做软件测试》新书上市
图书链接京东: https://item.jd.com/10121763192532.html当当: http://product.dangdang.com/29797547.html内容简介本书以目 ...
- Next.js 实战开发入门 1 开发环境部署 - 曲速引擎 Warp Drive
开发目标 我们将构建一个简化版本的财务仪表板,其内容包括:公共主页.登录页面.受身份验证保护的仪表板页面.用户可以添加.编辑和删除发票 开发环境配置 开发客户端 Windows 10 (不限系统,兼容 ...
- 整理程序员面试中HR最常问的问题
前言 不要慌,不要怕,要调适好自己的情绪,在介绍自己的基本情况时面无表情,说的头头是道,必要的时候包装下自己,不属于你的功能也能说是你的(难不成会去查?查也查不到).不过在面试前,建议可以找自己的朋友 ...
- 使用wxpython开发跨平台桌面应用,基类对话框窗体的封装处理
在开发桌面界面的时候,往往都需要对一些通用的窗体进行一些抽象封装处理,以便统一界面效果,以及继承一些通用的处理过程,减少重复编码.本篇随笔介绍使用wxpython开发跨平台桌面应用,基类对话框窗体的封 ...
- Volatility 内存取证基础
实操 (需要下面这个内存取证的私我)