怎么用Springboot和Netty实现rpc
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章主要介绍"怎么用Springboot和Netty实现rpc",在日常操作中,相信很多人在怎么用Springboot和Netty实现rpc问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作
千家信息网最后更新 2025年11月09日怎么用Springboot和Netty实现rpc
这篇文章主要介绍"怎么用Springboot和Netty实现rpc",在日常操作中,相信很多人在怎么用Springboot和Netty实现rpc问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么用Springboot和Netty实现rpc"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
Springboot、 Netty、动态代理(反射)、反射
项目整体结构如下:

1.在父项目中引入相关依赖;
org.springframework.boot spring-boot-starter-web 2.3.2.RELEASE io.netty netty-all 4.1.48.Final com.alibaba fastjson 1.2.58 org.slf4j slf4j-log4j12 2.0.0-alpha1
2.服务提供模块整体结构如下:
这里重点关注一下 RequestModel 和 ResponseModel 两个消息体类,
@Data@AllArgsConstructorpublic class RequestModel { private String requestId; private String serviceName; private String methodName; private Class[] paramTypes; private Object[] paramValues; }@Data@AllArgsConstructorpublic class ResponseModel { private String responseId; private String serviceName; private String methodName; private String code; private String data;}用于服务端和客户端的数据传输;再者就是关注 ServerChannelInboundHandler 中的 channelRead0() 报文解码处理;
@Override protected void channelRead0(ChannelHandlerContext ctx, String msg) { StringBuilder sb = null; RequestModel result = null; try { // 报文解析处理 sb = new StringBuilder(); result = JSON.parseObject(msg, RequestModel.class); requestId = result.getRequestId(); String serviceName = result.getServiceName(); String methodName = result.getMethodName(); Class[] paramType = result.getParamTypes(); Object[] paramValue = result.getParamValues(); System.out.println(serviceName + " " + methodName); String substring = serviceName.substring(serviceName.lastIndexOf(".") + 1); String s = substring.substring(0, 1).toLowerCase() + substring.substring(1); Object serviceObject = applicationContext.getBean(s); Method method = Class.forName(serviceName).getMethod(methodName, paramType); Object returnValue = method.invoke(serviceObject, paramValue); ResponseModel responseModel = new ResponseModel(requestId,serviceName,methodName,"200",JSON.toJSONString(returnValue)); sb.append(JSON.toJSONString(responseModel)); sb.append("\n"); System.out.println(sb.toString()); ctx.writeAndFlush(sb); } catch (Exception e) { ResponseModel responseModel = new ResponseModel(requestId,"","","500",e.getMessage()); String errorCode = JSON.toJSONString(responseModel)+"\n"; log.error(errorCode); ctx.writeAndFlush(errorCode); log.error("报文解析失败: " + e.getMessage()); } }客户端的模块代码如下;
这里重点关注的是 ClientHandler 类中 channelRead0() 方法的处理
@Override protected void channelRead0(ChannelHandlerContext ctx, String msg) { System.out.println("收到服务端消息: " + msg); ResponseModel responseModel = JSON.parseObject(msg,ResponseModel.class); String responseId = responseModel.getResponseId(); Promise promise = LocalPromise.promiseMap.remove(responseId); if(promise != null){ String code = responseModel.getCode(); if(code.equals("200")){ promise.setSuccess(responseModel.getData()); }else{ promise.setFailure(new RuntimeException(responseModel.getData())); } } }和 AppStart 类中获取获取服务的处理;
privateT getProxyService(Class serviceClass) { Object service = Proxy.newProxyInstance(serviceClass.getClassLoader(), new Class[]{serviceClass}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Channel channel = NettyClient.getChannel(host, port); RequestModel requestModel = new RequestModel("100001", method.getDeclaringClass().getName(), method.getName(), method.getParameterTypes(), args); channel.writeAndFlush(JSON.toJSONString(requestModel) + "\n"); Promise promise = new DefaultPromise(channel.eventLoop()); LocalPromise.promiseMap.put(requestModel.getRequestId(), promise); System.out.println(LocalPromise.promiseMap+">>>>>>>>>>>>"); promise.await(); if (promise.isSuccess()) { Class> returnType = method.getReturnType(); return JSON.toJavaObject(JSON.parseObject(promise.getNow()+""),returnType); } else { System.out.println(promise.cause()); return promise.cause(); } } }); return (T) service; }
测试结果:
到此,关于"怎么用Springboot和Netty实现rpc"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
处理
学习
服务
报文
客户
整体
方法
更多
模块
消息
端的
结构
重点
项目
反射
帮助
实用
接下来
两个
代码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
cmd命令关闭数据库
创世神插件加入服务器
我国网络安全的保护基本法
服务器长线
软件开发工程师 ssp
大同市网络安全设备
超凡先锋手机版服务器怎么选
数据库工具箱官网补单计划表
计算机学院网络安全普法
郑州安卓软件开发有用吗
郑州有哪些软件开发技校
数据库编程学习强国
郑州语音聊天软件开发
河南知名的软件开发公司
网络安全小报上网安全小贴士
互联网软件开发大概要多少钱
国内搞软件开发最厉害人是谁
营销软件开发公司电话
网络安全论文目录ppt
网络安全交易心得
公安内网网络安全培训课件
网络运营者常见的网络安全威胁有
无线网络安全技术发展前景
大疆mini飞机安全数据库版本
物探研究院做软件开发好不好
煤矿上的平台是什么软件开发的
电子网络技术有哪些
数据库的逻辑设计实验报告
网络技术开发与销售服务
电爆网络安全电阻测试仪