Netty源码-业务流程之请求处理

9 月 25 日
阅读 2 分钟
145
1、业务处理流程1.1 主从模型1.2 Debug跟踪我们用Netty源码包下面的example来Debug观察一下,包路径io.netty.example.echoNioEventLoop#processSelectedKeysOptimized()方式循环处理不同的事件。如下图。NioEventLoop#processSelectedKey方法处理一个事件,在该方法中的unsafe.read()这一行打断点(如1.2图), 这是NioE...

FutureTask源码解析

9 月 23 日
阅读 7 分钟
136
Future是一个接口,一般用FutureTask实现类去接收Callable任务返回的结果。FutureTask是同步非阻塞执行的任务,他不会主动通知你结果。

Netty源码-业务流程之构建连接

9 月 21 日
阅读 2 分钟
140
所以我们需要启动服务端,然后再启动客户端发起连接,我们在run()方法打个断点看一下。从run()方法进入processSelectedKeys方法,如下图:processSelectedKeys有一个优化,在selectedKeys为空的时候,调用Optimized方法,这个方法做了优化,性能更好,我们进入Optimized方法

Redis高级数据结构详解

9 月 19 日
阅读 7 分钟
117
Redis作为最为人熟知的key-value数据库,他的基本数据结构包括String、list、hash、set、sorted set等等,大家都已经耳熟能详了。但是Redis还有一些不是很常用的高级数据结构,如Bitmap、HyperLogLog、GEO,特殊场景下这些数据结构也能排上大用场。下面我们来看一下这些数据结构的底层原理、使用场景,以及如何使用。
封面图

TiDB介绍及原理

9 月 17 日
阅读 8 分钟
95
文字、字母、数字、图形、视频、音频、地理位置等。基于不同的数据种类,需要去选择专业的软件或系统去存储、管理、应用这些数据。这种软件,我们通常称之为:DBMS,数据库管理系统。数据库管理系统的种类: RDBMS、NoSQL、NewSQL、HTAP。

Netty源码-业务流程之写数据

9 月 16 日
阅读 3 分钟
131
Netty基本介绍,参考 Netty与网络编程1、源码分析,EchoServerHandler之Write流程1.1 write流程入口通常我们通过ChannelRead收到消息后,需要给一个响应,通过ctx.write()将响应返回客户端。在自定义handler的channelRead方法打一个断点,客户端发起请求,并进入ctx.write1.2 AbstractChannelHandlerContext#write方法我...

Netty源码-Server启动流程

9 月 14 日
阅读 4 分钟
82
Netty源码包的mnetty-example模块随便打开一个实现样例,比如包io.netty.example.echo下的EchoServer,我们从这里的源码开始看

Netty源码-业务流程之读事件

9 月 13 日
阅读 2 分钟
140
现在unsafe类不一样,NioSocketChannel$NioSocketChannelUnsafe类,进入Read方法,我们进入了AbstarctNioByteChannel <---继承自---NioSocketChannel

分布式锁实现

9 月 11 日
阅读 3 分钟
204
1、依赖过期时间事物提交前,必须先判断锁是否过期,然而判断过期和提交事物是两个操作,如果判断没有过期,在提交是之前发生GC,GC后锁过期,再执行提交操作会出问题,如图:

Netty源码-责任链模式运用

9 月 11 日
阅读 5 分钟
198
Netty基本介绍,参考juejin.cn/post/740884…1、Netty的责任链模式1.1 责任链模式实现样例基于上图,写一个责任链模式的案例如下:从下面的例子我们可以知道,责任链模式包含下面几个重要的部分:HandlerChainContext:hander上下文,也就是责任链中的节点,持有一个handler,并有指向下一个节点的指针Handler: 责任处理...

Netty源码解析-请求处理与多路复用

9 月 9 日
阅读 3 分钟
64
如图,NioEventLoop是worker threads中的thread,也就是处理请求的线程,属于NioEventLoopGroup,那么多个线程每次选择哪个线程来处理请求呢?

Netty源码解析-响应式实现(Reactor模式)

9 月 5 日
阅读 2 分钟
247
实现这种模式需要定义两个EventLoopGroup,bossGroup就是mainReactor, workerGroup就是subReactor,

Netty源码解析-锁机制

9 月 4 日
阅读 5 分钟
115
为了提高性能,Netty对锁也做了大量优化1、锁优化技术Netty大量使用了锁优化技术:1.1 减小锁粒度1.2 减少锁对象的空间占用1.3 提高锁的性能1.4 根据不同业务场景选择合适锁1.5 能不用锁则不用锁1.1 减小锁粒度在Netty4.1.15.Final版本中ServerBootstrap.init方法中有两个地方对对象加锁,而不是在方法上加一个大锁,缩...

数据库中间件Mycat

9 月 4 日
阅读 6 分钟
146
Mycat是基于Java编写的实现了MySQL协议的数据库中间件,可以将它看成一个数据库代理,可以直接用MySQL客户端工具访问。其核心功能是分库分表和读写分离。

Netty源码解析-零拷贝

9 月 2 日
阅读 4 分钟
143
sendFile(Kafka也是用该技术优化性能):发送文件描述符,如果硬件支持,图二的文件缓冲区和Socket缓冲区可以共享,只需要两次DMA拷贝就可以

Netty源码解析-底层原理及IO模式

