卷起来了 手把手带你写一个中高级程序员必会的分布式RPC框架

高性能RPC框架解密 Remote;RPC技术极大地简化了分布式系统的开发,它允许开发者以一种统一和透明的方式访问远程服务。随着技术的发展,RPC已经衍生出多种实现,支持多种编程语言和服务协议,成为现代分布式计算不可或缺的一部分。 阅读详情

一.概述

什么是RPC?

  • 远程服务调用
  • 官方:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想
  • 通俗一点:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。
  • 市面上常见的rpc框架:dobbo,springCloud,gRPC…

那为什么要有 RPC,HTTP 不好么?

  • 因为 RPC 和 HTTP 就不是一个层级的东西,所以严格意义上这两个没有可比性,也不应该来作比较。
  • HTTP 只是传输协议,协议只是规范了一定的交流格式
  • RPC 对比的是本地过程调用,是用来作为分布式系统之间的通信,它可以用 HTTP 来传输,也可以基于 TCP 自定义协议传输。
  • HTTP 协议比较冗余,所以 RPC 大多都是基于 TCP 自定义协议,定制化的才是最适合自己的。

项目总体结构

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架


整体架构

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架

接下来,分别解释上述的过程

二.自定义注解

服务的提供者和消费者公用一个接口,@ServiceExpose是为了暴露服务,放在生产者的某个实现类上;@ServiceReference是为了引用服务,放在消费者的需要注入的属性上。对于新手小白想更轻松的学好Java提升,Java架构,web开发、大数据,数据分析,人工智能等技术,这里给大家分享系统教学资源,扩列下我尉(同英):1253431195【教程/工具/方法/解疑】

  • Target:指定被修饰的Annotation可以放置的位置(被修饰的目标)

  • @Target(ElementType.TYPE) //接口、类

  • @Target(ElementType.FIELD) //属性

  • @Target(ElementType.METHOD) //方法

  • @Target(ElementType.PARAMETER) //方法参数

  • @Target(ElementType.CONSTRUCTOR) //构造函数

  • @Target(ElementType.LOCAL_VARIABLE) //局部变量

  • @Target(ElementType.ANNOTATION_TYPE) //注解

  • @Target(ElementType.PACKAGE) //包

  • Retention:定义注解的保留策略

  • @Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含

  • @Retention(RetentionPolicy.CLASS) //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得

  • @Retention(RetentionPolicy.RUNTIME) //注解会在class字节码文件中存在,在运行时可以通过反射获取到

  • Documented:指定被修饰的该Annotation可以被javadoc工具提取成文档

  • Inherited:指定被修饰的Annotation将具有继承性

二.启动配置

主要是加载一些rpc相关的配置类,使用SpringBoot自动装配。可以使用SPI机制加入一些自定义的类,放到指定文件夹中。

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架

三.rpc接口注入/rpc服务扫描

这里主要就是通过反射获得对应注解的属性/类,进行服务暴露/服务引用。 这里需要关注的是什么时候进行服务暴露/引用?如下:

  • 客户端:一般有俩种方案

  • 饿汉式:饿汉式是通过实现 Spring 的InitializingBean接口中的 afterPropertiesSet方法,容器通过调用 ReferenceBean的 afterPropertiesSet方法时引入服务。(在Spring启动时,给所有的属性注入实现类,包含远程和本地的实现类)懒汉式:只有当这个服务被注入到其他类中时启动引入流程,也就是说用到了才会开始服务引入。在应用的Spring IOC 容器刷新完毕(spring Context初始化)之后,扫描所有的Bean,将Bean中带有@ServiceExpose/@ServiceReference注解的field获取到,然后创建field类型的代理对象,创建完成后,将代理对象set给此field。后续就通过该代理对象创建服务端连接,并发起调用。(dubbo默认)

  • 服务端:与懒汉式一样。

那么怎么知道Spring IOC刷新完成,这里就使用一个Spring提供的监听器,当Spring IOC刷新完成,就会触发监听器。

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架

