当前位置: 首页 > news >正文

使用 httputils + protostuff 实现高性能 rpc

1、先讲讲 protostuf

protostuf 一直是高性能序列化的代表之一。但是用起来,可难受了,你得先申明 protostuf 配置文件,并且要把这个配置文件转成类。所以必然要学习新语法、新工具。

可能真的太难受了!于是乎,(有不爽的人)搞了个有创意的框架 protostuff(多一个字母“f”)。它借用注解,替代了 protostuf 文件申明和生成类的过程,丰常的接地气。

2、再讲讲 rpc

一讲 rpc ,很多人会想到 dubbo (国产)和 grpc。估计还会联想到注册与发现服务;可能还会联想到微服务。可能就会觉得这个事儿“老重啦”,害怕!

其实很简单的,你请求一次 http 就是个 rpc 请求了(远程过程调用嘛)。最典型的就是 http + json 请求了。

3、现在讲 httputils + protostuff

这里我们会用到两个重要的 solon 框架的插件:一个是 httputils 工具插件,一个是 protostuff 序列化插件。

<dependency><groupId>org.noear</groupId><artifactId>solon-serialization-protostuff</artifactId>
</dependency><dependency><groupId>org.noear</groupId><artifactId>solon-net-httputils</artifactId>
</dependency>

这里要感谢 solon 框架,它强调三元合一(mvc 与 rpc 是自然一体的)。下面,开始干活啦…

  • 公用包(也可以在客户端,服务端分别定义实体类。只要 @Tag 顺序与类型对应上即可 )

这里定义一个 protostuff 实体类。注意 @Tag 注解,它是替代 protostuf 配置文件的关键。

@Setter
@Getter
public class MessageDo {@Tag(1)    // Protostuff 注解,顺序位从 1 开始private long id;@Tag(2)private String title;
}
  • 服务端(只支持 @Body 数据接收,只支持实体类)

在 solon web 项目里,添加一个控制器(注解可以用 @Remoting@Controller)。使用 @Remoting 时,方法上不需要加 @Mapping 注解。

#添加插件
org.noear:solon-web
org.noear:solon-serialization-protostuff
@Mapping("/rpc/demo")
@Remoting
public class HelloServiceImpl {@Overridepublic MessageDo hello(@Body MessageDo message) { //还可接收路径变量,与请求上下文return message;}
}
  • 客户端应用 for HttpUtils(只支持 body 数据提交,只支持实体类)
#添加插件
org.noear:solon-net-httputils
//应用代码
@Component
public class DemoCom {public MessageDo hello() {MessageDo message = new MessageDo();message.setId(3);//指明请求数据为 PROTOBUF,接收数据要 PROTOBUFreturn HttpUtils.http("http://localhost:8080/rpc/demo/hello").serializer(ProtostuffBytesSerializer.getInstance()).header(ContentTypes.HEADER_CONTENT_TYPE, ContentTypes.PROTOBUF_VALUE).header(ContentTypes.HEADER_ACCEPT, ContentTypes.PROTOBUF_VALUE).bodyOfBean(message).postAs(MessageDo.class);}
}

4、总结

总体上,跟 json 没什么大的区别。主要是指定了:序列化器、内容类型、接收类型,让各端能识别类据类型。

5、也可以使用“注解式 http 客户端”框架

肯定也会有人觉得,一个接口还好,如果有很多接口就要写很多重复的http请求代码了。所以,“注解式 http 客户端” 很重要,这也是很多 rpc 框架流行的原因,就像调用本地接口一样,使用远程接口。

nami 是 solon 框架的 rpc 客户端(或者,注解式 http 客户端),支持各种序列化。(只要是“支持序列化定制”的注解式 http 客户端,用法都差不多)

