Hyperf-JsonRpc使用
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使用的更多相关文章
- hyperf从零开始构建微服务(一)——构建服务提供者
阅读目录 什么是服务 构建服务提供者 1.创建数据表 2.构建服务提供者 3.安装json rpc依赖 4.安装rpc server组件 5.修改server配置 6.配置数据库 7.编写基础代码 7 ...
- hyperf从零开始构建微服务(二)——构建服务消费者
阅读目录 构建服务消费者 安装json rpc依赖 安装JSON RPC客户端 server配置 编写业务代码 编写服务消费者类 consumer配置 配置 UserServiceInterface ...
- NodeJS POST Request Over JSON-RPC
1.npm install art-template2.npm install request3.在app.js中加入以下代码转html: var template = require('art-t ...
- 使用Jayrock开源组件开发基于JSON-RPC协议的接口
最近接手一个以前的项目,无意间发现此项目开发接口的组件:Jayrock(接口组件估计用的少,用的最多的估计是这个Jayrock.json.dll,用于解析json) 以下是Jayrock的介绍官网: ...
- Lua JSONRPC学习笔记
JSON RPC JSON RPC 为利用json数据格式来执行远程调用方式, 作用同xmlrpc,不过与xmlrpc相比, jsonrpc更加轻量,json更加节省数据量,更加可读性高. 官网网站: ...
- JSON-RPC轻量级远程调用协议介绍及使用
这个项目能够帮助开发人员利用Java编程语言轻松实现JSON-RPC远程调用.jsonrpc4j使用Jackson类库实现Java对象与JSON对象之间的相互转换.jsonrpc4j包含一个JSON- ...
- PHPCURL直接访问JSONRPC服务
<?php $ch = curl_init(); $url = 'http://localhost/jsonrpc?tm='.time().mt_rand (100,999); //参数是为了防 ...
- 利用QObject反射实现jsonrpc
1.jsonrpc请求中的params数组生成签名 static QString signatureFromJsonArray(const QJsonArray &array) { QStri ...
- A simple json-rpc case for bitcoin blockchains
#!/usr/bin/env python import json import jsonrpc import requests #url = "http://user:password@i ...
随机推荐
- Jenkins(4)docker容器内部修改jenkins容器时间
前言 用docker搭建的Jenkins环境时间显示和我们本地时间相差8个小时,需修改容器内部的系统时间 查看时间 查看系统时间 date-R 进入docker容器内部,查看容器时间 docker e ...
- 【uva 1349】Optimal Bus Route Design(图论--网络流 二分图的最小权完美匹配)
题意:有一个N个点的有向带权图,要求找若干个有向圈,使得每个点恰好属于一个圈.请输出满足以上条件的最小权和. 解法:有向圈?也就是每个点有唯一的后继.这是一个可逆命题,同样地,只要每个点都有唯一的后继 ...
- codeforces626E.Simple Skewness(三分)
Define the simple skewness of a collection of numbers to be the collection's mean minus its median. ...
- HDU 2176 取(m堆)石子游戏 && HDU1850 Being a Good Boy in Spring Festivaly
HDU2176题意: m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子. 通过 SG定理 我们可以知道每一个数的SG值,等于这个数到达不了的前面数 ...
- AtCoder Beginner Contest 173 D - Chat in a Circle (贪心)
题意:有一个空环和\(n\)个点,每次可以选择一个点放在空环上,并且获得周围两个点中最小的那个的权值,问能获得的最大的权值是多少? 题解:我们每次都优先放最大的进去,注意每次放的时候都要将这个点放在当 ...
- Codeforces Global Round 8 D. AND, OR and square sum (贪心,位运算)
题意:有\(n\)个数,选择某一对数使二者分别\(or\)和\(and\)得到两个新值,求操作后所有数平方和的最大值. 题解:不难发现每次操作后,两个数的二进制表示下的\(1\)的个数总是不变的,所以 ...
- js--执行上下文和作用域相关问题
前言 如果你是或者你想成为一名合格的前端开发工作者,你必须知道JavaScript代码在执行过程,知道执行上下文.作用域.变量提升等相关概念,并且熟练应用到自己的代码中.本文参考了你不知道的JavaS ...
- hautoj 1268 小天使改名
1268: 小天使改名 时间限制: 2 秒 内存限制: 128 MB提交: 437 解决: 123提交 状态 题目描述 小天使的b站帐号被大家发现啦.于是小天使决定改名,将他原有ID中的两个不同位 ...
- HDU - 5115 Dire Wolf (非原创)
Dire wolves, also known as Dark wolves, are extraordinarily large and powerful wolves. Many, if not ...
- P4213 【模板】杜教筛(杜教筛)题解
题意: 求\(\sum_{i=1}^n\varphi(i)\)和\(\sum_{i=1}^n\mu(i)\) 思路: 由性质可知:\(\mu*I=\epsilon,\varphi*I=id\)那么可得 ...