【Java框架】RPC远程调用
RPC架构
一、RPC概述
RPC(Remote Procedure Call)叫作远程过程调用,它是利用网络从远程计算机上请求服务,可以理解为把程序的一部分放在其他远程计算机上执行。通过网络通信将调用请求发送至远程计算机后,利用远程计算机的系统资源执行这部分程序,最终返回远程计算机上的执行结果。
RPC的五个主要部分
- user(服务调用方)
- user-stub(调用方的本地存根)
- RPCRuntime(RPC通信者)
- server-stub(服务端的本地存根)
- server(服务端)
服务调用方、调用方的本地存根及其一个RPC通信包的实例存在于调用者的机器上;而服务提供方、服务提供方的存根及另一个RPC通信包的实例存在于被调用的机器上。
服务方的代码启动后要能够接受调用方的网络请求(如Netty、Tomcat)
从一个简单的案例分析
- Provider模块为服务方,提供服务(接口)的实现,接收调用方的调用(网络请求),并返回执行结果
- Consumer模块为调用方,发送请求给服务方,并接受执行结果
- Common模块为公共模块,提供服务(接口)的定义。供Provider和Consumer使用
- RPC模块为RPC架构的实现框架
- 提供网络服务的启动(HttpServer)
- 提供网络请求的处理(HttpServerHandler)
- 提供接口名和实现类的映射,便于快速找到网络请求调用方法对应的实现类(LocalRegister,这里使用本地注册)
- 提供网络请求中接口名,方法名,参数类型数组,参数数组的封装(Invocation,需要实现序列化接口)
- 提供代理工厂类用于Consumer创建代理对象,通过代理对象直接调用服务中的方法(ProxyFactory,通过JDK中的动态代理类Proxy实现)
二、RPC框架的开发要点
服务发现
从远程注册中心(如Redis)获取接口名对应的ip地址和端口(URL列表)
List<URL> urlList = RemoteRegister.get(interfaceClass.getName(), "1.0");
负载均衡
负载均衡(LoadBalance)提供很多种策略,这里实现随机策略
public class LoadBalance {public static URL random(List<URL> urls){Random random = new Random();int randomIndex = random.nextInt(urls.size());return urls.get(randomIndex);}
}
服务容错
在可能会出现异常的位置进行异常的友好处理,例如在网络连接失败时返回具体的信息
也可以在catch中调用自定义的实现类HelloServiceErrorCallback调用具体的错误回调方法
//服务调用:发送请求
String result = null;
try {HttpClient client = new HttpClient();result = client.send(url.getHostname(), url.getPort(), invocation);
}catch (Exception e){return "服务调用失败!";
}
服务重试
当某个服务调用失败后,可以尝试调用集群中的其他服务
服务mock
若服务方的业务代码没有开发完,调用方需要一个返回结果,就可以用mock实现。
在代理对象的调用逻辑中判断是否有mock参数的信息,如果有直接返回mock中的信息
String mock = System.getProperty("mock");
if( mock != null && mock.startsWith("return:")){String result = mock.replace("return:", "");return result;
}
三、案例代码实现
获取源码可以去看我的Github
RPC模块中需要的依赖
<dependencies><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>9.0.43</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId><version>1.3.2</version></dependency>
</dependencies>
相关文章:
【Java框架】RPC远程调用
RPC架构 一、RPC概述 RPC(Remote Procedure Call)叫作远程过程调用,它是利用网络从远程计算机上请求服务,可以理解为把程序的一部分放在其他远程计算机上执行。通过网络通信将调用请求发送至远程计算机后,利用远程计…...
云原生全栈体系(一)
云平台核心 第一章 为什么用云平台 环境统一按需付费即开即用稳定性强 一、国内常见云平台 阿里云、百度云、腾讯云、华为云、青云… 二、国外常见云平台 亚马逊 AWS、微软 Azure … 三、公有云 购买云服务商提供的公共服务器 公有云是最常见的云计算部署类型。公有云资…...
【【51单片机直流电机调速】】
学会电机调速,掌握中国速度 PWM的生成方法 先用户设定一个比较值,然后计数器定时自增。 当计数器<比较值,输出0 当计数器>比较值,输出1 main.c #include <REGX52.H> #include"delay.h" #include"…...
【Spring Boot】
目录 🍪1 Spring Boot 的创建 🎂2 简单 Spring Boot 程序 🍰3 Spring Boot 配置文件 🍮3.1 properties 基本语法 🫖3.2 yml 配置文件说明 🍭3.2.1 yml 基本语法 🍩3.3 配置文件里的配置类…...
使用docker 部署自己的chatgpt
直接docker部署 docker run --name chatgpt-web -d -p 3002:3002 --env OPENAI_API_KEYyour_api_key chenzhaoyu94/chatgpt-web:latestDocker compose部署 version: 3services:app:image: chenzhaoyu94/chatgpt-web # 总是使用 latest ,更新时重新 pull 该 tag 镜像即可ports…...
Python适配器模式介绍、使用方法
一、Python适配器模式介绍 适配器模式(Adapter Pattern) 是一种结构型设计模式,用于将不兼容的接口转换为另一种接口,以便系统间的协同工作。 功能: 适配器模式主要功能是将一个类的接口转换成客户端所期望的另一种接口,以满足…...
【数据结构】复杂度
🔥博客主页:小王又困了 📚系列专栏:数据结构 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、什么是数据结构 二、什么是算法 三、算法的效率 四、时间复杂度 4.…...
【读点论文】PP-YOLOE: An evolved version of YOLO,面向友好部署的模型设计,为项目后续产业落地提供了更加有效的参考
PP-YOLOE: An evolved version of YOLO Abstract 在本报告中,我们介绍了PP-YOLOE,一种具有高性能和友好部署的工业最先进的目标探测器。我们在之前的PP-YOLOv2的基础上进行优化,采用无锚模式,更强大的骨干和颈部配备CSPRepResSt…...
微服务入门---SpringCloud(二)
微服务入门---SpringCloud(二) 1.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取配置 1.2.配置热更新1.2.1.方式一1.2.2.方式二 1.3.配置共享1)添加一个环境共享配置2)在user-service中读取共享配置…...
51单片机IO口控制
51单片机IO口控制 1.点亮LED灯 原理:根据电路图,指向IO口的引脚;拉低电平,灯亮、 如图: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zfco4IjK-1690308697530)(C:/Users/xie19/Pictur…...
ERROR 1064 - You have an error in your SQL syntax;
ERROR 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near (/, 少个逗号吧,以前开始写SQL,特别是修改SQL的时候容易出现这样错误。 而且自己也知道在附近…...
leetcode做题笔记46
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 思路一:回溯 void swap(int *nums,int index1,int index2) {int temp nums[index1];nums[index1] nums[index2];nums[index2] temp; }void prem(int* nu…...
快问快答JS面向对象面试题
1、说说你对闭包的理解 使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用…...
googlenet论文理解
参考文章:https://www.cnblogs.com/czy4869/p/8977788.html 以及下面这篇的前几行让我弄懂了论文里说的稀疏性和计算性能兼顾:参考文章:https://blog.csdn.net/weixin_52121118/article/details/119740279...
OnnxRuntime TensorRT OpenCV::DNN性能对比(YoloV8)实测
1. 前言 之前把ORT的一套推理环境框架搭好了,在项目中也运行得非常愉快,实现了cpu/gpu,fp32/fp16的推理运算,同onnx通用模型在不同推理框架下的性能差异对比贴一下,记录一下自己对各种推理框架的学习状况 YoloV8模型大小 模型名称参数量NANO3.2M...... 2. CPU篇 CPU推理框架性…...
【QT 网络云盘客户端】——获取用户文件列表信息
目录 1.获取用户文件列表信息分析 2.设置图标属性 3.向服务器获取文件的数量 4.向服务器获取文件信息列表 4.显示图标 1.获取用户文件列表信息分析 1.将QListWidget设置为图标模式 2. 当我们点击"按下载量升序","按下载量降序",“更新” 菜单选项 都会…...
从0到1,无代码开发如何简化产品创新流程
在当今竞争激烈的市场环境中,产品创新已经成为企业成功的关键因素之一。为了在市场上保持竞争力,企业需要不断地推出新产品或改进现有产品。然而,传统的开发流程往往耗时费力,且成本高昂。因此,简化产品创新流程成为了…...
select、epoll 的快速核心理解
一、 select 最low的就是在用户代码中自旋实现所有阻塞socket的监听。但是每次判断socket是否产生数据,都涉及到用户态到内核态的切换。 于是select改进:将fd_set传入内核态,由内核判断是否有数据返回; 然后最low的只能使用自旋…...
HTTP和HTTPS的区别
一、两者概念 1.1 HTTP概念 HTTP 的全称是超文本传输协议(HyperText Transfer Protocol) 是一种用于分布式、协作式和超媒体信息系统的应用协议,简单来说就是一种分布和接收HTML页面的方法,被用于在Web浏览器和网站服务器之间传递…...
分布式异步任务处理组件(二)
一些关键点的设计脑暴记录----very important!!! 首先,任务存储交给kafka,由节点负责写入kafka,acks1;失败重试;透传kafka的提交可靠性,保证任务提交成功;后…...
强化学习实战:Sarsa vs Q-learning,on-policy和off-policy到底怎么选?
强化学习实战:Sarsa与Q-learning的深度对比与策略选择指南 1. 理解策略分类的核心逻辑 在强化学习领域,策略选择直接影响算法的行为模式和学习效果。我们先从最基础的概念切入:什么是策略?简单来说,策略就是智能体在特…...
AWPortrait-Z WebUI日志诊断指南:从webui_startup.log定位90%常见问题
AWPortrait-Z WebUI日志诊断指南:从webui_startup.log定位90%常见问题 1. 引言:为什么需要关注启动日志 当你启动AWPortrait-Z WebUI时,系统会自动生成一个名为webui_startup.log的日志文件。这个文件就像是系统的"健康检查报告"…...
告别配置迷茫!手把手教你用DaVinci Configurator配置Autosar NvM Block(含三种类型详解)
告别配置迷茫!手把手教你用DaVinci Configurator配置Autosar NvM Block(含三种类型详解) 在汽车电子开发中,非易失性存储(NVM)的配置往往是工程师们最头疼的环节之一。面对复杂的AUTOSAR存储协议栈…...
为什么JavaScript无法访问用户电脑的硬件信息
JavaScript和硬件信息访问:安全和信任的博弈许多人想知道:为什么JavaScript不能访问用户计算机的硬件信息?答案与安全和信任机制密切相关。虽然本地客户端软件可以访问硬件信息,但这是基于用户对软件的信任和授权。浏览器和客户端…...
别再只用scatter了!用Matlab绘制密度散点图,让你的数据分布一目了然(附TheColor配色方案)
突破数据可视化瓶颈:Matlab密度散点图实战指南 当你面对数十万个数据点时,传统的散点图往往会变成一团模糊的噪点,重要分布特征完全被掩盖。这种场景下,密度散点图就像给你的数据装上了X光机,让隐藏的模式和结构清晰可…...
从对话到执行:一文读懂AI Coding Agent的底层原理
为什么 Claude Code 等 AI Agent 能自己写代码、改 bug、提交 PR?为什么它和 ChatGPT 完全不一样?这篇文章用最简单的语言,拆解 AI Agent 的底层工作原理。一句话说清楚:AI Coding Agent 和普通 AI 有什么不同?普通 AI…...
5B00,5B01,5B02,1700,1701,1702,1704,P07清零软件G3800,TS3480 ,TS3380 ,G3000,G1810,TS9020, TS8020,TS3480秒修复
下载地址:链接:https://pan.baidu.com/s/1j7Nwv715wX1JL3qidnGyXA?pwd0000 提取码:0000 常见 佳能打印机 型号: G5080 G6080 G7080 G1810 G2810 G3810 G4810 G1800 G2800 G3800 G4800 G5010 G6010 G7010 G1010 G2010 G3010 G4010 G1000 G2000 G3000 G40…...
AI绘画效率翻倍:WuliArt Qwen-Image Turbo极速生成实战测评
AI绘画效率翻倍:WuliArt Qwen-Image Turbo极速生成实战测评 1. 极速AI绘画新体验 作为一名长期使用各类AI绘画工具的技术爱好者,我一直在寻找一个能在个人电脑上流畅运行的高效文生图解决方案。直到最近体验了WuliArt Qwen-Image Turbo,这款…...
VASP机器学习力场训练避坑指南:从INCAR参数设置到声子谱验证的完整流程
VASP机器学习力场训练实战:参数调优与声子谱诊断全解析 在材料计算领域,VASP结合机器学习力场的技术路线正逐渐成为平衡计算精度与效率的黄金标准。但当我们真正着手训练自己的力场模型时,往往会发现教程中的理想案例与实际操作之间存在巨大鸿…...
别再只盯着大模型了!手把手教你用Python+卫星数据做农业产量预测(附代码)
用Python和卫星数据构建农业产量预测模型:从数据获取到结果可视化全流程指南 当我们在谈论智慧农业时,往往容易陷入对大模型的盲目崇拜。但实际上,一套简单实用的数据科学流程,配合公开免费的卫星遥感数据,就能为中小农…...
