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,在五秒后重新输出字符串。在 .envUSER_BREAKER_DELAY_TIME = 5000 设置,以毫秒计。
出现NULL时是服务降级(开启状态),五秒后会切换到半开状态。再通过三次的刷新,切换到开启,也就是输出"testCall异常了,所以调用了testCallback“

扫描二维码关注公众号,回复: 4643950 查看本文章

然后,我们测试成功次数
1、重启swoft服务。
2、刷新四次使进入开启状态,并能看到切换状态的NULL。把数字改成1,等到达五秒。
3、刷新页面七次,查看终端输出。
在这里插入图片描述
切换到了关闭状态,恢复了正常。

呀,真鸡儿绕,你只能自己试试了,每一步都去看那三种状态的图。

至于那个NULL,其实应该是要能输出服务降级方法里的内容的,可是就是没有。开启日志(LOG_ENABLE=true)后,发现是未定义

在这里插入图片描述

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

没有可以设定服务降级的参数栏位,我是没找着怎么加进去。。反正总的来说熔断器是完成了且生效了。

不过如果PHP哪里需要用到服务降级,那我想应该是网站挂了的时候吧,哈哈。

如果你研究出怎么使服务降级的方法调用到,麻烦在下面留言告诉我下,谢谢了!

猜你喜欢

转载自blog.csdn.net/weikaixxxxxx/article/details/85198292
今日推荐