在上一篇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哪里需要用到服务降级,那我想应该是网站挂了的时候吧,哈哈。
如果你研究出怎么使服务降级的方法调用到,麻烦在下面留言告诉我下,谢谢了!