实现nats rpc rest api gateway
主要说明下如何实现,具体就是基于现有的框架,实现基于service 提及msg 进行转发,处理比较简单
包装
主要说明下服务的
- 定义rest 暴露处理 RestApiAbstractServiceHandler 就是转发请求
public <R> R defaultRestApiHandler(String serviceName, String prefix, String serviceEndpoint, T demoMessage, HttpHeaders httpHeaders) {return restApiHandler(serviceName, prefix, serviceEndpoint, demoMessage, httpHeaders);}public boolean beforeRestApiHandler(String serviceName, String prefix, String serviceEndpoint, T baseMessage, HttpHeaders headers) {return true;}public void afterRestApiHandler(String serviceName, String prefix, String serviceEndpoint, T baseMessage, HttpHeaders headers, Object result) {}public <R> R restApiHandler(String serviceName, String prefix, String serviceEndpoint, T baseMessage, HttpHeaders headers) {Headers natsHeaders;if (headers != null) {natsHeaders = new Headers();headers.forEach((key, values) -> {for (String value : values) {natsHeaders.add(key, value);}});} else {natsHeaders = null;}String fullServiceEndpoint = String.format("%s.svc.%s.%s", serviceName, prefix, serviceEndpoint);if (beforeRestApiHandler(serviceName, prefix, serviceEndpoint, baseMessage, headers)) {byte[] payload = serializeMessage(this.getObjectMapper(), baseMessage);Object result = NatsRpcCall.call(this.getConnection(), this.getObjectMapper(), fullServiceEndpoint, payload, natsHeaders);afterRestApiHandler(serviceName, prefix, serviceEndpoint, baseMessage, headers, result);return (R) result;}return null;}
- 代码
服务格式/api/gw/rest/{servicename}/{prefix}/{serviceendpoint}
@Component
public class NatsRpcServiceHandler extends RestApiAbstractServiceHandler<BaseMessage> {private Connection connection;private ObjectMapper objectMapper;public NatsRpcServiceHandler(ObjectMapper objectMapper, Connection connection) {this.objectMapper = objectMapper;this.connection = connection;}@Overridepublic Connection getConnection() {return this.connection;}@Overridepublic ObjectMapper getObjectMapper() {return this.objectMapper;}@Overridepublic BaseMessage defaultMessageHandler(BaseMessage demoMessage, Headers headers) {return demoMessage;}@ResponseBody@ServiceMapping(name = "defaultRestApiHandler",path = {"/api/gw/rest/{servicename}/{prefix}/{serviceendpoint}"},method = {"POST"},version = "1.0.0")@Overridepublic Object defaultRestApiHandler(@PathVariable(name = "servicename") String serviceName,@PathVariable(name = "prefix") String prefix,@PathVariable(name = "serviceendpoint") String serviceEndpoint,@RequestBody BaseMessage demoMessage,@Parameter(hidden = true) @RequestHeader HttpHeaders httpHeaders) {return super.defaultRestApiHandler(serviceName,prefix,serviceEndpoint, demoMessage, httpHeaders);}
}
- 内部处理
因为提供了bean,核心就是对于@ServiceMapping 注解的处理,然后动态注册controller 就可以了
public void registerRestApis() {serviceHandlers.forEach(serviceHandler -> {Class<?> targetClass =AopProxyUtils.ultimateTargetClass(serviceHandler);Method[] methods = targetClass.getMethods();Arrays.stream(methods).forEach(method -> {if(method.isBridge()){return;}ServiceMapping serviceMapping = method.getAnnotation(ServiceMapping.class);if (serviceMapping == null) {return;}if (method.getDeclaringClass() != targetClass) {return;}RequestMappingInfo mapping = RequestMappingInfo.paths(serviceMapping.path()).methods(Arrays.stream(serviceMapping.method()).map(item -> methodutils.str2RequestMethod(item)).toArray(RequestMethod[]::new)).build();Method handlerMethod = method;requestMappingHandlerMapping.registerMapping(mapping, serviceHandler, handlerMethod);});});
}
参考api 效果

