Hyperf-JsonRpc使用

标签(空格分隔): php

安装扩展包

composer require hyperf/json-rpc
composer require hyperf/rpc-server
composer require hyperf/rpc-client

使用

服务有两种角色,一种是 服务提供者(ServiceProvider),即为其它服务提供服务的服务,另一种是 服务消费者(ServiceConsumer),即依赖其它服务的服务,一个服务既可能是 服务提供者(ServiceProvider),同时又是 服务消费者(ServiceConsumer)。而两者直接可以通过 服务契约 来定义和约束接口的调用,在 Hyperf 里,可直接理解为就是一个 接口类(Interface),通常来说这个接口类会同时出现在提供者和消费者下。

server.php

servers 下增加配置

        // jsonrpc-http 服务配置
[
'name' => 'jsonrpc-http',
'type' => Server::SERVER_HTTP,
'host' => '0.0.0.0',
'port' => 9504,
'sock_type' => SWOOLE_SOCK_TCP,
'callbacks' => [
Event::ON_REQUEST => [\Hyperf\JsonRpc\HttpServer::class, 'onRequest'],
],
],

services.php 标记要从何服务中心或者哪个节点 获取节点信息,服务中心配起来很麻烦

<?php
return [
'consumers' => [
[
// 对应消费者类的 $serviceName
'name' => 'UserServiceServer',
// 这个消费者要从哪个服务中心获取节点信息,如不配置则不会从服务中心获取节点信息
// 'registry' => [
// 'protocol' => 'consul',
// 'address' => 'http://127.0.0.1:8500',
// ],
// 如果没有指定上面的 registry 配置,即为直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息
'nodes' => [
['host' => '127.0.0.1', 'port' => 9504],
],
]
],
];

目录结构

定义Server端来提供服务

// 定义接口,更加规范
<?php
declare(strict_types=1); namespace App\Rpc\Inter; interface UserServiceInter
{
public function getUserInfo(int $userId) : string; public function getUserList(int $page, int $pageSize, array $params = []) : string;
} // server
<?php
declare(strict_types=1); namespace App\Rpc\Server; use App\Rpc\Inter\UserServiceInter;
use App\Utils\ResJson;
use Hyperf\Di\Annotation\Inject;
use Hyperf\RpcServer\Annotation\RpcService; /**
* Rpc用户服务
* Class RpcUserService
* @package App\Rpc
* name: 服务名称全局唯一
* protocol: 服务协议:jsonrpc-http, jsonrpc, jsonrpc-tcp-length-check
* @RpcService(name="UserServiceServer", protocol="jsonrpc-http", server="jsonrpc-http", publishTo="consul")
*/
class UserServiceServer implements UserServiceInter
{ /**
* @Inject()
* @var ResJson
*/
public $resJson; /**
* 获取用户信息
* @param int $userId
* @return string
*/
public function getUserInfo(int $userId) : string
{
$array['user_id'] = $userId;
$array['user_name'] = "PHP";
return $this->resJson->returnJsonString(ResJson::CODE_200, $array);
} /**
* 获取用户列表
* @param int $page 页码数
* @param int $pageSize 每页条数
* @param array $params 可选参数
* @return string
*/
public function getUserList(int $page, int $pageSize, array $params = []): string
{
$user[] = ['user_id' => 1, 'user_name' => 'Bill'];
$user[] = ['user_id' => 2, 'user_name' => 'Taylor'];
$user[] = ['user_id' => 3, 'user_name' => 'Jerry'];
return $this->resJson->returnJsonString(ResJson::CODE_200, $user);
}
}

定义服务消费者

<?php
declare(strict_types=1); namespace App\Rpc\Client; use App\Rpc\Inter\UserServiceInter;
use Hyperf\RpcClient\AbstractServiceClient; class UserServiceClient extends AbstractServiceClient implements UserServiceInter
{
/**
* 服务提供者的服务名称
* @var string
*/
protected $serviceName = "UserServiceServer"; /**
* 定义对应服务提供者的服务协议
* @var string
*/
protected $protocol = 'jsonrpc-http'; public function getUserInfo(int $userId) : string
{
return $this->__request(__FUNCTION__, compact('userId'));
} public function getUserList(int $page, int $pageSize, array $params = []): string
{
return $this->__request(__FUNCTION__, compact('page', 'pageSize', 'params'));
}
}

使用Rpc服务

在config/autoload/dependencies.php 内定义 UserServiceInter 和 UserServiceClient 的关系

// 这样便可以通过注入 UserServiceInter 接口来使用客户端了
\App\Rpc\Inter\UserServiceInter::class => \App\Rpc\Client\UserServiceClient::class,

这样便可以通过注入 UserServiceInter 接口来使用客户端了。

Controller 代码:

<?php

declare(strict_types=1);

namespace App\Admin\Controller;

use App\Admin\Model\UserModel;
use App\Admin\Service\UserService;
use App\Event\AppException;
use App\Rpc\Inter\UserServiceInter;
use Hyperf\DbConnection\Db;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\AutoController;
use Hyperf\Utils\Context;
use Psr\EventDispatcher\EventDispatcherInterface;
use function _HumbugBoxa5be08ba8ddb\React\Promise\Stream\first; /**
* 用户控制器
* Class UserController
* @package App\Admin\Controller
* @AutoController()
*/
class UserController extends AdminBaseController
{
/**
* @Inject()
* @var UserServiceInter
*/
public $rpcUserService; public function rpc()
{
$arr = $this->rpcUserService->getUserInfo(919);
var_dump($arr);
return $arr;
} public function rpcuserlist()
{
$arr = $this->rpcUserService->getUserList(1, 10);
var_dump($arr);
return $arr;
}
}

