自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 资源 (4)
  • 收藏
  • 关注

原创 源码解读五:流量整型算法实现分析

源码解读五:流量整型算法实现分析文章目录源码解读五:流量整型算法实现分析算法简述代码分析DefaultControllerRateLimiterControllerWarmUpController算法分析代码分析WarmUpRateLimiterController算法简述上文我们分析了 Sentinel 中的滑动窗口数据统计算法。在了解了滑动窗口机制后,这篇文章我们来重点分析下 FlowSlot 的代码实现。FlowSlot 是 Sentinel 内置的 8 个ProcessorSlot 中最重要最

2021-02-01 14:08:56 171

原创 源码解读四:滑动窗口数据统计

源码解读四:滑动窗口数据统计文章目录源码解读四:滑动窗口数据统计概述思路代码实现LeapArrayBucketLeapArraySlowRequestLeapArraySimpleErrorCounterLeapArrayUnaryLeapArrayFutureBucketLeapArrayOccupiableBucketLeapArray概述本篇章我们分析在 Sentinel 中的核心算法:滑动窗口数据统计算法。这是一个高性能的,应对写大于读场景的统计算法。流控的前提首先就是统计当前的访问数据,判断

2021-02-01 14:08:33 434

原创 源码解读三:ProcessSlot具体实现

源码解读三:ProcessSlot具体实现文章目录源码解读三:ProcessSlot具体实现概述代码分析NodeSelectorSlotClusterBuilderSlotLogSlotStatisticSlotAuthoritySlotSystemSlotFlowSlotDegradeSlotExceptionCircuitBreakerResponseTimeCircuitBreaker概述在前面的文章中我们知道,通过入口类 Sph 的 entry 方法,首先是获得(或创建)本次请求的 Conte

2021-02-01 13:53:55 168

原创 源码解读二:入口类和重点概念

源码解读二:入口类和重点概念文章目录源码解读二:入口类和重点概念概述入口类 SphResourceWrapperContextNodeRule授权规则,AuthorityRule降级规则,DegradeRule系统规则,SystemRule流量规则,FlowRule概述这篇文章先来分析下 Sentinel 的入口类 Sph 和一些基础概念的类:ResourceWrapper 、Context 、Node 、Rule。入口类 SphSentinel 是哨兵的意思,Sentinel 框架是使用流控方式

2021-02-01 13:53:17 131

原创 源码解读一 :ProcessorSlot责任链

源码解读一 :ProcessorSlot责任链文章目录源码解读一 :ProcessorSlot责任链概述代码实现初始化 ProcessorSlotChain获取 SlotChainBuilderDefaultSlotChainBuilder 构建 ProcessorSlotChain 实例DefaultProcessorSlotChain 内部逻辑使用 ProcessorSlotChain总结概述在总体设计章节中,我们知道 Sentinel 是通过不同的 ProcessorSlot 实现不同的功能,并

2021-02-01 13:52:47 134

原创 Sentinel总体设计

总体设计文章目录总体设计背景重点概念资源条目节点上下文设计思路背景每个系统都有自己的负载能力上限,当访问超过这个能力上限的时候,系统就会变得不稳定,甚至无法正常响应。因此,无论是对外请求还是对内的请求,都存在着流量控制的需要。防止自身被外部流量冲垮,防止自身外部请求过多压垮外部系统。Sentinel 就是这样的一个负责流量控制的组件。流量控制是一个大的概念,从流量控制的角度出发,会有不同的场景,包括但不限于限流,流量整形、熔断降级等。重点概念在介绍 Sentinel 的实现思路前,先需要了解 S

2021-02-01 13:51:53 190

原创 RocketMQ源码随笔-注册服务器

RocketMQ源码随笔-注册服务器文章目录RocketMQ源码随笔-注册服务器NamesrvStartupcreateNamesrvControllerstartNamesrvController构造方法initializestartKVConfigManagerDefaultRequestProcessorPUT_KV_CONFIGGET_KV_CONFIGDELETE_KV_CONFIGQUERY_DATA_VERSIONREGISTER_BROKERregisterBrokerWithFilter

2021-01-25 16:51:29 212

原创 RocketMq源码随笔-过期文件的删除

RocketMq源码随笔-过期文件的删除引言RocketMQ中文件的存储是分为3个不同的部分:CommitLog,提交日志。所有主题、队列的消息数据都是直接写入这一文件。ConsumeQueue,消费队列。按照主题和队列的方式进行区分,消费队列中写入定长20字节的消费条目信息,消费条目中指向了该信息对应在提交日志中的偏移量。IndexFile,索引文件。索引文件中写入定长20字节的索引信息,索引信息中指向了消息在提交日志中的偏移量。RocketMQ不会无限制的将消息存储下去,而是采取一定的策

