实现nats rpc rest api gateway

实现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 效果

image

说明

整体处理很简单,核心是动态注册,以及自动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博客&#xff1a;3种实用方法全解析 【免费下载链接】CSDNBlogDownloader 项目地址: https://gitcode.com/gh_mirrors/cs/CSDNBlogDownloader CSDN博客下载器是一款专门为技术博主打造的博客内容备份工具&#xff0c;能够快速保存CSDN平台上的技术文章…

2026年陕西搬家服务优选指南:西安喜福与天福搬家公司深度评测 - 深度智识库

在快节奏的都市生活中,搬家成为许多家庭与企业的刚需。无论是跨城迁移还是同城换居,选择一家靠谱的搬家公司至关重要。本文基于规模化运营、服务标准化、用户口碑等核心维度,为您推荐陕西地区两家优质搬家服务商,重…

2025-2026年生成式搜索时代的选择题:五家主流GEO服务商全方位对决 - 2026年企业推荐榜

本次评测,我们精心选取了五家具有代表性的公司,它们分别是: 摘星AI:以自研底层AI技术见长的创新领导者。 云链智推:主打高性价比与广泛市场覆盖的综合服务商。 智语环球 (LinguaGlobe):拥有国际视野与跨行业解决…

本地化语义匹配新选择|基于GTE模型的Web可视化实践

本地化语义匹配新选择&#xff5c;基于GTE模型的Web可视化实践 1. 背景与核心价值 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;语义相似度计算是文本检索、问答系统、推荐引擎等应用的核心能力。传统方法依赖关键词匹配或TF-IDF等统计特征&#xff0c;难以捕…

实时翻译中间件:HY-MT1.5-1.8B微服务架构设计

实时翻译中间件&#xff1a;HY-MT1.5-1.8B微服务架构设计 1. 技术背景与系统定位 随着全球化进程的加速&#xff0c;跨语言交流已成为企业、开发者乃至个人用户的刚需。传统云翻译服务虽具备高精度优势&#xff0c;但在延迟、隐私和离线场景下存在明显短板。为此&#xff0c;…

2026年安徽售后完善的搬家机构,怎么选择 - 工业品牌热点

2026年城市化进程持续加速,搬家服务已成为家庭乔迁、企业搬迁、政务单位物资转运的核心支撑。无论是老旧小区的家具吊运、精密仪器的跨城运输,还是政务单位的涉密档案搬迁,优质搬家企业的专业能力直接决定搬迁过程的…

Qwen2.5-7B模型解释:输出结果可信度分析

Qwen2.5-7B模型解释&#xff1a;输出结果可信度分析 1. 引言 1.1 技术背景与模型演进 通义千问&#xff08;Qwen&#xff09;系列自发布以来&#xff0c;持续在大语言模型领域推动技术边界。Qwen2.5 是该系列的最新迭代版本&#xff0c;在知识覆盖广度、推理能力、结构化理解…

Vetur性能优化建议:提升大型项目响应速度深度剖析

让Vetur不再卡顿&#xff1a;大型Vue项目编辑器性能优化实战 你有没有过这样的经历&#xff1f; 打开一个 .vue 文件&#xff0c;敲下一个字母&#xff0c;光标却要“思考人生”两秒才跟上&#xff1b;保存代码时VS Code突然卡死&#xff0c;任务管理器里 node.exe 吃掉3…

OpenCV透视变换实战:打造企业级文档扫描解决方案

OpenCV透视变换实战&#xff1a;打造企业级文档扫描解决方案 1. 引言 1.1 业务场景与痛点分析 在现代办公环境中&#xff0c;纸质文档的数字化处理已成为高频刚需。无论是合同归档、发票报销&#xff0c;还是会议白板记录&#xff0c;用户常常需要将拍摄角度倾斜、存在阴影或…

2026年知名的长沙家政软件开发公司推荐,口碑排行 - 品牌宣传支持者

开篇:行业背景与市场趋势随着数字化时代的深入发展,家政服务行业正经历前所未有的变革。传统的线下家政服务模式已无法满足现代消费者的高效、透明、个性化需求,家政软件的应用成为行业升级的关键驱动力。据市场调研…

通义千问2.5-0.5B-Instruct实战教程:Mac M系列芯片部署

通义千问2.5-0.5B-Instruct实战教程&#xff1a;Mac M系列芯片部署 1. 引言 1.1 学习目标 本文旨在为开发者提供一份完整、可落地的 Qwen2.5-0.5B-Instruct 模型在 Mac M 系列芯片上的本地部署指南。通过本教程&#xff0c;你将掌握&#xff1a; 如何在 macOS 上配置适用于…

Fast-GitHub完整教程:3步彻底解决GitHub访问卡顿问题

Fast-GitHub完整教程&#xff1a;3步彻底解决GitHub访问卡顿问题 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 还在为GitHub下载…

Onekey完整指南:高效获取Steam游戏清单的专业解决方案

Onekey完整指南&#xff1a;高效获取Steam游戏清单的专业解决方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 还在为Steam游戏清单的复杂下载流程而困扰吗&#xff1f;Onekey这款开源工具将…

2026年热门的牛奶装箱机厂家哪家便宜?实力对比 - 品牌宣传支持者

在2026年选择牛奶装箱机厂家时,性价比、技术实力和售后服务是三大核心考量因素。经过对行业20余家主流厂商的综合评估,我们发现常熟舒和机械设备有限公司在技术创新、价格竞争力和服务体系方面表现突出,可作为优先参…

语音克隆技术平民化:10分钟数据也能玩转专业级变声

语音克隆技术平民化&#xff1a;10分钟数据也能玩转专业级变声 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI 语音数据小于等于10分钟也可以用来训练一个优秀的变声模型&#xff01; 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Co…

3个人像风格化镜像推荐:开箱即用免安装,10块钱全试遍

3个人像风格化镜像推荐&#xff1a;开箱即用免安装&#xff0c;10块钱全试遍 你是不是也和我一样&#xff0c;作为一名自由插画师&#xff0c;每天都在寻找新的创作灵感&#xff1f;最近刷到各种AI生成的卡通头像、日漫风人设、赛博朋克角色图&#xff0c;看得心痒痒。点进去一…

高效GitHub访问:浏览器插件加速的完整指南

高效GitHub访问&#xff1a;浏览器插件加速的完整指南 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 还在为GitHub下载速度而困扰…

Chrome崩溃急救手册:三招让Ruffle扩展重获新生

Chrome崩溃急救手册&#xff1a;三招让Ruffle扩展重获新生 【免费下载链接】ruffle A Flash Player emulator written in Rust 项目地址: https://gitcode.com/GitHub_Trending/ru/ruffle 还记得那个让你重温童年Flash游戏的美好时光吗&#xff1f;Ruffle扩展就是现代浏…

libusb同步传输入门:项目应用中的基本用法

libusb同步传输入门&#xff1a;从零到实战的完整指南 你有没有遇到过这样的场景&#xff1f;手头有一个基于STM32或FPGA的USB设备&#xff0c;想要在PC上读取它的传感器数据、发送控制命令&#xff0c;却发现Windows只认成一个“未知设备”&#xff0c;Linux下连 /dev/ttyAC…

深度剖析I2C HID设备启动失败(代码10)的常见硬件原因

深度剖析I2C HID设备启动失败&#xff08;代码10&#xff09;的硬件根源与实战排查你有没有遇到过这样的情况&#xff1a;Windows设备管理器里&#xff0c;触控屏或电容按键明明被识别出来了&#xff0c;却始终显示“此设备无法启动&#xff08;代码10&#xff09;”&#xff1…