自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

A minor

菩提本无树,明镜亦非台。本来无一物,何处惹尘埃

  • 博客(88)
  • 资源 (1)
  • 收藏
  • 关注

转载 【Netty】原理分析:ChannelPipeline(转)

原文链接:https://blog.csdn.net/zxhoo/article/details/17264263。本文对部分内容进行了重新排版ChannelPipeline 实际上应该叫做 ChannelHandlerPipeline,可以把 ChannelPipeline 看成是一个 ChandlerHandler 的链表。当需要对 Channel 进行某种处理的时候,Pipeline 负责依次调用每一个 Handler 进行处理。每个 Channel 都有一个属于自己的 Pipeline,调用 .

2020-12-31 14:36:45 1162

原创 【Netty】高阶使用:自定义编解码器

当你通过 Netty 发送或者接受一个消息的时候,就将会发生一次数据转换入站时 – 消息被解码(Decode):从字节(二进制)转换为我们能读懂并操作的格式(int、String、Java对象…)出站时 – 消息被编码(Encode):从我们能读懂并操作的格式的形式(int、String、Java对象…)转换为字节形式(二进制)Netty 提供了一系列实用的编码解码器,比如编解码字符串的 StringEncoder 和 StringDecoder,编解码对象的 ObjectEncoder 和Obj

2020-12-31 02:50:52 3883

原创 【Netty】高阶使用:粘包问题分析,实现自定义协议拆包

