服务降级

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

普通服务降级

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

  • 全局函数
  • 匿名函数
  • 可以调用的 Callback
  1. // 全局函数
  2. function method()
  3. {
  4. // ..
  5. }
  6. // 匿名函数
  7. $fallback = function(){
  8. // ...
  9. };
  10. // callback
  11. class xxx
  12. {
  13. public function method()
  14. {
  15. }
  16. }

RPC服务降级

注解

@Fallback

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

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

定义降级服务

  1. /**
  2. * Fallback demo
  3. *
  4. * @Fallback("demoFallback")
  5. * @method ResultInterface deferGetUsers(array $ids)
  6. * @method ResultInterface deferGetUser(string $id)
  7. * @method ResultInterface deferGetUserByCond(int $type, int $uid, string $name, float $price, string $desc = "desc")
  8. */
  9. class DemoServiceFallback implements DemoInterface
  10. {
  11. public function getUsers(array $ids)
  12. {
  13. return ['fallback', 'getUsers', func_get_args()];
  14. }
  15. public function getUser(string $id)
  16. {
  17. return ['fallback', 'getUser', func_get_args()];
  18. }
  19. public function getUserByCond(int $type, int $uid, string $name, float $price, string $desc = "desc")
  20. {
  21. return ['fallback', 'getUserByCond', func_get_args()];
  22. }
  23. }
  • 需要使用注解定义defer函数,此处不做详细描述,请查看RPC客户单章节
  • DemoInterface 是RPC章节的lib接口,每个接口可以实现多个不用的降级服务
  • RPC服务调用失败后,就会调用实现的服务降级里面函数

使用实例

  1. /**
  2. * rpc controller test
  3. *
  4. * @Controller(prefix="rpc")
  5. */
  6. class RpcController
  7. {
  8. /**
  9. * @Reference(name="user", fallback="demoFallback")
  10. *
  11. * @var DemoInterface
  12. */
  13. /**
  14. * @return array
  15. */
  16. public function fallback()
  17. {
  18. $result1 = $this->demoService->getUser('11');
  19. $result2 = $this->demoService->getUsers(['1','2']);
  20. $result3 = $this->demoService->getUserByCond(1, 2, 'boy', 1.6);
  21. return [
  22. $result1,
  23. $result2,
  24. $result3,
  25. ];
  26. }
  27. /**
  28. * @return array
  29. */
  30. public function deferFallback()
  31. {
  32. $result1 = $this->demoService->deferGetUser('11')->getResult();
  33. $result2 = $this->demoService->deferGetUsers(['1','2'])->getResult();
  34. $result3 = $this->demoService->deferGetUserByCond(1, 2, 'boy', 1.6)->getResult();
  35. return [
  36. 'defer',
  37. $result1,
  38. $result2,
  39. $result3,
  40. ];
  41. }
  42. }
  • @Reference注解,指定fallback服务降级实现,如果不是同一个接口实现,会抛出异常