2021-01-18 13:52:02 160

原创 RocketMq源码随笔-Broker的初始化

RocketMq源码随笔-Broker的初始化文章目录RocketMq源码随笔-Broker的初始化引言BrokerStartupBrokerController构造方法initializeDefaultMessageStore初始化\构造方法loadloadConsumeQueuerecoverrecoverConsumeQueuerecoverTopicQueueTabletruncateDirtyLogicFilesCommitLogloadrecoverNormallyrecoverAbnorma

2021-01-13 22:43:50 164

原创 RocketMq源码随笔-刷盘

RocketMq源码随笔-刷盘文章目录RocketMq源码随笔-刷盘引言GroupCommitServiceputRequestdoCommitCommitRealTimeServiceFlushRealTimeService总结引言在rocketmq中有两种刷盘模式:同步刷盘和异步刷盘。从类图上来看,有三个不同的实现思路。那下面逐一来看过。适用情况如下同步刷盘使用GroupCommitService。异步刷盘且未开启TransientStorePool,使用FlushRealTimeSe

2021-01-10 20:34:38 167

原创 RocketMq-索引文件与消费队列的创建

索引文件与消费队列的创建文章目录索引文件与消费队列的创建引言ReputMessageServicedoPut索引文件的创建IndexServiceloadbuildIndexputKeyretryGetAndCreateIndexFilegetAndCreateLastIndexFileflushIndexFile格式loadputKeyselectPhyOffsetflush消费队列的创建DefaultMessageStoreputMessagePositionInfofindConsumeQueueC

2021-01-10 19:48:23 161

原创 RocketMq 高可用实现逻辑

RocketMq 高可用实现逻辑文章目录RocketMq 高可用实现逻辑HAServiceputRequestnotifyTransferSomeGroupTransferServiceAcceptSocketServicerunHaConnectionReadSocketServiceprocessReadEventWriteSocketServiceHaClientconnectMasterisTimeToReportOffsetreportSlaveMaxOffsetcloseMasterproce

2021-01-04 18:24:16 184

原创 Netty 专栏导读

为什么学Netty大家好,我是林斌,一名从业8年的技术老兵。Netty 自 2008 年诞生至今,也走过了 10 个年头。一款框架产品能够在 10 年的生命历程中不断演进,不断进化,没有随着时间而销声匿迹,反而被越来越多的人熟知、使用,自有其魅力所在。大体而言,Netty 已经确定了其在 Java 网络领域开发的霸主地位,正如同在企业开发中 Spring 的地位一般。开发网络应用程序是一个复杂...

2020-09-22 11:54:14 201

原创 Unix 的五种 IO 模型解析

前言操作系统为了保护自身的稳定,会将内存空间划分为内核空间和用户空间。当我们需要通过 TCP 将数据发送出去时,在应用程序中实际上执行了将数据从用户空间拷贝至内核空间,再由内核进行实际的发送动作;而从 TCP 读取数据时则反过来,等待内核将数据准备好,再从内核空间拷贝至用户空间,应用数据才能处理。针对在两个阶段上不同的操作,Unix 定义了 5 种 IO 模型,分别是:阻塞式 IO非阻塞...

2020-09-22 11:54:13 253

原创 Java的服务端编程进化史:从 BIO 到 NIO,最后走向 AIO

前言Java 语言诞生之初就提供了Socket套接字相关 API,用于支撑网络编程需求。早期的Socket接口是同步阻塞式IO,性能并不是很高,在服务端编程这块一直处于劣势。直到 JDK1.4 发布,伴随而来的是新的 NIO 包以及其提供了 IO 复用模型下的API,极大提高了网络IO效率,很多服务器开始采用这种模型,处理能力也有了极大的提升。随着 JDK1.7 的发布,JDK 也提供了对异步I...

2020-09-22 11:54:11 507

原创 深入剖析 Java NIO 组件

前言在前文中提到,Java 在 1.4 版本的时候提供了 NIO,实现了对 IO 的支持。在刚发布的时候,为了区别于原先的 IO 包,NIO的含义被定义New I/O。但是这么多年过去了,新事务也早就稀松平常了,再叫New I/O会觉得名不副实。现在大家一般都将NIO定义为NonBlocking I/O。NIO 相比于 BIO 而言,在概念上就复杂了许多,并且也引入了很多新的组件,需要熟悉使用...

2020-09-22 11:54:10 106

原创 实战:使用 Java NIO 编写服务端应用

