成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

99%的程序都沒有考慮的網(wǎng)絡(luò)異常

HollisChuang / 2059人閱讀

摘要:本文由云社區(qū)發(fā)表絕大多數(shù)程序只考慮了接口正常工作的場(chǎng)景,而用戶在使用我們的產(chǎn)品時(shí)遇到的各類異常,全都丟在看似的中。在面板,還可以對(duì)請(qǐng)求進(jìn)行暫停延遲等網(wǎng)絡(luò)異常的模擬。小程序?qū)崿F(xiàn)最后,留一道思考題。

本文由云+社區(qū)發(fā)表

絕大多數(shù)程序只考慮了接口正常工作的場(chǎng)景,而用戶在使用我們的產(chǎn)品時(shí)遇到的各類異常,全都丟在看似 ok 的 try catch 中。如果沒有做好異常的兼容和兜底處理,會(huì)極大的影響用戶體驗(yàn),嚴(yán)重的還會(huì)帶來(lái)安全和資損風(fēng)險(xiǎn)。

接口異常,通??梢苑譃橐韵氯悾?/p>

CGI 邏輯出錯(cuò)。如調(diào)用方入?yún)⑷笔ь悩I(yè)務(wù)邏輯報(bào)錯(cuò);

服務(wù)不穩(wěn)定。如服務(wù)器不穩(wěn)定導(dǎo)致 nginx 各類 500、502,cgi 路徑調(diào)整導(dǎo)致的 404

用戶網(wǎng)絡(luò)環(huán)境差。如,網(wǎng)絡(luò)不穩(wěn)定、網(wǎng)速慢、運(yùn)營(yíng)商劫持等

那么,我們?cè)趯懘a時(shí),如何快速的模擬這些接口異常,做好程序的兼容處理呢?

今天向大家介紹網(wǎng)絡(luò)調(diào)試神器 whistle 的網(wǎng)絡(luò)異常調(diào)試方法,如果你還沒用過(guò) whistle,請(qǐng)參考《8102 年的程序員不需要 Hosts 和 Fiddler》。

假設(shè)我們有以下前端頁(yè)面 index.html,放置在自己的本地路徑:

接下來(lái),打開 whistle Rules 配置面板 http://127.0.0.1:8899/#rules ,配置模擬的 demo page 和 mock CGI:

*/mock file://({"code":0,"data":"success"}) # 配置 mock cgi 為模擬的 json 數(shù)據(jù)
example.com file:///Users/kaiye/Projects/Markdown/20181213/ # 配置任意域名到本地 demo 目錄,這里注意替換成自己的路徑

打開 http://example.com ,正常邏輯下頁(yè)面展示出了綠色的 success ,現(xiàn)在我們開始加入一些網(wǎng)絡(luò)異常。

1、業(yè)務(wù)邏輯異常處理

例如 CGI 沒有返回 data 字段,而是返回了一個(gè)錯(cuò)誤碼 code 和對(duì)應(yīng)的 message,針對(duì)這種業(yè)務(wù)邏輯異常我們只需在第二個(gè) then 中做好 code 值的判斷即可(注意,這里的 code、message、data 只是示例,實(shí)際業(yè)務(wù) CGI 中的 JSON 結(jié)構(gòu)體的字段名很可能不同):

fetch(`/mock?r=${Math.random()}`)
  .then(response => response.json())
  .then((v) => {
    // 業(yè)務(wù)邏輯異常處理
    if (v.code !== 0) {
      return Promise.reject(new Error(`ERROR_LOGIC_CODE:${v.code}`));
    }
    document.getElementById("success").innerHTML = v.data;
  })
  .catch((err) => {
    document.getElementById("fail").innerHTML = err.message;
  });

相應(yīng)的 whistle 配置如下:

*/mock file://({"code":12345,"message":"some_logic_error"}) # 模擬業(yè)務(wù)邏輯異常
2、服務(wù)器異常處理

如果服務(wù)器直接拋出了 502 錯(cuò)誤碼,我們希望代碼能給用戶提示的同時(shí),再做一個(gè)異常上報(bào)。

fetch(`/mock?r=${Math.random()}`)
  .then((response) => {
    // 服務(wù)器異常處理
    if (response.ok) {
      return response.json();
    }
    return Promise.reject(new Error(`ERROR_STATUS_CODE:${response.status}`));
  })
  .then((v) => {
    // 業(yè)務(wù)邏輯異常處理
    if (v.code !== 0) {
      return Promise.reject(new Error(`ERROR_LOGIC_CODE:${v.code}`));
    }
    document.getElementById("success").innerHTML = v.data;
  })
  .catch((err) => {
    const [type, value] = err.message.split(":");
    // 異常類型上報(bào)
    console.log(type, value);
    document.getElementById("fail").innerHTML = err.message;
  });

