接口服务

定义接口并实现接口,才能提供RPC服务。

目录定义

官方应用中给出的目录如下:

  1. app/
  2. - Lib/ // 服务的公共接口定义目录,里面通常只有php接口类
  3. - Pool/ // 服务池配置,里面可以配置不同服务的连接池,参考里面的 UserServicePool
  4. - Services/ // 具体的服务接口实现类,里面的类通常实现了 Lib 中定义的接口

当然在多个服务中使用时, 要将lib库 app/Lib 移到一个公共的git仓库里,然后各个服务通过 composer 来获取使用

定义接口

服务提供方定义好接口格式,存放到公共的lib库里面,服务调用方,加载lib库,就能使用接口服务。

  1. /**
  2. * The interface of demo service
  3. *
  4. * @method ResultInterface deferGetUsers(array $ids)
  5. * @method ResultInterface deferGetUser(string $id)
  6. * @method ResultInterface deferGetUserByCond(int $type, int $uid, string $name, float $price, string $desc = "desc")
  7. */
  8. interface DemoInterface
  9. {
  10. /**
  11. * @param array $ids
  12. *
  13. * @return array
  14. *
  15. * <pre>
  16. * [
  17. * 'uid' => [],
  18. * 'uid2' => [],
  19. * ......
  20. * ]
  21. * <pre>
  22. */
  23. public function getUsers(array $ids);
  24. /**
  25. * @param string $id
  26. *
  27. * @return array
  28. */
  29. public function getUser(string $id);
  30. public function getUserByCond(int $type, int $uid, string $name, float $price, string $desc = "desc");
  31. }

接口定义和普通接口完全一致,唯一不一样的是

  • 需要在类注释上定义类似 deferGetUser 方法,对应类里面方法 getUser 且首字母大写。这种 defer* 方法,一般用于业务延迟收包和并发使用。
  • 这些方法是不需要实现的,仅用于提供IDE提示。内部调用逻辑由框架帮你完成

接口实现

一个接口,会存在多种不同的实现,通过一个版本号来标识是那个逻辑实现。

注解

@Service

  • version 定义接口版本,默认是 0

实例

实现版本1

  1. /**
  2. * Demo servcie
  3. *
  4. * @method ResultInterface deferGetUsers(array $ids)
  5. * @method ResultInterface deferGetUser(string $id)
  6. * @method ResultInterface deferGetUserByCond(int $type, int $uid, string $name, float $price, string $desc = "desc")
  7. *
  8. * @Service() // 实现了接口 DemoInterface,版本号为 0
  9. */
  10. class DemoService implements DemoInterface
  11. {
  12. public function getUsers(array $ids)
  13. {
  14. return [$ids];
  15. }
  16. public function getUser(string $id)
  17. {
  18. return [$id];
  19. }
  20. /**
  21. * @param int $type
  22. * @param int $uid
  23. * @param string $name
  24. * @param float $price
  25. * @param string $desc default value
  26. * @return array
  27. */
  28. public function getUserByCond(int $type, int $uid, string $name, float $price, string $desc = "desc")
  29. {
  30. return [$type, $uid, $name, $price, $desc];
  31. }
  32. }

实现版本2

  1. /**
  2. * Demo service
  3. *
  4. * @method ResultInterface deferGetUsers(array $ids)
  5. * @method ResultInterface deferGetUser(string $id)
  6. * @method ResultInterface deferGetUserByCond(int $type, int $uid, string $name, float $price, string $desc = "desc")
  7. * @Service(version="1.0.1") // 实现了接口 DemoInterface,版本号为 1.0.1
  8. */
  9. class DemoServiceV2 implements DemoInterface
  10. {
  11. public function getUsers(array $ids)
  12. {
  13. return [$ids, 'version'];
  14. }
  15. public function getUser(string $id)
  16. {
  17. return [$id, 'version'];
  18. }
  19. /**
  20. * @param int $type
  21. * @param int $uid
  22. * @param string $name
  23. * @param float $price
  24. * @param string $desc default value
  25. * @return array
  26. */
  27. public function getUserByCond(int $type, int $uid, string $name, float $price, string $desc = "desc")
  28. {
  29. return [$type, $uid, $name, $price, $desc];
  30. }
  31. }

不同的实现,需要定义不同的唯一版本号,如果存在相同,加载之后的服务会覆盖之前的服务