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;}}

在这里插入图片描述

问题

  1. 如果服务端宕机,则会有下面的报错
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/415631.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity学习路线

目录 一、Unity官方推荐路线二、AI总结的学习路线1、Unity学习路线图&#xff08;文言一心&#xff09;一、基础入门&#xff08;初级&#xff09;二、进阶提升&#xff08;中级&#xff09;三、高级深入&#xff08;高级&#xff09;四、专家级探索 注意事项 2、Unity学习路线…

【2024 CCF编程能力等级认证(GESP)C++ 】 计算机基础知识

目录 1. 引言2. 计算机系统结构2.1 中央处理器&#xff08;CPU - Central Processing Unit&#xff09;2.1.1 运算器 2.1.2 控制器2.1.3 性能指标2.2 存储器2.3 输入设备2.4 输出设备 3. 计算机系统层次结构4. 操作系统4.1 操作系统分类4.2 操作系统常见操作4.2.1 基本开关机操…

Mqtt消费端实现的几种方式

此处测试的mqtt的Broker是使用的EMQX 5.7.1&#xff0c;可移步至https://blog.csdn.net/tiantang_1986/article/details/140443513查看详细介绍 一、方式1 添加必要的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

直播相关概念

文章目录 1、腾讯云直播2、直播&#xff1a;视频直播3、常用的直播组合&#xff1a;4、推流&#xff1a;主播通过推流地址进行视频的推送5、拉流&#xff1a;观众通过拉流地址进行视频的播放6、准备工作6.1、进入腾讯云直播 1、腾讯云直播 直播即时聊天&#xff1a;打赏 文字 …

Linux运维--iptables防火墙命令以及端口号等详解(全)

Linux之iptable防火墙命令以及端口号等详解&#xff08;全&#xff09; 在Linux系统中&#xff0c;你可以使用firewalld和iptables来管理和设置防火墙规则。Firewalld是一个动态管理防火墙的工具&#xff0c;而iptables是一个更底层的工具&#xff0c;可以直接配置Linux内核的…

【重学 MySQL】一、数据库概述

【重学 MySQL】一、数据库概述 为什么要使用数据库数据库与数据库管理系统数据库&#xff08;Database&#xff09;数据库管理系统&#xff08;DBMS&#xff09;数据库与数据库管理系统的关系数据库是数据存储的容器数据库管理系统是数据库的管理者相互依存的关系数据库系统的组…

【网络安全】服务基础第一阶段——第六节:Windows系统管理基础---- DNS部署与安全

计算机智能识别并用IP地址定位&#xff0c;例如我们想要访问一个网页&#xff0c;其实是只能使用这个网页的IP地址&#xff0c;即四位的0&#xff5e;255来访问&#xff0c;但这一串数字难以记忆&#xff0c;于是就有了DNS&#xff0c;将难以记忆的数字转化为容易记忆的域名&am…

Elasticsearch 介绍

1、课程介绍 1.1 ES 8.x 演化进程 版本号发布日期多少个次要版本迭代历时8.02022年2月11日&#xff1f;至今7.02019年4月11日17个次要版本34个月6.02017年11月15日8个次要版本17个月5.02016年10月27日6个次要版本13个月 2、Elasticsearch 是什么 2.1 概念 2.1.1 标准定义 …

文件上传的学习

文件上传漏洞 文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷&#xff0c;而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马&#xff0c;病毒&#xff0c;恶意脚本或者WebShell等。“文件上传”本身没有…

计算机二级 C程序设计(2020B场)全解

A选项&#xff1a;C语言中&#xff0c;一共有3种结构。分别是顺序结构、选择结构&#xff08;else-if语句&#xff09;、循环结构&#xff08;for、while语句&#xff09;。因此&#xff0c;C语言具有结构化特征。 B选项&#xff1a;不仅能解决简单问题&#xff0c;3种基本结构…

WPF MVVM如何在ViewModel直接操作控件对象