TCP 粘包拆包是指发送方发送的若干包数据到接收方接收时粘成一包或某个数据包被拆开接收。如下图所示,Client 发了两个数据包 D1和 D2,但是 erver 端可能会收到如下几种情况的数据。为什么出现粘包现象?TCP 是面向连接的,面向流的,提供高可靠性服务。 收发两端(客户端和服务器端)都要有成对的 Socket,因此, 发送端为了将多个发给接收端的包,更有效的发给对方,使用了优化方法(Nagle 算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。 这样做虽然提高了效率

2020-12-31 00:12:42 2165

原创 【Netty】原理分析:ChannelHandler

ChannelPipelineChannel 就跟 BIO 中流(Stream) 一样是用来传输数据的,每一个客户端都会有一个 Channel;而每个 Channel 都包含了一个管道 ChannelPipeline;ChannelPipeline 提供了 ChannelHandler 的容器,可以理解成一个双向链表。public class NettyServerInitailizer extends ChannelInitializer<SocketChannel> { @Ov

2020-12-30 19:58:12 2827 2

原创 【Netty】Socket 编程(C/S):基于Netty的Server、Client示例(简单注释)

首先引入 Netty 的依赖<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.36.Final</version></dependency>Serverpublic class NettyServer { public static vo

2020-12-30 16:41:29 6489 4

原创 【Netty】Socket 编程(B/S):基于Netty手写Tomcat

既然要手写tomcat,那么从哪里入手呢?我们都知道tomcat是web容器,所以如果理解了tomcat的作用,我们应该就知道如何设计它了:tomcat要负责接受http请求,所以需要一个 MYRequesttomcat要负责返回响应,所以需要一个 MYResponsetomcat要负责实例化Servlet,所以需要一个 MYServlet 规范那这三者如何统一起来呢,或者说谁来处理映射关系呢?配置文件 + MYTomcat。1.MYRequestRequest 本质就是 InputStre

2020-12-30 01:22:06 905

原创 【Tomcat】第九篇:使用 Netty 重构之前手写的 Tomcat

在上一篇【Tomcat】第八篇:150代码手写Tomcat(基于BIO,超详细注释) 我们一步一步的分析了自己手写一个 Tomcat 的思路,说到底 Tomcat 底层就是做的网络 IO 操作MYRequest:读取 web 端发来的请求MYTomcat:调用 Servlet 对象中的方法去处理请求MYResponse:对处理结果编码编码并写回给 web 端PS:Servlet 可以理解成一种规范,它定义了我们如何写处理请求的方法,然后 Tomcat 在初始化时会实例化 Servlet 对象(

2020-12-30 00:32:13 1330

原创 【Netty】Socket 编程(C/S):基于Netty的Server、Client示例(详细注释)

1.依赖及注释1.1 依赖<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.36.Final</version></dependency>1.2 注释代码public void run() throws Exception{ //Group:群

2020-12-29 23:22:26 632 1

原创 【Netty】特性分析及核心组件介绍

NIO 的类库和 API 繁杂, 使用麻烦,需要熟练掌握 Selector、 ServerSocketChannel、 SocketChannel、 ByteBuffer等。 并且开发工作量和难度都非常大,例如客户端面临断连重连、 网络闪断、心跳处理、半包读写、 网络拥塞和异常流的处理等等。Netty 对 JDK 自带的 NIO 的 API 进行了良好的封装,解决了上述问题。按照定义来说,Netty 是一个异步、事件驱动的用来做高性能、高可靠性的网络应用框架。主要的优点有:框架设计优雅,底层模型随

2020-12-29 00:54:16 2046 2

原创 【NIO】源码:基于 Windows 系统的 NIO 源码分析

首先来看一段使用 NIO 创建编写 Server 的代码:public void start() throws IOException { // 1.打开服务器套接字通道 ServerSocketChannel ssc = ServerSocketChannel.open(); // 必须配置为非阻塞,该Channel才能往selector上注册,否则会报错,selector模式本身就是非阻塞模式 ssc.configureBlockin

2020-12-28 22:10:07 1353

原创 【BIO】Socket 编程:记曾经做过的课设(字典破解密码,附全部实验代码)

字典破解密码:设计一个信息系统,该系统可为学籍管理系统、订餐系统、票务管理系统不限, 系统必须通过客户端录入账号口令远程登录;系统内至少包含三个以上账号,密码为 6 位以上任意字符组成;设计程序设计程序在该系统所在服务器端进行字典密码破解,破解后将账号密码通过套 接字发送出去;字典举例: 当前账号信息:user:1234567字典:0000000011111111112345676666666666Aaaaaaaa1234567为了破解用户名 user 的密码,将字典文件和密码进

2020-12-28 01:09:40 1629 3

原创 【IO】Java 的 BIO、NIO 区别对比

1.两个概念1.1 阻塞(Block) & 非阻塞(Non-Block)阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候。阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。阻塞与非阻塞是相对于状态而言,阻塞存在等待状态1.2 同步(Synchronization) & 异步(Async

2020-12-27 23:39:29 1869 1

原创 【AIO】Socket 编程:基于AIO的Server、Client 示例

4.AIO(NIO2)4.1 AIO基本原理AIO(Asynchronous IO):jdk1.7 (NIO2)才是实现真正的异步 AIO、把IO 读写操作完全交给操作系统,学习了linux epoll 模式服务端:AsynchronousServerSocketChannel客服端:AsynchronousSocketChannel用户处理器:CompletionHandler 接口,这个接口实现应用程序向操作系统发起IO 请求,当完成后处理具体逻辑,否则做自己该做的事情,“真正”的异步I

2020-12-27 21:55:32 2572 1

转载 【IO】IO多路复用实现:select、poll、epoll(转)

原文链接:https://blog.csdn.net/qq_16399991/article/details/100377183?utm_source=appselect,poll,epoll 都是IO多路复用的机制。I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则.

2020-12-27 21:04:01 864

原创 【IO】IO设计模式:TPR模式,Reactor模式、Proactor模式

1.TRP模式传统的 Server/Client 模式会基于TPR(Thread per Request),服务器会为每个客户端请求建立一个线程,由该线程单独负责处理一个客户请求。这种模式虽然处理起来简单方便,但是由于服务器为每个 client 的连接都采用一个线程去处理,使得资源占用非常大。当客户端多时,会创建大量的处理线程。且每个线程都要占用栈空间和一些CPU 时间;另外,阻塞可能带来频繁的上下文切换,且大部分上下文切换可能是无意义的。所以服务器会增加很多没必要的开销。因此,为了解决这种一个线程

2020-12-27 20:41:22 2157

原创 【IO】IO模型:Linux下的五种IO模型

Linux 提供了五种 IO 模型,包括:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO。在unix操作系统中,一个IO操作主要经过两个阶段:1、等待数据准备;2、将数据从内核空间拷贝到用户进程中。示意图如下:1.阻塞 IO 模型Linux操作系统中,这就是一种最简单的IO模型,即阻塞IO。一般表现为进程或线程等待某个条件,如果条件不满足,则一直等下去。条件满足,则进行下一步操作。当用户线程发出 IO 请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于

2020-12-27 02:40:13 1614 2

原创 【IO】Java 中的 BIO、NIO、AIO

1.1 阻塞(Block) & 非阻塞(Non-Block)阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候。阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。阻塞与非阻塞是相对于状态而言,阻塞存在等待状态1.2 同步(Synchronization) & 异步(Asynchronous

2020-12-26 17:18:55 1081

原创 【BIO】Socket 编程:基于BIO的Server、Client 示例

Serverpublic class Server { public static void main(String[] args) throws Exception { ServerSocket server = new ServerSocket(8000); System.out.println("Server started..."); // while(true) 持续接收请求 while(true) {

2020-12-25 17:31:19 1642

原创 【NIO】Socket 编程:基于NIO的Server、Client 示例

1.Serverpublic class Server { private Selector selector; private ByteBuffer readBuffer = ByteBuffer.allocate(1024); // 调整缓存的大小可以看到打印输出的变化 private ByteBuffer sendBuffer = ByteBuffer.allocate(1024); // 调整缓存的大小可以看到打印输出的变化 String str;

2020-12-24 23:27:17 2134

原创 【NIO】小结:Buffer、Channel、Selector 关系

文件IO:BIO:读/写(人) --> 文件(终点)NIO:读/写(人) --> Buffer(车) ==> Channel(高速路) --> 文件(终点)=> TPR模式:一个连接对应一个线程–> TRP模型的根本原因是线程会出现阻塞–> 阻塞的原因是不确定性,即该连接要占用该线程多久,那么就会傻傻等待客户端的指令(注:实际的读写时间很短,可以忽略不计)==> 那可不可以在事件确定的前提下,采用一种单线程的轮询机制什么事件?四种事件

2020-12-24 01:28:51 1192 1

原创 【NIO】Selector:API 及使用实例

1.传统TRP模式传统的 Server/Client 模式会基于TPR(Thread per Request),服务器会为每个客户端请求建立一个线程,由该线程单独负责处理一个客户请求。这种模式带来的问题也很明显,当客户端多时,会创建大量的处理线程。且每个线程都要占用栈空间和一些CPU 时间;另外,阻塞可能带来频繁的上下文切换,且大部分上下文切换可能是无意义的。所以服务器会增加很多没必要的开销。后来,为了减少线程频繁创建、切换、销毁带来的性能消耗,我们引入了线程池模型,并根据流量设置线程池线程的最大数

2020-12-24 01:14:44 1589

原创 【NIO】Channel:管道与流,及非阻塞的Channel

通道是一个对象,起到连接作用: 读/写 ==> Buffer <=> Channel <=> File写:我们永远不会将字节直接写入通道中,相反是将数据写入包含一个或者多个字节的Buffer。读:同样不会直接从通道中读取字节,而是将数据从通道读入Buffer,再从缓冲区获取这个字节。在NIO 中,根据读取的file不同,提供了多种通道对象,而所有的通道对象都实现了 Channel 接口。public interface Channel extends Closea

2020-12-24 01:14:05 1973 1

原创 【NIO】Buffer:基本原理及高级使用

缓冲区实际上是一个容器对象,更直接的说,其实就是一个数组,在 NIO 库中,所有数据都是用缓冲区处理的。读/写 ==> Buffer,即用户的直接操作都是面向缓冲区。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,它也是写入到缓冲区中的;任何时候访问 NIO 中的数据,都是将它放到缓冲区中。PS:在面向流I/O 系统中,所有数据都是直接写入或者直接将数据读取到 Stream 对象中。在NIO 中,所有的缓冲区类型都继承于抽象类 Buffer,最常用的就是 ByteBuffer,对于 J

2020-12-23 22:08:09 1453 1

原创 【BIO】字符流、字节流 --文件读写操作示例

1File2类4对象3策略1基础:File对象是基础2类:字节流 + 字符流4接口:InputStream + OutputStream + Reader + Writer3策略:原生读写 --> 原生 + 缓冲区 --> 缓冲流1.字符流一般是用来通信与传输的1.1 ReaderFileReader -> int read()public static void main(String[] args) throws IOException { File.

2020-12-23 19:26:16 619

原创 【MyBatis】手写简易ORM框架(仿MyBatis)

MYSqlSession/** * 最核心对象,对外基础 * 1.在每次请求时创建(因为SqlSession线程不安全) * 2.SqlSession中包含了配置(Configuration)与执行器(Excutor) * Excutor:具体执行sql(Jdbc操作),被SqlSession提供的默认方法解析sql后调用 * Configuration:定制化配置,返回Mapper代理对象(MapperProxy) */public class MYSqlSession

2020-12-22 16:57:16 946 1

原创 【Spring】扩展点(二):BeanNameAware、ApplicationContextAware、BeanFactoryAware

前言:【Spring】扩展点(一):InitialingBean、DisposableBean、BeanPostProcessor、InstantiationAwareBeanPostProcessor【Spring】扩展点(二):FactoryBean、BeanFactoryPostProcessor本篇我们来看看 BeanNameAware、ApplicationContextAware、BeanFactoryAware 这三个扩展接口,把它们放在一起写是因为作用相似(PS:“Aware”.

2020-12-21 22:47:20 3366

原创 【Spring】扩展点(三):BeanPostProcessor、InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor

前言:【Spring】扩展点(一):InitialingBean、DisposableBean、BeanPostProcessor、InstantiationAwareBeanPostProcessor1.FactoryBean传统的 Spring 容器加载一个 bean 的整个过程,都是由 Spring 控制的,换句话说,开发者除了设置Bean相关属性之外,是没有太多的自主权的。FactoryBean 改变了这一点,开发者可以个性化地定制自己想要实例化出来的 Bean,方法就是实现 Factory.

2020-12-21 21:50:39 3531

原创 【Spring】扩展点(一):InitializingBean、DisposableBean

首先,什么是 Spring 的扩展点呢?IOC 容器对 bean 的管理从 BeanDefinition 的注册到实例化再到依赖注入,有自己一套默认的流程,而 Spring 预留的扩展点允许某些 bean 干预这个预设的流程。下面来看一个例子:那问题来了,什么样的码农会选择去加班(什么样的 bean 会用到扩展点)?那还用说,肯定是想拿或者已经拿了更多薪水的人啊,公司会它们做更多的事情。同理,当某个 bean 实现了 Spring 中预置的扩展接口,比如 FactoryBean,InitialingB

2020-12-21 21:49:29 2792 1

原创 【MyBatis】插件原理(二):插件实现逻辑分析

MyBatis 的插件可以在不修改原来的代码的情况下,通过拦截的方式,改变四大核心对象的行为,比如处理参数,处理SQL,处理结果。第一个问题:不修改对象的代码,怎么对对象的行为进行修改,比如说在原来的方法前面做一点事情,在原来的方法后面做一点事情?答案:大家很容易能想到用代理模式,这个也确实是MyBatis插件的原理。第二个问题:我们可以定义很多的插件,那么这种所有的插件会形成一个链路,比如我们提交一个休假申请,先是项目经理审批,然后是部门经理审批,再是HR审批,再到总经理审批,怎么实现层层的

2020-12-19 17:31:52 251

原创 【MyBatis】Spring 集成 MyBatis 及问题分析

在 【MyBatis】基本使用(一):编程式使用(单用)及核心对象生命周期 一文中我们看到了如何单独使用 mybatis,但在实际开发中我们却很少单独使用它,而是整合到 Spring 中去使用。经过前面几篇文章的分析,我们已经了解了 mybatis 的底层执行原理,认识了 mybatis 原生API 中三个核心对象:SqlSessionFactory、SqlSession、MapperProxy。【MyBatis】执行原理(一):创建会话工厂(SqlSessionFactory) --配置解析源码分

2020-12-19 17:24:50 1122 2

原创 【MyBatis】Spring集成原理(四):注入代理对象 MapperProxy

我们使用Mapper 的时候,只需要在加了Service 注解的类里面使用@Autowired注入Mapper接口就好了。@Service public class EmployeeService { @Autowired EmployeeMapper employeeMapper; public List<Employee> getAll() { return employeeMapper.selectByMap(null);

2020-12-19 03:24:03 2561 2

原创 【MyBatis】Spring集成原理(三):注册 Mapper 接口到 IOC 容器

在 Service 层可以使用@Autowired 自动注入的 Mapper 接口,需要保存在BeanFactory(比如XmlWebApplicationContext)中。也就是说接口肯定是在Spring启动的时候被扫描了,注册过的。1、 什么时候扫描的?2、 注册的时候,注册的是什么?这个决定了我们拿到的是什么实际对象。MapperScannerConfigurer.postProcessBeanDefinitionRegistry()我们在 applicationContext.xml 配置

2020-12-19 00:53:44 4397 1

原创 【MyBatis】Spring集成原理(二):创建 SqlSession

Q1:可以直接使用 DefaultSqlSession 吗?我们现在已经有一个DefaultSqlSessionFactory,按照编程式的开发过程,我们接下来就会创建一个 SqlSession 的实现类,但是在 Spring 里面,我们不是直接使用DefaultSqlSession 的,而是对它进行了一个封装,这个 SqlSession 的实现类就是SqlSessionTemplate。这个跟Spring封装其他的组件是一样的,比如JdbcTemplate,RedisTemplate等等,也是Spr

2020-12-18 21:18:41 2175

原创 【MyBatis】Spring集成原理(一):创建 SqlSessionFactory

这里我们以传统的Spring为例,因为配置更直观,在Spring中使用配置类注解是一样的。在前面的课程里面,我们基于编程式的工程已经弄清楚了MyBatis的工作流程、核心模块和底层原理。编程式的工程,也就是MyBatis的原生API里面有三个核心对象:SqlSessionFactory、SqlSession、MapperProxy。大部分时候我们不会在项目中单独使用MyBatis的工程,而是集成到Spring里面使用,但是却没有看到这三个对象在代码里面的出现。我们直接注入了一个Mapper接口,调用它的方

2020-12-18 21:13:05 1729

原创 【MyBatis】执行原理(四):Executor 执行SQL源码分析

4.执行sql由于所有的 Mapper 都是 MapperProxy 代理对象,所以任意的方法都是执行MapperProxy的invoke()方法。问题1:我们引入MapperProxy为了解决什么问题?硬编码和编译时检查问题。它需要做的事情是:根据方法查找Statement ID的问题。问题2:这里没有实现类,进入到invoke方法的时候做了什么事情?它是怎么找到我们要执行的SQL的?MapperProxy.invoke()public Object invoke(Object p

2020-12-17 18:09:19 2159 1

原创 【MyBatis】执行原理(三):获取代理对象(MapperProxy) 源码分析

3.获得代理对象现在我们已经有一个 DefaultSqlSession 了,必须找到 Mapper.xml 里面定义的Statement ID,才能执行对应的SQL语句。找到StatementID有两种方式:硬编码:直接调用session的方法,在参数里面传入Statement ID这种方式属于硬编码,我们没办法知道有多少处调用,修改起来也很麻烦。另一个问题是如果参数传入错误,在编译阶段也是不会报错的,不利于预先发现问题。Blog blog = (Blog) session.selectO

2020-12-17 17:11:13 3566

原创 【MyBatis】执行原理(二):创建会话(SqlSession) 源码分析

2.创建会话这是第二步,我们跟数据库的每一次连接,都需要创建一个会话,我们用openSession()方法来创建。DefaultSqlSessionFactory —— openSessionFromDataSource()这个会话里面,需要包含一个Executor用来执行 SQL。Executor 又要指定事务类型和执行器的类型。所以我们会先从Configuration里面拿到Enviroment,Enviroment里面就有事务工厂。创建 Transaction属性产生工厂产生事务

2020-12-16 23:06:10 1083

原创 【MyBatis】执行原理(一):创建会话工厂(SqlSessionFactory) --配置解析源码分析

1.解析配置首先我们要清楚的是配置解析的过程全部只解析了两种文件。一个是mybatis-config.xml全局配置文件。另外就是可能有很多个的Mapper.xml文件,也包括在Mapper接口类上面定义的注解。mybatis-config.xml由许多标签构成,这里我们再具体看一下这里面的标签都是怎么解析的,解析的时候做了什么// 通过SqlSessionFactoryBuilder(建造者模式,用来构建SqlSessionFactory)// 返回SqlSessionFactory(单例单例,全

2020-12-16 19:09:20 2159 1

原创 【MyBatis】架构分层及主要对象

在 MyBatis 的主要工作流程里面,不同的功能是由很多不同的类协作完成的,它们分布在 MyBatis jar 包的不同的 package 里面。我们来看一下 MyBatis 的jar包(基于3.4.6),jar包结构是这样的(21个包):跟Spring一样,MyBatis 按照功能职责的不同,所有的 package 可以分成不同的工作层次1.接口层第一个是跟客户打交道的服务员,它是用来接收程序的工作指令的,我们把它叫做接口层。接口层是我们打交道最多的。核心对象是 SqlSession,它是上

2020-12-16 15:30:28 2852

原创 【MyBatis】高级特性(三):MBG、通用Mapper、Mybatis-plus

我们在项目中使用 MyBaits 的时候,针对需要操作的一张表,需要创建实体类、Mapper 映射器、Mapper 接口,里面又有很多的字段和方法的配置,这部分的工作是非常繁琐的。而大部分时候我们对于表的操作是相同的,比如根据主键查询、根据Map查询、单条插入、批量插入、根据主键删除等等等等。当我们的表很多的时候,意味着有大量的重复工作。所以有没有一种办法,可以根据我们的表,自动生成实体类、Mapper映射器、Mapper接口,里面包含了我们需要用到的这些基本方法和SQL呢?1.MBGMyBatis也

2020-12-16 10:51:33 2232

jdk8环境(解压即用)

jdk8,解压即用。

2020-09-18

空空如也

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

TA关注的人

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