Netty-Handler&Pipeline
参考文献
ChannelPipline
每一个新创建的Channel都将会被分配一个新的ChannelPipeline.这项关联是永久性的;Channel 既不能附加另外一个ChannelPipeline,也不能分离其当前的.在 Netty 组件的生命周期中,这是一项固定的操作,不需要开发人员的任何干预.
ChannelPipeline可以看作ChannelHandler的容器载体,它是由一组ChannelHandler实例组成的,内部通过双向链表将不同的ChannelHandler链接在一起.ChannelPipeline 的双向链表分别维护了HeadContext 和 TailContext 的头尾节点。我们自定义的ChannelHandler会插入到Head和Tail 之间.
保存 ChannelHandler的List,用于处理或拦截Channel的入站事件和出站操作**,它们的执行顺序是由它们被添加的顺序所决定的**.
ChannelPipeline 实现了一种高级形式的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及 Channel中各个的 Chann ...
Netty-Future&Promise
参考文献
Future & Promise
在异步处理时,经常用到这两个接口
首先要说明Netty中的Future与JDK中的Future同名,但是是两个接口,Netty的Future继承自JDK的Future,而Promise又对NettyFuture进行了扩展
JDKFuture只能同步等待任务结束(或成功、或失败)才能得到结果
NettyFuture可以同步等待任务结束得到结果,也可以异步方式得到结果,但都是要等任务结束
NettyPromise不仅有nettyFuture的功能,而且脱离了任务独立存在,只作为两个线程间传递结果的容器
功能/名称
JDK Future
Netty Future
Promise
cancel
取消任务
-
-
isCanceled
任务是否取消
-
-
isDone
任务是否完成,不能区分成功失败
-
-
get
获取任务结果,阻塞等待
-
-
getNow
-
获取任务结果,非阻塞,还未产生结果时返回 null
-
await
-
等待任务结束,如果任务失败,不会抛异常,而是通 ...
Netty-Channel
参考文献
Channel
与Socket类似
Netty 网络通信的组件,能够用于执行网络 I/O 操作.Channel 为用户提供
当前网络连接的通道的状态(例如是否打开?是否已连接?
网络连接的配置参数 (例如接收缓冲区大小)
提供异步的网络 I/O 操作(如建立连接,读写,绑定端口),异步调用意味着任何 I/O 调用都将立即返回,并且不保证在调用结束时所请求的 I/O 操作已完成.
调用立即返回一个 ChannelFuture 实例,通过注册监听器到 ChannelFuture 上,可以 I/O 操作成功、失败或取消时回调通知调用方.
支持关联 I/O 操作与对应的处理程序.
不同协议、不同的阻塞类型的连接都有不同的 Channel 类型与之对应,下面是一些常用的 Channel 类型:
NioSocketChannel: 异步的客户端 TCP Socket 连接.
NioServerSocketChannel: 异步的服务器端 TCP Socket 连接.
NioDatagramChannel: 异步的 UDP 连接.
NioSctpChannel: 异步的客 ...
Netty-EventLoop
参考文献
如何解决 Netty Channel.isWritable 返回 false
Netty Best Practices
Channel、EventLoop和 EventLoopGroup
一个EventLoopGroup包含一个或者多个EventLoop;
一个EventLoop在它的生命周期内只和一个Thread绑定;
所有由EventLoop处理的I/O 事件都将在它专有的Thread上被处理;
一个Channel在它的生命周期内只注册于一个EventLoop;
一个EventLoop可能会被分配给一个或多个Channel.
EventLoop事件循环对象
EventLoop是一种事件等待和处理的程序模型,可以解决多线程资源消耗高的问题.
EventLoop通用运行模式为,当事件发生时,应用程序都会将产生的事件放入事件队列中,然后EventLoop会轮询从队列中取出事件执行或者将事件分发给相应的事件监听者执行.事件执行的方式通常分为立即执行,延后执行,定期执行.
EventLoop本质是一个单线程执行器(同时维护了一个Selector),里面有run方 ...
JavaNIO-Socket
参考文献
非阻塞 vs 阻塞
阻塞
阻塞模式下,相关方法都会导致线程暂停
ServerSocketChannel.accept 会在没有连接建立时让线程暂停
SocketChannel.read 会在没有数据可读时让线程暂停
阻塞的表现其实就是线程暂停了,暂停期间不会占用 cpu,但线程相当于闲置
单线程下,阻塞方法之间相互影响,几乎不能正常工作,需要多线程支持
但多线程下,有新的问题,体现在以下方面
32 位 jvm一个线程 320k,64 位 jvm 一个线程1024k,如果连接数过多,必然导致 OOM,并且线程太多,反而会因为频繁上下文切换导致性能降低
可以采用线程池技术来减少线程数和线程上下文切换,但治标不治本,如果有很多连接建立,但长时间inactive,会阻塞线程池中所有线程,因此不适合长连接,只适合短连接.
服务器端
123456789101112131415161718192021222324252627// 使用 nio 来理解阻塞模式, 单线程// 0. ByteBufferByteBuffer buffer = ByteBuffer.allocat ...
JavaNIO-ByteBuffer
参考文献
黑马Netty
Buffer(缓冲区)
Buffer是一个对象,它包含一些要写入或者要读出的数据.在面向流的I/O中,可以将数据直接写入或者将数据直接读到Stream对象中.
在NIO库中,所有数据都是用缓冲区处理的.在读取数据时,它是直接读到缓冲区中的;在写入数据时,写入到缓冲区中.任何时候访问NIO中的数据,都是通过缓冲区进行操作.
缓冲区实质上是一个数组.通常它是一个字节数组(ByteBuffer),也可以使用其他种类的数组.但是缓冲区不仅仅是一个数组,缓冲区提供了对数据的结构化访问以及维护读写位置(limit)等信息.
最常用的缓冲区是ByteBuffer,一个ByteBuffer提供了一组功能用于操作byte数组.除了ByteBuffer,还有其他的一些缓冲区,事实上,每一种Java基本类型(除了Boolean类型),都有与之对应的缓冲区:
类型
说明
ByteBuffer
字节缓冲区
CharBuffer
字符缓冲区
ShortBuffer
短整形缓冲区
IntBuffer
整形缓冲区
LongBuffer
长整型 ...
Java日志框架
参考文献
SLF4J user manual
Slf4j
简单使用
12slf4j-api-${version}.jarslf4j-simple-${version}.jar
12345678910<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>${slf4j.version}</version> ...
JDK8特性-新的日期和时间API
参考文献
Convert between Date to LocalDateTime
旧的日期和时间API的缺点
Date类的缺点
Date类中的大多数方法都已经过时,因为它们不是线程安全的,而且有一些设计缺陷.
Date类中的时间表示是基于1970年1月1日的毫秒数,这种表示方式不太方便处理日期和时间.
Calendar类的缺点
Calendar类不是线程安全的,如果多个线程同时访问一个Calendar实例,可能会导致不可预测的结果.
Calendar类中的月份是从0开始计数的,这种设计很容易导致错误.
Calendar类中的方法名不够直观,比如要设置月份要使用set(Calendar.MONTH, month),而不是setMonth(month).
DateFormat类的缺点
DateFormat类不是线程安全的,如果多个线程同时访问一个DateFormat实例,可能会导致不可预测的结果.
DateFormat类中的解析和格式化方法都很慢,因为它们需要进行字符串和日期之间的转换.
新的日期和时间API
java.time包的类
123456789101112 ...
MySQL-各个版本的特性
[TOC]
MySQL各个版本的特性
MySQL 3.23
基本的SQL功能
ISAM和MyISAM存储引擎
BDB存储引擎
全文搜索
大文件支持
基本的权限管理
客户端/服务器通信协议
基本的查询优化与缓存
基本的表锁
窗口函数(部分)
MySQL 4.0
InnoDB存储引擎
ACID事务支持
行级锁定
外键约束
查询缓存
压缩协议
大文件支持(更大的文件尺寸)
多表更新与删除
子查询
高效的嵌套查询处理
MySQL 5.0
存储过程与函数
触发器
视图
游标
分区表
插件式存储引擎架构
INFORMATION_SCHEMA数据库
XA分布式事务
在线DDL
日志查询
MySQL 5.5
性能模式
信号处理
分区功能改进
InnoDB插件
语义表分析
语句摘要
度量单位转换
数字类型转换
新的字符集与排序规则
改进的查询优化器
MySQL 5.6
全文搜索改进
备份锁定
优化器跟踪
改进的InnoDB性能
多线程复制
MEMCACHED API支持
NoSQL接口
子查询优化
时间和日期函数改进
字符集和排序规则改进
MySQL 5.7
JSON数据类型
虚拟 ...
SpringBoot-SpringBoot项目启动流程分析
参考文献
SpringBoot源码分析(二)启动类流程
启动流程
基于SpringBoot 2.7.x
构造函数
123456789101112131415161718192021222324252627282930313233343536373839public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { // 设置资源加载器 this.resourceLoader = resourceLoader; Assert.notNull(primarySources, "PrimarySources must not be null"); // 初始化加载资源类集合并去重 // 将启动类设置为属性存入primarySources (设置要加载的基础资源) this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources)); // TODO ...