通用RPC方案

保姆级教程:手把手教你下载和配置Waymo自动驾驶数据集(附百度网盘链接) 本文提供了一份详细的Waymo自动驾驶数据集下载和配置指南,特别针对国内研究者优化了数据获取方案,包括百度网盘链接和Google Cloud CLI配置。文章还涵盖了环境配置、数据处理实战、可视化分析以及进阶技巧,帮助开发者高效利用这一业界黄金标准数据集进行自动驾驶研究。 阅读详情

通用RPC方案

provider端

  1. 利用org.springframework.context.ApplicationListener#onApplicationEvent在Spring初始化的最后一步时绑定端口
  2. 利用Netty将ServerSocketChannel绑定到boss 线程绑定端口
((ServerBootstrap)this.serverBootstrap
.group(getParentEventLoopGroup(), getChildEventLoopGroup())
.channel(NioServerSocketChannel.class)
.childHandler(new ServerChannelInitializer(this.config));

((ServerBootstrap)((ServerBootstrap)((ServerBootstrap)((ServerBootstrap)((ServerBootstrap)this.serverBootstrap
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, this.config.getCONNECTTIMEOUT()))
.option(ChannelOption.SO_BACKLOG, this.config.getBACKLOG()))
.option(ChannelOption.ALLOCATOR, PooledBufHolder.getInstance()))
.option(ChannelOption.SO_REUSEADDR, reusePort))
.option(ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator.DEFAULT))
.childOption(ChannelOption.SO_KEEPALIVE, this.config.isKEEPALIVE())
.childOption(ChannelOption.TCP_NODELAY, this.config.isTCPNODELAY())
.childOption(ChannelOption.ALLOCATOR, PooledBufHolder.getInstance())
.childOption(ChannelOption.SO_RCVBUF, 1048576)
.childOption(ChannelOption.SO_SNDBUF, 1048576)
.childOption(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, this.config.getBufferLowWaterMark())
.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, this.config.getBufferHighWaterMark());

ChannelFuture future = this.serverBootstrap.bind(new InetSocketAddress(this.config.getHost(), this.config.getPort()));

其中ServerChannelInitializer的initChannel为

protected void initChannel(SocketChannel ch) throws Exception {
    ch.pipeline().addLast(new ChannelHandler[]{this.connectionChannelHandler}).addLast(new ChannelHandler[]{new SerializeAdapterDecoder(this.serverChannelHandler, this.transportConfig.getPayload(), this.transportConfig.isTelnet(), this.transportConfig)});
}

触发read事件时,在SerializeAdapterDecoder的decode方法的最后一个中加入ServerChannelHandler 继承 ChannelInboundHandlerAdapter

继续处理read事件时,在ServerChannelHandler 的channelRead方法中使用线程池来处理读到的数据(可能是耗时操作)

从而来保证不会由于处理请求导致work线程全部耗尽,而出现等待的情况

小结

  1. 利用org.springframework.context.ApplicationListener#onApplicationEvent在Spring初始化的最后一步时绑定端口
  2. 利用Netty将ServerSocketChannel绑定到work 线程绑定端口
  3. consumer端连接到provider端
  4. 将接收的SocketChannel绑定到work 线程中
  5. consumer端传输数据给provider端
  6. provider端处理读事件,在pipeline的最后一个ChannelInboundHandlerAdapter时,使用线程池来处理读到的数据(可能是耗时操作)

consumer端

  1. 使用FactoryBean在Spring初始化Bean的时候代理得到真正的代理Bean

  2. 从注册中心获取所有的provider

  3. 在线程池中利用Netty连接到provider

    EventLoopGroup eventLoopGroup = transportConfig.getEventLoopGroup();
    Channel channel = null;
    String host = transportConfig.getProvider().getIp();
    int port = transportConfig.getProvider().getPort();
    int connectTimeout = transportConfig.getConnectionTimeout();
    
    Bootstrap bootstrap = new Bootstrap();
    ((Bootstrap)bootstrap.group(eventLoopGroup)).channel(NioSocketChannel.class);
    
    bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
    bootstrap.option(ChannelOption.ALLOCATOR, PooledBufHolder.getInstance());
    bootstrap.option(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, transportConfig.getLowWaterMark());
    bootstrap.option(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, transportConfig.getHighWaterMark());
    bootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, AdaptiveRecvByteBufAllocator.DEFAULT);
    ClientChannelInitializer initializer = new ClientChannelInitializer(transportConfig);
    bootstrap.handler(initializer);
    ChannelFuture channelFuture = bootstrap.connect(host, port);
    channelFuture.awaitUninterruptibly((long)connectTimeout, TimeUnit.MILLISECONDS);
    if (channelFuture.isSuccess()) {
        channel = channelFuture.channel();
        if (NetUtils.toAddressString((InetSocketAddress)channel.remoteAddress())
            .equals(NetUtils.toAddressString((InetSocketAddress)channel.localAddress()))) {
            channel.close();
            throw new InitErrorException("Failed to connect " + host + ":" + port + ". Cause by: Remote and local address are the same");
        } else {
            return channel;
        }
    } else {
        Throwable cause = channelFuture.cause();
        throw new InitErrorException("Failed to connect " + host + ":" + port + (cause != null ? ". Cause by: " + cause.getMessage() : "."));
    }
    

