自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(76)
  • 收藏
  • 关注

原创 Netty源码分析之EventLoop组件

Netty编程注意事项:如果业务逻辑比较简单,并且没有 数据库操作、线程阻塞的磁盘操作、网路操作等,可以直接在 NIO线程 上完成业务逻辑编排,不需要切换到用户线程;如果业务逻辑比较复杂,不要在 NIO线程 上完成,建议将解码后的 POJO消息 封装成 Task,分发到 业务线程池 中由业务线程执行,以保证 NIO线程 尽快被释放,处理其他的I/O操作。...

2020-09-03 22:00:48 255

原创 Netty源码分析之Channel和Unsafe组件

类似于 java.nio包 的 Channel,Netty 提供了自己的 Channel 和其子类实现,用于异步 I/O操作 等。Unsafe 是 Channel 的内部接口,聚合在 Channel 中协助进行网络读写相关的操作,因为它的设计初衷就是 Channel 的内部辅助类,不应该被 Netty框架 的上层使用者调用,所以被命名为 Unsafe。Channel 组件Netty 的 Channel组件 是 Netty 对网络操作的封装,如 网络数据的读写,与客户端建立连接,主动关闭连接 等,也包含了

2020-09-01 22:37:45 298

原创 Netty源码解析之 ChannelPipeline和ChannelHandler

ChannelPipeline 的功能和作用ChannelPipeline 的事件处理ChannelPipeline 自定义拦截器构建 pipelineChannelPipeline 的主要特性ChannelPipeline 源码解析ChannelPipeline 对 ChannelHandler 的管理ChannelPipeline 的 inbound事件 和 outbound事件ChannelHandler 的功能和作用ChannelHandlerAdapterChannelHand

2020-08-30 14:11:23 446

原创 Selector、SelectionKey和Channel 源码联合解析

Selector、SelectionKey和Channel 这三个组件构成了Java nio包的核心,也是Reactor模型在代码层面的体现。Selector能让单线程同时处理多个客户端Channel,非常适用于高并发,传输数据量较小的场景。要使用Selector,首先要将对应的Channel及IO事件(读、写、连接)注册到Selector,注册后会产生一个SelectionKey对象,用于关联Selector和Channel,及后续的IO事件处理。这三者的关系如下图所示。对nio编程不熟的同学可以搜索

2020-08-23 22:39:22 619

原创 详解AbstractQueuedSynchronizer抽象类

简介AbstractQueuedSynchronizer 是Doug Lea大师创作的用来构建锁或者其他同步组件的基础框架类。J.U.C中许多锁和并发工具类的核心实现都依赖于AQS,如:ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch 等。AQS的源码中 方法很多,但主要做了三件事情:管理 同步状态;维护 同步队列;阻塞和唤醒 线程。另外,从行为上来区分就是 获取锁 和 释放锁,从模式上来区分就是 独占锁 和 共享锁。

2020-07-18 22:20:24 288

原创 LinkedHashMap容器类 源码赏析

HashMap 大家都清楚,底层是 数组 + (红黑树 / 链表),元素是无序的,而 LinkedHashMap 则比 HashMap 多了这一个功能,并且,LinkedHashMap 的有序可以按两种顺序排列,一种是按照插入的顺序,一种是按照访问的顺序(初始化LinkedHashMap对象时设置accessOrder参数为true),而其内部是靠 建立一个双向链表 来维护这个顺序的,在每次插入、删除后,都会调用一个函数来进行 双向链表的维护,这也是实现 LRU Cache 功能的基础。先说几个比较重要的

2020-07-05 20:03:19 146

原创 HashSet容器类 源码赏析

HashSet 本身并没有什么特别的东西,它提供的所有集合核心功能,都是基于HashMap来实现的。如果了解HashMap源码的实现,HashSet 源码看起来跟玩一样。我的博客中有专门分析HashMap源码的文章,不熟悉的请自行翻阅。HashSet 的特点如下:内部使用HashMap的key存储元素,以此来保证元素不重复;HashSet是无序的,因为HashMap的key是无序的;HashSet中允许有一个null元素,因为HashMap允许key为null;HashSet是非线程安全的。

