怎么用Springboot和Netty实现rpc
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要介绍"怎么用Springboot和Netty实现rpc",在日常操作中,相信很多人在怎么用Springboot和Netty实现rpc问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作
千家信息网最后更新 2025年01月19日怎么用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安全错误
数据库的锁怎样保障安全
软件开发取得的阶段性成果
安全云服务器欢迎咨询
中国网络安全最有前景的公司
数字媒体技术数据库
网络安全有名培训机构
云服务器链接网站
电信 网络技术
在线代理服务器免费测试
方舟怎么攻击别人服务器
网络安全伴我行手抄报最美丽
双路服务器内存插几条
服务器session共享
帧服务器 vegas
cis网络安全创新大会 首届
安卓 服务器搭建
域 数据库
服务器一个网卡两个网口配置
oracle数据库添加数据语句
分条件审批 数据库设计
5g智能网络安全
中国汽车网络安全分享
微晟互联网科技有限公司招聘
互联网教育科技统计表
福州职业技术学院网络安全
网络安全防护有哪些方面
未获取到数据库
网络安全法对实名制的规定
禾川服务器点动
潮州数据链软件开发价格
数据库设计技术标准