手把手教你基于Netty实现一个基础的RPC框架(通俗易懂)
图怪兽_d569f1e0224db8b7e6726d1a5b17e7ea_75242.png
阅读这篇文章之前,建议先阅读和这篇文章关联的内容。
[1]详细剖析分布式微服务架构下网络通信的底层实现原理(图解)
[2][年薪60W的技巧]工作了5年,你真的理解Netty以及为什么要用吗?(深度干货)
[3]深度解析Netty中的核心组件(图解+实例)
[4]BAT面试必问细节:关于Netty中的ByteBuf详解
[5]通过大量实战案例分解Netty中是如何解决拆包黏包问题的?
[6]基于Netty实现自定义消息通信协议(协议设计及解析应用实战)
[7]全网最详细最齐全的序列化技术及深度解析与应用实战
在前面的内容中,我们已经由浅入深的理解了Netty的基础知识和实现原理,相信大家已经对Netty有了一个较为全面的理解。那么接下来,我们通过一个手写RPC通信的实战案例来带大家了解Netty的实际应用。
为什么要选择RPC来作为实战呢?因为Netty本身就是解决通信问题,而在实际应用中,RPC协议框架是我们接触得最多的一种,所以这个实战能让大家了解到Netty实际应用之外,还能理解R ...
基于Netty实现自定义消息通信协议(协议设计及解析应用实战)
图怪兽_ed0940d740868a66a219f109d43d079f_41663.png
所谓的协议,是由语法、语义、时序这三个要素组成的一种规范,通信双方按照该协议规范来实现网络数据传输,这样通信双方才能实现数据正常通信和解析。
由于不同的中间件在功能方面有一定差异,所以其实应该是没有一种标准化协议来满足不同差异化需求,因此很多中间件都会定义自己的通信协议,另外通信协议可以解决粘包和拆包问题。
在本篇文章中,我们来实现一个自定义消息协议。
自定义协议的要素自定义协议,那这个协议必须要有组成的元素,
魔数: 用来判断数据包的有效性
版本号: 可以支持协议升级
序列化算法: 消息正文采用什么样的序列化和反序列化方式,比如json、protobuf、hessian等
指令类型:也就是当前发送的是一个什么类型的消息,像zookeeper中,它传递了一个Type
请求序号: 基于双工协议,提供异步能力,也就是收到的异步消息需要找到前面的通信请求进行响应处理
消息长度
消息正文
协议定义sessionId | reqType | Content-Length | Content |
...
通过大量实战案例分解Netty中是如何解决拆包黏包问题的?
图怪兽_d3c9b823ca0faaff4827def1bc596a37_83299.png
TCP传输协议是基于数据流传输的,而基于流化的数据是没有界限的,当客户端向服务端发送数据时,可能会把一个完整的数据报文拆分成多个小报文进行发送,也可能将多个报文合并成一个大报文进行发送。
在这样的情况下,有可能会出现图3-1所示的情况。
服务端恰巧读到了两个完整的数据包 A 和 B,没有出现拆包/粘包问题;
服务端接收到 A 和 B 粘在一起的数据包,服务端需要解析出 A 和 B;
服务端收到完整的 A 和 B 的一部分数据包 B-1,服务端需要解析出完整的 A,并等待读取完整的 B 数据包;
服务端接收到 A 的一部分数据包 A-1,此时需要等待接收到完整的 A 数据包;
数据包 A 较大,服务端需要多次才可以接收完数据包 A。
图3-1 粘包和拆包问题
由于存在拆包/粘包问题,接收方很难界定数据包的边界在哪里,所以可能会读取到不完整的数据导致数据解析出现问题。
拆包粘包问题实战下面演示一个拆包粘包问题
PackageNettyServerpublic class PackageN ...
BAT面试必问细节:关于Netty中的ByteBuf详解
图怪兽_7cbb7e9648c3202abfac1a143d532a65_39252.png
在Netty中,还有另外一个比较常见的对象ByteBuf,它其实等同于Java Nio中的ByteBuffer,但是ByteBuf对Nio中的ByteBuffer的功能做了很作增强,下面我们来简单了解一下ByteBuf。
下面这段代码演示了ByteBuf的创建以及内容的打印,这里显示出了和普通ByteBuffer最大的区别之一,就是ByteBuf可以自动扩容,默认长度是256,如果内容长度超过阈值时,会自动触发扩容
public class ByteBufExample { public static void main(String[] args) { ByteBuf buf= ByteBufAllocator.DEFAULT.buffer();//可自动扩容 log(buf); StringBuilder sb=new StringBuilder(); for (int i = 0; i < 32; ...
45岁程序员,精通各种技术体系,却连个面试机会都没有…
最近,在中国政府网,看到这样一个留言,引发了程序员这个圈子不少的轰动。
原文地址:http://www.gov.cn/hudong/2021-11/01/content_5648121.htm
“Mary:我是一名计算机专业出身的软件开发人员,今年45岁,精通java的各种技术体系,包括微服务、大数据等技术,并能应用到实际工作中,帮助所在公司提升、改造所使用的技术框架,业余我还考取了PMP项目管理证书、系统架构师证书,成为所在公司的系统架构师、核心技术骨干。我对计算机理论的理解也随着实践的增多越来越深刻,我感觉我的职业生涯进入一生中最好的时刻。在我儿子读初二上学期时,我辞职回家陪伴儿子。半年后,当我再回来寻找工作机会的时候,却发现连个面试机会都很难得到,更别提发挥自己的专业特长了。现在国家鼓励延迟退休,我觉得,40岁以上的有经验的专业技术人员此刻正是自身职业发展的黄金时期,他们找工作时不能被年龄限制了。”
当一个45岁的中年男人,需要被生活逼到何种境地,才能鼓起勇气公开向总理求助说出自己的无奈。
这一刻,中年程序员的不易,体现的淋漓尽致
当你被时代抛弃时,连招呼也不会打随着E ...
面试题系列:超过1W字深度剖析JVM常量池(全网最详细最有深度)
面试题:String a = “ab”; String b = “a” + “b”; a == b 是否相等
面试考察点考察目的: 考察对JVM基础知识的理解,涉及到常量池、JVM运行时数据区等。
考察范围: 工作2到5年。
背景知识要回答这个问题,需要搞明白两个最基本的问题
String a=“ab”,在JVM中发生了什么?
String b=“a”+“b”,底层是如何实现?
JVM的运行时数据首先,我们一起来复习一下JVM的运行时数据区。
为了让大家有一个全局的视角,我从类加载,到JVM运行时数据区的整体结构画出来,如下图所示。
对于每一个区域的作用,在我之前的面试系列文章中有详细说明,这里就不做复述了。
在上图中,我们需要重点关注几个类容:
字符串常量池
封装类常量池
运行时常量池
JIT编译器
这些内容都和本次面试题有非常大的关联关系,这里对于常量池部分的内容,先保留一个疑问,先跟随我来学习一下JVM中的常量池。
JVM中都有哪些常量池大家经常会听到各种常量池,但是又不知道这些常量池到底存储在哪里,因此会有很多的疑问:JVM中到底有哪些常量池?
JVM中的常量 ...
面试题系列:用了这么多年的 Java 泛型,我竟然只知道它的皮毛
面试题:说说你对泛型的理解?
面试考察点考察目的:了解求职者对于Java基础知识的掌握程度。
考察范围:工作1-3年的Java程序员。
背景知识Java中的泛型,是JDK5引入的一个新特性。
它主要提供的是编译时期类型的安全检测机制。这个机制允许程序在编译时检测到非法的类型,从而进行错误提示。
这样做的好处,一方面是告诉开发者当前方法接收或返回的参数类型,另一方面是避免程序运行时的类型转换错误。
泛型的设计推演举一个比较简单的例子,首先我们来看一下ArrayList这个集合,部分代码定义如下。
public class ArrayList{ transient Object[] elementData; // non-private to simplify nested class access}
在ArrayList中,存储元素所使用的结构是一个Object[]对象数组。意味着可以存储任何类型的数据。
当我们使用这个ArrayList来做下面这个操作时。
public class ArrayExample { public sta ...
工作5年的程序员感慨:final、finally、finalize面试这么卷?
面试题:final、finally、finalize的区别
面试考察点考察目的: 了解求职者对Java基础的了解。
考察范围: 工作1-3年的Java程序员。
背景知识final/finally在工作中几乎无时无刻不再使用,因此即便是没有系统化的梳理这个问题,也能回答出一些内容。
但是finalize就接触得非常少,接下来我们对这几个关键字逐一进行分析。
final关键字final关键字代表着不可变性。
在面试题系列:工作5年,第一次这么清醒的理解final关键字?.这篇文章中, 我详细的进行了分析,建议大家去看这篇文章,这里就不重复分析了。
finally关键字finally关键字用在try语句块后面,它的常用形式是
try{ }catch(){ }finally{ }
以及下面这种形式。
try{ }finally{ }
finally语句块中的代码,无论try或者catch代码块中是否有异常,finally语句块中的代码一定会被执行,所以它一般用于清理工作、关 ...
美团面试官问:写一个你认为最好的单例模式?于是我写了7个
面试题:写一个你认为最好的单例模式
面试考察点考察目的: 单例模式可以考察非常多的基础知识,因此对于这种问题,很多面试官都会问。 小伙伴要注意,在面试过程中,但凡能够从多个维度考察求职者能力的题目,一定不会被抛弃,特别是比较泛的问题,比如: ”请你说说对xxx的理解“之类。
考察范围: 工作1到5年经验,随着经验的提升,对于该问题的考察深度越深。
背景知识单例模式,是一种软件设计模式,属于创建型模式的一种。
它的特性是:保证一个类只有唯一的一个实例,并提供一个全局的访问点。
基于这个特性可以知道,单例模式的好处是,可以避免对象的频繁创建对于内存的消耗,因为它限制了实例的创建,总的来说,它有以下好处:
控制资源的使用,通过线程同步来控制资源的并发访问;
控制实例产生的数量,达到节约资源的目的。
作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
在实际应用中,单例模式使用最多的就是在Spring的IOC容器中,对于Bean的管理,默认都是单例。一个bean只会创建一个对象,存在内置map中,之后无论获取多少次该be ...
面试题系列:工作5年,第一次这么清醒的理解final关键字?
面试题:用过final关键字吗?它有什么作用
面试考察点考察目的: 了解面试者对Java基础知识的理解
考察人群: 工作1-5年,工作年限越高,对于基础知识理解的深度就越高。
背景知识final关键字大家都不陌生,但是要达到深度理解,还是欠缺了一些。我们从三个方面去理解final关键字。
final关键字的基本用法
深度理解final关键字
final关键字的内存屏障语义
final的基本用法final关键字,在Java中可以修饰类、方法、变量。
被final修饰的类,表示这个类不可被继承,final类中的成员变量可以根据需要设为final,并且final修饰的类中的所有成员方法都被隐式指定为final方法.
在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。
public final class TClass { public final String test(){ return "true"; }}pu ...