重启hyperf 运行

Hyperf-JsonRpc使用的更多相关文章

  1. hyperf从零开始构建微服务(一)——构建服务提供者

    阅读目录 什么是服务 构建服务提供者 1.创建数据表 2.构建服务提供者 3.安装json rpc依赖 4.安装rpc server组件 5.修改server配置 6.配置数据库 7.编写基础代码 7 ...

  2. hyperf从零开始构建微服务(二)——构建服务消费者

    阅读目录 构建服务消费者 安装json rpc依赖 安装JSON RPC客户端 server配置 编写业务代码 编写服务消费者类 consumer配置 配置 UserServiceInterface ...

  3. NodeJS POST Request Over JSON-RPC

    1.npm install art-template2.npm  install request3.在app.js中加入以下代码转html: var template = require('art-t ...

  4. 使用Jayrock开源组件开发基于JSON-RPC协议的接口

    最近接手一个以前的项目,无意间发现此项目开发接口的组件:Jayrock(接口组件估计用的少,用的最多的估计是这个Jayrock.json.dll,用于解析json) 以下是Jayrock的介绍官网: ...

  5. Lua JSONRPC学习笔记

    JSON RPC JSON RPC 为利用json数据格式来执行远程调用方式, 作用同xmlrpc,不过与xmlrpc相比, jsonrpc更加轻量,json更加节省数据量,更加可读性高. 官网网站: ...

  6. JSON-RPC轻量级远程调用协议介绍及使用

    这个项目能够帮助开发人员利用Java编程语言轻松实现JSON-RPC远程调用.jsonrpc4j使用Jackson类库实现Java对象与JSON对象之间的相互转换.jsonrpc4j包含一个JSON- ...

  7. PHPCURL直接访问JSONRPC服务

    <?php $ch = curl_init(); $url = 'http://localhost/jsonrpc?tm='.time().mt_rand (100,999); //参数是为了防 ...

  8. 利用QObject反射实现jsonrpc

    1.jsonrpc请求中的params数组生成签名 static QString signatureFromJsonArray(const QJsonArray &array) { QStri ...

  9. A simple json-rpc case for bitcoin blockchains

    #!/usr/bin/env python import json import jsonrpc import requests #url = "http://user:password@i ...

随机推荐

  1. 3. Linear Regression with Multiple Variables

    前面还有一章主要讲解,基本的Linear Algebra线性代数的知识,都比较简单,这里就直接跳过了. Speaker: Andrew Ng 1. Multiple featues 训练集的特征变成了 ...

  2. P1714 切蛋糕 dp+单调队列

    题意: 题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到 ...

  3. 【uva 12219】Common Subexpression Elimination(图论--树+自定义比较器+映射+递归)

    题意:如题,用表达式树来表示一个表达式,且消除公共的部分,即用编号表示.编号 K 定义为表达式第 K 个出现的字符串. 解法:先构造表达式树,给每棵子树用(string,left_son,right_ ...

  4. 2020ICPC&#183;小米 网络选拔赛第一场 J.Matrix Subtraction (贪心,二维差分)

    题意:给一个\(nXm\)的矩阵,可以选取\(aXb\)的子矩阵,使子矩阵中的所有元素减一,问最后是否能使矩阵中所有元素变为\(0\). 题解:首先贪心,我们看最左上角的元素,如果\(g[1][1]\ ...

  5. 洛谷-P1439 【模板】最长公共子序列 (DP,离散化)

    题意:给两个长度为\(n\)的全排列,求他们的LCS 题解:这题给的数据范围到\(10^5\),用\(O(n^2)\)的LCS模板过不了,但由于给的是两个全排列,他们所含的元素都是一样的,所以,我们以 ...

  6. JavaScript——匿名函数和闭包

    匿名函数就是没有名字的函数 闭包就是一个函数中的另一个函数 函数可以不加分号,但是语句要加!! 可以把匿名函数的返回值赋值给变量!! box()时返回里面的函数,再加一个()就会返回里面那函数的值(浅 ...

  7. 恢复win10 LTSC 2019 图片查看器功能

    1.开始–运行–输入"regedit"打开注册表. 2. 在打开的注册表编辑器中,从左侧依次展开:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Win ...

  8. .NET 5学习笔记(10)——Entity Framework Core之切换SQLServer和SQLite

    上一篇我们梳理了CodeFist的一般流程,本篇我们讨论如何在一套代码中,支持SQL Server和SQLite的切换.同时从本篇开始,我们从.NET Core 3.1 迁移到.NET 5.相信.NE ...

  9. smartbits国产版本minismb –快速安装上手指南

    Minismb测试仪表是复刻smartbits的国产版本,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连接数和 ...

  10. Kubernets二进制安装(9)之部署主控节点控制器controller-manager

    kube-controller-manager运行控制器,它们是处理集群中常规任务的后台线程 Controller Manager就是集群内部的管理控制中心,由负责不同资源的多个Controller构 ...