四.服务注册到ZK/从Zk获得服务

Zookeeper采用节点树的数据模型,类似linux文件系统,/,/node1,/node2 比较简单。不懂Zookeeper请移步:Zookeeper原理

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架

我们采用的是对每个服务名创建一个持久节点,服务注册时实际上就是在zookeeper中该持久节点下创建了一个临时节点,该临时节点存储了服务的IP、端口、序列化方式等。对于新手小白想更轻松的学好Java提升,Java架构,web开发、大数据,数据分析,人工智能等技术,这里给大家分享系统教学资源,扩列下我尉(同英):1253431195【教程/工具/方法/解疑】

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架

客户端获取服务时通过获取持久节点下的临时节点列表,解析服务地址数据:

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架

客户端监听服务变化:

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架

五.生成代理类对象

这里使用JDK的动态代理,也可以使用cglib或者Javassist(dobbo使用)。

public class ClientProxyFactory 
{   
 /**     * 获取代理对象,绑定 invoke 行为     *  
   * @param clazz 接口 class 对象     * @param <T>   类型     * 
@return 代理对象     *
/public <T> T getProxyInstance(Class<T> clazz) 
{        
return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, 
new InvocationHandler() 
{            
final Random random = new Random();            
@Override            
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
{                
// 第一步:通过服务发现机制选择一个服务提供者暴露的服务                
String serviceName = clazz.getName();                
final List<ServiceInfo> serviceInfos = serviceDiscovery.listServices(serviceName);                
logger.info("Rpc server instance list: {}", serviceInfos);                
if (CollectionUtils.isEmpty(serviceInfos)) 
{                    
throw new RpcException("No rpc servers found.");                
}                
// TODO: 这里模拟负载均衡,从多个服务提供者暴露的服务中随机挑选一个,后期写方法实现负载均衡                
final ServiceInfo serviceInfo = serviceInfos.get(random.nextInt(serviceInfos.size()));                
// 第二步:构造 rpc 请求对象                
final RpcRequest rpcRequest = new RpcRequest();                
rpcRequest.setServiceName(serviceName);                
rpcRequest.setMethod(method.getName());                rpcRequest.setParameterTypes(method.getParameterTypes());                
rpcRequest.setParameters(args);                
// 第三步:编码请求消息, TODO: 这里可以配置多种编码方式                
byte[] data = messageProtocol.marshallingReqMessage(rpcRequest);                
// 第四步:调用 rpc client 开始发送消息                
byte[] byteResponse = rpcClient.sendMessage(data, serviceInfo);                
// 第五步:解码响应消息                
final RpcResponse rpcResponse = messageProtocol.unmarshallingRespMessage(byteResponse);                
// 第六步:解析返回结果进行处理                
if (rpcResponse.getException() != null) 
{                    
throw rpcResponse.getException();                
}                
return rpcResponse.getRetValue();            
}        
});    
}
}

六.负载均衡

本实现支持两种主要负载均衡策略,随机和轮询,其中他们都支持带权重的随机和轮询,其实也就是四种策略。

七.Netty通信

服务端和客户端基本一样,这里只展示服务端的代码。代理对象在Spring启动的时候就生成了,但是没有调用,每一个调用(请求)都会生成一个Netty的连接。对于新手小白想更轻松的学好Java提升,Java架构,web开发、大数据,数据分析,人工智能等技术,这里给大家分享系统教学资源,扩列下我尉(同英):1253431195【教程/工具/方法/解疑】

public class NettyRpcServer extends RpcServer
 {       
@Override    public void start() 
{        
// 创建两个线程组        
EventLoopGroup bossGroup = new NioEventLoopGroup();        
EventLoopGroup workerGroup = new NioEventLoopGroup();        
try {            
// 创建服务端的启动对象            
ServerBootstrap serverBootstrap = new ServerBootstrap()                    
// 设置两个线程组                    
.group(bossGroup, workerGroup)                    
// 设置服务端通道实现类型                    
.channel(NioServerSocketChannel.class)                    
// 服务端用于接收进来的连接,也就是boosGroup线程, 线程队列大小                    
.option(ChannelOption.SO_BACKLOG, 100)                    
.childOption(ChannelOption.SO_KEEPALIVE, true)                    
// child 通道,worker 线程处理器                    
.childHandler(new ChannelInitializer<SocketChannel>() {                        
// 给 pipeline 管道设置自定义的处理器                        
@Override                        
public void initChannel(SocketChannel channel) 
{                            
ChannelPipeline pipeline = channel.pipeline();                            
pipeline.addLast(new NettyServerHandler());                        
}                    
});            
// 绑定端口号,同步启动服务            
ChannelFuture channelFuture = serverBootstrap.bind(port).sync();           
 channel = channelFuture.channel();            
// 对关闭通道进行监听,变为同步            
channelFuture.channel().closeFuture().sync();        
} 
catch (Exception e) 
{            
logger.error("server error.", e);        
} 
finally 
{           
 // 释放线程组资源            
bossGroup.shutdownGracefully();            
workerGroup.shutdownGracefully();        
}    
}

实现具体handler

public class NettyServerHandler extends ChannelInboundHandlerAdapter 
{    
//当通道就绪就会触发该方法    
@Override    
public void channelActive(ChannelHandlerContext ctx) 
throws Exception 
{        
//进行记录        
logger.info("channel active: {}", ctx);    
}    
//读取数据实际(这里我们可以读取客户端发送的消息)    
@Override    
public void channelRead(ChannelHandlerContext ctx, MyDataInfo.MyMessage msg) throws Exception 
{        
//将数据读到buffer中        
final ByteBuf msgBuf = (ByteBuf) msg;        
final byte[] reqBytes = new byte[msgBuf.readableBytes()];        
msgBuf.readBytes(reqBytes);    
}    
//数据读取完毕    
@Override    
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception 
{        
//使用反射获找到目标方法进行返回        
final byte[] respBytes = requestHandler.handleRequest(reqBytes);        
ctx.writeAndFlush(respBytes);    
}    
//处理异常, 一般是需要关闭通道    
@Override    
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) 
throws Exception 
{        
ctx.close();    
}
}

八.序列化协议

对计算机网络稍微有一点了解的同学都知道,数据在网络中传输是二进制的:01010101010101010,类似这种,只有二进制数据才能在网络中传输。但是在编码之前我们一般先进行序列化,目的是为了优化传输的数据量。因为有的数据太大,需要进行空间优化。

那么我们来区分一下序列化和编码:我画一张图大家都全明白了

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架


定义一个序列化协议,放入作为一个handler放入pipeline中。

Netty支持多种序列化,比如jdk,Json,ProtoBuf 等,这里使用ProtoBuf,其序列化后码流小性能高,非常适合RPC调用。接下来看怎么使用ProtoBuf?

  • 1.编写需要序列化的类xxx.proto:ProtoBuf有自己的语法规则(自行百度)

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架

  • 2.通过官网提供的protoc.exe生成对应的Java代码
  • 3.前面通过工具生成的代码(AnimalProto)已经帮我们封装好了序列化和反序列化的方法,我们只需要调用对应方法即可

引入Protobuf的依赖

<dependency>    
<groupId>com.google.protobuf</groupId>    
<artifactId>protobuf-java</artifactId>    
<version>2.4.1</version></dependency>

序列化:

/** * 调用对象构造好的Builder,完成属性赋值和序列化操作 * 
@return */public static byte[] protobufSerializer()
{    
AnimalProto.Animal.Builder builder = AnimalProto.Animal.newBuilder();    
builder.setId(1L);    
builder.setName("小猪");   
 List<String> actions = new ArrayList<>();    
actions.add("eat");    
actions.add("run");    
builder.addAllActions(actions);    
return builder.build().toByteArray();}

反序列化:

/** * 通过调用parseFrom则完成反序列化 * 
@param bytes * 
@return * @throws InvalidProtocolBufferException *
/public static Animal deserialize(byte[] bytes) throws Exception 
{    
AnimalProto.Animal pAnimal = AnimalProto.Animal.parseFrom(bytes);    
Animal animal = new Animal();    
animal.setId(pAnimal.getId());    
animal.setName(pAnimal.getName());    
animal.setActions(pAnimal.getActionsList());    
return animal;
}

测试:

public static void main(String[] args) 
throws Exception 
{    
byte[] bytes = serializer();    
Animal animal = deserialize(bytes);    
System.out.println(animal);
}

以下看到是能正常序列化和反序列化的:

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架

九.通信协议

通信协议主要是解决网络传输问题,比如TCP拆包粘包问题。

TCP问题:

  • TCP拆包粘包主要就是把一些数据合并或者分割开进行发送,这时候有的数据就不完整,有的数据就多出一部分,就会造成问题。一般使用TCP协议都需要考虑拆包粘包问题
  • tcp粘包和半包问题就是因为滑动窗口。 因为不管你的数据是多少长度,怎么分割每一条数据。但是tcp只按照我滑动窗口的长度发送。对于新手小白想更轻松的学好Java提升,Java架构,web开发、大数据,数据分析,人工智能等技术,这里给大家分享系统教学资源,扩列下我尉(同英):1253431195【教程/工具/方法/解疑】
  • 本质是因为TCP是流式协议,消息无边界。

解决方案:业界的主流协议的解决方案可以归纳如下

  • 消息定长:例如每个报文的大小为固定长度100字节,如果不够用空格补足。(定长解码器)
  • 在包尾加特殊结束符进行分割。(分隔符编码器)

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架

  • 消息长度+消息:将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段。Netty自带:

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架

  • 自定义编解码器

图片.png

这里只是列举出来编码过程,解码是逆过程。(说白了,编码就是找着固定的格式进行写入,解码就是照着固定的格式读)

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架


恭喜你,已经学会写RPC框架了,想深入了解的朋友可以参照源码。进行学习,升级。

Alibaba Java Coding Guidelines,以后我的Java代码规范,就靠它了 前言 对于Java代码规范,业界有统一的标准,不少公司对此都有一定的要求。但是即便如此,庞大的Java使用者由于经验很水平的限制,未必有规范编码的意识,而且即便经验丰富的老Java 程序员也无法做到时刻将规范牢记于心。所以对于代码规范扫描工具,一经问世就广受青睐,阿里巴巴出品的Alibaba Java Coding Guidelines(阿里巴巴Java代码规约扫描,以下简称为AJCG)插件便是其... 阅读详情

相关推荐

COLMAP性能优化实战:如何用GPU加速和并行计算让重建速度提升300%

本文详细介绍了如何通过GPU加速、并行计算和参数调优显著提升COLMAP的三维重建效率。从硬件资源分配到计算流程优化,再到大型数据集的分块处理策略,全面解析了将重建速度提升300%以上的实用技巧,特别适合处理无人机航拍和室内扫描等大规模三维重建项目。

weixin_29098391的博客 202

gRPC(一)

RPC目标:让远程服务调用更加简单、透明,其负责屏蔽底层的传输方式(TCP/UDP)、序列化方式(XML/Json)和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程。gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和HTTP/2设计。其中 C 版本支持和C#支持.定义一个服务,指定其能够被远程调用的方法。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

weixin_42128977的博客 903

ArcGIS渔网分割实战:用Create Fishnet快速生成1km×1km网格(附GDP数据分析案例)

本文详细解析了ArcGIS中Create Fishnet工具在渔网分割中的应用,从基础操作到GDP空间分析全流程。通过1km×1km网格的创建与优化,实现经济数据的空间标准化和可视化表达,解决数据融合与分析的三大核心痛点。

weixin_29250403的博客 295

开源项目推荐:主流RPC开源框架及知识科普

什么是rpc框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如这样一个函数方法: localAdd(10, 20),localAdd方法的具体实现要么是用户自己定义的,要么是php库函数中自带的,也就说在localAdd方法的代码实现在本地,它是一个本地调用...

$firecat利白的代码足迹$ 1万+

手机如何高效辅助林业调查

手机如何高效辅助林业调查 很多林业工作者将栅格类型的地形图处理后导入平板电脑,在林地使用平板电脑加载小班矢量图,辅助林业调查。但是,如果没有地形图底图,这种方法可能就有难度,而且最重要的是,大部分林地工作者没有能力配置平板电脑。大凡林业基层工作者在林地调查时,除调查记录本等部分纸质材料外,都必然携带手机和水杯,此外其他设备已经成为累赘,尤其是炎热的夏季在杂灌丛生的林地进行调查作业。因此,使用手机...

xu780820的博客 3077

YOLOv8改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作

HorNet: 利用递归门控卷积实现高效高阶空间交互GnConv(Recursive Gated Convolution,递归门控卷积)

Limiiiing的博客 324

异步发送HTTP请求

Http异步请求 AsyncHttpRequestHelperV2.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using Imps.Services.CommonV4; using System.Diagnostics; u

我的英文站点:https://iorilan.medium.com/ 3148

yolov5直接调用zed相机实现三维测距(python)

zed代码比较简洁,但是一定要把环境配置好,后续自己会把他当做普通双目标定,去对比分析效果,并完善相关功能。

积极向上的mr.d的博客 1万+

grpc框架_分布式RPC框架dubbo、motan、rpcx、gRPC、thrift简介与性能比较

DubboDubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。曾有一段时间放弃维护,不过当前已经阿里已经重启对Dubbo的维护,并发布了多个更新版本。MotanMotan是新浪微博开源的一个Java 框架。它诞生的比较晚,起于2013年,2016年5月开源。Motan 在微博平台中已经广泛应用...

weixin_39561577的博客 527

踩过20+工控视觉项目的坑后,我用C# + 海康相机 + YOLOv11实现了零依赖产线缺陷检测

触发式检测:只有光电传感器检测到零件到位,才触发相机拍照和算法检测,不是持续推理,减少工控机性能占用;全链路本地运行:从图像采集、算法推理到不良品剔除,所有逻辑全在本地工控机运行,不需要外网、不需要云端服务,哪怕产线断网也能正常运行;异常降级机制:算法推理异常时,系统自动触发产线缓停,同时声光告警,不会让不良品流到下工序,满足汽车行业IATF16949质量要求;模块化解耦:算法核心层和业务逻辑层完全分离,后续更换YOLO模型、新增缺陷类型,只需要替换模型文件,不需要修改业务逻辑;全链路可追溯。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 152

【AI黑话日日新】什么是AI Infra?

是支撑AI模型开发、训练、推理、部署与规模化运营的,是连接底层算力与上层AI应用的“数字基建”。没有高效的AI Infra,大模型训练、推理与落地都无法高效实现。

专注:太空算力、AI infra、异构调度、大模型成本工程 1105

卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架

什么是RPC? 远程服务调用 官方:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想 通俗一点:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。 市面上常见的rpc框架:dobbo,springCloud,gRPC...

Javatutouhouduan的博客 949

RT-Thread Studio 使用笔记(七)| 配合STM32CubeMX添加裸机驱动(以ADC为例)

1. 配置STM32CubeMX 2. 复制stm32xxxx_hal_msp.c文件 将 CubeMx 生成的代码 stm32f7xx_hal_msp.c 函数复制到 RT-Thread Studio 生成的工程中,并参与工程编译: 由于我们并没有使用 CubeMx 生成的工程,所以这里需要将 stm32f7xx_hal_msp.c 文件中 #include “main.h” 替换为 #i...

Mculover666的博客(嵌入式) 9626

卷起来了,手把手带你写一个中高级程序员必会的分布式RPC框架

对计算机网络稍微有一点了解的同学都知道,数据在网络中传输是二进制的:01010101010101010,类似这种,只有二进制数据才能在网络中传输。Netty支持多种序列化,比如jdk,Json,ProtoBuf 等,这里使用ProtoBuf,其序列化后码流小性能高,非常适合RPC调用。我们采用的是对每个服务名创建一个持久节点,服务注册时实际上就是在zookeeper中该持久节点下创建了一个临时节点,该临时节点存储了服务的IP、端口、序列化方式等。可以使用SPI机制加入一些自定义的类,放到指定文件夹中。

Cr1556648487的博客 158

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

rpc详解rpc框架

在互联网应用开发中,随着业务的复杂度增加,一般都会采用分布式架构。分布式架构的核心,就是利用多台普通的计算机组成一个庞大的复杂计算网络,提供高并发、高性能、高可用的系统能力支撑。在分布式架构中,原本的单体应用服务被拆分成多个独立部署的服务,分布式在计算机网络上,这些服务必然,需要通过网络进行数据通信和交互。而RPC框架,就是解决在分布式架构中,各个服务之间的网络通信问题的框架。在Java应用中,JDK 1.1版本的时候就提供了对RPC的支持框架,叫做RMI。由于RMI不能实现跨域语言的远程调用。

刘皇叔说Java的博客 7079

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

手把手带你写一个中高级程序员必会的分布式RPC框架

一.概述 什么是RPC? 远程服务调用 官方:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想 通俗一点:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。 市面上常见的rpc框架:dobbo,springCloud,gRPC... 那为什么要有 RPC,HTTP 不好么? 因为 RPC 和 HTTP 就不是一个层级的东西,所以严格意义上这两个没有可比性,也不应该来作比较。 HTTP 只是传输协议,协议只是规范了一定的.

duan18888的博客 235

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

怎么才能写一个中高级程序员必会的分布式RPC框架?教教你

一.概述 什么是RPC? 远程服务调用 官方:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想 通俗一点:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。 市面上常见的rpc框架:dobbo,springCloud,gRPC... 那为什么要有 RPC,HTTP 不好么? 因为 RPC 和 HTTP 就不是一个层级的东西,所以严格意义上这两个没有可比性,也不应该来作比较。 HTTP 只是传输协议,协议只是规范了一定的.

JAVA88866的博客 197

闪现!手把手带你写一个中高级程序员必会的分布式RPC框架不香吗?

什么是RPC?那为什么要有 RPC,HTTP 不好么?项目总体结构整体架构接下来,分别解释上述的过程服务的提供者和消费者公用一个接口,@ServiceExpose是为了暴露服务,放在生产者的某个实现类上;@ServiceReference是为了引用服务,放在消费者的需要注入的属性上。主要是加载一些rpc相关的配置类,使用SpringBoot自动装配。可以使用SPI机制加入一些自定义的类,放到指定文件夹中。这里主要就是通过反射获得对应注解的属性/类,进行服务暴露/服务引用。 这里需要关注的是什么时候进行服务暴

m0_72101998的博客 156

RPC 框架

学习记录

学习记录 3757

RPC框架原理简述:从实现一个简易RPCFramework说起

摘要:   本文阐述了RPC框架与远程调用的产生背景,介绍了RPC的基本概念和使用背景,之后手动实现了简易的RPC框架并佐以实例进行演示,以便让各位看官对RPC有一个感性、清晰和完整的认识,最后讨论了RPC框架几个较为重要问题。总之,RPC框架的精髓在于动态代理和反射,通过它们使得远程调用“本地化”,对用户透明且友好。 版权声明: 本文原创作者:书呆子Rico 作者博客地址:http:...

Rico's Blogs 1万+

RPC框架:一文带你搞懂RPC

RPC框架:一文带你搞懂RPC

日常笔记 | 干货分享 | 毕设源码 | 毕设指导 | 答辩指导 1716
上一篇: Redis实战:保证数据不丢失,RDB&AOF持久化原理解析
下一篇: 成功“拿捏”金三银四 汇总2022Java面试突击班后的面试小册
python88889
博客等级 码龄5年 15粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值