自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

流的博客

spring全家桶/分布式/hadoop生态

  • 博客(311)
  • 收藏
  • 关注

原创 Spring Boot2.0版本源码(八):Spring Boot的注解的解析出Bean之整体流程

里面有一个BeanDefinitionRegistryPostProcessor的实现类ConfigurationClassPostProcessor,它的postProcessBeanDefinitionRegistry()方法如下,其调用了processConfigBeanDefinitions()方法进入该方法 /** * Build and validate a configu...

2020-04-23 10:53:09 107

原创 Netty源码(十五):Recycler工具类

1. Recycler工具类的使用Recycler为了避免我们重复的创建对象,使用对象池将我们使用过的数据保存起来,下一次就可以拿出来使用public class TestRecycler { // 对象池 private static final Recycler<User> RECYCLER = new Recycler<User>() { ...

2020-04-17 13:22:55 86

原创 rabbitmq(三):100%投递、幂等性、confirm和return、消费端限流、重回队列、TTL、死信队列

rabbitmq消息的完全投递、幂等性、重复消费、Confirm和Return消息、自定义消费者、消息ACK和重回队列、消息的限流、TTL消息、死信队列1.消息如何保证100%投递同时做到下面四点可以保证消息可靠性的。完善的消息进行补偿机制:当消息产生特殊情况进行处理,如:消息没有成功发出或者确认应答超时。解决方案:(1)消息落库:将消息的投递、发送中、和已经收状态进行打标,将消息目前...

2020-01-12 16:09:50 190

原创 关于分布式事务:两阶段提交,TCC和tx-lcn框架

1. 分布式事务出现的场景当北京得数据库向上海的数据库转移数据时,怎么保证转账的事务性?这就出现了分布式事务的问题。2. 2PC下面就是两阶段提交的过程:第一阶段:事务管理器要求每个涉及到事务的数据库预提交(precommit)此操作,并反映是否可以提交.第二阶段:事务协调器要求每个数据库提交数据,或者回滚数据。缺点:单点问题:事务管理器在整个流程中扮演的角色很关键,如果其宕机...

2020-01-10 13:46:53 1131 1

原创 散列算法: MD5,SHA-2,彩虹表

1.散列算法哈希算法主要有MD4、MD5、SHA。MD4 1990年 输出128位 (已经不安全)MD5 1991年 输出128位 (已经不安全)SHA-0 1993年 输出160位 (发布之后很快就被NSA撤回,是SHA-1的前身)SHA-1 1995年 输出160位 (已经不安全)SHA-2包括SHA-224、SHA-256、SHA-384,和 SHA-512,分别输出224、25...

2019-10-22 16:20:30 412

原创 设计模式(七): 单例模式(懒汉、饿汉、静态内部类、双重检验锁、枚举、序列化反序列化、反射攻击、容器单例)

1. 定义优点缺点特性:(1)私有构造函数(2)线程安全(3)延迟加载(4)序列化和反序列化(5)反射攻击2. 懒汉模式多线程创建:主函数直接调用开启线程调试:类型设置为Thread开始调试:thread0thread1直接往下走,生成两个对象。3. 双重检验锁...

2019-10-17 20:34:52 122

原创 mysql(九): innoDB各种锁机制(解释普通索引和唯一索引锁算法的区别)

1.各种锁机制2 加锁机制乐观锁:假定大概率不会发生并发更新冲突,访问、处理数据过程中不加锁,只在更新数据时再根据版本号或时间戳判断是否有冲突,有则处理,无则提交事务;悲观锁:假定大概率会发生并发更新冲突,访问、处理数据前就加排他锁,在整个数据处理过程中锁定数据,事务提交或回滚后才释放锁;3 锁粒度关于全局锁、行锁、表锁和死锁: https://blog.csdn.net/qq_356...

2019-10-06 17:12:42 1055

原创 关于为什么ReentrantLock不是乐观锁的一些猜想

1.众所周知,ReentrantLock是一个悲观锁,但是查看源码,发现底层实现使用的是compareAndSet相关方法实现的,于是产生疑问:为什么ReentrantLock使用的和CAS一样的compareAndSet相关的方法实现的,CAS确实乐观锁,ReentrantLock却是悲观锁?猜想一:仔细看代码发现ReentrantLock使用了setExclusiveOwnerThread...

2019-09-23 20:47:23 4187

原创 从servlet到mvc框架的演变

1 提出问题在我学习servlet以后直接上手springmvc等框架会感觉这更本就是两个系统,不清楚其中的区别。下面我们一一解决这些疑惑。2 IOC2.1 注解在目前的spring框架中,大量的注解,下面是一个@Service注解的声明定义的实现方式:2.2 获取注解类然后们就可以通过反射的方式获取到@Service注解的类。其他的列如:@Bean,@Action,@Contr...

2019-06-11 16:56:50 582

原创 zookeeper中的从选paxos和fast paxos算法到实现分布式锁和分布式队列

1.paxos算法为什么需要paxos相关概念:Paxos算法是基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一,其解决的问题就是在分布式系统中如何就某个值(决议)达成一致。解释为什么需要paxos锁:zookeeper需要同时对某一个节点进行某种操作,为了达成这种操作我们需要使用一个分布式算法来制定一种规则来制约,使所有节点的意见统一,于是就产生...

2019-04-23 20:54:26 100

原创 hadoop中mapreduce的shuffle过程详细解释

1.mapreduce整体执行流程input – split切片 – map – map shuffle – 分成多个partition – reduce shuffle – reduce拉去对应的partition到相应的reduce上 – reduce2.map shufflepartition而可以通过自定义partitoner实现自定义分区,是缓解数据倾斜的一种手段。pu...

2019-04-20 19:38:28 738

原创 spark操作hbase详细讲解

1.java API实现对hbase的操作package testhbase;import java.util.ArrayList;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.Cell;import org.apache.hadoop.hbase.CellUtil;import...

2019-04-14 15:47:45 5318

原创 Spring Boot2.0版本源码(十):Spring Boot的Start的解析之starter原理解析

之前的章节中讲过Spring Boot2.0版本源码(九):Spring Boot的Servlet容器Tomcat工厂类的加载,这个章节中有讲解@EnableAutoConfiguration注解实现对starter的自动注入的过程,会在在AutoConfigurationImportSelector类的getAutoConfigurationEntry()方法内执行解析@EnableAutoCo...

2020-04-30 15:01:01 117

原创 Spring Boot2.0版本源码(十):Spring Boot的Start的解析之自定义starter

start是一个可插拔的插件,如果是直接引入一个jar,还需要将jar中的数据注入到spring boot当中才可以使用,springboot starer可以自定注入下面我们就自定义一个starter...

2020-04-30 14:18:33 148

原创 Spring Boot2.0版本源码(十):Spring Boot的Start的解析之@Conditional注解

@Conditional注解是根据我们的条件来判断是否需要注入某个bean@ConditionalOnBean表示是否存在某个bean@ConditionalOnMissingBean表示不存在bean@ConditionalOnClass表示是否存在某个类@ConditionalOnMissingClass表示不存在某个类@ConditionalOnWebApplication表示是...

2020-04-29 16:03:09 99

原创 Spring Boot2.0版本源码(九):Spring Boot的Servlet容器个性化参数配置原理

我们可以在application.properties文件中写入server.port=9000使得我们的tomcat容器启动的时候,会在9000端口。我们之前讲解bean的注入的过程中Spring Boot2.0版本源码(五):Spring Boot的Bean的解析之bean的实例化过程讲解过,我们会调用AbstractAutowireCapableBeanFactory的applyBean...

2020-04-28 21:00:16 85

原创 Spring Boot2.0版本源码(九):Spring Boot的Servlet容器Tomcat工厂类的加载

11

2020-04-27 19:16:59 111

原创 Spring Boot2.0版本源码(九):Spring Boot的Servlet容器启动解析整体流程

下面是tomcat的容器架构tomcat处理请求

2020-04-24 14:49:10 81

原创 Spring Boot2.0版本源码(八):Spring Boot的注解的解析出Bean之核心方法

在上一篇博客Spring Boot2.0版本源码(八):Spring Boot的注解的解析出Bean之整体流程,我们知道里面解析各种注解使用的是ConfigurationClassParser解析器的parse(candidates)这个方法,完成对待处理的各种注解进行处理。/** * Apply processing and build a complete {@link Configur...

2020-04-23 16:27:56 88

原创 Spring Boot2.0版本源码(七):Spring Boot的属性配置解析

使用:指定配置文件配置文件中配置属性实现CommandLineRunner, EnvironmentAware接口即可运行程序,打印环境属性:下面是常见的spring ware

2020-04-22 15:33:03 111

原创 Spring Boot2.0版本源码(六):Spring Boot的启动加载器

自定义启动加载器实现ApplicationRunner接口,重写run()方法即可SpringApplication.run()方法中有一个callRunners(context, applicationArguments);就是在springboot运行时调用启动加载器的地方/** * Run the Spring application, creating and refreshi...

2020-04-21 20:37:30 90

原创 Spring Boot2.0版本源码(五):Spring Boot的Bean的解析之bean的实例化过程

大致介绍了一下bean实例化重要步骤:/** * Return an instance, which may be shared or independent, of the specified bean. * @param name the name of the bean to retrieve * @param requiredType the required type of...

2020-04-21 15:58:15 185

原创 Spring Boot2.0版本源码(四):Spring Boot的Bean的解析之refresh()方法

1. IOC思想使用一个IOC去管理抽象bean的初始化,下面就是用一个@autowired注解完成animal的初始化,他可能是Dog也可能是Cat,我们无需关心它使用的是哪一个实现。以此降低类之间的耦合性。下面是注入bean的五种方式2. refresh()方法看到SpringApplication的run()方法中会使用调用refreshContext(context);实现re...

2020-04-21 14:57:21 117

原创 Spring Boot2.0版本源码(三):Spring Boot监听器的实现

1. 介绍监听器的组成部分springboot的监听器都是通过ApplicationListener实现的类完成对监听事件的处理的,看得出来,所有的监听事件都是ApplicationEventApplicationEventMulticaster就是管理这些监听器的多播器,里面用一个集合存储了所有的ApplicationListener的实现类,可以实现增加一个监听器,删除一个监听器,和执行...

2020-04-20 14:51:06 101

原创 Spring Boot2.0版本源码(二):Spring Boot初始化器

1. 系统初始化器通过ApplicationContextInitializer类可以实现在springboot容器刷新之前注册属性2. 演示FirstInitializer类实现ApplicationContextInitializer接口,重写其中的initialize方法,可以通过下面的代码,向springboot中注入map.put("key1", "value1");这样的键值对...

2020-04-20 12:06:13 106

原创 Spring Boot2.0版本源码(一):Spring Boot启动整体流程预览

1. 项目启动1.框架初始化,也就是new Application()的过程2.框架启动,也就是new Application(),run()方法执行3.自动装配2.框架初始化1.配置资源加载器:用于加载resource等文件2.配置primarysources:一般是启动类3.环境监测:一般分为三种环境,标准环境、web环境、active环境(springboot2特性)3. ...

2020-04-18 16:24:12 111

原创 Netty源码(十四):FastThreadLocal工具类

1. 写一个程序来验证FastThreadLocal功能public class TestFastThreadLocal { // FastThreadLocal初始化 public static FastThreadLocal<Object> fastThreadLocal1 = new FastThreadLocal<Object>(){ ...

2020-04-16 19:57:34 54

原创 Netty源码(十三):关闭服务

关闭流程:包括了bossGroup和workGroup的关闭开始源码,按照下面的方式完成操作,启动EchoServer1. 进入workerGroup.shutdownGracefully();不断跟进源码,进入到了SingleThreadEventExecutor的shutdownGracefully(long quietPeriod, long timeout, TimeUnit ...

2020-04-15 20:48:35 81

原创 Netty源码(十二):断开连接

1.正常关闭的逻辑关闭连接会进入read状态为了直接观察到关闭操作,我们注释上面的代码关闭最后也会进入到read事件里面1.allocHandle.lastBytesRead() <= 0这一行会发现数据小于零,释放byteBuf2.进入到closeOnRead(pipeline);完成关闭事件 @Override public final void re...

2020-04-15 19:15:31 92

原创 Netty源码(十一):写数据

write是把数据写入到一个buffer。flush就是将数据发出去。writeAndFlush就是写入数据立马发出去。下面是拿快递和写数据的对比:发送数据分为三部分:1.unflushedEntry所指向的entry,每次向链表中添加数据写到链表尾部2.写好一份完整的数据以后就将unflushedEntry这个头结点变成flushedEntry3.最后写入数据就是从flushe...

2020-04-15 16:36:40 99

原创 Netty源码(十):业务处理的过程pipeline

根据上一次接收数据逻辑的学习,可以总结下面的流程,红色就是我们学习的地方。pipeline,下面以inbound和outbound为例。pipeline本质就是一个链表,有head和tail,中间是很多个context,每个context中包含了需要执行的handler。可以看出inbound执行handle的顺序和outbound相反。打断点到EventLoop的读取数据的部分依然会...

2020-04-15 14:24:47 78

原创 Netty源码(九):接收数据

整体流程也是在EvenetLoop的run方法中select到了read事件,开始处理read事件。进入AbstractNioByteChannel类,调用其中的read方法 @Override public final void read() { final ChannelConfig config = config(); ...

2020-04-15 13:36:47 67

原创 Netty源码(八):建立连接请求的过程

在NioEventLoop中有一个run方法是处理接受请求的部分run方法循环监听事件,里面做了两件事情:1.select阻塞操作2.监听到事件以后处理事件// 死循环监听处理事件 @Override protected void run() { int selectCnt = 0; for (;;) { try {...

2020-04-14 21:15:53 161

原创 Netty源码(七):启动源码

1. 主线our thread就是我们自己写的netty服务器的主线程的代码2. 启动在下面三处打上断点2.1 selector初始化是在NioEventLoopGroup初始化运行程序:发现,查看NioEventLoopGroup通过创建一个子的NioEventLoopGroup,然后子的NioEventLoopGroup又NioEventLoop,并完成selector的创建...

2020-04-14 19:09:02 83

原创 Netty源码(六):Netty的内存

1. 内存分配方式可以通过下面代码实现内存分配是采用pooled还是unpooled方式,pooled可以增加对内存的使用反复使用下面试netty默认的内存分配方式不断跟进ByteBufAllocator.DEFAULT里面的代码,发现如下代码,可以看出内存的分配默认还是pooled的方式1.1 PooledDirectByteBuf对象池的使用...

2020-04-14 15:23:55 68

原创 Netty源码(五):keepalive和Idle处理

1.keepalive和Idle检测keepalive机制:如果对方突然无响应,我们需要发送一个探测帧去查看对方是是否下线。Idle检测:如果你发送数据给对方,对方无响应,你会等一段时间(Idle检测),如果对方无响应,你就会发送心跳包(Idle检测)2. 两种设置keepalive的方式下面两行代码都可以开启keepalive模式,keepalive模式默认是关闭的跟进childOp...

2020-04-13 20:12:09 253

原创 Netty源码(四):Netty的“二次解码器”MessageToMessageDecoder

1. 二次解码器如果说封装成帧是一次解码器,那么二次解码器就是将byte流转化成java对象等。一次解码器和二次解码器的区别,区别一次解码器,而不是将两个两个解码器合二为一主要是因为考虑到分层的思想。如果有一天protobuf协议变成json协议,代码耦合度高,修改代码量大。2. ObjectEncoder如何实现编码的进入源码如图所示的包路径,第48行就是编码的核心方式,看得出来使用...

2020-04-13 15:53:59 178

原创 Netty源码(三):Netty的粘包问题ByteToMessageDecoder

1. 产生粘包和半包的原因粘包产生的原因:两个包小于缓存区的大小,传送数据会将两个包都放在缓冲区中一起发送,就会产生粘包的问题。半包产生的原因:当某一个包的大于缓冲区的大小,会被发送多次,每次就收到的就是一个不完整的数据包。常见的处理手段:netty对不同粘包半包问题的支持类2. 问题一:Netty如何实现编码解码的查看ByteToMessageDecoder,该类是解码器的实现类...

2020-04-12 21:16:21 98

原创 Netty源码(二):三种Reactor模式

1. Reactor模型1.1 单线程reactor一个单线程去维护所有的acceptor、read、decode、compute、encode、send。1.2 多线程reactor模型我们认为decode、read、compute比较耗时,使用一个线程池去管理。1.3 主从多线程模型上面有两个reactor,因为所有事件里面acceptor最重要,用一个单独的reactor去...

2020-04-12 19:49:23 113

原创 Netty源码(一):OIO和NIO两种模式的切换方式

本项目源码使用的是netty4.11.修改IO模式对应的使用除了修改两个EventLoopGroup类型之外,我们想要修改IO模式,实现对OIO/NIO之间的切换只需要使用如下图所示的channel()方法。跟进channel()方法,我们发现IO模式切换使用的是一个ReflectiveChannelFactory()这个反射工厂实现的。跟进ReflectiveChannelFacto...

2020-04-09 20:01:01 191

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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