2020-07-03 23:25:27 112

原创 String类源码详解

public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** 保存String的字节数组 */ private final char value[]; /** 缓存这个String的hash值 */ private int hash; // Default to 0 /** use serialVers

2020-06-19 20:39:44 658

原创 Dubbo远程通信模块简析

dubbo-remoting 模块整体结构设计服务治理框架 大致可分为 “服务通信” 和 “服务管理” 两部分,前面我们分析了有关注册中心的源码,也就是服务管理,接下来要分析的就是跟服务通信有关的源码,也就是远程通讯模块。该模块中提供了多种客户端和服务端通信的功能,而在对NIO框架选型上,dubbo交由用户选择,它集成了mina、netty、grizzly等各类NIO框架来搭建NIO服务器和客户端,并且利用dubbo的SPI扩展机制可以让用户自定义选择。dubbo-remoting的工程结构如下。du

2020-05-24 12:49:04 1648

原创 Dubbo 负载均衡模块 源码赏析

Dubbo 负载均衡简介负载均衡,无论在常用的中间件 及 框架中,还是现实生活中,都有所体现。比如,一个团队干活,老大肯定要尽可能把任务均匀合理地分下去,让整个团队能高速运转,能力强的多分点,能力弱的少分点,绝对不能去逮着一个人 让他累到死,让其它人闲着。这样的均匀分配任务及压力的思想 放在开发领域 即是“负载均衡”。它就相当于是一个压力均衡机制,通过各种策略,为集群中的每台服务器合理地分配压力...

2020-05-12 22:46:39 806

原创 Dubbo集群模块 源码简析

集群模块简介集群,是指同一个服务 被部署在了多个服务器上,每个服务器的任务都相同,能够以较高的性价比,提升系统的 性能、可靠性、灵活性,但同时也要面对 集群中会出现的 负载均衡、容错等问题。dubbo的集群模块,主要涉及以下几部分内容。负载均衡策略:dubbo支持的所有负载均衡策略算法;集群容错:Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,...

2020-04-19 20:08:57 802

原创 Dubbo注册中心——Zookeeper实现 源码赏析

Dubbo的注册中心 虽然提供了多种实现,但生产上的事实标准基本上都是 基于Zookeeper实现的。这种注册中心的实现方法也是Dubbo最为推荐的。为了易于理解 Zookeeper 在 Dubbo 中的应用,我们先简单看一下zookeeper。由于 Dubbo 是一个分布式RPC开源框架,各服务之间单独部署,往往会出现资源之间数据不一致的问题,比如:某一个服务增加或减少了几台机器,某个服务提供...

2020-04-19 17:25:44 1013

原创 Dubbo注册中心模块 源码赏析

注册中心在Dubbo中的作用服务治理框架可以大致分为 服务通信 和 服务管理 两部分,服务管理可以分为服务注册、服务订阅以及服务发现,服务提供者Provider 会往注册中心注册服务,而消费者Consumer 会从注册中心中订阅自己关注的服务,并在关注的服务发生变更时 得到注册中心的通知。Provider、Consumer以及Registry之间的依赖关系 如下图所示。dubbo-regis...

2020-04-19 15:27:20 1129

原创 Dubbo源码赏析之 SPI

JDK的SPI思想SPI,即Service Provider Interface。在面向对象的设计里面,模块之间推荐基于接口编程,而不是对实现类进行硬编码,这样做也是为了模块设计的可拔插原则。比较典型的应用,如 JDBC,Java 定义了一套 JDBC 的接口,但是 Java 本身并不提供对 JDBC 的实现类,而是开发者根据项目的 ,要使用 jdbc 接口的哪些实现类呢?一般来说,我们要...

2020-04-15 22:15:31 777

原创 Dubbo 架构设计