小结:

  1. 最终的每个连接的4元组都有一个Netty工作线程组,用于传输数据。–>依赖的jsf接口多(不同的提供方)、依赖方的机器多都会导致机器的连接数较多–>大促巡检的时候能看出每个项目的连接数差距较大。–>在我看来连接数的报警是没有意义的,因为依赖方如果加机器你就报警啦,但是报警没有任何意义

其中ClientChannelInitializer中加入编码器以及解码器进行编解码通信,以及ClientChannelHandler来处理请求的msgId与响应的msgId的对应关系

真正调用是使用负载均衡器获取到provider

得到provider对应的NioSocketChannel

真正发消息(含有readTimeout读超时时间):

msgId = this.genarateRequestId(msg);
msg.setRequestId(msgId);
MsgFuture<ResponseMessage> future = this.doSendAsyn(msg, timeout);
var5 = (ResponseMessage)future.get((long)timeout, TimeUnit.MILLISECONDS);

在ClientChannelHandler的channelRead处理read事件:

public void receiveResponse(ResponseMessage msg) {
    Integer msgId = msg.getRequestId();
    MsgFuture future = (MsgFuture)this.futureMap.remove(msgId);
    if (future == null) {
        if (msg != null && msg.getMsgBody() != null) {
            msg.getMsgBody().release();
        }
    } else {
        future.setSuccess(msg);
    }
}
人工智能在慢病管理中的具体应用全集:从技术落地到场景创新 这一成果的取得,得益于 AI 对居民血压数据的实时监测和分析,以及及时的干预措施。据统计,医疗支出下降了 18%,这主要是由于 AI 慢病管理系统实现了对慢病患者的早筛早诊早治,减少了并发症的发生,降低了医疗资源的浪费,从而减轻了患者和社会的医疗负担。医院信息系统(HIS)、电子病历(EMR)、区域卫生平台、可穿戴设备(如三诺血糖仪、华为手环)、第三方健康APP以及体检中心的数据往往采用不同的数据标准和格式(如HL7、FHIR、JSON、CSV等),且存储在相互隔离的系统中,形成典型的数据孤岛。 阅读详情

相关推荐

Qoder + ADB Supabase :5分钟GET超火AI手办生图APP

本文介绍如何利用Qoder、阿里云 ADB Supabase 和通义千问图像编辑模型,快速构建AI手办生图Flutter应用。无需传统后端,通过AI生成代码、BaaS服务与边缘函数调用,实现从原型到上线的敏捷开发,全流程轻量高效,助力Vibe Coding落地实践。

数据库技术 931

嵌入式轻量级RPC接口设计:裸机与RTOS通用远程调用方案

远程过程调用(RPC)是一种实现跨组件、跨设备函数调用的基础通信范式,在嵌入式系统中尤为关键。其核心原理是将本地函数调用抽象为可序列化、可传输的请求-响应模型,通过协议层解耦业务逻辑与通信细节。轻量级RPC技术的价值在于满足资源受限场景下的确定性、低内存占用与高可靠性需求,广泛应用于Bootloader与Application交互、MCU与协处理器通信、传感器网络集中控制及产线自动化测试等工业场景。本文聚焦于一种零依赖、静态内存、协议中立的嵌入式RPC中间件设计,深度适配裸机与RTOS环境,并支持UART/

weixin_29215509的博客 261

【NLP】语言模型的发展历程 (1)

N-gram模型是一种基于统计语言模型的文本分析算法,它用于预测文本中下一个词出现的概率,基于前面出现的n-1个词的序列。这里的n代表序列中元素的数量,因此称为N-gram。Unigram:N=1,每个单词的出现概率独立计算,不考虑上下文。Bigram:N=2,基于前一个单词预测当前单词的联合概率模型。Trigram:N=3,考虑前两个单词来预测当前单词的联合概率模型,更复杂但可能更准确。

酒酿小圆子呀~ 1667

RPC 原理与实现

文章目录1. RPC 简介1.1 什么是RPCReference: LPC & IPC (本地过程调用)1.2 为什么要用RPC1.2.1 系统架构的演进1.2.2 Web 服务的技术结构1.2.2 SOAP ( Simple Object Access Protocol)1.2.2 REST(REpresentational State Transfort)SOAP & REST......

谈谈1974 5415

