1. 程式人生 > >Swoft 踩坑筆記十六 - 服務降級與熔斷器

Swoft 踩坑筆記十六 - 服務降級與熔斷器

在上一篇RPC裡,我們是見過服務降級的,下圖藍色框。
在這裡插入圖片描述

它是在程式發生異常時會觸發的,我們先來試試看吧。服務降級可以防止服務雪崩,具體百度哈。

進入服務端
新增丟擲異常 throw new Exception();
在這裡插入圖片描述

ip:埠/rpc/call

在這裡插入圖片描述
這些資料是哪裡返回的呢?
這裡定義了服務降級
在這裡插入圖片描述
總結就是當發生異常時那個方法會執行。

熔斷器

熔斷器是幹嘛的?
通過某種規則來觸發服務降級。這裡採用的是當發生數次異常時觸發。

客戶端建立 swoft/app/Controllers/TestController.php 測試控制器

<?php

namespace App\Controllers;

use Swoft\Http\Server\Bean\Annotation\Controller;
use Swoft\Http\Server\Bean\Annotation\RequestMapping;
use Swoft\Http\Server\Bean\Annotation\RequestMethod;

/**
 * Class TestController
 * @Controller("/test")
 */
class TestController
{

    public function testCall(int $nun)
    {
        if ($nun != '1') {
            throw new \Exception();
        }

        return '沒有異常';
    }

    /**
     * @RequestMapping(route="test")
     */
    public function test()
    {
        $result  = \breaker('user')->call([$this, 'testCall'], ['1'], [$this, 'testCallback']);
        return $result;
    }

    public function testCallback()
    {
        return 'testCall異常了,所以呼叫了testCallback';
    }


}

訪問

ip:埠/test/test

返回 沒有異常。
然後,修改$result = \breaker('user')->call([$this, 'testCall'], ['1'], [$this, 'testCallback']);第二個引數為[‘2’]。
再次訪問
在這裡插入圖片描述

現在第二個引數為[‘2’],你再重新整理三次看看。

不見了!
在這裡插入圖片描述
我們剛才失敗了三次,切換到了開啟狀態,這個次數在 .env 的 USER_BREAKER_FAIL_COUNT = 3 可以修改。
現在,把return改成var_dump,通過終端檢視。
在這裡插入圖片描述

可以發現,如果你一直重新整理,輸出三次字串後,會出現NULL,在五秒後重新輸出字串。在 .env

USER_BREAKER_DELAY_TIME = 5000 設定,以毫秒計。
出現NULL時是服務降級(開啟狀態),五秒後會切換到半開狀態。再通過三次的重新整理,切換到開啟,也就是輸出"testCall異常了,所以呼叫了testCallback“

然後,我們測試成功次數
1、重啟swoft服務。
2、重新整理四次使進入開啟狀態,並能看到切換狀態的NULL。把數字改成1,等到達五秒。
3、重新整理頁面七次,檢視終端輸出。
在這裡插入圖片描述
切換到了關閉狀態,恢復了正常。

呀,真雞兒繞,你只能自己試試了,每一步都去看那三種狀態的圖。

至於那個NULL,其實應該是要能輸出服務降級方法裡的內容的,可是就是沒有。開啟日誌(LOG_ENABLE=true

)後,發現是未定義

在這裡插入圖片描述

\breaker('name')->call($handler, $params, $fallback);

沒有可以設定服務降級的引數欄位,我是沒找著怎麼加進去。。反正總的來說熔斷器是完成了且生效了。

不過如果PHP哪裡需要用到服務降級,那我想應該是網站掛了的時候吧,哈哈。

如果你研究出怎麼使服務降級的方法呼叫到,麻煩在下面留言告訴我下,謝謝了!