JSON RPC 是一种基于 JSON 格式的轻量级的 RPC 协议标准,易于使用和阅读。在 Hyperf 里由 hyperf/json-rpc 组件来实现,可自定义基于 HTTP 协议来传输,或直接基于 TCP 协议来传输。
安装
composer require hyperf/json-rpc
Copy to clipboardErrorCopied
该组件只是 JSON RPC 的协议处理的组件,通常来说,您仍需配合 hyperf/rpc-server 或 hyperf/rpc-client 来满足 服务端 和 客户端的场景,如同时使用则都需要安装:
要使用 JSON RPC 服务端:
composer require hyperf/rpc-server
Copy to clipboardErrorCopied
要使用 JSON RPC 客户端:
composer require hyperf/rpc-client
Copy to clipboardErrorCopied
使用
服务有两种角色,一种是 服务提供者(ServiceProvider)
,即为其它服务提供服务的服务,另一种是 服务消费者(ServiceConsumer)
,即依赖其它服务的服务,一个服务既可能是 服务提供者(ServiceProvider)
,同时又是 服务消费者(ServiceConsumer)
。而两者直接可以通过 服务契约
来定义和约束接口的调用,在 Hyperf 里,可直接理解为就是一个 接口类(Interface)
,通常来说这个接口类会同时出现在提供者和消费者下。
定义服务提供者
目前仅支持通过注解的形式来定义 服务提供者(ServiceProvider)
,后续迭代会增加配置的形式。
我们可以直接通过 #[RpcService]
注解对一个类进行定义即可发布这个服务了:
<?php
namespace App\JsonRpc;
use Hyperf\RpcServer\Annotation\RpcService;
/**
* 注意,如希望通过服务中心来管理服务,需在注解内增加 publishTo 属性
*/
#[RpcService(name: "CalculatorService", protocol: "jsonrpc-http", server: "jsonrpc-http")]
class CalculatorService implements CalculatorServiceInterface
{
// 实现一个加法方法,这里简单的认为参数都是 int 类型
public function add(int $a, int $b): int
{
// 这里是服务方法的具体实现
return $a + $b;
}
}
Copy to clipboardErrorCopied
#[RpcService]
共有 4
个参数:name
属性为定义该服务的名称,这里定义一个全局唯一的名字即可,Hyperf 会根据该属性生成对应的 ID 注册到服务中心去;protocol
属性为定义该服务暴露的协议,目前仅支持 jsonrpc-http
, jsonrpc
, jsonrpc-tcp-length-check
,分别对应于 HTTP 协议和 TCP 协议下的两种协议,默认值为 jsonrpc-http
,这里的值对应在 Hyperf\Rpc\ProtocolManager
里面注册的协议的 key
,它们本质上都是 JSON RPC 协议,区别在于数据格式化、数据打包、数据传输器等不同。server
属性为绑定该服务类发布所要承载的 Server
,默认值为 jsonrpc-http
,该属性对应 config/autoload/server.php
文件内 servers
下所对应的 name
,这里也就意味着我们需要定义一个对应的 Server
;publishTo
属性为定义该服务所要发布的服务中心,目前仅支持 consul
、nacos
或为空,为空时代表不发布该服务到服务中心去,但也就意味着您需要手动处理服务发现的问题,要使用此功能需安装 hyperf/service-governance 组件及对应的驱动依赖,具体可参考 服务注册 章节;
使用
#[RpcService]
注解需use Hyperf\RpcServer\Annotation\RpcService;
命名空间。
定义 JSON RPC Server
HTTP Server (适配 jsonrpc-http
协议)
<?php
use Hyperf\Server\Server;
use Hyperf\