Astah 9.0升级步骤(Widnows/Mac OS)

Astah Professional是一款全新的轻量级UML建模工具。软件集思维导图和UML建模于一体,采用100%纯JAVA构建, 兼容性强,不仅能够实现分布式建模、项目合并,还能够实现和其它建模工具的交互。

tequiero777的博客 2824

聚类模型-层次聚类

聚类模型 1、层次聚类 2、原型聚类-K-means 3、模型聚类-GMM 4、EM算法-LDA主题模型 5、密度聚类-DBSCAN 6、图聚类-谱聚类 一、层次聚类 一、聚类理论 ​ 一般来说,聚类是在训练样本的标签信息不知的情况下,学习样本内在的性质和规律,将有限的集合划分成ccc类。根据“方以类聚,物以群分”的思想,类内对象尽可能的相似,...

myazi 6502

远程过程调用(RPC)详解

原文同步至 http://waylau.com/remote-pr...

weixin_33913377的博客 6243

华大HC32F460 TCP Client 实验

华大HC32F460 TCP Client 实验

ZhuoWuKeJi的博客 647

JAVA中几种常用的RPC框架介绍

点击打开链接

架构师的方向 1万+

详解AXI4-Lite接口(3)--AXI4-Lite接口IP源码仿真及分析(Master接口)

通过本文您会学到:1、了解AXI4-Lite_Master接口的逻辑实现;2、加深Xilinx IP、仿真工具的使用;3、提高阅读时序图的能力。

孤独的单刀 6445

智能车图像处理2-入门级分析1 ---基础扫线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 7740

RPC原理及应用

01背景 对于一个电商平台而言,往往涉及购物车,订单,支付,商品等多个模块,这就需要多个人员进行维护,如果采用单机系统,就会导致这样的问题: 1、某人在维护自己模块代码时,需要将所有代码编译打包,其余模块可能需要回归测试; 2、其中一个模块出问题,可能导致整个系统故障。 这就出现了远程过程调用RPC,它使得我们可以像调用本地函数一样调用远程服务器的函数。 RPC是分布式的基石。 从单机走向分布式,产生了很多分布式的通信方式: 1、TCP/UD...

yedushusheng的专栏 1262

2026年数学建模国赛C题利器:层次分析法与主成分分析在统计建模中的应用

本文系统探讨了层次分析法(AHP)与主成分分析(PCA)在数学建模竞赛,特别是全国大学生数学建模竞赛C题中的联合应用策略。通过理论阐述、方法对比和案例实践,本文揭示了两种方法从“数据降维”到“决策评价”的完整分析链条,提出了“PCA+AHP”协同框架,并通过实际算例验证了该框架在解决复杂评价类问题中的有效性和优越性。研究表明,将PCA的客观降维能力与AHP的主观决策优势有机结合,能够显著提升统计建模的科学性、合理性和解释力,是应对日益复杂的竞赛题目的重要方法论工具。关键词:层次分析法;主成分分析;数学建模。

YOLO 40

通用RPC调用组件,dubbo泛化调用集成

项目介绍随着微服务的流行,不管是企业级应用还是互联网应用都在向微服务架构转变,我们在享用微服务给我们带来价值的同时,也发现了传统的开发模式上微服务给我们带来的管理、部署的问题,比如新增或扩展provider后,consumer需要重新引用provider的API,或者后端服务做升级更新后,前端调用端一般也要跟着升级。本项目就是为了解决此类问题。特点:consumer不需要引入provider的ap...

w2ndong的专栏 791

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

通用RPC跨平台方案设计

本文提出了一种基于C++17的轻量级跨平台RPC框架设计方案。该框架采用分层架构,包含应用层、RPC核心层和通信层,支持多种传输协议和序列化方式。核心组件包括网络传输抽象、协议编解码、服务存根生成等,具备服务注册发现、负载均衡和熔断机制。协议设计采用固定头部格式,支持JSON/Protobuf/MsgPack等多种消息体结构。实现上采用模块化设计,提供C++、Python、Go等多语言绑定能力,特别适合嵌入式等高性能场景。框架具有跨平台、高性能、易扩展等特点,核心代码精简无重量级依赖。

ALex_zry的博客 786

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

web端 -- RPC - 通用方案

今天我所带来的是一个简单的RPC模型, 架构很简单,主要分为三个部分,1、spider客户端 2、服务器 3、浏览器客户端, 其中服务器只做数据的中转,数据逻辑处理都做客户端。的说就是 搭建一个后端服务器, 然后把拦截到的浏览器数据通过websocket发送到我们的服务器, 我们通过API 取获取加密数据。当一个目标站加密字段特别多,而且我们对其并不需要大规模爬取时,考虑到时间成本,我们就可以使用。注意: 这段js代码需要自行定位加密函数位置,把代码加入其中。RPC: 远程服务器调用,