需求分析本文将实战如何使用 Java NIO 编写一个趋向于实际的 echo 应用。首先是明确这个 echo 服务器的需求,总结来说有以下几条:服务器原样返回客户端发送的信息客户端发送的信息以'\r'作为一个消息的结尾,一个消息的最大长度不超过 128客户端可能会一次发送多个消息,服务端需要按照收到的消息的顺序依次回复,不能乱序客户端可以在任意时刻关闭通道服务端不能主动关闭通道代...

2020-09-22 11:54:08 168

原创 实战:编写你的第一个Netty应用

前言从《实战:使用 Java NIO 编写服务端应用》可以看到,使用 Java 原生的 NIO 接口编写一个服务端应用程序相对比较复杂,并且需要考虑许多的细节问题。而上文举的例子本身无论是在协议制定还是功能需求上都是比较简单的。而且这个例子还是一个功能定制化的应用。如果需要完成具备可扩展性的 IO 框架性质的程序,方便应用在其上进行二次开发,无疑更加困难。线程模型的设计,供二次开发的应用程序接口...

2020-09-22 11:54:07 121

原创 深入剖析 Netty 的核心组件

前言从上一个章节的学习,对使用 Netty 进行网络应用开发已经有了一个初步的感性的印象。但是仅仅依靠这种简单的介绍就上手 Netty 还是过于勉强了。所以本文会剖析 Netty 中的重点组件。通过对这些组件的理解和掌握,从底层熟悉和理解 Netty。核心组件分析ByteBuf在 JDK 的 NIO 中,我们学习到了其原生的数据承载组件ByteBuffer。ByteBuffer的体验着实不...

2020-09-22 11:54:05 89

原创 异步化的 Netty:隐藏在其后的线程模型

异步化的 NettyNetty 在官网首页有这么一句话介绍自己 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.异步的特性...

2020-09-22 11:54:04 125

原创 事件驱动的 Netty

前言Netty 官网对自己的描述是一个异步的事件驱动的网络框架。异步如何表现和异步背后的线程模型在上文已经分析过了。事件驱动是 Netty 中另外一个非常重要的概念。Netty 框架中描述的事件是一种抽象概念,其将框架运行过程中会发生的许多“动作”以事件的概念定义。并且在事件发生时,触发对应的回调方法。对于开发者而言,只需要实现自己感兴趣的事件的回调方法。因此,对于事件的回调方法的实现,构成了...

2020-09-22 11:54:02 132

原创 何为 TCP 拆包粘包问题,Netty又是如何帮我们解决它

粘包和拆包现象在网络通信中,客户端向服务端发送两个数据包,C1 和 C2 如下图:站在客户端的角度,它是发送了两个不同的数据包。但是从服务端接受数据的角度来看就不一定了。可能出现的情况有三种。第一种也是最符合直觉的,服务端按照客户端发送的顺序收到了数据包:D1 和 D2。第二种,服务端第一次读取数据时读到了 D1 的一部分,再次读取时读取到了 D1 的剩余部分,第三次读取,读取完毕了D2...

2020-09-22 11:54:00 128

原创 使用Netty编写一个多人聊天程序(中)-服务端实现

前言前文中我们进行了需求澄清,协议制订,服务端设计,本文将在这些的基础上实现完整的服务端功能。编解码器实现消息的收发基础是编解码器。上文对协议的制订,最外围的结构是报文头加报文体的形式。针对这个结构,实现报文分割,我们可以直接接触Netty提供的内嵌支持LengthFieldBasedFrameDecoder进行报文体的长度确定和分割。报文体中是具体的消息,我们需要根据消息的不同类型来进行...

2020-09-22 11:53:58 100

原创 使用Netty编写一个多人聊天程序(上)-总体设计

前言在入门篇中我们介绍了Netty的主要组件,线程模型,以及基本的使用方式;掌握了这些内容,就足以在实际的项目开发中使用Netty来进行网络程序的构建。从本章开始,我们将以实际中开发的项目作为例子,进行Netty实战讲解。本篇文章我们将实现一个网络多人聊天程序。需求澄清对于该网络多人聊天项目,需要实现的功能有:支持客户端以用户名发送注册申请,服务端响应是否成功,成功的注册名需要全局唯一...

2020-09-22 11:53:56 143

原创 使用 Netty 编写一个多人聊天程序(下)- 客户端实现和验收

使用Netty编写一个多人聊天程序(下)-客户端实现和验收引言命令编码响应解码注册和登录示例单聊消息示例群聊消息示例心跳消息示例思考与总结引言上篇文章中,详细阐述了服务端核心功能的设计思路和实现逻辑。与服务端相比起来,客户端的实现就比较简单了。Netty 为开发者尽最大可能保证了编程模型的一致性。服务端和客户端的区别仅仅只是在于Channel具体实现类和BootStrap引...

