select、poll、epoll的原理与区别

IO复用select、poll、epoll都是IO复用的基本实现,select出现的最后,之后是poll,再是epoll。 Select我们使用select就可以实现同时处理多个网络连接的IO请求,基本原理就是程序调用select,然后整个程序就进入阻塞状态,这个时候,kernel内核就会轮询检查所有select负责的文件描述符fd,当找到其中哪个数据准备好了文件描述符,会返回给select,select通知系统调用,将数据从内核复制到进程的缓存区。

再读Sping源码一

ApplicationContext的创建过程在之前,我已经写过一篇关于BeanFactory的文章。但是在实际开发中,直接使用BeanFactory的场景还是比较少的,更多的时候是使用ApplicationContext。 那么下面我们就从ApplicationContext context=new ClassPathXmlApplicationContext("beanFactoryTest.xml");来探究ApplicationContext是如何启动的。 1234567891011121314151617public ClassPathXmlApplicationContext(String configLocation) throws BeansException { this(new String[] {configLocation}, true, null);}public ClassPathXmlApplicationContext( String[] configLocations, boolean refresh, @Nullable ApplicationContext parent) throws BeansException { super(parent); setConfigLocations(configLocations); if (refresh) { refresh(); }}

JDK8新特性详解

JDK8新特性详解JDK8主要引入了这些新特性: 接口的默认实现 Lambda表达式 函数式接口 方法与构造函数引用 内置了许多函数式接口 Stream流

ThreadLocal源码分析

ThreadLocal是什么?ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。这里有几点需要注意: 因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal 命名的由来。 既然每个 Thread 有自己的实例副本,且其它 Thread不可访问,那就不存在多线程间共享的问题。

Netty启动流程分析

示例代码我们就以下面这段代码为例,来分析一个Netty是如何启动的。 123456789101112131415161718192021222324252627282930313233343536public class HttpServer { public static void main(String[] args) throws InterruptedException { //负责接收客户端连接 EventLoopGroup bossGroup = new NioEventLoopGroup(1); //负责网络读写 EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(bossGroup,workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { ChannelPipeline pipeline = socketChannel.pipeline(); //http编解码器 pipeline.addLast(new HttpServerCodec()); //自定义的handler pipeline.addLast(new HttpServerHandler()); } }); final ChannelFuture future = bootstrap.bind(3333).sync(); future.channel().closeFuture().sync(); }finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }} 这段代码我们首先创建了两个EventLoopGroup。然后创建了ServerBootstrap并设置设置了一系列的属性。然后调用了bind方法完成了服务器的启动。所以要分析Netty服务端的启动过程就需要从bind方法入手。

Dubbo之SPI

什么是SPI?SPI全称是Service Provider Interface,是一种服务发现机制。SPI的本质是将接口的实现类的全限定名配置在文件中,并由服务加载器读取配置文件,完成类的加载。这样可以在运行是,动态为接口替换实现类。通过SPI机制,可以为程序提供拓展功能。

Dubbo基础

为什么需要Dubbo?在最初服务之间是通过配置URL地址进行调用的。通过硬件来做负载均衡。 随着服务越来越多,服务URL配置管理变得非常困难。负载均衡的单点压力也越来越大。 服务之间的依赖关系也越来越复杂,描述应用的架构关系困难。 随着服务的调用的增加,管理服务的容量就变得困难。 Dubbo就是为了解决这些问题而产生的。

深入理解TCP协议

什么是TCP协议?TCP协议是一种面向连接的、可靠的字节流服务,它是一种传输层协议,它会使用网络层协议IP协议。 TCP协议是如何保证可靠传输的 序列号 校验和 确认应答机制 连接管理 重发控制 流露控制 阻塞控制 TCP协议的首部是怎样的?TCP数据被封装在一个IP数据报中。由TCP传递给IP的信息单位称为报文端或段(segment)标记比特介绍:URG:紧急指针有效ACK:确认需要有效PSH:接收方应该尽快将这个报文段交给应用层。RST:重建连接SYN:同步序号用来发起一个连接。FIN:发送端完成发送任务。

Netty学习笔记二

什么是TCP粘包和拆包?TCP是一个“流”协议,所谓流就是没有界限的一串数据。TCP协议会根据TCP缓冲区的实际情况对包进行划分,所以业务上的一个包,可能被TCP拆分为多个包发送(拆包),多个小的包也可能被TCP合并为一个包进行发送(粘包)。 TCP粘包和拆包发生的原因原因有三个: 应用程序write写入的字节大小大于套接字缓冲区的大小 进行MSS(maximum segment size,最大分节大小,为TCP数据包每次传输的最大数据分段大小)大小的TCP分段 以太帧的payload大于MTU(maximum transmission unit,最大传输单元,由硬件规定)进行IP分片

Netty学习笔记一

Netty是是什么?Netty是基于NIO的客户,服务器端的编程框架,它提供了异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠的网络服务器和客户端程序。 Netty有什么特点?

13456713