声明服务

接口服务

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

目录定义

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

  1. app/
  2. Rpc/
  3. - Lib/ // 服务的公共接口定义目录,里面通常只有php接口类
  4. - Services/ // 具体的服务接口实现类,里面的类通常实现了 Lib 中定义的接口

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

定义接口

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

  1. **
  2. * Class UserInterface
  3. *
  4. * @since 2.0
  5. */
  6. interface UserInterface
  7. {
  8. /**
  9. * @param int $id
  10. * @param mixed $type
  11. * @param int $count
  12. *
  13. * @return array
  14. */
  15. public function getList(int $id, $type, int $count = 10): array;
  16. /**
  17. * @param int $id
  18. *
  19. * @return bool
  20. */
  21. public function delete(int $id): bool;
  22. /**
  23. * @return string
  24. */
  25. public function getBigContent(): string;
  26. }

接口实现

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

注解

@Service

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

实例

实现版本1

  1. /**
  2. * Class UserService
  3. *
  4. * @since 2.0
  5. *
  6. * @Service()
  7. */
  8. class UserService implements UserInterface
  9. {
  10. /**
  11. * @param int $id
  12. * @param mixed $type
  13. * @param int $count
  14. *
  15. * @return array
  16. */
  17. public function getList(int $id, $type, int $count = 10): array
  18. {
  19. return ['name' => ['list']];
  20. }
  21. /**
  22. * @param int $id
  23. *
  24. * @return bool
  25. */
  26. public function delete(int $id): bool
  27. {
  28. return false;
  29. }
  30. /**
  31. * @return string
  32. */
  33. public function getBigContent(): string
  34. {
  35. $content = Co::readFile(__DIR__ . '/big.data');
  36. return $content;
  37. }
  38. }

实现版本2

  1. /**
  2. * Class UserServiceV2
  3. *
  4. * @since 2.0
  5. *
  6. * @Service(version="1.2")
  7. */
  8. class UserServiceV2 implements UserInterface
  9. {
  10. /**
  11. * @param int $id
  12. * @param mixed $type
  13. * @param int $count
  14. *
  15. * @return array
  16. */
  17. public function getList(int $id, $type, int $count = 10): array
  18. {
  19. return [
  20. 'name' => ['list'],
  21. 'v' => '1.2'
  22. ];
  23. }
  24. /**
  25. * @param int $id
  26. *
  27. * @return bool
  28. */
  29. public function delete(int $id): bool
  30. {
  31. return false;
  32. }
  33. /**
  34. * @return string
  35. */
  36. public function getBigContent(): string
  37. {
  38. $content = Co::readFile(__DIR__ . '/big.data');
  39. return $content;
  40. }
  41. }

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