说明
整体处理很简单,核心是动态注册,以及自动bena注入(包装为starter),详细代码参考github
参考资料
https://github.com/rongfengliang/nats-rpc-springboot-starter
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1181955.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
如何高效备份CSDN博客:3种实用方法全解析
如何高效备份CSDN博客:3种实用方法全解析 【免费下载链接】CSDNBlogDownloader 项目地址: https://gitcode.com/gh_mirrors/cs/CSDNBlogDownloader
CSDN博客下载器是一款专门为技术博主打造的博客内容备份工具,能够快速保存CSDN平台上的技术文章…
2026年陕西搬家服务优选指南:西安喜福与天福搬家公司深度评测 - 深度智识库
在快节奏的都市生活中,搬家成为许多家庭与企业的刚需。无论是跨城迁移还是同城换居,选择一家靠谱的搬家公司至关重要。本文基于规模化运营、服务标准化、用户口碑等核心维度,为您推荐陕西地区两家优质搬家服务商,重…
2025-2026年生成式搜索时代的选择题:五家主流GEO服务商全方位对决 - 2026年企业推荐榜
本次评测,我们精心选取了五家具有代表性的公司,它们分别是:
摘星AI:以自研底层AI技术见长的创新领导者。
云链智推:主打高性价比与广泛市场覆盖的综合服务商。
智语环球 (LinguaGlobe):拥有国际视野与跨行业解决…
本地化语义匹配新选择|基于GTE模型的Web可视化实践
本地化语义匹配新选择|基于GTE模型的Web可视化实践
1. 背景与核心价值
在自然语言处理(NLP)领域,语义相似度计算是文本检索、问答系统、推荐引擎等应用的核心能力。传统方法依赖关键词匹配或TF-IDF等统计特征,难以捕…
实时翻译中间件:HY-MT1.5-1.8B微服务架构设计
实时翻译中间件:HY-MT1.5-1.8B微服务架构设计
1. 技术背景与系统定位
随着全球化进程的加速,跨语言交流已成为企业、开发者乃至个人用户的刚需。传统云翻译服务虽具备高精度优势,但在延迟、隐私和离线场景下存在明显短板。为此,…
2026年安徽售后完善的搬家机构,怎么选择 - 工业品牌热点
2026年城市化进程持续加速,搬家服务已成为家庭乔迁、企业搬迁、政务单位物资转运的核心支撑。无论是老旧小区的家具吊运、精密仪器的跨城运输,还是政务单位的涉密档案搬迁,优质搬家企业的专业能力直接决定搬迁过程的…
Qwen2.5-7B模型解释:输出结果可信度分析
Qwen2.5-7B模型解释:输出结果可信度分析
1. 引言
1.1 技术背景与模型演进
通义千问(Qwen)系列自发布以来,持续在大语言模型领域推动技术边界。Qwen2.5 是该系列的最新迭代版本,在知识覆盖广度、推理能力、结构化理解…
Vetur性能优化建议:提升大型项目响应速度深度剖析
让Vetur不再卡顿:大型Vue项目编辑器性能优化实战 你有没有过这样的经历? 打开一个 .vue 文件,敲下一个字母,光标却要“思考人生”两秒才跟上;保存代码时VS Code突然卡死,任务管理器里 node.exe 吃掉3…
OpenCV透视变换实战:打造企业级文档扫描解决方案
OpenCV透视变换实战:打造企业级文档扫描解决方案
1. 引言
1.1 业务场景与痛点分析
在现代办公环境中,纸质文档的数字化处理已成为高频刚需。无论是合同归档、发票报销,还是会议白板记录,用户常常需要将拍摄角度倾斜、存在阴影或…
2026年知名的长沙家政软件开发公司推荐,口碑排行 - 品牌宣传支持者
开篇:行业背景与市场趋势随着数字化时代的深入发展,家政服务行业正经历前所未有的变革。传统的线下家政服务模式已无法满足现代消费者的高效、透明、个性化需求,家政软件的应用成为行业升级的关键驱动力。据市场调研…
通义千问2.5-0.5B-Instruct实战教程:Mac M系列芯片部署
通义千问2.5-0.5B-Instruct实战教程:Mac M系列芯片部署
1. 引言
1.1 学习目标
本文旨在为开发者提供一份完整、可落地的 Qwen2.5-0.5B-Instruct 模型在 Mac M 系列芯片上的本地部署指南。通过本教程,你将掌握:
如何在 macOS 上配置适用于…
Fast-GitHub完整教程:3步彻底解决GitHub访问卡顿问题
Fast-GitHub完整教程:3步彻底解决GitHub访问卡顿问题 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub
还在为GitHub下载…
Onekey完整指南:高效获取Steam游戏清单的专业解决方案
Onekey完整指南:高效获取Steam游戏清单的专业解决方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey
还在为Steam游戏清单的复杂下载流程而困扰吗?Onekey这款开源工具将…
2026年热门的牛奶装箱机厂家哪家便宜?实力对比 - 品牌宣传支持者
在2026年选择牛奶装箱机厂家时,性价比、技术实力和售后服务是三大核心考量因素。经过对行业20余家主流厂商的综合评估,我们发现常熟舒和机械设备有限公司在技术创新、价格竞争力和服务体系方面表现突出,可作为优先参…
语音克隆技术平民化:10分钟数据也能玩转专业级变声
语音克隆技术平民化:10分钟数据也能玩转专业级变声 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI 语音数据小于等于10分钟也可以用来训练一个优秀的变声模型! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Co…
3个人像风格化镜像推荐:开箱即用免安装,10块钱全试遍
3个人像风格化镜像推荐:开箱即用免安装,10块钱全试遍
你是不是也和我一样,作为一名自由插画师,每天都在寻找新的创作灵感?最近刷到各种AI生成的卡通头像、日漫风人设、赛博朋克角色图,看得心痒痒。点进去一…
高效GitHub访问:浏览器插件加速的完整指南
高效GitHub访问:浏览器插件加速的完整指南 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub
还在为GitHub下载速度而困扰…
Chrome崩溃急救手册:三招让Ruffle扩展重获新生
Chrome崩溃急救手册:三招让Ruffle扩展重获新生 【免费下载链接】ruffle A Flash Player emulator written in Rust 项目地址: https://gitcode.com/GitHub_Trending/ru/ruffle
还记得那个让你重温童年Flash游戏的美好时光吗?Ruffle扩展就是现代浏…
libusb同步传输入门:项目应用中的基本用法
libusb同步传输入门:从零到实战的完整指南 你有没有遇到过这样的场景?手头有一个基于STM32或FPGA的USB设备,想要在PC上读取它的传感器数据、发送控制命令,却发现Windows只认成一个“未知设备”,Linux下连 /dev/ttyAC…
深度剖析I2C HID设备启动失败(代码10)的常见硬件原因
深度剖析I2C HID设备启动失败(代码10)的硬件根源与实战排查你有没有遇到过这样的情况:Windows设备管理器里,触控屏或电容按键明明被识别出来了,却始终显示“此设备无法启动(代码10)”࿱…