Hyperf初体验-JsonRpc的使用

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 就能看到结果了

简单的操作基本就这么多了,其他更深的业务,大家慢慢探索吧!

如果当前的代码有什么遗漏,或者跑不起来,可以联系我。有什么需要改正的,可以留言给我;有用的话,点个赞 [手动抱拳]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三书yjy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值