首先从GitHub 上 down下来Dubbo项目,我们根据里面的目录名 也能大概猜出来各个模块的作用。dubbo-­common公共逻辑模块,定义了各模块中 通用的 组件 和 工具类,如:IO、日志、配置处理等。dubbo-rpc分布式协调服务框架的核心,该模块定义了 RPC相关的组件,包括 服务发布、服务调用代理、远程调用结果、RPC调用网络协议,RPC调用监听器和过滤器等等。该模块...

2020-04-15 19:57:49 167

原创 详解 分布式事务

什么是分布式事务跨多个数据库执行的事务叫 分布式事务,分布式事务 是用来保证分布式环境下 事务一致性的技术方案。如:分库分表、服务拆分时,各数据库被部署在不同的机器上,需要分布式事务来保证 这种情况的事务一致性。X/Open DTP 分布式事务处理模型X/Open DTP (X/Open Distributed Transaction Processing Reference Model) ...

2020-04-12 19:10:06 982

原创 ConcurrentHashMap 源码赏析

HashMap 源码中主要了解其核心源码及实现逻辑。ConcurrentHashMap 就不再重复那些数据结构相关的内容咯,这里重点看一下它的并发安全实现。源码如下。public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Ser...

2020-04-01 22:39:37 108

原创 HashMap 源码赏析

作为工作中最重要、最常用的容器之一,当然还是要自己动手写一篇 HashMap 的源码解析来加深对其的印象咯,而且它的设计与实现 也有很多值得学习的地方。源码赏析JDK1.8 的HashMap 底层使用的是 动态数组,数组中元素存放的是 链表或红黑树。核心源码如下。public class HashMap<K,V> extends AbstractMap<K,V> im...

2020-04-01 21:43:33 132

原创 ThreadLocal 源码赏析

前面我们分析了 Thread类的源码,有了前面的铺垫,通过源码 理解ThreadLocal的秘密就容易多了。ThreadLocal类 提供了 get/set线程局部变量的实现,ThreadLocal成员变量与正常的成员变量不同,每个线程都可以通过 ThreadLocal成员变量 get/set自己的专属值。ThreadLocal实例 通常是类中的私有静态变量,常用于将状态与线程关联,例如:用户I...

2020-03-31 22:31:03 218

原创 java.lang.Thread 源码赏析

本来想看 ThreadLocal 的源码的,但发现其中最重要的 get/set 方法都是操纵的 Thread类 中的 threadLocals变量 (java.lang.ThreadLocal.ThreadLocalMap),索性先来看一下 Thread 的源码吧,可以留意一下其中与 ThreadLocal 相关的属性,这样下次阅读 ThreadLocal 的核心API时,就能够轻易理解其原理咯。...

2020-03-30 23:03:58 341

原创 servlet-api源码赏析

servlet简介Servlet(Server Applet),全称Java Servlet,是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态 Web内容。Servlet 运行于支持 Java的应用服务器中。从实现上讲,Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP协议 的 Web服务器。servlet 的工作模式...

2020-03-23 21:13:24 449

原创 Lock锁组件 (J.U.C) 源码赏析

