hyperf json-rpc
安装
安装docker hyperf
安装 hyperf-rpc-server-v8 (服务端)
docker run --name hyperf-rpc-server-v8 \
-v /www/docker/hyperf-rpc-server:/data/project \
-w /data/project \
-p 9508:9501 -it \
--privileged -u root \
--entrypoint /bin/sh \
hyperf/hyperf:8.1-alpine-v3.18-swoole
安装 hyperf-rpc-client-v8 (客户端)
docker run --name hyperf-rpc-client-v8 \
-v /www/docker/hyperf-rpc-client:/data/project \
-w /data/project \
-p 9509:9501 -it \
--privileged -u root \
--entrypoint /bin/sh \
hyperf/hyperf:8.1-alpine-v3.18-swoole
(一)创建配置中心服务
安装nacos配置中心
composer require hyperf/config-center
composer require hyperf/config-nacos
配置文件config/aoutload/config_center.php
注意:
这里的
'group_name' => 'DEFAULT_GROUP', 对应注册中心的 Group
'namespace_id' => 'public', 对应注册中心的 命名空间 public
<?phpdeclare(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*/
use Hyperf\ConfigCenter\Mode;use function Hyperf\Support\env;return ['enable' => (bool) env('CONFIG_CENTER_ENABLE', true),'driver' => env('CONFIG_CENTER_DRIVER', 'nacos'),'mode' => env('CONFIG_CENTER_MODE', Mode::PROCESS),'drivers' => ['nacos' => ['driver' => Hyperf\ConfigNacos\NacosDriver::class,'merge_mode' => Hyperf\ConfigNacos\Constants::CONFIG_MERGE_OVERWRITE,'interval' => 3,'default_key' => 'nacos_config','listener_config' => [// dataId, group, tenant, type, content'nacos_config' => ['tenant' => 'public', // corresponding with service.namespaceId'data_id' => 'config_user','group' => 'DEFAULT_GROUP',],'nacos_config.data' => ['data_id' => 'config_user','group' => 'DEFAULT_GROUP','type' => 'json',],'nacos_config.member' => ['data_id' => 'member','group' => 'DEFAULT_GROUP','type' => 'json',],],'client' => [// nacos server url like https://nacos.hyperf.io, Priority is higher than host:port// 'uri' => '','host' => '10.0.0.94','port' => 8848,'username' => null,'password' => null,'guzzle' => ['config' => null,]],],],
];

nacos配置文件


结果

控制器调用
public function index(){$user = $this->request->input('user', 'Hyperf');$method = $this->request->getMethod();$v = \Hyperf\Config\config('nacos_config');var_dump($v);return ['method' => $method,'message' => "Hello {$user}.",];}
(二)创建服务发现项目
composer create-project hyperf/hyperf-skeleton
服务端
安装json-rpc
如果没安装请先安装相关的插件
composer require hyperf/json-rpc
安装rpc-server
要使用 JSON RPC 服务端:
composer require hyperf/rpc-server
安装service-governance-nacos
composer require hyperf/service-governance-nacos
或指定版本
composer require hyperf/service-governance-nacos:v2.2.39
server.php配置文件
['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'],],'options' => [// Whether to enable request lifecycle event'enable_request_lifecycle' => false,],],

nacos注册中心,推服务到注册中心,servers.php
注意:
这里的
'group_name' => 'DEFAULT_GROUP', 对应注册中心的 Group
'namespace_id' => 'public', 对应注册中心的 命名空间 public
<?php
/*** services.php** Created on 2024-08-27-14:30* Created by xxp 332410549@qq.com*/return ['enable' => [// 开启服务发现'discovery' => true,// 开启服务注册'register' => true,],// 服务消费者相关配置'consumers' => [],// 服务提供者相关配置'providers' => [],// 服务驱动相关配置'drivers' => [//consul注册中心驱动'consul' => ['uri' => 'http://127.0.0.1:8500','token' => '','check' => ['deregister_critical_service_after' => '90m','interval' => '1s',],],// 注册 nacos 服务发现驱动'nacos' => ['host' => '10.0.0.94','port' => 8848,// The nacos account info'username' => null,'password' => null,'guzzle' => ['config' => null,],'group_name' => 'DEFAULT_GROUP','namespace_id' => 'public','heartbeat' => 5,'ephemeral' => false, // 是否注册临时实例],],
];

查看结果

消费端
安装
安装json-rpc
如果没安装请先安装相关的插件
composer require hyperf/json-rpc
安装rpc-client
要使用 JSON RPC 客户端:
composer require hyperf/rpc-client
安装service-governance-nacos
composer require hyperf/service-governance-nacos
或指定版本
composer require hyperf/service-governance-nacos:v2.2.39
如果没有安装service-governance-nacos,则会有报错
hyperf Invalid protocol of registry nacos[156]
自动创建代理消费者类
不常用,可以看下面的配置复用
<?php
return [// 此处省略了其它同层级的配置'consumers' => [[// name 需与服务提供者的 name 属性相同'name' => 'CalculatorService',// 服务接口名,可选,默认值等于 name 配置的值,如果 name 直接定义为接口类则可忽略此行配置,如 name 为字符串则需要配置 service 对应到接口类'service' => \App\Interfaces\CalculatorServiceInterface::class,// 对应容器对象 ID,可选,默认值等于 service 配置的值,用来定义依赖注入的 key'id' => \App\Interfaces\CalculatorServiceInterface::class,// 服务提供者的服务协议,可选,默认值为 jsonrpc-http// 可选 jsonrpc-http jsonrpc jsonrpc-tcp-length-check'protocol' => 'jsonrpc-http',// 负载均衡算法,可选,默认值为 random'load_balancer' => 'random',// 这个消费者要从哪个服务中心获取节点信息,如不配置则不会从服务中心获取节点信息'registry' => ['protocol' => 'nacos','address' => 'http://10.0.0.94:8848',],// 如果没有指定上面的 registry 配置,即为直接对指定的节点进行消费,通过下面的 nodes 参数来配置服务提供者的节点信息'nodes' => [['host' => '127.0.0.1', 'port' => 9504],],// 配置项,会影响到 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,],// 重试次数,默认值为 2,收包超时不进行重试。暂只支持 JsonRpcPoolTransporter'retry_count' => 2,// 重试间隔,毫秒'retry_interval' => 100,// 使用多路复用 RPC 时的心跳间隔,null 为不触发心跳'heartbeat' => 30,// 当使用 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/services.php 配置文件内就可能会重复配置很多次 registry 配置,但通常来说,我们的服务中心可能是统一的,也就意味着多个服务消费者配置都是从同样的服务中心去拉取节点信息,此时我们可以通过 PHP 变量 或 循环 等 PHP 代码来实现配置文件的生成。
通过 PHP 变量生成配置
<?php
$registry = ['protocol' => 'consul','address' => 'http://127.0.0.1:8500',
];
return [// 下面的 FooService 和 BarService 仅示例多服务,并不是在文档示例中真实存在的'consumers' => [['name' => 'CalculatorService','service' => \App\JsonRpc\CalculatorServiceInterface::class,'registry' => $registry,],],
];
通过循环生成配置
<?php
return [// 此处省略了其它同层级的配置'consumers' => value(function () {$consumers = [];// 这里示例自动创建代理消费者类的配置形式,顾存在 name 和 service 两个配置项,这里的做法不是唯一的,仅说明可以通过 PHP 代码来生成配置// 下面的 FooServiceInterface 和 BarServiceInterface 仅示例多服务,并不是在文档示例中真实存在的$services = ['FooService' => App\JsonRpc\FooServiceInterface::class,'BarService' => App\JsonRpc\BarServiceInterface::class,];foreach ($services as $name => $interface) {$consumers[] = ['name' => $name,'service' => $interface,'registry' => ['protocol' => 'consul','address' => 'http://127.0.0.1:8500',]];}return $consumers;}),
];
控制器调用
接口代码
这个接口与服务端是一致的
<?php
/*** CalculatorServiceInterface.php** Created on 2024-08-27-14:50* Created by xxp 332410549@qq.com*/
declare(strict_types=1);namespace App\JsonRpc;interface CalculatorServiceInterface
{public function sum(int $v1, int $v2): int;}

属性注入调用
控制器代码
<?phpdeclare(strict_types=1);
namespace App\Controller;use App\JsonRpc\CalculatorServiceInterface;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\AutoController;;#[AutoController(prefix: "index")]
class IndexController extends AbstractController
{#[Inject]private CalculatorServiceInterface $cal;public function client(){$res = $this->cal->sum(1,2);return '1 + 2 = '.$res;}
}
结果:

容器调用
<?phpdeclare(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*/namespace App\Controller;use App\JsonRpc\CalculatorServiceInterface;
use Hyperf\Context\ApplicationContext;
use Hyperf\HttpServer\Annotation\AutoController;;#[AutoController(prefix: "index")]class IndexController extends AbstractControllerpublic function container(){$client = ApplicationContext::getContainer()->get(CalculatorServiceInterface::class);$res = $client->sum(100,200);return '100 + 200 = '.$res;}}

问题
- 如果服务端宕机,则会有下面的报错

相关文章:
hyperf json-rpc
安装 安装docker hyperf 安装 hyperf-rpc-server-v8 (服务端) docker run --name hyperf-rpc-server-v8 \ -v /www/docker/hyperf-rpc-server:/data/project \ -w /data/project \ -p 9508:9501 -it \ --privileged -u root \ --entrypoint /bin/sh \…...
基于SpringBoot的外卖点餐系统
你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:SpringBootJSP 工具:IDEA/Eclipse、Navicat、Maven、Tomcat 系统展示 首页 用户管理界…...
网络编程day02(字节序、TCP编程)
目录 【1】字节序 1》大小端转换 2》端口转换 3》IP地址转换 主机字节序转换为网络字节序 (小端序->大端序) 网络字节序转换为主机字节序(大端序->小端序) 【2】TCP编程 1》流程 2》函数接口 1> socket 2> …...
萌新6:临场发挥(区间dp)
题目描述 小x和室友总共 nnn 人,组团去打一款游戏,总共有 nnn 台电脑供他们使用,一人一台,最开始,第 iii 个人使用第 iii 台电脑。 小x评估了每个人的能力值和临场发挥值。 第 iii 个人的能力值为 aia_iai。 而他们…...
《数字信号处理》学习04-离散时间系统中的线性时不变系统
目录 一,系统及离散时间系统 二,离散时间系统中的线性时不变系统 1,线性系统 1) 可加性 2) 比例性(齐次性) 3)叠加原理(叠加性质) 2,时不变系统(移不变系统) 通过前几篇文章的学习,此时我对序列的相关概…...
ABAP 调试宏DEFINE
文章目录 调试过程完整程序 调试过程 完整程序 REPORT Z_TEST_DEFINE.TYPES: BEGIN OF GTY_DATA,NAME TYPE STRING,AGE TYPE I,END OF GTY_DATA. DATA: GS_DATA TYPE GTY_DATA,GT_DATA TYPE TABLE OF GTY_DATA. DEFINE D_TEST.GS_DATA-NAME &1.GS_DATA-AGE &2.APPE…...
Golang | Leetcode Golang题解之第393题UTF-8编码验证
题目: 题解: const mask1, mask2 1 << 7, 1<<7 | 1<<6func getBytes(num int) int {if num&mask1 0 {return 1}n : 0for mask : mask1; num&mask ! 0; mask >> 1 {nif n > 4 {return -1}}if n > 2 {return n}r…...
HarmonyOS开发实战( Beta5.0)DevEco Device Tool开发环境搭建实践
通常在嵌入式开发中,很多开发者习惯于使用Windows进行代码的编辑,比如使用Windows的Visual Studio Code进行OpenHarmony代码的开发。但当前阶段,大部分的开发板源码还不支持在Windows环境下进行编译,如Hi3516、Hi3518系列开发板。…...
WIFI贴项目到底是不是“骗局”呢?由我来揭秘!
各位亲爱的朋友们,大家好!我是你们的老朋友鲸天科技千千,一直在这片互联网的热土上耕耘。相信你们对我都不会陌生,因为我常常分享一些互联网上的新奇项目和实用技巧。如果你对我的内容感兴趣,别忘了点个关注哦…...
C++ string类—string修饰符、操作、非成员函数
一、Modifiers(修饰符): 1、operator 这个成员函数给一个string类类型的对象进行追加,在现有的string后面追加string类、字符串或者字符; 代码示例: void test1() {std::string s1("Hello ");…...
PVN3D(一)代码框架
在windows上配置pvn3d的环境一直配不成功,主要卡在了与C联合编译上,不知道如何处理了。索性先看看代码,竟然发现与论文中的代码对应上了。希望这一段时间把环境配置好。 1.论文中的网络结构 1.RGB图像特征,通过CNN提取特征。深度…...
「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究
「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究 文章目录 「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究前言介绍UIResponderUIGestureRecognizerUIControl 正文UIGestur…...
GitHub Copilot的详细介绍
目录 主要功能: 示例用法: GitHub Copilot 的优缺点: 优点: 缺点: 如何使用 GitHub Copilot? 总结: GitHub Copilot 是一种基于人工智能的编程助手,由 GitHub 和 OpenAI 联合…...
opencv之阈值处理
文章目录 1. 阈值处理2. 阈值处理的基本原理3. 常见的阈值处理方法3.1 全局阈值(Global Thresholding):3.2 自适应阈值(Adaptive Thresholding):3.2.1 工作原理3.2.2 工作步骤3.2.3 适用场景3.2.4 优缺点自适应阈值的优点自适应阈…...
oracle startup失败,ORA-01078: failure in processing system parameters
SQL> startup ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file /data/oracle/product/11.2.0/db_1/dbs/initorc1.ora 出错的原因可能是:文件名字不正确,文件权限不对,文件不存在&#x…...
【python因果推断库7】使用 pymc 模型的工具变量建模 (IV)2
目录 与普通最小二乘法 (OLS) 的比较 应用理论:政治制度与GDP 拟合模型:贝叶斯方法 多变量结果和相关性度量 结论 与普通最小二乘法 (OLS) 的比较 simple_ols_reg sk_lin_reg().fit(X.reshape(-1, 1), y)print("Intercept:", simple_ols_…...
【2024数模国赛赛题思路公开】国赛B题思路丨附可运行代码丨无偿自提
2024年国赛B题解题思路 问题 1: 抽样检测方案设计 【题目分析】 分析: 目标是设计一个高效的抽样检测方案,在尽量少的样本数量下,确保在高信度水平下做出正确的接受或拒收决策。需要处理两个不同的信度要求,这对样本量的计算提…...
智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(KNN分类器)
智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(KNN分类器) 文章目录 一、基本原理原理流程举个例子总结 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#x…...
使用udp进行通信
UDP chat 头文件 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <time…...
C#上位机使用Microsoft.Office.Interop.Excel和EPPlus库对Excel或WPS表格进行写操作
C#上位机使用Microsoft.Office.Interop.Excel和EPPlus库对Excel或WPS表格进行写操作 一、使用Microsoft.Office.Interop.Excel库 1、通过NuGet包管理器添加引用 按照下图中红框所示进行操作。 需要安装Microsoft.Office.Interop.Excel包 添加Microsoft Office 16.0 Object …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...
以太网PHY布局布线指南
1. 简介 对于以太网布局布线遵循以下准则很重要,因为这将有助于减少信号发射,最大程度地减少噪声,确保器件作用,最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确,然…...
