前言
在以前的前端开发中,我们通常会使用 Ajax 请求接口来获取数据。但是,单纯的 Ajax 请求也存在一些问题,比如在服务端故障的情况下,前端一直等待返回结果,导致前端的应用程序失去响应能力。这时候使用断路器模式就能很好的解决这个问题。
@bennadel/circuit-breaker 是一个简单易用的断路器库,它可以在服务故障的情况下,为前端应用程序提供优秀的容错机制。
本文就来介绍一下如何使用 @bennadel/circuit-breaker 库来实现前端的断路器功能。
安装
要使用 @bennadel/circuit-breaker,我们需要首先安装该库,可以使用 npm 命令进行安装。
npm install @bennadel/circuit-breaker
使用
创建 Circuit Breaker 对象
在使用 @bennadel/circuit-breaker 之前,我们需要先创建一个 CircuitBreaker 对象。我们可以使用以下方式来实现创建:
-- -------------------- ---- ------- ------ - -------------- - ---- ---------------------------- ----- -------------- - --- ---------------- ----------------- -- -- -------------------------- ----------------- -- -- -------------------------- -------- ----- -- ---------------------------- ------- -- -- - -------------------- ------- -------- -- -- ---------- -------- -- -- - -------------------- ------- --------- -- -- ---------- ---
在创建 Circuit Breaker 对象时,我们需要传入一些参数:
failureThreshold
: 请求失败阀值,指定在多少次请求失败之后,断路器将会启动,默认值是3
;successThreshold
: 请求成功阀值,指定在多少次请求成功之后,断路器将会重置,默认值是2
;timeout
: 请求超时时间,指定请求的最长等待时间,默认值是3000
毫秒;onOpen
: 断路器启动回调函数,指定一个函数,在断路器启动时将会调用该函数;onClose
: 断路器关闭回调函数,指定一个函数,在断路器关闭时将会调用该函数。
包裹函数
在使用断路器时,我们需要把被保护的函数包裹在一个调用 CircuitBreaker 对象的函数中,如下所示:
-- -------------------- ---- ------- ----- --------- - ----- -- -- - ----- -------- - ----- ------------------- ----- ---- - ----- ---------------- ------ ----- -- ----- --------------------------- - ----- -- -- - ------ --------------------------- -- -- - ------ ----- ------------ --- --
首先将要保护的函数 fetchData 定义为一个异步函数,在内部使用 fetch 方法获取数据,然后返回数据。
然后定义一个新的函数 fetchDataWithCircuitBreaker,该函数是调用断路器的包裹函数。在 invoke 方法中传入 fetchData 函数作为参数,invoke 方法将会尝试执行该函数,如果函数正常执行,则断路器计数器中 success 的计数器增加,否则将增加 failure 的计数器。
功能测试
接下来我们来进行一些功能测试,看看 @bennadel/circuit-breaker 是否能够正常工作:
-- -------------------- ---- ------- ----- --------------------- - ----- -- -- - ----- --- ---------------- ----------- -- -- ---------------------------- --- ---- - - -- - - -- ---- - --- - ----- --------------------------- -- -- - ------ ----- ------------------------ --- -------------------- ------------- - ----- ------- - ------------------- ------------------- - - -- --------------------- --- ---- - - -- - - -- ---- - --- - ----- ------------------------------ -------------------- ------------- - ----- ------- - ------------------- ------------------- - - -- --------------------------- --- ---- - - -- - - -- ---- - --- - ----- ------------------------------ -------------------- ------------- -- -- --- -- - ----------------------- - - ----- ------- - ------------------- ------------------- - -
这里我们编写了三个测试用例:
第一个测试用例是在断路器打开的情况下,连续发起3次请求并接受响应。因为前两次请求都是失败的,所以我们会看到3条错误消息输出,然后断路器会关闭。
第二个测试用例我们连续发起2次请求,并且都接受到正常的响应,并输出 "Request succeeded." 信息。由于前两次请求都成功了,所以断路器稍后也会被重置。
第三个测试用例是在断路器部分打开的情况下,连续发起3次请求,并在第二次启动后关闭断路器。在代码中,我们使用了 reset() 方法来手动重置断路器。
总结
断路器是一个非常有用的容错机制,可以确保服务故障时应用程序不会失去响应能力。@bennadel/circuit-breaker 提供了一种可靠且易于使用的实现,能够帮助我们轻松地添加服务器故障保护机制。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055d1f81e8991b448dacbb