![](https://img-blog.csdnimg.cn/20201101163720622.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Netty从入门到理解
文章平均质量分 87
Netty程序编码模式、服务端启动流程、Java NIO封装、网络I/O接口操作、Channel设计理念、Reactor线程模型、Netty线程模型,Tcp通用的拆包/粘包解决方案。Netty编码解码实现。Netty高性能内存管理设计、内存池、对象池的设计,零拷贝技术等。
Think_Higher
内存虽快,但不持久,好记性不如烂笔头。
展开
-
Netty 在项目开发中的一些实践
文章目录性能篇网络参数优化SO_SNDBUF/SO_RCVBUFTCP_NODELAYSO_BACKLOGSO_KEEPALIVE业务线程池的必要性共享 ChannelHandler设置高低水位线GC 参数优化堆内存堆外内存年轻代内存池 & 对象池Native 支持线程绑定高可用篇连接空闲检测 + 心跳检测解码器保护线程池隔离流量整形堆外内存泄漏排查思路堆外内存回收堆外内存代码监控Netty 自带检测工具MemoryAnalyzer 内存分析Btrace 神器二分排查法:笨方法解决大问题总结这是专原创 2021-02-06 22:17:21 · 340 阅读 · 0 评论 -
Netty 中应用了哪些设计模式?
Netty 源码中运用了大量的设计模式,常见的设计模式在 Netty 源码中都有所体现。文章目录单例模式双重检验锁静态内部类方式饿汉方式枚举方式工厂方法模式责任链模式责任处理器接口动态创建责任链,添加、删除责任处理器上下文责任传播和终止机制观察者模式策略模式装饰者模式总结单例模式单例模式是最常见的设计模式,它可以保证全局只有一个实例,避免线程安全问题。单例模式有很多种实现方法,其中我比较推荐四种最佳实践:双重检验锁、静态内部类方式、饿汉方式和枚举方式,其中双重检验锁和静态内部类方式属于懒汉式单例,饿汉原创 2021-02-06 22:05:54 · 434 阅读 · 0 评论 -
RPC 实战总结与进阶延伸
文章目录Netty 服务端启动自定义通信协议ByteBufPipeline & ChannelHandler注册中心动态代理和反射调用性能优化篇I/O 模型Netty 网络参数配置序列化协议。内存管理线程池隔离重试机制集群容错Netty 服务端启动Netty 提供了 ServerBootstrap 引导类作为程序启动入口,ServerBootstrap 将 Netty 核心组件像搭积木一样组装在一起,服务端启动过程我们需要完成以下三个基本步骤:配置线程池。Netty 是采用 Reactor原创 2021-02-06 21:58:27 · 330 阅读 · 0 评论 -
动态代理——为用户屏蔽 RPC 调用的底层细节
动态代理在 RPC 框架的实现中起到了至关重要的作用,它可以帮助用户屏蔽 RPC 调用时底层网络通信、服务发现、负载均衡等具体细节,这些对用户来说并没有什么意义。你在平时项目开发中使用 RPC 框架的时候,只需要调用接口方法,然后就拿到了返回结果,你是否好奇 RPC 框架是如何完成整个调用流程的呢?今天一起来完成 RPC 框架的最后一部分内容:RPC 请求调用和处理,看看如何使用动态代理机制完成这个神奇的操作。文章目录动态代理基础JDK 动态代理InvocationHandler 接口Proxy 类Cgl原创 2021-01-18 20:07:10 · 270 阅读 · 0 评论 -
服务治理——服务发现与负载均衡机制的实现
在分布式系统中,服务消费者和服务提供者都存在多个节点,如果服务提供者出现部分机器节点负载过高,那么可能会导致该节点上接收的请求处理超时,从而导致服务提供者整体可用率下降。所以 RPC 框架需要实现合理的负载均衡算法,那么如何控制流量能够均匀地分摊到每个服务提供者呢?今天便讨论 RPC 框架负载均衡机制的相关实现。注册中心选型服务消费者在发起 RPC 调用之前,需要知道服务提供者有哪些节点是可用的,而且服务提供者节点会存在上线和下线的情况。所以服务消费者需要感知服务提供者的节点列表的动态变化,在 RPC原创 2021-01-16 17:53:10 · 326 阅读 · 0 评论 -
远程通信——通信协议设计以及编解码的实现
上篇文章中我们搭建了服务提供者和服务消费者的基本框架,现在我们可以建立两个模块之间的通信机制了。我们通过向 ChannelPipeline 添加自定义的业务处理器,来完成 RPC 框架的远程通信机制。需要实现的主要功能如下:服务消费者实现协议编码,向服务提供者发送调用数据。服务提供者收到数据后解码,然后向服务消费者发送响应数据,暂时忽略 RPC 请求是如何被调用的。服务消费者收到响应数据后成功返回。文章目录RPC 通信方案设计自定义 RPC 通信协议序列化选型协议编码实现协议解码实现原创 2021-01-11 22:14:52 · 456 阅读 · 0 评论 -
服务发布与订阅——搭建生产者和消费者的基础框架
此系列从本文开始,将开始动手开发一个完整的 RPC 框架原型,通过整个实践,不仅可以熟悉 RPC 的实现原理,而且可以对之前 Netty 基础知识加深理解,同样在工作中也可以学以致用。我会从服务发布与订阅、远程通信、服务治理、动态代理四个方面详细地介绍一个通用 RPC 框架的实现过程,let’s get started!文章目录环境搭建项目结构如何使用服务提供者发布服务服务提供者启动参数配置发布服务服务消费者订阅服务总结环境搭建工欲善其事必先利其器,首先我们需要搭建我们的开发环境,这是每个程序员的必原创 2021-01-11 22:08:52 · 368 阅读 · 0 评论 -
如何实现一个高性能分布式 RPC 框架
RPC 框架是大型企业高频使用的一种中间件框架,用于解决分布式系统中服务之间的调用问题。RPC 框架设计很多重要的知识点,如线程模型、通信协议设计、同步/异步调用、负载均衡等,对于提高我们的技术综合能力有非常大的帮助。市面上有较多出名的 RPC 框架,例如 Dubbo、Thrift、gRPC 等,RPC 框架本身是非常负责的,我们不可能面面俱到,而是抓住 RPC 框架的核心流程以及必备的组件,开发一个功能比较丰富的小型 RPC 框架。麻雀虽小,五脏俱全。在正式开始 RPC 实战项目之前,我们先学习一下原创 2021-01-07 20:54:41 · 356 阅读 · 1 评论 -
高性能的无锁队列 —— Mpsc Queue & CPU的伪共享问题
NioEventLoop 线程以及时间轮 HashedWheelTimer 的任务队列中都出现了 Mpsc Queue 的身影。这又是 Netty 使用的什么 “黑科技” 呢?为什么不使用 JDK 原生的队列呢?Mpsc Queue 应该在什么场景下使用呢?文章目录JDK 原生并发队列JDK 原生并发队列在介绍 Mpsc Queue 之前,我们先回顾下 JDK 原生队列的工作原理。JDK 并发队列按照实现方式可以分为阻塞队列和非阻塞队列两种类型,阻塞队列是基于锁实现的,非阻塞队列是基于 CAS 操作实原创 2021-01-04 19:58:28 · 1281 阅读 · 2 评论 -
netty延迟任务处理 —— HashedWheelTimer
Netty 中有很多场景依赖定时任务实现,比较典型的有客户端连接的超时控制、通信双方连接的心跳检测等场景。在学习 Netty Reactor 线程模型时,我们知道 NioEventLoop 不仅负责处理 I/O 事件,而且兼顾执行任务队列中的任务,其中就包括定时任务。为了实现高性能的定时任务调度,Netty 引入了时间轮算法驱动定时任务的执行。时间轮到底是什么呢?为什么 Netty 一定要用时间轮来处理定时任务呢?JDK 原生的实现方案不能满足要求吗?说明:本文参考的 Netty 源码版本为 4.1.4原创 2020-12-29 20:29:25 · 1145 阅读 · 0 评论 -
Netty 的 FastThreadLocal VS JAVA ThreadLocal
我们都有在源码中发现 FastThreadLocal 的身影,顾名思义,Netty 作为高性能的网络通信框架,FastThreadLocal 是比 JDK 自身的 ThreadLocal 性能更高的通信框架。FastThreadLocal 到底比 ThreadLocal 快在哪里呢?说明:本文参考的 Netty 源码版本为 4.1.42.Final。文章目录JDK ThreadLocal 基本原理JDK ThreadLocal 基本原理JDK ThreadLocal 不仅是高频的面试知识点,而原创 2020-12-28 11:55:35 · 184 阅读 · 0 评论 -
一个网络请求在 Netty 中的旅行
Netty 在服务端启动时会为创建 NioServerSocketChannel,当客户端新连接接入时又会创建 NioSocketChannel,不管是服务端还是客户端 Channel,在创建时都会初始化自己的 ChannelPipeline。如果把 Netty 比作成一个生产车间,那么 Reactor 线程无疑是车间的中央管控系统,ChannelPipeline 可以看作是车间的流水线,将原材料按顺序进行一步步加工,然后形成一个完整的产品。本次梳理一遍网络请求在 Netty 中的处理流程,并着重讲解 Ch原创 2020-12-25 09:37:04 · 200 阅读 · 1 评论 -
Netty Reactor 线程模型
Reactor 线程模型是 Netty 实现高性能的核心所在,在 Netty 中 EventLoop 是 Reactor 线程模型的核心处理引擎,那么 EventLoop 到底是如何实现的呢?又是如何保证高性能和线程安全性的呢?说明:本文参考的 Netty 源码版本为 4.1.42.Final。Reactor 线程执行的主流程因为 Netty 是基于 NIO 实现的,所以推荐使用 NioEventLoop 实现,我们再次通过 NioEventLoop 的核心入口 run() 方法回顾 Netty原创 2020-12-22 22:21:59 · 269 阅读 · 1 评论 -
netty服务端启动流程
说明:本文参考的 Netty 源码版本为 4.1.42.Final。启动服务的过程中我们可以了解到 Netty 各大核心组件的关系,这将是学习 Netty 源码一个非常好的切入点,让我们一起看看 Netty 的每个零件是如何运转起来的吧。文章目录从 Echo 服务器示例入手服务端启动全过程服务端 Channel 初始化及注册创建服务端 Channel初始化服务端 Channel注册服务端 Channel端口绑定netty服务端如何处理客户端新建连接总结从 Echo 服务器示例入手在这里我们实现了.原创 2020-12-21 20:09:19 · 353 阅读 · 0 评论 -
Netty 零拷贝技术
Netty 实现高性能的另一个高阶特性——零拷贝。零拷贝是一个耳熟能详的词语,在 Linux、Kafka、RocketMQ 等知名的产品中都有使用,通常用于提升 I/O 性能。而且零拷贝也是面试过程中的高频问题,那么你知道零拷贝体现在哪些地方吗?Netty 的零拷贝技术又是如何实现的呢?接下来我们就针对 Netty 零拷贝特性进行详细地分析。传统 Linux 中的零拷贝技术在介绍 Netty 零拷贝特性之前,我们有必要学习下传统 Linux 中零拷贝的工作原理。所谓零拷贝,就是在数据操作时,不需要将数据原创 2020-12-15 23:06:49 · 459 阅读 · 0 评论 -
轻量级对象回收站——Recycler 对象池
我们学习了 Netty 内存池的高性能设计原理,本文会介绍 Netty 的另一种池化技术:Recycler 对象池。在刚接触到 Netty 对象池这个概念时,你是不是也会有类似的疑问:对象池和内存池有什么区别?它们有什么联系吗?实现对象池的方法有很多,Netty 也是自己实现的吗?是如何实现的?对象池在实践中我们应该怎么使用?带着这些问题,往下看~Recycler 快速上手我们通过一个例子直观感受下 Recycler 如何使用,假设我们有一个 User 类,需要实现 User 对原创 2020-12-08 11:39:09 · 306 阅读 · 1 评论 -
Netty 高性能内存管理设计(2)
Netty 的内存规格分类以及内存管理的核心组件,今天我们继续介绍 Netty 内存分配与回收的实现原理。有了上节课的基础,相信接下来的学习过程会事半功倍。本文章会侧重于详细分析不同场景下 Netty 内存分配和回收的实现过程,让你对 Netty 内存池的整体设计有一个更加清晰的认识。内存分配实现原理Netty 中负责线程分配的组件有两个:PoolArena和PoolThreadCache。PoolArena 是多个线程共享的,每个线程会固定绑定一个 PoolArena,PoolThreadCache原创 2020-12-06 15:12:58 · 402 阅读 · 0 评论 -
Netty 高性能内存管理设计 (1)
Netty 作为一款高性能的网络框架,需要处理海量的字节数据,而且 Netty 默认提供了池化对象的内存分配,使用完后归还到内存池,所以一套高性能的内存管理机制是 Netty 必不可少的。在上节课中我们介绍了原生 jemalloc 的基本原理,而 Netty 高性能的内存管理也是借鉴 jemalloc 实现的,它同样需要解决两个经典的核心问题:在单线程或者多线程的场景下,如何高效地进行内存分配和回收?如何减少内存碎片,提高内存的有效利用率?内存规格介绍Netty 保留了内存规格分类的设计原创 2020-12-01 19:53:18 · 289 阅读 · 0 评论 -
高性能内存分配器 jemalloc 基本原理
文章目录背景知识常用内存分配器算法动态内存分配伙伴算法Slab 算法jemalloc 架构设计在上一篇文章中,我们介绍了强大的 ByteBuf 工具类,ByteBuf 在 Netty 中随处可见,那么这些 ByteBuf 在 Netty 中是如何被分配和管理的呢?接下来的我们会对 Netty 高性能内存管理进行剖析,这些知识相比前面的章节有些晦涩难懂,你不必过于担心,Netty 内存管理的实现并不是一蹴而就的,它也是参考了 jemalloc 内存分配器。今天我们就先介绍 jemalloc 内存分配器的基本原创 2020-11-30 20:21:26 · 1572 阅读 · 0 评论 -
模仿echo命令学习NIO——Java实现
一、NIO模型:同步非阻塞IO处理在传统的Java环境里面,最初的程序需要依赖于JVM虚拟机技术。最早的时候由于虚拟机的性能较差,所以很少有人去关注通讯的速度问题,大部分的问题都出现在了CPU处理上。但是随着硬件的性能提升,实际上CPU的处理速度加强了。所以从JDK 1.4开始就引入NIO的开发包,可以带来底层数据的传输性能。在NIO之中采用了一个Reactor事件模型,注册的汇集点Sele...原创 2019-05-04 00:40:35 · 491 阅读 · 0 评论 -
模仿echo命令学习BIO——Java实现
一、BIO模型:同步阻塞IO处理在程序的开发之中Java里面最小的处理单元就是线程,也就是说每一个线程可以进行IO的处理,在处理之中,该线程无法进行任何的其他操作。.多线程是不可能无限制进行创造的,所以需要去考虑堆线程进行有效的个数控制。如果产生的线程过多,那么直接的问题在于,处理性能降低 ,响应的速度变慢。需要去区分操作系统的内核线程,以及用户线程的区别,所以最好与内核线程有直接联系,需...原创 2019-05-02 20:04:43 · 301 阅读 · 0 评论 -
Netty 数据传输载体 —— ByteBuf
在学习编解码的过程中,我们看到 Netty 大量使用了自己实现的 ByteBuf 工具类,ByteBuf 是 Netty 的数据容器,所有网络通信中字节流的传输都是通过 ByteBuf 完成的。然而 JDK NIO 包中已经提供了类似的 ByteBuffer 类,为什么 Netty 还要去重复造轮子呢?那就要好好说说 ByteBuf。文章目录为什么是 ByteBufByteBuf 内部结构引用计数ByteBuf 分类ByteBuf 核心 API指针操作 API数据读写 API内存管理 APIByteBuf原创 2020-11-25 00:12:33 · 886 阅读 · 0 评论 -
Netty 堆外内存的管理
本篇文章我们将进入 Netty 内存管理的学习,在此之前,我们需要了解 Java 堆外内存的基本知识,因为当你在使用 Netty 时,需要时刻与堆外内存打交道。我们经常看到各类堆外内存泄漏的排查案例,堆外内存使用不当会使得应用出错、崩溃的概率变大,所以在使用堆外内存时一定要慎重,文章将带你一起认识堆外内存,并探讨如何更好地使用它。文章目录为什么需要堆外内存堆外内存的分配堆外内存的回收总结为什么需要堆外内存在 Java 中对象都是在堆内分配的,通常我们说的JVM 内存也就指的堆内内存,堆内内存完全被JV原创 2020-11-21 11:12:05 · 754 阅读 · 1 评论 -
writeAndFlush处理流程剖析——数据传输
接下来我们如何将解编码后的结果发送出去呢?在 Netty 中实现数据发送非常简单,只需要调用 writeAndFlush 方法即可,这么简单的一行代码究竟 Netty 帮我们完成了哪些事情呢?文章目录Pipeline 事件传播回顾writeAndFlush 事件传播分析写 Buffer 队列刷新 Buffer 队列总结Pipeline 事件传播回顾在介绍 writeAndFlush 的工作原理之前,我们首先回顾下 Pipeline 的事件传播机制,因为他们是息息相关的。根据网络数据的流向,Channe原创 2020-11-17 22:21:10 · 1160 阅读 · 2 评论 -
Netty 支持哪些常用的解码器?
之前我们介绍了 TCP 拆包/粘包的问题,以及如何使用 Netty 实现自定义协议的编解码。可以看到,网络通信的底层实现,Netty 都已经帮我们封装好了,我们只需要扩展 ChannelHandler 实现自定义的编解码逻辑即可。更加人性化的是,Netty 提供了很多开箱即用的解码器,这些解码器基本覆盖了 TCP 拆包/粘包的通用解决方案。本文章我们将对 Netty 常用的解码器进行讲解,一起探索下它们有哪些用法和技巧。我们首先回顾一下 TCP 拆包/粘包的主流解决方案。并梳理出 Netty 对应的编码器原创 2020-11-12 22:33:10 · 547 阅读 · 0 评论 -
如何利用 Netty 实现自定义协议通信?
通信协议设计1. 魔数2. 协议版本号3. 序列化算法4. 报文类型5. 长度域字段6. 请求数据7. 状态8. 保留字段Netty 如何实现自定义通信协议Netty 常用编码器类型Netty 常用解码器类型MessageToByteEncoderMessageToMessageEncoder抽象解码类抽象解码类 ByteToMessageDecoder。抽象解码类 MessageToMessageDecoder。通信协议实战总结原创 2020-11-11 23:48:21 · 961 阅读 · 0 评论 -
粘包/拆包问题——如何获取一个完整的网络包?
本文章开始讲解 Netty 通信过程中的编解码技术。编解码技术是实现网络通信的基础,让我们可以定义任何满足业务需求的应用层协议。在网络编程中,我们经常会使用各种网络传输协议,其中 TCP 是最常用的协议。我们首先需要了解的是 TCP 最基本的拆包/粘包问题以及常用的解决方案,才能更好地理解 Netty 的编解码框架。文章目录为什么有拆包/粘包MTU 最大传输单元和 MSS 最大分段大小滑动窗口Nagle 算法拆包/粘包的解决方案消息长度固定特定分隔符总结为什么有拆包/粘包TCP 是传输协议是面向流的,原创 2020-11-10 19:50:03 · 504 阅读 · 0 评论 -
Pipeline 如何协调各类 Handler ?
文章目录ChannelPipeline 概述ChannelPipeline 内部结构ChannelHandler 接口设计1. ChannelInboundHandler 的事件回调方法与触发时机2. ChannelOutboundHandler 的事件回调方法与触发时机事件传播机制异常传播机制异常处理的最佳实践总结通过上篇文章的学习,我们知道 EventLoop 可以说是 Netty 的调度中心,负责监听多种事件类型:I/O 事件、信号事件、定时事件等,然而实际的业务处理逻辑则是由 ChannelPip原创 2020-11-08 22:26:50 · 269 阅读 · 0 评论 -
Netty的精髓——EventLoop
Netty 高性能的奥秘在于其 Reactor 线程模型。 EventLoop 是 Netty Reactor 线程模型的核心处理引擎,那么它是如何高效地实现事件循环和任务处理机制的呢?文章目录再谈 Reactor 线程模型单线程模型多线程模型主从多线程模型Netty EventLoop 实现原理EventLoop 是什么Netty 如何实现 EventLoop再谈 Reactor 线程模型网络框架的设计离不开 I/O 线程模型,线程模型的优劣直接决定了系统的吞吐量、可扩展性、安全性等。目前主流的网络原创 2020-11-08 09:20:51 · 373 阅读 · 0 评论 -
Netty 的引导器Bootstrap —— 从搭建HTTP服务器讲起
我们在使用 Netty 编写网络应用程序的时候,一定会从引导器 Bootstrap开始入手。Bootstrap 作为整个 Netty 客户端和服务端的程序入口,可以把 Netty 的核心组件像搭积木一样组装在一起。本文会从 Netty 的引导器Bootstrap出发,带你学习如何使用 Netty 进行最基本的程序开发。文章目录从一个简单的 HTTP 服务器开始服务端启动类服务端业务逻辑处理类从一个简单的 HTTP 服务器开始HTTP 服务器是我们平时最常用的工具之一。同传统 Web 容器 Tomcat原创 2020-11-04 23:04:12 · 352 阅读 · 2 评论 -
把握 Netty 整体架构脉络
文章目录Netty 整体结构1. Core 核心层2. Protocol Support 协议支持层3. Transport Service 传输服务层Netty 逻辑架构网络通信层BootStrap & ServerBootStrapChannel事件调度层EventLoopGroup & EventLoop服务编排层ChannelPipelineChannelHandler & ChannelHandlerContext组件关系梳理Netty 源码结构Core 核心层模块Prot原创 2020-11-03 19:41:16 · 309 阅读 · 1 评论 -
Netty的高性能与低延迟—— I/O
文章目录为什么 Netty 这么流行?高性能,低延迟1. 同步阻塞 I/O(BIO)2. 同步非阻塞 I/O(NIO)3. I/O 多路复用4. 信号驱动 I/O5. 异步 I/O完美弥补 Java NIO 的缺陷更低的资源消耗网络框架的选型Netty 的发展现状谁在使用 Netty?今天我们将正式开始学习本专栏,一同了解一下 Netty。众所周知,Java 的生态非常完善,同一类型的需求可能会有几款产品供你选择。那为什么 Java 的网络编程框架大家都会向你推荐 Netty,而不是 Java NIO、原创 2020-11-01 17:22:23 · 894 阅读 · 1 评论 -
为什么要学习 Netty?
文章目录为什么要学习 Netty?Netty 是目前最流行的一款高性能 Java 网络编程框架,它被广泛使用在中间件、直播、社交、游戏等领域。目前,许多知名的开源软件也都将 Netty 用作网络通信的底层框架,如 Dubbo、RocketMQ、Elasticsearch、HBase 等。为什么要学习 Netty?你可能要问了:如果我的工作中涉及网络编程的内容并不多,那我是否还有必要花精力学习 Netty 呢?Netty 的高性能表现在哪些方面?对你平时的项目开发有何启发?Netty 中有哪原创 2020-11-01 16:29:42 · 2391 阅读 · 0 评论