Hyperf
官方写 JsonRpc
的使用 Demo
还是比较清晰的,但是作为一个新手,刚使用的时候,还是不是很明白,这里给初次接触的同学,写一个更精细化的 Demo
。很简单的 Demo
,在官方的例子基础上写的。已经理解 JsonRpc
怎么交互,怎么写代码的兄弟们,就不用继续看了。
首先使用下面命令,创建两个hyperf
的项目
composer create-project hyperf/hyperf-skeleton hyperf1
composer create-project hyperf/hyperf-skeleton hyperf2
hyperf1
作为 rpc
的客户端,hyperf2
作为 rpc
的服务端
安装的时候,除了这里需要选择 1 ,其他的都直接按回车键就可以了。
hyperf1
客户端需要完成的代码
在 app
目录下创建一个 JsonRpc
的目录,在当前目录下创建一个接口 CalculatorServiceInterface
和 一个实现类 CalculatorServiceConsumer
,代码如下:
CalculatorServiceInterface.php
<?php
namespace App\JsonRpc;
interface CalculatorServiceInterface
{
public function add(int $a, int $b): int;
public function reduce(int $a, int $b): int;
}
CalculatorServiceConsumer.php
<?php
namespace App\JsonRpc;
use Hyperf\RpcClient\AbstractServiceClient;
class CalculatorServiceConsumer extends AbstractServiceClient implements CalculatorServiceInterface
{
/**
* 定义对应服务提供者的服务名称
* @var string
*/
protected $serviceName = 'CalculatorService';
/**
* 定义对应服务提供者的服务协议
* @var string
*/
protected $protocol = 'jsonrpc-http';
/**
* 两数相加
* @param int $a
* @param int $b
* @return int $a + $b
*/
public function add(int $a, int $b): int
{
return $this->__request(__FUNCTION__, compact('a', 'b'));
}
/**
* 两数相减
* @param int $a
* @param int $b
* @return int $a - $b
*/
public function reduce(int $a, int $b): int
{
return $this->__request(__FUNCTION__, compact('a', 'b'));
}
}
在 app/Controller
目录下创建一个 TestController
类,代码如下:
TestController.php
<?php
namespace App\Controller;
use App\JsonRpc\CalculatorServiceInterface;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\AutoController;
/**
* @AutoController()
* Class TestController
* @package App\Controller
*/
class TestController extends AbstractController
{
/**
* @Inject()
* @var CalculatorServiceInterface
*/
private $calculatorService;
/**
* 两树相加
* @return int
*/
public function add()
{
return $this->calculatorService->add($this->request->query('a', 1), $this->request->query('b', 2));
}
/**
* 两树相减
* @return int
*/
public function reduce()
{
return $this->calculatorService->reduce($this->request->query('a', 1), $this->request->query('b', 2));
}
}
然后在 config/autoload/services.php
中加入如下代码,如果这个文件没有,直接创建即可
<?php
return [
'consumers' => [
[
// name 需与服务提供者的 name 属性相同
'name' => 'CalculatorService',
// 服务接口名,可选,默认值等于 name 配置的值,如果 name 直接定义为接口类则可忽略此行配置,如 name 为字符串则需要配置 service 对应到接口类
'service' => App\JsonRpc\CalculatorServiceInterface::class,
// 对应容器对象 ID,可选,默认值等于 service 配置的值,用来定义依赖注入的 key
'id' => App\JsonRpc\CalculatorServiceInterface::class,
// 服务提供者的服务协议,可选,默认值为 jsonrpc-http
// 可选 jsonrpc-http jsonrpc jsonrpc-tcp-length-check
'protocol' => 'jsonrpc-http',
// 负载均衡算法,可选,默认值为 random
'load_balancer' => 'random',
// 这个消费者要从哪个服务中心获取节点信息,如不配置则不会从服务中心获取节点信息
// 这个注释了,我们不配置服务中心
// 'registry' => [
// 'protocol' => 'consul',
// 'address' => 'http://127.0.0.1:9502',
// ],
// 如果没有指定上面的 registry 配置,即为直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息
'nodes' => [
['host' => '127.0.0.1', 'port' => 9502],
],
// 配置项,会影响到 Packer 和 Transporter
'options' => [
'connect_timeout' => 5.0,
'recv_timeout' => 5.0,
'settings' => [
// 根据协议不同,区分配置
'open_eof_split' => true,
'package_eof' => "\r\n",
// 'open_length_check' => true,
// 'package_length_type' => 'N',
// 'package_length_offset' => 0,
// 'package_body_offset' => 4,
],
// 当使用 JsonRpcPoolTransporter 时会用到以下配置
'pool' => [
'min_connections' => 1,
'max_connections' => 32,
'connect_timeout' => 10.0,
'wait_timeout' => 3.0,
'heartbeat' => -1,
'max_idle_time' => 60.0,
],
],
]
],
];
然后在 config/autoload/dependencies.php
文件中写入如下代码
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
return [
App\JsonRpc\CalculatorServiceInterface::class => App\JsonRpc\CalculatorServiceConsumer::class
];
至此,我们的 hyperf1
作为客户端的代码就完成了,启动应用,继续写服务端的代码
hyperf2
服务端需要完成的代码
继续在服务端的 app
目录下创建一个 JsonRpc
的目录,在当前目录下创建一个接口 CalculatorServiceInterface
和 一个实现类 CalculatorService
,代码如下:
CalculatorServiceInterface.php
<?php
namespace App\JsonRpc;
interface CalculatorServiceInterface
{
public function add(int $a, int $b): int;
public function reduce(int $a, int $b): int;
}
CalculatorService.php
<?php
namespace App\JsonRpc;
use Hyperf\RpcServer\Annotation\RpcService;
/**
* @RpcService(name="CalculatorService", protocol="jsonrpc-http", server="jsonrpc-http", publishTo="consul")
* Class CalculatorService
* @package App\JsonRpc
*/
class CalculatorService implements CalculatorServiceInterface
{
/**
* 两数相加
* @param int $a
* @param int $b
* @return int
*/
public function add(int $a, int $b): int
{
return $a + $b;
}
/**
* 两数相减
* @param int $a
* @param int $b
* @return int
*/
public function reduce(int $a, int $b): int
{
return $a - $b;
}
}
然后在 config/autoload/server.php
中加入如下代码
<?php
// ...其他代码
return [
'mode' => SWOOLE_PROCESS,
'servers' => [
// ...其他代码
[
'name' => 'jsonrpc-http',
'type' => Server::SERVER_HTTP,
'host' => '0.0.0.0',
'port' => 9502,
'sock_type' => SWOOLE_SOCK_TCP,
'callbacks' => [
SwooleEvent::ON_REQUEST => [Hyperf\JsonRpc\HttpServer::class, 'onRequest'],
],
]
],
// ...其他代码
];
好了,我们的 hyperf2
作为服务端的代码也就这么多了,启动应用
访问 http://127.0.0.1:9501/test/add?a=2&b=3
就能看到结果了
简单的操作基本就这么多了,其他更深的业务,大家慢慢探索吧!
如果当前的代码有什么遗漏,或者跑不起来,可以联系我。有什么需要改正的,可以留言给我;有用的话,点个赞 [手动抱拳]