2020-09-22 11:53:55 103

原创 使用 Netty 完成一个轻量级 HTTP 文件下载器

引言在网络开发中,不可避免的会与许多标准通讯协议打交道。在这方面, Netty 为开发者提供了很大的便利。 Netty 自身除了提供编解码机制外,还提供了大量现成协议的编解码支持,这部分支持的内容可以在包netty-codec中找到。当然也包括我们今天要讲述,对Http的支持。有了对 HTTP 编解码协议的支持,我们完全可以使用 Netty 来开发一款 Web 容器或者符合需求的 HTTP 容...

2020-09-22 11:53:53 680

原创 源码解析:Netty 如何扩展实现Future 和 Promise 接口

前言Netty 的大部分用户接口都是异步化的,返回的都是一个 ChannelFuture 对象。该接口是 Netty 对 JDK 中的 Future 接口扩展而来。和开发者相关比较大的变化是允许添加一个 GenericFutureListener 监听器,以便在异步任务完成时触发回调任务。接口的定义比较简单,不过如何保证并发的安全性则是一个值得思考的问题。假定在任务完成的瞬间,addListe...

2020-09-22 11:53:51 150

原创 Netty 线程模型详解:从演进的角度看源码设计

前言从这篇文章开始,开始进入源码分析阶段。在之前的入门篇和实战篇中,通过代码的编写和各种特性的讲解,让我们对 Netty 有了充分的感性认知。那么接下来,通过对代码的详细走读,来细细查看哪些在感性直觉背后的实现原理。Netty 的线程模型Netty 的线程模型其实没有什么太特别的地方,属于比较自然而然的设计。首先,基于 Selector 可以同时监控多个链接的特性,很容易想到将所有通道都注...

2020-09-22 11:53:50 127

原创 源码解析:从 pipeline 的源码看责任链模式设计

前言前文中,多次有提到 pipeline 这个组件。该组件也是 Netty 中比较核心的一个设计。任何一个通道对象在初始化的时候都会初始化一个 pipeline 对象。pipeline 负责存储添加到通道上的 ChannelHandler 对象。其本身是一个责任链的设计,前文也多次提到了。那下面就来逐步对其进行代码分析。类层次图首先来看下类层次图从 ChannelPipeline 继承的...

2020-09-22 11:53:48 462

原创 源码解析:ServerBootStrap 启动的背后,Netty 到底完成了哪些工作?

引言在 Netty 的引导程序中,启动一个服务端应用是一个十分简单的事情。配置链接类对象,配置子类初始化 ChannelHandler,再调用 bind 方法绑定端口号,一个服务端应用就启动完毕了,接着只需要等待客户端发送连接请求,程序就能自动为我们完成客户端接入。看着是很简单的过程,Netty 在背后却是做了相当多的工作,本文就以 ServerBootStrap 启动的时序动作为分析入手点,剖...

2020-09-22 11:53:46 75

原创 Netty 流程细讲之服务端接受并创建客户端链接

引言在上篇文章中我们分析了服务端的启动流程。在服务端启动成功后,就可以开始监听端口,并且处理客户端的接入请求了。服务端的 ServerChannel 是注册在 EventLoop 线程上的,而对客户端的接入处理也是从这个地方开始。因此,在这里我们需要首先分析下在 NioEventLoop。NioEventLoop 的 run 方法源码篇第一讲,我们曾分析过 NioEventLoop,它是一...

2020-09-22 11:53:45 125

原创 源码解析:Netty 连接初始化建立到读取数据全流程分析

引言在上篇文章中我们分析了服务端的启动流程。在服务端启动成功后,就可以开始监听端口,并且处理客户端的接入请求了。服务端的 ServerChannel 是注册在 EventLoop 线程上的,而对客户端的接入处理也是从这个地方开始。因此,在这里我们需要首先分析下在 NioEventLoopNioEventLoop 的 run 方法源码篇第一讲,我们曾分析过 NioEventLoop,它是一个...

2020-09-22 11:53:44 273

原创 源码解析:Netty 通道读取数据的自适应缓存大小算法

引言前文我们介绍了 Netty 如何让 NioServerSocketChannel 服务端通道接受并且初始化一个客户端链接。对于一个客户端链接而言,主要的处理任务有两类:处理就绪事件和处理队列任务。其中就绪事件又可以再细分为读就绪,写就绪,连接就绪和接受就绪。接受就绪我们在上文已经分析过了,本文主要来分析读就绪和连接就绪事件。数据读取当 NioServerSocketChannel 初始化...