早些年在WPF中使用COM组件时&#xff0c;需要在ViewModel中操作COM组件中的控件对象&#xff0c;但是这个控件对象又不支持绑定&#xff0c; 后面的解决办法是在窗口加载时&#xff0c;将控件对象以参数传递到Loaded事件的处理命令中&#xff0c;然后将这个对象记录下来&#…

Ubuntu 18.04升级gclibc为2.28版本

一、查看系统支持的 GLIBC 版本号 ​strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_出现以下&#xff0c;说明到2.27版本&#xff0c;没有2.28版本&#xff0c;所以我们需要手动安装 GLIBC_2.2.5 GLIBC_2.2.6 GLIBC_2.3 GLIBC_2.3.2 GLIBC_2.3.3 GLIBC_2.3.4 GLIBC_…

Docker入门笔记

Docker 文章目录 Docker1. 下载 &#xff08;centos&#xff09;2. 部署 MySQL3. 常用命令4. 数据卷5. 自定义镜像6. Java 项目部署 1. 下载 &#xff08;centos&#xff09; 卸载旧版 yum remove docker \docker-client \docker-client-latest \docker-common \docker-lates…

84、 k8s的pod基础+https-harbor

一、pod基础&#xff1a; pod进阶&#xff1a;探针&#xff08;面试必问—扩缩容&#xff0c;挂载&#xff09; 1.1、pod的定义 pod是k8s里面的最小单位&#xff0c;pod也是最小运行容器的资源对象。 容器时基于pod在k8s集群当中工作。 在k8s集群当中&#xff0c;一个pod就…

第二阶段:机器学习经典算法-02决策树与随机森林-1.决策树概述

该视频主要讲述了决策树与随机森林算法的基本概念和构造过程。决策树是一个树形结构&#xff0c;用于进行一系列的决策&#xff0c;可以用于分类和回归问题。随机森林算法是基于决策树的集成学习算法&#xff0c;通过构建多棵决策树并结合它们的预测结果来提高分类准确率。视频…

asp.net core web api项目添加自定义中间件

前言 在asp.net core web api项目中&#xff0c;默认提供了很多的中间件&#xff0c;比如访问静态文件中间件UseStaticFiles&#xff0c;跨域配置中间件UseCors&#xff0c;路由中间件UseRouting,身份验证中间件UseAuthentication。 那么如何添加一些自定义的中间件呢。 需求…

java SpringBoot 使用ijpay对接微信支付-商家转账到零钱

使用的maven版本&#xff1a;2.9.11 由于ijpay中提供的实体类没有设置回调参数的属性&#xff0c; 这里是自定义一个实体类:InitiateBatchTransferRequest代码如下&#xff1a; package com.foo.web.controller.pay.wxpay;import com.ijpay.wxpay.model.v3.TransferDetailInput…

【办公软件】Excel如何开n次方根

在文章&#xff1a;【分立元件】电阻的基础知识中我们学习电阻值、电阻值容差标注相关标准。知道了标准将电阻值标准数列化。因此电阻值并非1Ω、2Ω、3Ω那样的整数&#xff0c;而是2.2Ω、4.7Ω那样的小数。 这是因为电阻值以标准数(E系列)为准。系列的“E”是Exponent(指数)…

react vant 在使用dialog.confirm取消报错 Uncaught (in promise) undefined

项目场景&#xff1a; 在使用react做移动端开发时&#xff0c;需要使用Dialog.confirm确认框来做弹框选项&#xff0c;这是在操作中非常常用的一种场景。 问题描述 在列表中&#xff0c;使用弹框时&#xff0c;点击取消时&#xff0c;语法报错&#xff1b;导致后面再触发弹框…

【RabbitMQ之一:windows环境下安装RabbitMQ】

目录 一、下载并安装Erlang1、下载Erlang2、安装Erlang3、配置环境变量4、验证erlang是否安装成功 二、下载并安装RabbitMQ1、下载RabbitMQ2、安装RabbitMQ3、配置环境变量4、验证RabbitMQ是否安装成功5、启动RabbitMQ服务&#xff08;安装后服务默认自启动&#xff09; 三、安…