手写rpc
文章平均质量分 78
不务正业的攻城狮
这个作者很懒,什么都没留下…
展开
-
手写RPC(十) 优化
经过了前面的九节(千难万阻)我们终于拿到了想要的结果,但是这就结束了吗?作为一个合格的程序员,一定要学会对需求说不!,呃,这也没喝酒呀,怎么就吐真言了呢?作为一个合格的程序员,一定要学会对不好的代码说不!。比如我们服务端收到请求以后,反射调用方法时生成对象的时候需要依赖相关的配置(META-INF/services),每次调用都会生成一个新的对象(clz.newINSTANCE()) ,作为一个有追求的程序员。这怎么能忍!spring的作用之一不就是管理bean的生命周期么?说干就干!父pom.xm原创 2021-12-10 07:15:00 · 503 阅读 · 0 评论 -
手写RPC(九) 测试
编写测试方法:package com.info.consumer;import com.info.api.Animal;public class ConsumerApplication { public static void main(String[] args) { ClientProxy proxy = new ClientProxy(); Animal animal = proxy.clientProxy(Animal.class, "localh原创 2021-12-09 07:15:00 · 494 阅读 · 0 评论 -
关于 LengthFieldBasedFrameDecoder 不得不说的事
LengthFieldBasedFrameDecoder 是什么?LengthFieldBasedFrameDecoder对于不经常接触netty 的人来说可能有些陌生,但是对于经常使用netty的人来说,对它一定不陌生。A decoder that splits the received ByteBufs dynamically by the value of the length field in the message. It is particularly useful when you de原创 2021-12-09 07:15:00 · 2039 阅读 · 15 评论 -
手写RPC(八) provider、consumer 实现
首先,我们的provider是需要提供rpc服务的,而我们 rpc底层是需要依赖netty的,因此我们需要依赖我们已经编写好的rpc-protocol模块。rpc-provider模块 pom.xml文件添加 <dependency> <groupId>com.info</groupId> <artifactId>rpc-protocol</artifactId> <version>1.0-原创 2021-12-08 07:15:00 · 1612 阅读 · 2 评论 -
手写RPC(七) 核心模块网络协议模块编写 ---- 实现客户端
相对服务端,客户端的实现就简单了许多,因为编码器已经实现好了,实现客户端的处理器:package com.info.core;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.SimpleChannelInboundHandler;import lombok.extern.slf4j.Slf4j;@Slf4jpublic class CustomClientHandler extends SimpleC原创 2021-12-07 07:00:00 · 286 阅读 · 0 评论 -
手写RPC(六) 核心模块网络协议模块编写 ---- 实现编解码器
前面的基础已经写好了,现在我们来实现编码器。为什么需要编码器?netty只负责传输数据,至于数据长什么样它是不关注的。前面也提到了自定义协议就是把我们要传输的数据按照我们的规则进行组织、传输、解码,编码器就是对我们要发送的数据进行组织的作用。netty已经为我们做好了封装,我们只需要集成MessageToByteEncoder实现其encode方法即可,然后把这个编码器添加到我们netty处理器的pipeline(流水线)即可。package com.info.protocol.netty.core原创 2021-12-06 18:45:00 · 1001 阅读 · 0 评论 -
手写RPC(五) 核心模块网络协议模块编写 ---- 自定义协议
自定义协议?第一次听到这个名词的时候,感觉好高大上!后面学习了这块类容以后,发现也就那样,所谓的自定义协议,就是自己定义一套数据传输的规则。这么说你不一定明白我们知道只有二进制才能在网络中传输,所以 RPC 请求在发送到网络中之前,他需要把方法调用的请求参数转成二进制但,在传输过程中,RPC 并不会把请求参数的所有二进制数据整体一下子发送到对端机器上,中间可能会拆分成好几个数据包,也可能会合并其他请求的数据包(合并的前提是同一个 TCP 连接上的数据),至于怎么拆分合并,这其中的细节会涉及到系统参数原创 2021-12-05 12:13:06 · 1835 阅读 · 0 评论 -
手写RPC(四) 核心模块网络协议模块编写 ---- netty服务端
从哪下手?接上一节的内容,两个最单的模块我们已经编码完成,现在开始正餐,但是从哪下手呢?前面我们提到,数据经过网络传输需要有一个序列化 反序列化的过程,那不妨就从序列化开始,因为目前知识写一个乞丐版,暂不考虑不同序列化方式对rpc性能以及传输是否压缩数据等问题,本着能简就减的原则,直接使用jdk自带的序列化方法,余下的后期再调整。先看看pom文件,rpc-protocol pom.xml<?xml version="1.0" encoding="UTF-8"?><project原创 2021-12-04 14:55:49 · 311 阅读 · 0 评论 -
手写RPC(三) 基础结构搭建
根据之前的分析,乞丐版RPC分为api、服务调用者、服务提供者、数据传输 三个模块,网络层已经有偌大名声的netty封装好了底层实现,本着不重复造轮子的原则(实际是因为自己不会写),那就直接选择它了。原创 2021-12-03 09:21:16 · 327 阅读 · 0 评论 -
手写RPC(二) 碎碎念
什么是RPC?远程过程调用,既然是远程,那一定是跨机器的,即服务的调用者和提供者不在同一台机器(当然,你非要把他们放在一台机器也没问题),数据的交换需要经过网络传输。我们知道网络传输的是二进制数据,即 01,因此发起远程调用时,必须把数据转化为二进制(序列化)才能通过网络传输,服务提供者收到数据以后需要还原数据(反序列化)才能知道真正传输的数据,然后调用方法实现,返回结果给调用方(返回结果时同样要进过序列化反序列化的过程)。RPC框架隐藏底层网络通信的复杂性,屏蔽远程调用跟本地调用的区别,让我们更原创 2021-12-02 14:58:15 · 381 阅读 · 0 评论 -
手写RPC(一) 絮絮叨叨
提到RPC(Remote Procedure Call)大家应该都不陌生,特别是想我一样做web开发的,可以说天天和rpc打交道。常见的rpc框架主要包括Dubbo、SpringCloud、Thrift等。既然有了那么多已经成熟的开源RPC框架,我为什么还要自己写呢,是已有的RPC框架不能满足我的业务需求?是因为我想写一款完美的RPC框架一战成名?NO! NO! 都不是,你给自己加戏太多了!我只是想以此来学习,督促自己学习,同时印证自己所学。原创 2021-11-30 17:51:53 · 471 阅读 · 0 评论