2020-09-22 11:53:42 297

原创 源码解析:从源码重新学习 Netty 解码器

引言在入门篇的学习中,我们曾经阐述过工作于 TCP 协议的应用出现的粘包和拆包现象。当时我们介绍了 Netty 用于解决拆包粘包问题的三种常见的解码器实现:处理定长协议的 FixedLengthFrameDecoder。处理固定消息分隔符的 DelimiterBasedFrameDecoder。处理报文头 + 报文体模式协议的 LengthFieldBasedFrameDecoder。...

2020-09-22 11:53:41 86

原创 源码解析:Netty 客户端链接数据写出完整流程分析

引言在前文中我们介绍了连接就绪,读就绪,接受就绪三种事件流程的处理代码。这篇文章我们来介绍下最后一种流程,数据写出。当用户业务需要将数据写出时一般会调用 channel.write 或者是 channel.writeAndFlush。相关的 API 在入门篇的例子中也有过演示。本文,我们将来分析这两个 API 背后的工作原理。write 和 flush 的区别在 Netty 的设计中,写出侧...

2020-09-22 11:53:39 171

原创 Netty 内存池设计之内存页申请与分配

引言网络 IO 框架,最大的开销往往并不是在业务处理的环节,而是在高负载高并发下的 byte[] 对象申请或者 ByteBuffer 申请。很多时候,这些对象只是短暂地用于承载从通道读取数据或者向通道写出数据。在完成这个职能后,这些对象不再使用被 GC 回收。当系统的负载很高时,频繁的申请 byte[] 或 ByteBuffer 对象,对内存的压力是很大的,很容易在短时间内消耗大量的内存。此时...

2020-09-22 11:53:38 175

原创 Netty 内存池设计之总体管理

引言前文我们分析了内存分配的相关算法,以及其在 Netty 当中的变种和代码实现。之前在内存块中申请内存,申请大小都大于一个内存页的大小。而如果在申请大小小于一个内存页时也分配一个内存页,就显得很浪费了。为此,Netty 设计了专门的子页分配算法,用于处理小内存的分配场景。子页管理算法对于小于一个内存页大小的内存申请,首先也是需要在内存块上执行申请的,成功后就会得到一个内存页的空间。现在的问...

2020-09-22 11:53:36 104

原创 Netty 内存池设计之内存申请代码实现

引言前文我们通过引导,设问的方式一步步思考和总结出了一套管理连续内存的申请与分配的方法。同时也分析了相关算法思想下,Netty 中算法的变种表现形式。今天,我们接着上文,来为大家梳理下 Netty 中针对这段算法的代码实现方式。基础属性用于实现内存分配算法的类是 io.netty.buffer.PoolChunk。这是一个被 final 修饰的具备泛型的类。使用泛型的主要原因在于,用于分配的...

2020-09-22 11:53:35 193

原创 Netty 如何实现对内存泄漏的监控

前言在前面的四个章节中,我们介绍了 Netty 中用于内存管理的内存池算法。Netty4 开始默认都使用内存池用于分配内存空间。而承载池化内存空间的一般都是PooledByteBuf对象。使用池化ByteBuf可以提高性能,但是使用完毕需要注意是否需要进行手工释放。在需要手动释放的场合没有释放,就会因为申请的内存空间没有归还给内存池造成内存泄漏,最终应用程序OOM。在复杂的应用程序中找到没有释...

2020-09-22 11:53:33 606

原创 Netty 如何实现更快的 ThreadLocal

引言在前面关于内存分配的代码分析文章中,我们在多个场合见到了一个类 FastThreadLocal。从名字可以看出,这应该是 ThreadLocal 的高性能版本。在 Netty 中,为了打磨性能的细节,在很多方面都做了一些改造,这篇文章我们就来分析下关于 FastThreadLocal 设计与实现。原生的 ThreadLocal在介绍 Netty 的 FastThreadLocal 之前...

2020-09-22 11:53:32 184

轻量级IOC框架BeanContext

轻量级的IOC框架,用于取代Spring在j2se项目中进行使用。

2014-08-21

lbse高性能序列化框架1.0.3

高性能的java序列化框架,无论是生成的二进制字节数或者是序列化的速度都要优于kryo

2014-08-16

lbse 1.0.2

高性能java序列化框架。序列速度及大小强于kryo。目前暂不支持map类型数据。后续会开放支持

2014-08-14

Lbse序列化框架1.0.1

高性能java序列化框架,比kryo的性能还要强上三分之一。目前还不支持多维数组以及Map类。框架正在持续开发演进中。

2014-08-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除