通過(guò) whistle 的模擬配置如下:

*/mock statusCode://502 # 模擬 HTTP 狀態(tài)碼異常
3、接口被劫持注入

如果 CGI 被運(yùn)營(yíng)商劫持注入,可能導(dǎo)致接口返回一個(gè)不合法的 JSON 結(jié)構(gòu),最前面的 response.json() 會(huì)拋異常,我們可以提前 catch ?。?/p>

fetch(`/mock?r=${Math.random()}`).then((response) => {
  // 服務(wù)器異常處理
  if (response.ok) {
    return (
      response
        .json()
        // 接口數(shù)據(jù)解碼異常處理
        .catch(err => Promise.reject(new Error("ERROR_DECODE_JSON")))
    );
  }
  return Promise.reject(new Error(`ERROR_STATUS_CODE:${response.status}`));
});

whistle 模擬配置如下:

*/mock file://(
hijacking
{"code":0,"data":"success"}) # 模擬接口被劫持注入 1

借助 htmlAppend 和 values 配置,可以模擬更復(fù)雜的注入示例:

*/mock file://({"code":0,"data":"success"}) htmlAppend://{hijacking.html} # 模擬接口被劫持注入 2

4、用戶網(wǎng)絡(luò)不穩(wěn)定

如果我們要模擬請(qǐng)求發(fā)出 10 秒后斷網(wǎng)或網(wǎng)絡(luò)不通的情況,可以通過(guò) whistle 這樣配置:

*/mock reqDelay://10000 enable://abort # 模擬 10 秒超時(shí)后網(wǎng)絡(luò)不通

讓用戶苦苦等待 10 秒,再報(bào)錯(cuò)的體驗(yàn)太糟糕。我們可以封裝一個(gè)能配置超時(shí)時(shí)間的請(qǐng)求發(fā)送函數(shù),同時(shí)把上面提到的錯(cuò)誤異常都一起配置進(jìn)來(lái)。

這樣,自定義的 myFetch 只需關(guān)注業(yè)務(wù)具體邏輯,針對(duì)不同的 catch error 做對(duì)應(yīng)的處理。

除以上提到的協(xié)議命令字外,whistle 還支持 resSpeed 用于模擬低網(wǎng)速傳輸(單位:kb/s),tpl 協(xié)議則可以根據(jù)請(qǐng)求傳入?yún)?shù)來(lái)動(dòng)態(tài)模擬不同的數(shù)據(jù)。在 Frames 面板,還可以對(duì) WebSocket/Socket 請(qǐng)求進(jìn)行暫停、延遲等網(wǎng)絡(luò)異常的模擬。

小程序 fetch API 實(shí)現(xiàn)

最后,留一道思考題。

近來(lái)微信小程序開發(fā)非?;?,小程序原生提供的 wx.request API 能用于發(fā)送 HTTPS 請(qǐng)求,請(qǐng)?jiān)谒幕A(chǔ)之上進(jìn)行封裝,支持 promise 調(diào)用和 timeout 超時(shí)時(shí)間定義(小程序默認(rèn)的請(qǐng)求超時(shí)定義在 app.json 中,不夠靈活),并針對(duì)以上提到的 HTTP 狀態(tài)碼異常、接口劫持注入、慢網(wǎng)絡(luò)、無(wú)網(wǎng)絡(luò)狀態(tài)等各種網(wǎng)絡(luò)異常進(jìn)行兼容處理。

歡迎留言分享你的代碼實(shí)現(xiàn)

此文已由作者授權(quán)騰訊云+社區(qū)發(fā)布

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100424.html

