hyperf/go/springboot通过jsonrpc通信_深井伏特加的博客-CSDN博客_hyperf goframe


本站和网页 https://blog.csdn.net/m0_52107987/article/details/111414639 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

hyperf/go/springboot通过jsonrpc通信_深井伏特加的博客-CSDN博客_hyperf goframe
hyperf/go/springboot通过jsonrpc通信
深井伏特加
已于 2022-10-22 20:29:53 修改
1089
收藏
分类专栏:
PHP
Golang
Java
文章标签:
springboot
php
golang
于 2020-12-20 10:48:43 首次发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_52107987/article/details/111414639
版权
PHP
同时被 3 个专栏收录
2 篇文章
0 订阅
订阅专栏
Golang
2 篇文章
0 订阅
订阅专栏
Java
3 篇文章
0 订阅
订阅专栏
一、背景
随着用户的增长和业务的增多,单节点服务已经满足不了需求,用hyperf对主业务进行了重构。
hyperf是一个后现代的php框架,基于php+swoole,支持协程,解决了php让人诟病的性能问题和多线程支持不够的问题。官方也提供了各种组件,比如 配置中心、定时任务、消息队列和微服务,对于日常业务需求,基本能做到开箱即用,有点php界的springcloud的意思。
用过hyperf的微服务后,眼前一亮。hyperf采用了新起一个Server,在Service层接收和返回数据,本地也可以复用这些Service,通信协议用的是jsonrpc2.0,既支持http协议,又支持tcp协议,用http协议调试时可以直接用postman,方便直观,服务安全方面,线上服务器只要对微服务端口进行隔离,不对外部服务器开放即可。
之前在与JAVA组进行业务对接用的是restful,现在hyperf又提供了一种新的思路,重新设计架构。
二、架构
如上图所示,在后台服务与服务之间,采用jsonrpc进行交互,根据业务分库分表,不同业务之前不直接访问数据库。上层独立出子项目,每个子项目包含一个前端和一个业务中台,业务中台采用php,不直接访问数据库,从根据不同的业务从不同的业务后台取数据,进行数据组装。
三、代码
下面以加法运算为例,展示一下springboot、hyperf、go之间相互请求。
1、PHP
服务端代码(以http协议为例)
<?php
declare(strict_types=1);
namespace App\JsonRpc;
use Hyperf\RpcServer\Annotation\RpcService;
#[RpcService(name: "PhpHttpService", protocol: "jsonrpc-http", server: "jsonrpc-http")]
class PhpHttpService implements PhpServiceInterface
public function add(array $args): array
$result = [];
$result["c"] = $args["a"] + $args["b"];
return $result;
客户端代码(以请求java为例)
接口 <?php
declare(strict_types=1);
namespace App\JsonRpc;
use Hyperf\RpcClient\AbstractServiceClient;
class JavaHttpServiceConsumer extends AbstractServiceClient implements JavaServiceInterface
protected string $serviceName = 'JavaHttpService';
protected string $protocol = 'jsonrpc-http';
public function add(array $args): array
return $this->__request(__FUNCTION__, compact('args'));
调用 <?php
namespace App\Task;
use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\Crontab\Annotation\Crontab;
use Hyperf\Di\Annotation\Inject;
use App\JsonRpc\JavaHttpServiceConsumer;
#[Crontab(name: "ClientTask", rule: "*/5 * * * * *", callback: "execute", memo: "客户端定时任务")]
class ClientTask
#[Inject]
private StdoutLoggerInterface $logger;
#[Inject]
private JavaHttpServiceConsumer $javaHttpServiceConsumer;
public function execute()
$seed = time();
srand($seed);
try {
$a = rand(0, 100);
$b = rand(0, 100);
$result = $this->javaHttpServiceConsumer->add(["a" => $a, "b" => $b]);
$this->logger->info(sprintf("[http] PHP asked:\"%d+%d=?\"; Java answered:\"%d\"", $a, $b, $result["c"]));
} catch (Exception $e) {
$this->logger->info($e->getMessage());
2、Java
服务端代码(以http协议为例)
package io.moonquakes.javahttp.service;
import io.moonquakes.javahttp.dto.ArgsDto;
import io.moonquakes.javahttp.dto.ResultDto;
public class JavaHttpService implements IJavaHttpService {
@Override
public ResultDto add(ArgsDto args) {
ResultDto resultDto = new ResultDto();
resultDto.setC(args.getA() + args.getB());
return resultDto;
客户端代码(以请求go为例)
接口 package io.moonquakes.javahttp.client;
import com.sunquakes.jsonrpc4j.JsonRpcClient;
import com.sunquakes.jsonrpc4j.JsonRpcProtocol;
import io.moonquakes.javahttp.dto.ArgsDto;
import io.moonquakes.javahttp.dto.ResultDto;
@JsonRpcClient(value = "GoHttp", protocol = JsonRpcProtocol.http, url = "localhost:3602")
public interface IGoHttpClient {
ResultDto Add(ArgsDto args);
调用 package io.moonquakes.javahttp.task;
import io.moonquakes.javahttp.client.IGoHttpClient;
import io.moonquakes.javahttp.dto.ArgsDto;
import io.moonquakes.javahttp.dto.ResultDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Slf4j
@EnableScheduling
@Component
public class ClientTask {
@Autowired(required = false)
private IGoHttpClient goHttpClient;
@Scheduled(fixedDelay = 10000)
public void run() {
ArgsDto args = new ArgsDto();
try {
int a = (int) (Math.random() * 100);
int b = (int) (Math.random() * 100);
args.setA(a);
args.setB(b);
ResultDto resultDto = goHttpClient.Add(args);
log.info(String.format("[http] Java asked:\"%d+%d=?\"; Go answered:\"%d\"", a, b, resultDto.getC()));
} catch (Exception e) {
log.error(e.getMessage(), e);
3、Go
服务端代码(以http协议为例)
go func() {
s, _ := jsonrpc4go.NewServer("http", "127.0.0.1", "3602")
s.Register(new(GoHttp))
s.Start()
}()
客户端代码(以请求php为例)
phpHttpClient, _ := jsonrpc4go.NewClient("http", "127.0.0.1", "9504")
a = rand.Intn(100)
b = rand.Intn(100)
_ = phpHttpClient.Call("php_http/add", Params{Args{a, b}}, result, false)
四、演示项目
1、简介
moonquakes是一个演示项目。它展示了如何在一些web框架中使用jsonrpc协议进行通信,这些web框架是由java、php或golang编写的。
在moonquakes中,java框架用的是springboot,它使用 jsonrpc4j 与go和php框架通信;php框架是 Hyperf ,它有自己的 jsonrpc组件 来与go和java框架通信;go框架使用 jsonrpc4go 与java和php框架通信。
2、Demo项目地址
https://github.com/sunquakes/moonquakes
3、 预览
演示springboot/hyperf/golang通信
深井伏特加
关注
关注
点赞
收藏
打赏
评论
hyperf/go/springboot通过jsonrpc通信
Moonquakes是一个演示项目。它展示了如何在一些web框架中使用jsonrpc协议进行通信,这些web框架是由java、php或golang编写的。在moonquakes中,java框架用的是springboot,它使用。来与go和java框架通信;与go和php框架通信;与java和php框架通信。
复制链接
扫一扫
专栏目录
hyperf.test:超级测试
04-12
介绍
这是使用Hyperf框架的框架应用程序。 该应用程序旨在用作那些希望使用Hyperf Framework入门的人的起点。
要求
Hyperf对系统环境有一些要求,它只能在Linux和Mac环境下运行,但是由于Docker虚拟化技术的发展,适用于Windows的Docker也可以用作Windows下的运行环境。
在项目中已经为您准备了各种版本的Dockerfile,或者直接基于已经构建的 Image运行。
如果您不想使用Docker作为运行环境的基础,则需要确保您的操作环境满足以下要求:
PHP> = 7.2
Swoole PHP扩展> = 4.4,并禁用Short Name
OpenSSL PHP扩展
JSON PHP扩展
PDO PHP扩展(如果需要使用MySQL客户端)
Redis PHP扩展(如果需要使用Redis Client)
Protobuf PHP扩展(如
springboot jsonrpc server
10-09
非常适合java springboot好用的jsonrpc服务。
客户端调用:
Content-Type:application/json
{"id":"1","jsonrpc":"2.0","method":"multiplier","params":[5,8]}
服务端返回:{
"jsonrpc": "2.0",
"id": "1",
"result": 40
评论 5
您还未登录,请先
登录
后发表或查看评论
Go语言GoFrame框架之二:模版生成的web服务示例分析
最新发布
ln_chenchao的博客
11-15
183
Go,GoFrame,示例分析
fguillot json rpc_hyperf与go基于jsonrpc2.0通信
weixin_39978350的博客
12-22
130
前言现在微服务很流行,很多的语言都有自己的rpc框架,在同一框架内的微服务之间通信很方便,笔者工作时用到的框架是hyperf,自带jsonrpc、grpc组件,grpc用起来略感繁琐,调试起来也不方便,因此选用jsonrpc-http,损失些许通信成本在可接受范围之内,能用postman调试实在是太方便了。随着业务和团队的不断发展,开始有多语言开发需求,我们的另一个项目是用go搭建的,hyperf...
Hyperf协程框架-PHP
06-20
Hyperf 是基于 Swoole 4.5+ 实现的高性能、高灵活性的 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于 PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性,标准组件均基于 PSR 标准 实现,基于强大的依赖注入设计,保证了绝大部分组件或类都是可替换 与可复用的。
框架组件库除了常见的协程版的 MySQL 客户端、Redis 客户端,还为您准备了协程版的 Eloquent ORM、WebSocket 服务端及客户端、JSON RPC 服务端及客户端、GRPC 服务端及客户端、Zipkin/Jaeger (OpenTracing) 客户端、Guzzle HTTP 客户端、Elasticsearch 客户端、Consul 客户端、ETCD 客户端、AMQP 组件、NSQ 组件、Nats 组件、Apollo 配置中心、阿里云 ACM 应用配置管理、ETCD 配置中心、基于令牌桶算法的限流器、通用连接池、熔断器、Swagger 文档生成、Swoole Tracker、视图引擎、Snowflake 全局 ID 生成器 等组件,省去了自己实现对应协程版本的麻烦。
Hyperf 还提供了基于 PSR-11 的依赖注入容器、注解、AOP 面向切面编程、基于 PSR-15 的中间件、自定义进程、基于 PSR-14 的事件管理器、Redis/RabbitMQ/NSQ/Nats 消息队列、自动模型缓存、基于 PSR-16 的缓存、Crontab 秒级定时任务、Translation 国际化、Validation 验证器等非常便捷的功能,满足丰富的技术场景和业务场景,开箱即用。
框架初衷:
尽管现在基于 PHP 语言开发的框架处于一个百家争鸣的时代,但仍旧未能看到一个优雅的设计与超高性能的共存的完美框架,亦没有看到一个真正为 PHP 微服务铺路的框架,此为 Hyperf 及其团队成员的初衷,我们将持续投入并为此付出努力,也欢迎你加入我们参与开源建设。
设计理念:
Hyperspeed + Flexibility = Hyperf,从名字上我们就将超高速和灵活性作为 Hyperf 的基因。
对于超高速,我们基于 Swoole 协程并在框架设计上进行大量的优化以确保超高性能的输出。
对于灵活性,我们基于 Hyperf 强大的依赖注入组件,组件均基于 PSR 标准的契约和由 Hyperf 定义的契约实现,达到框架内的绝大部分的组件或类都是可替换的。
基于以上的特点,Hyperf 将存在丰富的可能性,如实现 Web 服务,网关服务,分布式中间件,微服务架构,游戏服务器,物联网(IOT)等。
运行环境:
Linux, OS X or Cygwin, WSL
PHP 7.2+
Swoole 4.4+
Hyperf初体验-JsonRpc的使用
u010398650的博客
11-27
1443
Hyperf 官方写 JsonRpc 的使用 Demo 还是比较清晰的,但是作为一个新手,刚使用的时候,还是不是很明白,这里给初次接触的同学,写一个更精细化的 Demo 。很简单的 Demo ,在官方的例子基础上写的。已经理解 JsonRpc 怎么交互,怎么写代码的兄弟们,就不用继续看了。
首先使用下面命令,创建两个hyperf的项目
composer create-project hyperf/hyperf-skeleton hyperf1
composer create-project hyperf/h
Hyperf的jsonRPC简易教程
Aring的博客
04-12
587
一,provider(服务提供者)
1,建立方法接口类
(1)在app目录下建立jsonRpc目录
(2)新建项目接口类
2,实现接口类的方法
3,在service 添加rpc服务
二、consumer(服务消费者)
1,在app目录下新建rpc目录
2,添加provider的方法接口类
3,在config/autoload目录下修改services文件(没有就新建)
添加相关配置
name 对应rpc服务名称
service对应rpc接口类
nodes对应rpc服务的地址
4,控制类直接实现接
fguillot json rpc_hyperf json-rpc剖析
weixin_28881749的博客
01-13
70
hyperf在启动阶段BootApplication会初始化JsonRpc中的TcpServer文件构造函数,而TcpServer文件继承了RpcServer的Server文件。通过这两个文件的构造函数,将自动注入ContainerInterface、DispatcherInterface、ExceptionHandlerDispatcher、LoggerInterface然后初始化initSer...
Hyperf框架创建json-rpc服务
donjan的博客
11-12
2971
我们创建一个User服务供其他服务调用以实现认证和鉴权。
创建文件UserService.php
checkToken 方法接收两个参数,一个token,一个permission,首先验证token获得user,对user的鉴权将在以后的权限认证教程补充。
如果认证成功,将返回user.
在配置文件server.php增加一个json-rpc服务,监听端口为9504
'name' =&...
Hyperf框架JSON RPC微服务
渡目成书
09-17
732
JSON RPC 是一种基于 JSON 格式的轻量级的 RPC 协议标准
安装
安装RPC相关拓展包
composer require hyperf/json-rpc
composer require hyperf/rpc-server
composer require hyperf/rpc-client
定义服务提供者
这里我们新建项目名改为provider,用来提供服务
新建文件App\Rpc\CalculatorService.php,注册为jsonrpc-http服务
<?ph.
Hyperf微服务——五、JsonRpc远程调用
LuckyStar_D的博客
06-22
595
Hyperf微服务——五、JsonRpc远程调用
Hyperf框架 - 基于Json-Rpc与Consul的微服务搭建
猛犸象
07-31
4090
依赖的组件
hyperf/json-rpc
hyperf/rpc-client
hyperf/rpc-server
hyperf/service-governance
hyperf/consul
以 HTTP协议 为例
json-rpc 即为基于json的rpc调用,原理就是 A 和 B 拥有同一套 interface I 的定义,A 就像调用自己的方法一样调用B的方法F,当然F必须是 insterface I 中的方法。
保存镜像
docker commit -p hyperf raoxi
简单解析hyperf-TCP-RPC-Json请求的数据结构
嗨皮螃的博客
06-25
721
习惯了使用TP框架调用swoft的RPC微服务,使用hyperf框架时,在其文档和百度都没有找到其他框架调用RPC的数据结构,故只能在hyperf的RPC服务端的请求链路进行日志输入和搭建hyperf的PRC客户端进行数据请求。......
hyperf 实现简单的jsonrpc和grpc
弄啥嘞的博客
07-14
765
hypefr简单介绍
这里使用docker安装一下hyperf
因为需要容器间通信 用docker创建自己的网络 这里我使用172.172.0.0/24创建hyperf网络
到时候创建hyperfy容器的时候 使用
这个范围内的网络
docker run --name hyperfServer\
-v /home/wwwroot/default/hyperf1:/data/project \
-p 9505:9505 -itd \
--privileged -u root \
--entrypoin.
fguillot json rpc_手把手编写hyperf JsonRpc demo
weixin_39916758的博客
12-22
29
1 服务端 provider.phpcomposer.json文件"require":{"php": ">=7.2","ext-swoole": ">=4.4","hyperf/cache": "~1.1.0","hyperf/command": "~1.1.0","hyperf/config": "~1.1.0","hyperf/contract": "~1.1.0","hyperf...
fguillot json rpc_Hyperf 框架创建 JSON-rpc 服务
weixin_39733805的博客
12-22
36
我们创建一个User服务供其他服务调用以实现认证和鉴权。checkToken 方法接收两个参数,一个token,一个permission,首先验证token获得user,对user的鉴权将在以后的权限认证教程补充。如果认证成功,将返回user.在配置文件server.php增加一个json-rpc服务,监听端口为9504['name' => 'jsonrpc-http','type' =&g...
Hyperf JSON RPC 服务 Demo
努力的Dom先生
12-16
671
系列文章目录
提示:JSON RPC 是一种基于 JSON 格式的轻量级的 RPC 协议标准,易于使用和阅读。在 Hyperf 里由 hyperf/json-rpc 组件来实现,可自定义基于 HTTP 协议来传输,或直接基于 TCP 协议来传输。
提示:经过作者验证
目录系列文章目录前言一、使用搭建环境二、JSON RPC服务开发与配置2.读入数据总结
前言
服务有两种角色,一种是 服务提供者(ServiceProvider),即为其它服务提供服务的服务,另一种是 服务消费者(ServiceConsu
用hyperf框架开发JsonRpc服务
qq_23257451的博客
07-01
391
按照官网文档创建好hyperf项目开发容器,我在容器内部创建了role_manage项目,提供服务的srv项目和服务客户端client。首先创建服务提供者srv,以下命令都是在srv目录下的命令行工具中执行创建项目时选择了jsonrpc协议在srv目录的终端执行......
fguillot json rpc_使用PHP协程框架Hyperf搭建JSON RPC服务
weixin_39938331的博客
12-22
186
JSON RPC:基于JSON格式的跨语言远程过程调用协议Hyperf:基于Swoole的PHP协程框架,适合配合Docker搭建大型集群项目处理高并发场景1、使用Hyperf搭建适配TCP协议的JSON RPC服务composer create-project hyperf/hyperf-skeleton Server/ClientWhat time zone do you want to se...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:数字20
设计师:CSDN官方博客
返回首页
深井伏特加
CSDN认证博客专家
CSDN认证企业博客
码龄2年
暂无认证
原创
106万+
周排名
12万+
总排名
2690
访问
等级
68
积分
粉丝
获赞
评论
收藏
私信
关注
热门文章
hyperf/go/springboot通过jsonrpc通信
1089
高并发下Redis限制接口每天访问次数
832
golang jsonrpc2.0服务端和客户端
413
java调整图片大小到指定范围
312
springboot日志
45
分类专栏
Java
3篇
PHP
2篇
Golang
2篇
最新评论
hyperf/go/springboot通过jsonrpc通信
不吃西红柿丶:
写的挺不错的,要持续稳定输出哦~
hyperf/go/springboot通过jsonrpc通信
深井伏特加:
共勉
hyperf/go/springboot通过jsonrpc通信
Deep Learning小舟:
感谢大佬分享,很详细。
hyperf/go/springboot通过jsonrpc通信
深井伏特加:
回复这么官方,感觉像机器人
hyperf/go/springboot通过jsonrpc通信
Rex~:
最近一直在找相关的资料,这文章出现得真及时!
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
高并发下Redis限制接口每天访问次数
springboot日志
golang jsonrpc2.0服务端和客户端
2020年5篇
目录
目录
分类专栏
Java
3篇
PHP
2篇
Golang
2篇
目录
评论 5
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
深井伏特加
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值