TF的博客 1068

跨域NATS消息对接通用解决方案

每个领域要处理来自其它领域的消息 server, 要处理两大类消息:同步异步。每个领域client有两个topic:同步异步,消息源。实际rpc主要的应用场景是领域内部的对接。NATS消息类型:同步、异步。

leijmdas的专栏 746

K神吹水系列之RPC

我们知道,有几十种的RPC技术,corba啊,com+,soap啊,xml-rpc,rmi、.net remoting,hessian,pb,thrift,avro,,,甚至dwr,blazeds 远程过程调用,肯定走网络的,所以可以按协议分成走tcp的,走http的, 少量的是走http的,比如hessian,soap一般也走http 大部分直接走tcp 对了,soap可以走非http方式的哦,一般人不知道。以前的axis和cxf源码里会带有webservice走jms协议的例子。 远程调用,肯定是两个系

AhahaGe 332

joe老大关于rpc之争的文章

joe老大关于rpc之争的文章 原文:http://armstrongonsoftware.blogspot.com.nyud.net/2008/05/road-we-didnt-go-down.html 通过我的哪吒机器人,我收到joe老大blog更新的消息,以为joe老大的blogspot不会更新,甚是惊喜. 因为"功夫网"的原因,我们无法访问blogger(blogspot,我以前...

Erlang Display - Erlang问答社区:www.erlangqa.com 140

周志明架构课--08.远程服务调用,如何选择合适的RPC框架

能不能看懂?

Exception的专栏 267

GraphQL RPC 与通用索引器公测介绍:为 Sui 带来更强大的数据层

GraphQL RPC 与通用索引器公测,让访问和构建 Sui 数据变得更简单、更强大。

Sui_Network的博客 845

一文讲清 RPC是什么?和HTTP什么关系?

RPC:Remote Procedure Call,远程过程调用是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。为什么要用RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用。也便于微服务的划分,根据业务模块做了不同的拆分,像用户的服

哇咔咔的博客 472

1.RPC的基础知识

什么是RPC RPC的全称是Remote ProcedureCall,即远程过程调用,RPC屏蔽了底层网络通信相关的细节,实现调用远程方法和调用本地方法一样 RPC通信流程 RPC协议 RPC协议设计 RPC协议的设计可以分为协议头和协议体 协议头包含协议长度、序列化方式、协议标示、消息 ID、 消息类型等 协议体包含请求接口方法、请求的业务参数值、扩展属 性等 可扩展的协议设计 上面设计的协议都是固定的协议,如果想在这个协议中增加新的参数,那么就会有兼容性问题,那么就要设计一个可扩展的协议,如下所示:

strong_yu的博客 826

从 TCP 到 RPC:彻底搞懂「HTTP 与 RPC用法区别」

本文深入剖析HTTP与RPC的本质区别,从TCP底层原理讲起,解析粘包拆包、协议封装等核心问题,梳理二者演进脉络。通过对比服务发现、传输性能、适用场景等维度,结合Dubbo、gRPC等框架,帮你按场景精准选型,彻底搞懂微服务通信的技术逻辑。

三两肉的博客 908

RMI和RPC区别联系

RMI和RPC区别联系 RMI 概念 RMI(Remote Method Invocation,远程方法调用)java1.2实现,实现了程序级不同jvm上的程序通信,是rpc的纯java版本。 场景 纯java通信的分布式通信解决方案。 stub->skeleton->找到真正的对象和方法->返回结果给stub 代码示例 gitlab地址 客户端 public class Client { public static void main(String[] args) {

Andy的博客 468

低代码平台中的分布式 RPC 框架 (约 3000 行代码)

NopRPC 是从第一性原理出发,重新审视 RPC 的概念,完全重新设计的 Yet Another PRC 框架,它的设计非常简洁直观,易于扩展,是 Nop 平台的一个有机组成部分。

csdn1234561231的博客 438

RPC 开发系列六:负载均衡

一、背景 首先从讲故事开始 有一次碰上流量高峰,突然发现线上服务的可用率降低了,经过排查发现,是因为其中有几台机器比较旧了。当时最早申请的一批容器配置比较低,缩容的时候留下了几台,当流量达到高峰时,这几台容器由于负载太高,就扛不住压力了。 解决方案:在治理平台上调低这几台机器的权重,这样的话,访问的流量自然就减少了。 但业务接着反馈了,说:当他们发现服务可用率降低的时候,业务请求已经受到影响了,这时再如此解决,需要时间啊,那这段时间里业务可能已经有损失了。紧接着就提出了需求,问:RPC 框架有没

hfut_zhanghu的博客 2195
上一篇: Netty源码解析系列三:Netty与Tomcat的区别
下一篇: SpringMVC系列一:SpringMVC请求处理流程
技术爱好者666
博客等级 码龄9年 4粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值