类图结构J.U.C 的锁组件中 类相对较少,从JDK相应的包中也能看出来,下图标记了其中最主要的几个接口和类,也是本文要分析的重点。下图 将这几个接口和类 以类图的方式展现出来,其中包含了它们所声明的主要方法。Lock 组件Lock 组件的结构很简单,只有一个接口和一个实现类,源码如下。public interface Lock { /** * 获取锁 ...

2020-03-16 21:02:04 230

原创 Executor 线程池组件 源码赏析

线程池核心组件图解看源码之前,先了解一下该组件 最主要的几个 接口、抽象类和实现类的结构关系。该组件中,Executor 和 ExecutorService接口 定义了线程池最核心的几个方法,提交任务submit()、关闭线程池shutdown()。抽象类 AbstractExecutorService 主要对公共行为 submit()系列方法进行了实现,这些 submit()方法 的实现...

2020-03-15 22:54:36 133

原创 Netty高性能之道

作为一个高性能的 NIO通信框架,Netty 被广泛应用于大数据处理、互联网消息中间件、游戏和金融行业等。大多数应用场景对底层的通信框架都有很高的性能要求,作为综合性能最高的 NIO框架 之一,Netty 可以完全满足不同领域对高性能通信的需求。本章我们将从架构层对 Netty 的高性能设计和关键代码实现进行剖析,看 Netty 是如何支撑高性能网络通信的。RPC 调用性能模型分析传统 RPC...

2020-02-24 23:17:37 160

原创 Netty 的主要组件

ByteBuf 组件当我们进行数据传输的时候,往往需要使用到缓冲区,常用的缓冲区就是 JDK NIO类库 提供的 Buffer组件,7 种基本数据类型 ( Boolean 除外 ) 都有自己的缓冲区实现。对于 NIO编程 而言,我们主要使用的是 ByteBuffer。从功能角度而言,ByteBuffer 完全可以满足 NIO编程 的需要,但是由于 NIO编程 的复杂性,ByteBuffer 也...

2020-02-23 20:53:59 538

原创 Java多线程编程在各主流框架中的应用

Java内存模型与多线程编程Java内存模型线程状态转换线程的使用Netty的并发编程实践共享变量的同步正确使用锁volatile的使用CAS指令和原子类J.U.C类库多线程编程规范...

2020-02-23 11:22:13 532

原创 重新认识enum枚举类

public enum EnumTest implements Cloneable { ......}就像所有的类都默认继承了 java.lang.Object 一样,所以的枚举类 都默认继承了 java.lang.Enum。虽然语法上是通过关键字 enum 声明一个类是枚举类,但实际上 还是使 被声明类 继承了 java.lang.Enum。所以在语法上,枚举类不能 再使用 ext...

2020-02-20 14:22:49 163

原创 基于Netty的客户端开发

相对于服务端,Netty客户端 的创建更加复杂,除了要考虑线程模型、异步连接、客户端连接超时等因素外,还需要对连接过程中的各种异常进行考虑。本章将对 Netty客户端 创建的关键流程和源码进行分析,以期读者能够了解客户端创建的细节。基于 Netty 创建客户端的流程分析Netty 为了向使用者屏蔽 NIO通信 的底层细节,在和用户交互的边界做了封装,目的就是为了减少用户开发工作量,降低开发难度...

2020-02-19 22:30:05 1242

原创 为什么有的Java文件会编译出多个.class文件,它们是什么

public class Shuitu { public static void main(String[] args) { // 这些匿名内部类编译出来的 .class文件名,就是带$1、$2、$3这种后缀的 new Runnable(){ @Override public void run() { // TODO Auto-generated method s...

2020-02-17 14:02:06 1190

原创 基于Netty的服务端开发

Netty 服务端创建源码分析当我们直接使用 JDK 的 NIO类库 开发基于 NIO 的异步服务端时,需要用到 多路复用器Selector、ServerSocketChannel、SocketChannel、ByteBuffer、SelectionKey 等,相比于传统的 BIO开发,NIO 的开发要复杂很多,开发出稳定、高性能的异步通信框架,一直是个难题。Netty 为了向使用者屏蔽 NIO...

2020-02-16 22:16:01 293

原创 Netty架构设计

本博文用于重点分析 Netty 的逻辑架构及关键的架构质量属性,希望有助于大家从 Netty 的架构设计中汲取营养,设计出高性能、高可靠性和可扩展的程序。Netty的三层架构设计Netty 采用了典型的三层网络架构进行设计和开发,其逻辑架构图如下所示。通信调度层 Reactor它由一系列辅助类完成,包括 Reactor线程 NioEventLoop 及其父类,NioSocketChan...

2020-02-16 14:25:28 367

原创 TCP粘包/拆包问题的解决之道

TCP粘包/拆包熟悉 TCP编程 的都知道,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑 TCP底层 的 粘包/拆包机制。本篇博文,我们先简单了解 TCP粘包/拆包 的基础知识,然后来看看 Netty 是如何解决这个问题的。TCP粘包/拆包问题说明TCP 是个 “流” 协议,所谓流,就是没有界限的一串数据。TCP底层 并不了解上层(如 HTTP协议)业务数据的具体含义,它...

2020-02-15 20:06:53 236

原创 四种IO编程及对比

传统的BIO编程伪异步IO编程NIO编程三种IO的对比为何选择Netty

2020-02-15 15:33:38 283

原创 IO模型

Linux 网络 IO 模型简介Linux 的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个fd (file descriptor,文件描述符)。而对一个 socket 的读写也会有相应的描述符,称为 socket fd (socket 描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)。根据UNIX网络编程对 I...

2020-02-11 23:13:05 87

原创 从Spring及Mybatis框架源码中学习设计模式(结构型)

设计模式是解决问题的方案,从大神的代码中学习对设计模式的使用,可以有效提升个人编码及设计代码的能力。本系列博文用于总结阅读过的框架源码(Spring系列、Mybatis)及JDK源码中 所使用过的设计模式,并结合个人工作经验,重新理解设计模式。本篇博文主要看一下结构型的几个设计模式,即,适配器模式、代理模式 及 装饰器模式。适配器模式个人理解从名字就很好理解,主要起到一个连接适配的作用。生...

2020-02-03 13:52:02 191

原创 从Spring及Mybatis框架源码中学习设计模式(行为型)

设计模式是解决问题的方案,从大神的代码中学习对设计模式的使用,可以有效提升个人编码及设计代码的能力。本系列博文用于总结阅读过的框架源码(Spring系列、Mybatis)及JDK源码中 所使用过的设计模式,并结合个人工作经验,重新理解设计模式。本篇博文主要看一下结构型的几个设计模式,即,策略模式、模板方法模式、迭代器模式 及 观察者模式。策略模式个人理解去年看了蛮多源码,发现 框架的开发者...

2020-02-01 22:39:22 385

原创 从Spring及Mybatis框架源码中学习设计模式(创建型)

六大原则单一职责:一个类只负责唯一一项职责依赖倒置:即面向接口编程,系统的高层模块(顶层接口、顶层抽象类等)不应该依赖底层模块(具体实现类),当需求发生变化时,对外接口不变,只要提供新的实现类即可。接口隔离:尽量设计出功能单一的接口,避免实现类实现很多不必要的接口方法开放-封闭:对扩展开放,对修改关闭,本原则是设计模式的终极目标迪米特法则:尽量减少类之间的耦合性里氏替换:继承体系的设...

2020-01-30 21:23:41 322

原创 由量变到质变 写出高质量代码

本文由于总结《阿里Java开发手册》、《用友技术review手册》及个人Java开发工作经验,结合这半年来的源码阅读经验进行编写。回顾那些写过的 读过的代码,回顾自己。第一章 基础编码规范1.1 命名规范代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。tips:JDK动态代理生成的代理类 类名使用了$符号开头,如$Proxy1。代码中的命名严禁使用拼音与英...

2020-01-28 16:02:16 1268

原创 Spring事务组件 源码阅读(Spring事务管理器的设计与实现)

1 Spring事务处理的应用场景下面,我们以DataSourceTransactionManager事务管理器为例,看一下在具体的事务管理器中如何实现事务创建、提交和回滚这些底层的事务处理操作。DataSourceTransationManager和其他事务管理器一样,如JtaTransactionManager,JpaTransactionManager和JdoTransactionMan...

2020-01-23 21:27:39 161

原创 Spring事务组件 源码阅读(Spring事务处理的设计与实现)

1 事务处理的编程式使用 TransactionDefinition td = new DefaultTransactionDefinition(); TransactionStatus ts = transactionManager.getTransaction(td); try { // 这里是需要进行事务处理的方法调用 } catch (Exception e) {...

2020-01-23 17:27:08 199

空空如也

空空如也

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

TA关注的人

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