使用实例

使用比较简单,类似注入普通一个类的实例一样,唯一区别是会有额外的参数。

注解

@Reference

  • name 定义引用那个服务的接口,缺省使用类名,一般都需要定义
  • version 使用该服务的那个版本,用于区别不同版本
  • pool 定义使用哪个连接池,如果不为空,不会根据name配置的名称去查找连接池,而是直接使用配置的连接池。
  • breaker 定义使用哪个熔断器,如果不为空,不会根据name配置的名称去查找熔断器,而是直接使用配置的熔断器
  • packer RPC服务调用,会有一个默认的数据解包器,此参数是指定其它的数据解包器,不使用默认的。

实例

  1. /**
  2. * rpc controller test
  3. *
  4. * @Controller(prefix="rpc")
  5. */
  6. class RpcController
  7. {
  8. /**
  9. * @Reference("user")
  10. *
  11. * @var DemoInterface
  12. */
  13. private $demoService;
  14. /**
  15. * @Reference(name="user", version="1.0.1")
  16. *
  17. * @var DemoInterface
  18. */
  19. private $demoServiceV2;
  20. /**
  21. * @Reference("user")
  22. * @var \App\Lib\MdDemoInterface
  23. */
  24. private $mdDemoService;
  25. /**
  26. * @RequestMapping(route="call")
  27. * @return array
  28. */
  29. public function call()
  30. {
  31. $version = $this->demoService->getUser('11');
  32. $version2 = $this->demoServiceV2->getUser('11');
  33. return [
  34. 'version' => $version,
  35. 'version2' => $version2,
  36. ];
  37. }
  38. /**
  39. * Defer call
  40. */
  41. public function defer(){
  42. $defer1 = $this->demoService->deferGetUser('123');
  43. $defer2 = $this->demoServiceV2->deferGetUsers(['2', '3']);
  44. $defer3 = $this->demoServiceV2->deferGetUserByCond(1, 2, 'boy', 1.6);
  45. $result1 = $defer1->getResult();
  46. $result2 = $defer2->getResult();
  47. $result3 = $defer3->getResult();
  48. return [$result1, $result2, $result3];
  49. }
  50. }

@Reference 注解可以任何Bean实例的类中使用,不仅仅是controller,这里只是测试。如果要使用延迟收包或并发,必须使用deferXxx方法。

非 Swoft 框架

如果服务端采用 JSON 协议,非 Swoft 框架可以按照下面的 demo 格式封装调用

  1. $result = call('App\Lib\DemoInterface', '1.0.1', 'getUsers', [['1','2']]);
  2. var_dump($result);
  3. function call(string $interface, string $version, string $method, array $params = [])
  4. {
  5. $fp = stream_socket_client('tcp://127.0.0.1:8099', $errno, $errstr);
  6. if (!$fp) {
  7. throw new Exception("stream_socket_client fail errno={$errno} errstr={$errstr}");
  8. }
  9. $data = [
  10. 'interface' => $interface,
  11. 'version' => $version,
  12. 'method' => $method,
  13. 'params' => $params,
  14. 'logid' => uniqid(),
  15. 'spanid' => 0,
  16. ];
  17. $data = json_encode($data, JSON_UNESCAPED_UNICODE);
  18. fwrite($fp, $data);
  19. $result = fread($fp, 1024);
  20. fclose($fp);
  21. return $result;
  22. }

如果服务端rpc 配置了 package_eof = "\r\n", 客户端则需要在发送的data后追加 \r\n