PHP实现微服务RPC接口的一种尝试(yii2+yar)

跨世纪少年 2月前 226

安装yar及msgpack
  • pecl install msgpack
  • pecl install yar
注:安装yar时我的mac电脑上报了如下错,这是因为在/usr/local/include/目录下没有curl导致的,我的curl在/usr/local/opt/curl-openssl/include/curl/这里,所以只要加一个软链接就可以了,进入/usr/local/include/目录在终端输入 ln -s /usr/local/opt/curl-openssl/include/curl curl 就OK了
configure: error: Please reinstall the libcurl distribution - easy.h should be in <curl-dir>/include/curl/
ERROR: `/private/tmp/pear/temp/yar/configure --with-php-config=/usr/local/opt/php@7.2/bin/php-config --enable-msgpack=yes' failed 
PHP配置
  • php.ini里添加 extension=msgpack.so
  • php.ini里添加 extension=yar.so
新建一个yii2项目作为server端
  • 我们新建一个TestController.php 写一个控制器方法,内容如下:
public function actionHandle()
{
  try {
    $service = new \Yar_Server(new TestLogical());
    Yii::$app->response->send();
    $service->handle();
  } catch (\Exception $e) {
    Yii::error($e->getMessage());
  }
}
  • 再建一个TestLogical.php, 内容如下:
<?php

namespace app\modules\v1\logical;

use Yii;
use dusnoob\yii\rest\RestModel;

class TestLogical extends RestModel
{
    public function test()
    {
        return [
            'name' => 'Test name',
            'info' => 'Tthis is info',
            'status' => 10
        ];
    }
}

以上,服务端就写完了!

再建一个项目作为client端
  • 我封装了一个帮助类,内容如下:
<?php

namespace dusnoob\yii\helpers\rpc;

use Yii;
use yii\base\InvalidConfigException;

class RpcServiceHelper
{
    private $client; // 用于创建一个客户端实例
    public $route; // 请求的接口路由
    public $header; // 头部信息;格式: ['Authorization: DusNoob 123456', 'signature: 56789']
    public $packager; // 默认“php”,当使用--enable-msgpack构建然后默认为“msgpack”时,它应该是“php”,“json”,“msgpack”之一
    public $persistent; // 默认 off,具体干什么的找不到资料-_-!!!
    public $timeout; // 默认5000(ms) 接口请求超时时间
    public $connect_timeout; // 默认1000(ms)连接超时时间

    /**
     * 调用接口;获取、处理信息
     *
     * @return void
     */
    public function getRpcInterface()
    {
        if (empty($this->route)) {
            throw new InvalidConfigException('缺少请求的接口地址');
        }
        if (empty($this->client)) {
            $this->client = new \Yar_Client($this->route);
        }
        $this->header = Yii::$app->request->headers->get('signature-header');
        $this->setOptHeader();
        !empty($this->packager) && $this->setOptPackager();
        !empty($this->persistent) && $this->setOptPersistent();
        !empty($this->timeout) && $this->setOptTimeout();
        !empty($this->connect_timeout) && $this->setOptConnectTimeout();
        return $this->client;
    }

    /**
     * 设置头部信息
     *
     * @return void
     */
    private function setOptHeader()
    {
        $this->client->setOpt(YAR_OPT_HEADER, $this->header);
    }

    /**
     * Undocumented function
     *
     * @return void
     */
    private function setOptPackager()
    {
        $this->client->setOpt(YAR_OPT_PACKAGER, $this->packager);
    }

    /**
     * Undocumented function
     *
     * @return void
     */
    private function setOptPersistent()
    {
        $this->client->setOpt(YAR_OPT_PERSISTENT, $this->persistent);
    }

    /**
     * Undocumented function
     *
     * @return void
     */
    private function setOptTimeout()
    {
        $this->client->setOpt(YAR_OPT_TIMEOUT, $this->timeout);
    }

    /**
     * Undocumented function
     *
     * @return void
     */
    private function setOptConnectTimeout()
    {
        $this->client->setOpt(YAR_OPT_CONNECT_TIMEOUT, $this->connect_timeout);
    }
}
  • 新建一个TestController.php,写一个控制器方法,内容如下:
public function actionView()
{
  $model = new RpcServiceHelper();
  $model->route = Yii::$app->params['server_api_host'].ServerApiConst::TEST_ROUTE;// 这个是server端的接口地址
  $client = $model->getRpcInterface();
  $data = $client->test();
  return $data;
}
  • 我们请求这个接口地址;返回结果如下:
{
    "data": {
        "name": "Test name",
        "info": "Tthis is info",
        "status": 10
    },
    "code": 200,
    "message": "OK",
    "success": true
}

以上,客户端也OK了!

注:因为每个人项目的环境不一样,以上代码并非拿来就可以用,如有问题可以评论和我讨论
最新回复 (0)
    • 都市菜鸟网
      2
        立即登录 立即注册 
返回
发新帖