9 月 1 日
阅读 3 分钟
297
1、Netty源码编译我们看一下版本4.1.40.Final-SNAPSHOT源码包,可以把源码pull到本地,用IDEA打开。github地址:[链接]包含的模块如下图:2、Netty 源码核心包2.1 Netty源码核心包主要分成下面几块:1、工具类下图红色的模块,如buffer、common、resolver2、底层协议(transport)下图黄色的模块,TCP的不同实现(linux(epo...

Netty与网络编程

8 月 31 日
阅读 9 分钟
278
要了解Netty,必须先了解网络编程1 网络编程1.1 网络IO模型1.1.1 网络三种I/O模型分类:BIO:(同步 阻塞)jdk1.4以前 java.io包NIO:(同步 非阻塞)jdk1.4 java.nio包AIO:(异步 非阻塞)jdk1.7 java.nio包1.1.2 BIO、NIO、AIO处理模式1)BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理,...

Netty对处理粘包和半包的支持

8 月 31 日
阅读 8 分钟
153
1.1 什么是粘包拆包例如:发送 ABC, DEF两个报文收到ABCDEF一个报文,发生了粘包收到AB,C,DEF三个报文,ABC发生了拆包收到AB,CD,EF三个报文,即发生了拆包又发生了粘包1.2 看一个粘包半包样例客户端每次把消息“ABC,DEF,GHI,JKL,MNO\n" 发生一百次给服务端服务端将每次收到的消息输出,并记录收到的次数,然后将消息...

MySQL 事务详解

8 月 24 日
阅读 3 分钟
160
假设一个网购付款的操作,用户付款后要涉及到订单状态更新、扣库存以及其他一系列动作,这就是一个事务,如果一切正常那就相安无事,一旦中间有某个环节异常,那整个事务就要回滚,总不能更新了订单状态但是不扣库存吧,这问题就大了。

CompletableFuture-详解、使用及源码解析

8 月 24 日
阅读 10 分钟
524
问题2:如果不通过get挂起线程,通过while循环,不停的判断任务的状态是否结束,结束后,再拿结果。如果任务长时间没有执行完毕,CPU会一直调度查看任务状态的方法,浪费CPU资源。
封面图

Netty源码解析-零拷贝

8 月 19 日
阅读 4 分钟
265
Netty为了加快文件传输速度,采用了零拷贝技术。sendFile(Kafka也是用该技术优化性能):发送文件描述符,如果硬件支持,图二的文件缓冲区和Socket缓冲区可以共享,只需要两次DMA拷贝就可以
封面图

Netty源码解析-请求处理与多路复用

8 月 18 日
阅读 3 分钟
171
该方法是EventLoop注册Channel的方法,进入next()方法,就在下图最上面的一个方法。此方法负责选择一个NioEventLoop,进入super.next()方法。
封面图

Mysql分库分表

8 月 13 日
阅读 4 分钟
239
Mysql作为做流行的开源数据库,在各大互联网公司被广泛使用。通常我们用一个库就可以满足需求,但是随着业务的增长,数据量和并发量迅速膨胀。Mysql单表数据量到百万以上的时候,查询效率就会受到影响,另外Mysql单库能承受的并发也有限。这个时候我们需要做分库分表,来提高数据库的性能和扩展性
封面图

Raft协议原理-分布式一致性

8 月 9 日
阅读 10 分钟
197
提到Raft不得不提到Paxos,Paxos 协议是由 Leslie Lamport在1989年提出的一种分布式一致性协议,它是分布式系统领域中的经典协议之一。Leslie Lamport 是分布式计算领域的著名科学家,曾获得图灵奖等多项荣誉。Paxos 协议被称为经典协议,它提供了一种在异步网络模型下实现分布式系统状态机复制的解决方案,而这种解决方...

Redis主从架构原理

8 月 5 日
阅读 3 分钟
182
我们使用redis的时候为了预防单点故障,通常要做高可用设计,redis主从架构就是一种防止redis主节点宕机启用从节点的高可用设计方案。下面我们看一下redis主从架构的设计原理。
封面图

记一次mapstruct对象映射问题排查(Maven optional)

7 月 26 日
阅读 2 分钟
197
碰到一个奇葩的问题,在一个模块order-domain里面使用了mapstruct,创建一个Mapper接口,但是生成的实现类没有字段映射,如下图:

Java锁优化之批量重偏向

7 月 13 日
阅读 4 分钟
364
我们知道,当我们使用synchronized关键字的时候,一个对象a只被一个对象访问的时候,对对象加的锁偏向锁,如果之后出现第二个线程访问a的时候(这里只考虑线程交替执行的情况,不存在竞争),不管线程1是已死亡还是运行状态,此时锁都会升级为轻量锁,并且锁升级过程不可逆。

关于RedLock算法大佬的争论

7 月 13 日
阅读 5 分钟
275
RedLock分布式锁很多人用过,但是大家是否知道,这个算法出来的时候关于他的正确性发生过一些争论,首先是Martin Kleppmann发表了一篇质疑文章,然后antirez做了回应,我们看一下大佬的争论。让我们直击大佬对分布式锁算法及分布式系统设计的探讨和思考

volatile的底层实现

7 月 7 日
阅读 4 分钟
224
java内存模型定义的java线程使用内存的规则,主要目标是定义程序变量的访问规则,即虚拟机中变量存储到内存以及从内存访问的细节。这里讲的变量是指线程共享的变量(如实例字段,静态字段,对象),不包含线程私有变量(如局部变量,方法参数)。

ConcurrentHashMap源码深度分析

2021-08-12
阅读 13 分钟
1.2k
Unsafe类是用来做cas操作的,都是native方法,代码由C++实现,下面的变量表示对应变量的偏移例如:compareAndSwapInt(Object o, long offset, int expected, int x); 表示对象o偏移位置offset的变量如果和期望值expected相等,把变量值设置为x