NPM 包 @bennadel/circuit-breaker 使用教程

阅读时长 6 分钟读完

前言

在以前的前端开发中,我们通常会使用 Ajax 请求接口来获取数据。但是,单纯的 Ajax 请求也存在一些问题,比如在服务端故障的情况下,前端一直等待返回结果,导致前端的应用程序失去响应能力。这时候使用断路器模式就能很好的解决这个问题。

@bennadel/circuit-breaker 是一个简单易用的断路器库,它可以在服务故障的情况下,为前端应用程序提供优秀的容错机制。

本文就来介绍一下如何使用 @bennadel/circuit-breaker 库来实现前端的断路器功能。

安装

要使用 @bennadel/circuit-breaker,我们需要首先安装该库,可以使用 npm 命令进行安装。

使用

创建 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

纠错
反馈