  • 添加两个依赖包
#添加插件
org.noear:nami-coder-protostuff # protostuff 编解码支持
org.noear:nami-channel-http     # http 请求通道支持,也可以是 socketd(支持 tcp, udp, ws)
  • 代码应用(只支持 body 数据提交,只支持实体类)
@NamiClient(url = "http://localhost:8080/rpc/demo", headers = {ContentTypes.PROTOBUF, ContentTypes.PROTOBUF_ACCEPT})
public interface HelloService {MessageDo hello(@NamiBody MessageDo message);//方法2//方法3//方法4//方法5//方法6
}@Component
public class DemoCom {@NamiClient //注入HelloService helloService;public MessageDo hello() {MessageDo message = new MessageDo();message.setId(3);rerturn helloService.hello(message);}
}

相关文章:

使用 httputils + protostuff 实现高性能 rpc

1、先讲讲 protostuf protostuf 一直是高性能序列化的代表之一。但是用起来&#xff0c;可难受了&#xff0c;你得先申明 protostuf 配置文件&#xff0c;并且要把这个配置文件转成类。所以必然要学习新语法、新工具。 可能真的太难受了&#xff01;于是乎&#xff0c;&#…...

系统思考—战略共识

最近与和一位企业创始人深度交流时&#xff0c;他告诉我&#xff1a;“虽然公司在制定战略时总是非常明确&#xff0c;但在执行过程中&#xff0c;经常发现不同层级对战略的理解偏差&#xff0c;甚至部分团队的执行效果与预期大相径庭。每次开会讨论时&#xff0c;大家都说得头…...

Java版-速通数据结构-树基础知识

现在面试问mysql,红黑树好像都是必备问题了。动不动就让手写红黑树或者简单介绍下红黑树。然而&#xff0c;我们如果直接去看红黑树&#xff0c;可能会一下子蒙了。在看红黑树之前&#xff0c;需要先了解下树的基础知识&#xff0c;从简单到复杂&#xff0c;看看红黑树是在什么…...

详尽的oracle sql函数

1&#xff0c;CHR 输入整数&#xff0c;返回对应字符。 用法&#xff1a;select chr(65),chr(78) from dual; 2&#xff0c;ASCII 输入字符&#xff0c;返回对应ASCII码。 用法&#xff1a;select ascii(A),ascii(B) from dual; 3&#xff0c;CONCAT 输入两个字符串&#xff0c…...

SAP IDOC Error VG205

今天在做IDOC 入栈处理销售订单的时候&#xff0c;一直报错VG205 There is no article description for item 000030 这个问题在通过WE19 前台显示的时候就不会遇见&#xff0c; 只有在接口传输的时候才会遇到 搜索发现&#xff0c;可以通过配置忽略此消息号 配置路径如下…...

DSP 的 CV 算子调用

01 前言 DSP 是 征程 5 上的数字信号处理器&#xff0c;专用于处理视觉、图像等信息。在 OE 包的 ddk/samples/vdsp_rpc_sample 路径下&#xff0c;提供了 DSP 使用示例&#xff0c;包括 nn 和 CV 两部分。 nn 示例涵盖了深度学习模型的相关算子&#xff0c;包括量化、反量化、…...

WMI攻击-基础篇(一)

#WMI攻击-基础篇&#xff08;一&#xff09; 这篇文章是关于WMI攻击系列文章的第一部分&#xff0c;面向新手。如果对Powershell有一定了解会对阅读本文有所帮助&#xff0c;但这并不是必需的&#xff0c;我们直接上干货。 #1、概述 为什么是WMI&#xff1f; WMI 是 Microso…...

使用Pygame创建一个简单的消消乐游戏

消消乐游戏是一种经典的益智游戏&#xff0c;玩家通过交换相邻的方块来形成三个或更多相同颜色的连续方块&#xff0c;从而消除它们。本文将介绍如何使用Python的Pygame库来创建一个简单的消消乐游戏。 准备工作 在开始之前&#xff0c;请确保已安装Pygame库。可以通过以下命…...

证明直纹面是可展曲面沿着直母线,曲面的切平面不变

目录 证明直纹面是可展曲面的当且仅当沿着直母线&#xff0c;曲面的切平面不变 证明直纹面是可展曲面的当且仅当沿着直母线&#xff0c;曲面的切平面不变 直纹面是可展曲面当且仅当沿着直母线&#xff0c;曲面的切平面不变. 证明&#xff1a;设直纹面 S S S的参数式为 r ( u …...

Chrome控制台 网站性能优化指标一览

打开chrome-》f12/右键查看元素-》NetWrok/网络 ctrlF5 刷新网页&#xff0c;可以看到从输入url到页面资源请求并加载网页&#xff0c;用于查看资源加载&#xff0c;接口请求&#xff0c;评估网页、网站性能等&#xff0c;如下图&#xff1a; request、stransferred、resour…...

Typora创建markdwon文件的基础语法

标题的创建 使用#空格xxx 可使xxx为标题&#xff0c;同时第一标题为#空格标题&#xff1b;第二标题为##空格标题2。以此类推最多可创建六个标题。 同时按住Ctrl1可创建第一标题&#xff0c;同时按住Ctrl2可创建第二标题&#xff0c;以此类推&#xff0c;最多可创建六个标题。也…...

《嵌入式硬件设计》

一、引言 嵌入式系统在现代科技中占据着至关重要的地位&#xff0c;广泛应用于消费电子、工业控制、汽车电子、医疗设备等众多领域。嵌入式硬件设计作为嵌入式系统开发的基础&#xff0c;直接决定了系统的性能、可靠性和成本。本文将深入探讨嵌入式硬件设计的各个方面&#xff…...

【AIGC】大模型面试高频考点-位置编码篇

【AIGC】大模型面试高频考点-位置编码篇 &#xff08;一&#xff09;手撕 绝对位置编码 算法&#xff08;二&#xff09;手撕 可学习位置编码 算法&#xff08;三&#xff09;手撕 相对位置编码 算法&#xff08;四&#xff09;手撕 Rope 算法&#xff08;旋转位置编码&#xf…...

如何使用 SQL 语句创建一个 MySQL 数据库的表,以及对应的 XML 文件和 Mapper 文件

文章目录 1、SQL 脚本语句2、XML 文件3、Mapper 文件4、启动 ServiceInit 文件5、DataService 文件6、ComplianceDBConfig 配置文件 这个方式通常是放在项目代码中&#xff0c;使用配置在项目的启动时创建表格&#xff0c;SQL 语句放到一个 XML 文件中。在Spring 项目启动时&am…...

Unity性能优化---动态网格组合(二)

在上一篇中&#xff0c;组合的是同一个材质球的网格&#xff0c;如果其中有不一样的材质球会发生什么&#xff1f;如下图&#xff1a; 将场景中的一个物体替换为不同的材质球 运行之后&#xff0c;就变成了相同的材质。 要实现组合不同材质的网格步骤如下&#xff1a; 在父物体…...

JVM学习《垃圾回收算法和垃圾回收器》

目录 1.垃圾回收算法 1.1 标记-清除算法 1.2 复制算法 1.3 标记-整理算法 1.4 分代收集算法 2.垃圾回收器 2.1 熟悉一下垃圾回收的一些名词 2.2 垃圾回收器有哪些&#xff1f; 2.3 Serial收集器 2.4 Parallel Scavenge收集器 2.5 ParNew收集器 2.6 CMS收集器 1.垃圾…...

GPS模块/SATES-ST91Z8LR:电路搭建;直接用电脑的USB转串口进行通讯;模组上报定位数据转换地图识别的坐标手动查询地图位置

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...

什么是TCP的三次握手

TCP&#xff08;传输控制协议&#xff09;的三次握手是一个用于在两个网络通信的计算机之间建立连接的过程。这个过程确保了双方都有能力接收和发送数据&#xff0c;并且初始化双方的序列号。以下是三次握手的详细步骤&#xff1a; 第一次握手&#xff08;SYN&#xff09;&…...

《Clustering Propagation for Universal Medical Image Segmentation》CVPR2024

摘要 这篇论文介绍了S2VNet&#xff0c;这是一个用于医学图像分割的通用框架&#xff0c;它通过切片到体积的传播&#xff08;Slice-to-Volume propagation&#xff09;来统一自动&#xff08;AMIS&#xff09;和交互式&#xff08;IMIS&#xff09;医学图像分割任务。S2VNet利…...

Linux ifconfig ip 命令详解

简介 ifconfig 和 ip 命令用于配置和显示 Linux 上的网络接口。虽然 ifconfig 是传统工具&#xff0c;但现在已被弃用并被提供更多功能的 ip 命令取代。 ifconfig 安装 sudo apt install net-toolssudo yum install net-tools查看所有活动的网络接口 ifconfig启动/激活网络…...

构建智能交易系统:高效掌握缠论量化实战技巧

构建智能交易系统&#xff1a;高效掌握缠论量化实战技巧 【免费下载链接】chan.py 开放式的缠论python实现框架&#xff0c;支持形态学/动力学买卖点分析计算&#xff0c;多级别K线联立&#xff0c;区间套策略&#xff0c;可视化绘图&#xff0c;多种数据接入&#xff0c;策略开…...

AI 写的鸿蒙 ArkTS 代码能跑?我测了 37 个案例,翻车率 60%

先扔结论&#xff1a;如果你现在把 Claude 或 Cursor 当成 ArkTS 专家来用&#xff0c;大概率会掉坑里。我上周闲得慌&#xff0c;跑了 37 个常见开发场景的测试&#xff0c;结果 AI 生成的代码能直接编译通过的&#xff0c;不到四成。剩下的要么语法错误&#xff0c;要么用了废…...

零 Python 依赖!用 JavaCV + ONNX Runtime 把 YOLO 塞进生产环境

上周五快下班的时候&#xff0c;运维老张突然冲进办公室&#xff0c;手里还拎着半杯凉透的枸杞茶。 “兄弟&#xff0c;客户那边又炸了&#xff01;”他把杯子往桌上一墩&#xff0c;“那个 PCB 缺陷检测系统&#xff0c;Python 推理服务又崩了。这周第三次了&#xff0c;人家产…...

公域卖课佣金高、粉丝留不住?这套私域打法,完课率提升了3倍

公域卖课的两大痛点痛点一&#xff1a;佣金太高&#xff0c;利润被吃掉一大块。相信在公域卖过课的朋友都有体会。平台抽成、分销佣金、投流成本……七七八八算下来&#xff0c;到手的钱可能连一半都不到。你辛辛苦苦打磨的课程&#xff0c;大头却被别人拿走了。这感觉&#xf…...

别再只会真彩色了!用ENVI玩转波段组合:揭秘植被红、水体蓝背后的遥感密码

遥感图像解译的艺术&#xff1a;ENVI波段组合背后的科学密码 当一张卫星遥感图像首次展现在眼前时&#xff0c;未经训练的眼睛往往只能看到一片模糊的色块。然而&#xff0c;对于掌握波段组合奥秘的解译专家来说&#xff0c;这些色彩背后隐藏着丰富的地表信息——健康的植被、水…...

XInputTest:精准测量游戏手柄轮询率与延迟的专业工具

XInputTest&#xff1a;精准测量游戏手柄轮询率与延迟的专业工具 【免费下载链接】XInputTest Xbox 360 Controller (XInput) Polling Rate Checker 项目地址: https://gitcode.com/gh_mirrors/xin/XInputTest 在竞技游戏和模拟飞行等高精度操作场景中&#xff0c;游戏手…...

phpenv终极指南:5分钟掌握PHP多版本管理的完整解决方案

phpenv终极指南&#xff1a;5分钟掌握PHP多版本管理的完整解决方案 【免费下载链接】phpenv Simple PHP version management 项目地址: https://gitcode.com/gh_mirrors/ph/phpenv 还在为不同PHP项目间的版本冲突而烦恼吗&#xff1f;phpenv为您提供了一站式PHP版本管理…...

Agent工程2026:从提示词堆砌到生产级智能体的完整跃迁路径

如果你今天还在用"给LLM加几个工具调用"来描述你的Agent&#xff0c;那我们需要认真谈谈了。 2026年的AI工程现实是&#xff1a;绝大多数Agent项目死在了从Demo到生产的路上。不是因为模型不够强&#xff0c;而是因为工程没跟上。本文会系统梳理Agent工程化的核心路…...

从点灯到AI:用高云Tang Nano 4K玩转FPGA+MCU混合开发(附避坑指南)

从点灯到AI&#xff1a;高云Tang Nano 4K混合架构开发实战与避坑指南 在嵌入式AI和边缘计算领域&#xff0c;FPGA凭借其并行计算能力和低功耗特性&#xff0c;正成为越来越多开发者的选择。而高云Tang Nano 4K这款搭载Cortex-M3硬核的FPGA开发板&#xff0c;以其独特的"FP…...

Python爬虫遇到InsecureRequestWarning?别慌,这3种方法帮你搞定urllib3的SSL证书警告

Python爬虫遇到InsecureRequestWarning&#xff1f;3种专业级解决方案与安全实践 当你兴致勃勃地运行新写的Python爬虫脚本时&#xff0c;控制台突然跳出一堆黄字警告&#xff1a;"InsecureRequestWarning: Unverified HTTPS request is being made..."。这场景就像…...