/master/zh-CN/service-governance/fallback.html

TOC

服务降级

服务降级,其实对功能的一种容错机制,这里指的是RPC调用服务降级和普通的服务降级。

普通服务降级

比如内部服务调用失败后,为不影响正常请求,可以实现 Fallback,实现对服务的降级。Fallback 定义有目前有三种形式。

  • 全局函数
  • 匿名函数
  • 可以调用的 Callback
// 全局函数
function method()
{
    // ..
}

// 匿名函数

$fallback = function(){
                // ...
            };

// callback
class xxx
{
  public function method()
  {

  }
}

RPC服务降级

注解

@Fallback

定义RPC服务降级处理的接口实现。

  • name 降级功能名称,缺省使用类名

定义降级服务

/**
 * Fallback demo
 *
 * @Fallback("demoFallback")
 * @method ResultInterface deferGetUsers(array $ids)
 * @method ResultInterface deferGetUser(string $id)
 * @method ResultInterface deferGetUserByCond(int $type, int $uid, string $name, float $price, string $desc = "desc")
 */
class DemoServiceFallback implements DemoInterface
{
    public function getUsers(array $ids)
    {
        return ['fallback', 'getUsers', func_get_args()];
    }

    public function getUser(string $id)
    {
        return ['fallback', 'getUser', func_get_args()];
    }

    public function getUserByCond(int $type, int $uid, string $name, float $price, string $desc = "desc")
    {
        return ['fallback', 'getUserByCond', func_get_args()];
    }
}
  • 需要使用注解定义defer函数,此处不做详细描述,请查看RPC客户单章节
  • DemoInterface 是RPC章节的lib接口,每个接口可以实现多个不用的降级服务
  • RPC服务调用失败后,就会调用实现的服务降级里面函数

使用实例

/**
 * rpc controller test
 *
 * @Controller(prefix="rpc")
 */
class RpcController
{

    /**
     * @Reference(name="user", fallback="demoFallback")
     *
     * @var DemoInterface
     */

    /**
     * @return array
     */
    public function fallback()
    {
        $result1  = $this->demoService->getUser('11');
        $result2  = $this->demoService->getUsers(['1','2']);
        $result3  = $this->demoService->getUserByCond(1, 2, 'boy', 1.6);

        return [
            $result1,
            $result2,
            $result3,
        ];
    }

    /**
     * @return array
     */
    public function deferFallback()
    {
        $result1  = $this->demoService->deferGetUser('11')->getResult();
        $result2  = $this->demoService->deferGetUsers(['1','2'])->getResult();
        $result3  = $this->demoService->deferGetUserByCond(1, 2, 'boy', 1.6)->getResult();

        return [
            'defer',
            $result1,
            $result2,
            $result3,
        ];
    }
}
  • @Reference注解,指定fallback服务降级实现,如果不是同一个接口实现,会抛出异常
progress-bar