相關(guān)文章

  • 99%程序沒有考慮網(wǎng)絡(luò)異常?使用Fundebug.notify()主動(dòng)上報(bào)

    摘要:而且官方也給出了示例在回調(diào)函數(shù)中上報(bào)異常為了確保完全掌握小程序的運(yùn)行狀況,我們將異常上報(bào)。的微信小程序插件除了可以自動(dòng)捕獲異常外,還支持通過(guò)接口主動(dòng)上報(bào)異常。 近日看到一篇文章99%的程序都沒有考慮的網(wǎng)絡(luò)異常,開篇提到: 絕大多數(shù)程序只考慮了接口正常工作的場(chǎng)景,而用戶在使用我們的產(chǎn)品時(shí)遇到的各類異常,全都丟在看似 ok 的 try catch 中。如果沒有做好異常的兼容和兜底處理,會(huì)極...

    ChanceWong 評(píng)論0 收藏0
  • 道路千萬(wàn)條,安全第一條——一次服務(wù)器被入侵處理經(jīng)過(guò)

    摘要:為了進(jìn)一步確認(rèn),再次到威脅情報(bào)平臺(tái)進(jìn)行查詢。再結(jié)合我部署的容器停止時(shí)間進(jìn)行分析,應(yīng)該是在我部署完成后幾小時(shí)內(nèi)服務(wù)器被入侵的。要從根本上解決問(wèn)題需要進(jìn)行溯源分析,避免服務(wù)器再次被入侵。結(jié)合以上線索以及個(gè)人經(jīng)驗(yàn)分析,很可能利用的漏洞進(jìn)行入侵的。 容器為何自動(dòng)停止? 服務(wù)器為何操作卡頓? 進(jìn)程的神秘連接到底指向何處? 發(fā)現(xiàn)——自動(dòng)停止的容器 某日發(fā)現(xiàn)部署在服務(wù)器上的一個(gè)容器被停掉了,開始以為...

    aaron 評(píng)論0 收藏0
  • rancher使用感受以及與k8s對(duì)比

    摘要:但的數(shù)據(jù)存在,而的數(shù)據(jù)存儲(chǔ)暫未了解但肯定是存在內(nèi)存中。測(cè)試對(duì)比物理機(jī)進(jìn)程。當(dāng)然,使用對(duì)容器進(jìn)行編排的時(shí)候,可以指定任何想要的網(wǎng)絡(luò)方式如采用的方式,,。 簡(jiǎn)介: rancher 自帶了一套網(wǎng)絡(luò)方案,可以實(shí)現(xiàn)跨機(jī)器的docker容器互聯(lián)。其原理大致是:在每個(gè)機(jī)器上通過(guò)docker啟動(dòng)一個(gè)路由容器,將docker容器啟動(dòng)時(shí)的ip定義為10.42網(wǎng)段,并在iptables中將10.42網(wǎng)段的請(qǐng)...

    dingda 評(píng)論0 收藏0
  • rancher使用感受以及與k8s對(duì)比

    摘要:但的數(shù)據(jù)存在,而的數(shù)據(jù)存儲(chǔ)暫未了解但肯定是存在內(nèi)存中。測(cè)試對(duì)比物理機(jī)進(jìn)程。當(dāng)然,使用對(duì)容器進(jìn)行編排的時(shí)候,可以指定任何想要的網(wǎng)絡(luò)方式如采用的方式,,。 簡(jiǎn)介: rancher 自帶了一套網(wǎng)絡(luò)方案,可以實(shí)現(xiàn)跨機(jī)器的docker容器互聯(lián)。其原理大致是:在每個(gè)機(jī)器上通過(guò)docker啟動(dòng)一個(gè)路由容器,將docker容器啟動(dòng)時(shí)的ip定義為10.42網(wǎng)段,并在iptables中將10.42網(wǎng)段的請(qǐng)...

    _ang 評(píng)論0 收藏0
  • 一文梳理 RedHat 和 CentOS 運(yùn)維中網(wǎng)絡(luò)知識(shí)

    摘要:一系統(tǒng)運(yùn)維中網(wǎng)絡(luò)方面的規(guī)劃與思考在很多公司,崗位職責(zé)都是很明確的,專職轉(zhuǎn)崗,每人或者每組負(fù)責(zé)一塊業(yè)務(wù)。二系統(tǒng)運(yùn)維中網(wǎng)絡(luò)方面操作梳理在系統(tǒng)運(yùn)維中,經(jīng)常涉及的網(wǎng)絡(luò)方面的操作,一般由以下幾個(gè)方面組成。初步意見,交換機(jī)上線這臺(tái)機(jī)器所連端口。運(yùn)維是一門藝術(shù),也是一門苦差事,每個(gè)人對(duì)此均有不同的理解,正所謂一千個(gè)人眼中有一千個(gè)哈姆雷特。干一行就要愛一行,既然選擇了這個(gè)行業(yè),較好是能把它做到較好,發(fā)揮自己...

    Olivia 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<