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 来获取使用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注