SWOFT之RPC服务与请求
swoft中的请求方式:http://39.99.231.223:18306/rpc/getList
rpc底层是通过tcp连接的,客户端发起的http请求其实封装了一次tcp的连接。Http/Controller/RpcController.php控制器对应的路由是rpc
非swoft中的请求封装:
const
RPC_EOL
= "\r\n\r\n"; function request($host, $class, $method, $param, $version = '1.0', $ext = []) { $fp = stream_socket_client($host, $errno, $errstr); if (!$fp) { throw new Exception("stream_socket_client fail errno={$errno} errstr={$errstr}"); } $req = [ "jsonrpc" => '2.0', "method" => sprintf("%s::%s::%s", $version, $class, $method), 'params' => $param, 'id' => '', 'ext' => $ext, ]; $data = json_encode($req) .
RPC_EOL
; fwrite($fp, $data); $result = ''; while (!feof($fp)) { $tmp = stream_socket_recvfrom($fp, 1024); if ($pos = strpos($tmp,
RPC_EOL
)) { $result .= substr($tmp, 0, $pos); break; } else { $result .= $tmp; } } fclose($fp); return json_decode($result, true); } $ret = request('tcp://127.0.0.1:18307', \App\Rpc\Lib\UserInterface::class, 'getList', [1, 2], "1.2"); var_dump($ret);
接口服务
定义接口并实现接口,才能提供 RPC 服务。
官方应用中给出的 目录结构 如下:
app/
Rpc/
- Lib/ // 服务的公共接口定义目录,里面通常只有php接口类
- Services/ // 具体的服务接口实现类,里面的类通常实现了 Lib 中定义的接口
当在多个服务中使用时, 要将lib库
app/Rpc/Lib
移到一个公共的git
仓库里,然后各个服务通过composer
来获取使用。