自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Springboot @Conditional条件注解原理

在Springboot里经常能看到各种以@Conditional开头的条件注解,比较常见的有@ConditionalOnClass、@ConditionalOnBean,这里看下他们的实现原理。Springboot加载bean可以简单概括为三个阶段:1、根据配置的扫描路径找到所有需要加载的类,并封装成BeanDefinition注册到Spring容器2、实例化所有注册到容器的BeanDefinition3、对已经实例化的bean进行依赖注入这是最主要的三步,在这过程中还穿插这很多的后置处理器,这些条

2021-12-22 20:30:20 578

原创 Springboot注解式缓存原理详解

文章目录生成动态代理类InfrastructureAdvisorAutoProxyCreator注册过程动态代理类生成逻辑Advisor、Pointcut、Advice选择缓存载体我们这里以redis作为缓存载体为例,在Springboot里使用redis缓存时只需要需要简单几步配置就可以:1、引入spring-boot-starter-data-redis依赖和配置2、在Springboot启动类上加上@EnableCaching 注解3、根据实际的缓存场景,在需要缓存的方法上加上相应的注解(@C

2021-12-21 15:56:44 741

原创 Springboot之@Transactional事务注解原理详解

文章目录注册事务切面逻辑根据切面逻辑生成代理类总结@Transactional注解的逻辑是通过动态代理来实现的,而生成这个动态代理类分成了两步:1、向spring容器注册事务相关的切面逻辑2、根据切面逻辑生成动态代理下面围绕这两点来看下Springboot里的实现原理注册事务切面逻辑切面逻辑里有三个概念:Pointcut:负责告诉spring容器哪个类需要增强Advise:具体的切面逻辑,这里就是根据异常进行commit或者回滚的相关逻辑Advisor:封装了Advise和Pointcut

2021-09-02 18:35:36 4961 3

原创 Netty原理简析

文章目录Netty做了什么?源码分析Server端启动过程IO写流程IO读流程总结Netty做了什么?Netty是以NIO为基础的网络通信框架,对jdk提供的的NIO的API做了很多完善和抽象,如果没有Netty我们需要搞定下面这些事:如何设计这个框架,以保证可维护性和可扩展性如何定义线程模型:哪些线程处理accept事件、哪些线程读写io、哪些线程处理业务逻辑解决jdk自带的NIO的一些bug,比如空轮训bug怎么序列化、反序列化怎么处理TCP粘包怎么做超时检测、异常重连等而Nett

2021-06-07 12:11:03 343 1

原创 Guava提供的RateLimiter限流原理以及漏桶算法和令牌桶算法

文章目录漏桶算法、令牌桶算法思路及使用场景RateLimiter实现原理SmoothBurstySmoothWarmingUp漏桶算法、令牌桶算法思路及使用场景在介绍RateLimiter之前我们先看下常说的漏桶算法和令牌桶算法,看下两种算法的思想和适用场景:漏桶算法:结合上面的图,漏桶算法就是将请求放入桶中,然后始终以一个固定的速率从桶中取出请求来处理,当桶中等待的请求数超过上限后(桶的容量固定),后续的请求就不再加入桶中,而是执行拒绝策略(比如降级)适用于需要以固定速率的场景,而在多数业务场

2021-05-14 00:05:33 2685 4

原创 线程池中使用的SynchronousQueue的offer和take原理

使用场景线程池ThreadPoolExecutor中经常使用SynchronousQueue作为阻塞队列,比如dubbo的provider的线程池默认会使用该队列,这里要先介绍下线程池ThreadPoolExecutor的逻辑,ThreadPoolExecutor的构造方法如下:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,

2021-04-29 03:16:06 2435 2

原创 Springboot整合mybatis原理

文章目录加载过程1、读取META-INF/spring.factories配置文件里需要自动装载类2、解析MybatisAutoConfiguration类里的注解信息,将需要管理的Bean注册到Spring容器2.1 注册SqlSessionFactory,并根据mapper配置文件解析出dao与具体jdbc操作、resultMap与实体类等的映射关系2.2 注册实现了CRUD操作的SqlSessionTemplate类2.3 注册AutoConfiguredMapperScannerRegistrar类

2021-04-21 10:49:02 3429 2

原创 ConcurrentHashMap的扩容方法transfer源码详解

主要细节问题:什么时候触发扩容?扩容阈值是多少?扩容时的线程安全怎么做的?其他线程怎么感知到扩容状态,从而一起进行扩容?多个线程一起扩容时,怎么拆分任务,是不是任务粒度越小越好?ConcurrentHashMap.get(key)方法是没有加锁的,怎么保证在这个扩容过程中,其他线程的get(key)方法能获取到正确的值,不出现线程安全问题?魔鬼在细节里,一起看下源码,然后回答下上面的细节问题,先看下触发扩容的代码,在往map中put新数据后会调用这个addCount(long x, int

2021-04-08 00:37:08 631 2

原创 Dubbo 请求全过程解析

文章目录1、consumer端发送请求1.1 获取Spring容器内的代理类,调用代理类对应的方法1.2 将请求的接口的元数据信息封装成Invocation并调用invoker链1.2.1 通过注册中心对象获取符合路由策略的服务提供方列表1.2.2 获取配置的负载均衡策略,默认是随机1.2.3 根据负载均衡策略选取一个服务提供者进行调用1.2.3.1 组装Request对象,设置request的id1.2.3.2 调用NettyClient发送Request,返回异步结果Future1.3 获取Future

2021-04-01 02:26:00 2129

原创 Dubbo provider在Spring中的加载过程详解

文章目录前言1、实例化ServiceBean类,填充各种配置信息,为服务暴露做准备2、监听Spring容器事件,触发DubboBootstrap的start方法3、构造invoker链,生成代理类4、开启Socket服务并发布到注册中心4.1、开启Socket Server,并构建处理channel的ChannelHandler链4.2、将provider信息发布到注册中心前言这里debug的代码用的是github上dubbo项目的dubbo-demo里的dubbo-demo-xml下的代码。上一章讲

2021-03-17 01:35:52 933

原创 Dubbo consumer在Spring中的加载过程详解

前言这里debug的代码用的是github上dubbo项目的dubbo-demo里的dubbo-demo-xml下的代码。由于这一篇都是dubbo框架内部实现,所以建议先看下dubbo官网上的一篇讲dubbo的设计原则的文章,有助于理解代码,接着上一篇,这一篇分析consumer对应的org.apache.dubbo.config.spring.ReferenceConfig.class的getObject方法,这里先贴出dubbo官网上的架构图,然后我们在看代码时,比对架构图一起分析:下面是架构图

2021-03-15 16:15:05 1326 1

原创 spring解析dubbo标签配置过程

前言这里debug的代码用的是github上dubbo项目的dubbo-demo里的dubbo-demo-xml下的代码。spring的xml文件里自定义标签的解析是基于spring.handlers文件指定的解析类来解析的,dubbo标签是在dubbo-config-spring的jar包下的META-INF/spring.handlers文件里。这里先看下一个consumer端的配置文件内容:<beans // xmlns:xsi是xsi标签命名空间 xmlns

2021-03-14 23:53:59 516 1

原创 Spring提供的DispatcherServlet是怎么调用我们的Controller里的业务接口的?

前言在分析问题前,先看下Tomcat的架构图,有助于后面看代码:这里可以看出一个Tomcat就是一个Server,一个Server下会有多个Service,Service只负责封装多个Connector和一个Container(Service本身不是容器,可以看做只是用来包装Connector和Container的壳,不负责具体功能),而Container(也叫engine)下又有多个Host,每个Host下对应多个Context,Context下才是我们的Servlet,Tomcat为了使整个架构灵

2021-03-05 16:34:43 1140 1

原创 Springboot之整合tomcat容器过程

前言  Tomcat容器最主要作用就是监听网络请求,并将请求封装成request和response对象最终交给Servlet去执行,而我们spring项目中用来供servlet调用的业务代码的入口一般就是Spring管理的Controller。而Springboot整合tomcat的话,就需要提供一个Servlet的标准实现,并将这个Servlet注册到Tomcat容器里,并且在Servlet处理请求时,能调用Spring所管理的Controller进而使用Spring容器的所有资源。所以这里最主要的几个

2021-03-04 14:29:02 1202 2

原创 Springboot 自动装载组件原理

文章目录获取需要自动装载的组件加载组件简单一句话就是扫描META-INF/spring.factories下org.springframework.boot.autoconfigure.EnableAutoConfiguration的配置项,然后自动装载这些类这里分两步讲下整个过程:1、获取需要自动装载的组件2、加载组件获取需要自动装载的组件在启动类上会有@SpringBootApplication注解,该注解上有@EnableAutoConfiguration注解,这个注解import了Au

2020-12-29 01:00:49 910

原创 Springboot之Bean的加载过程

加载和实例化bean分以下几个重要步骤:1、根据package扫描出需要被管理的类2、将这些类封装成BeanDefinition并注册到BeanFactory容器3、实例化所有扫描到的BeanDefinition,其中包括解决循环依赖、延迟加载问题下面这张图根据Springboot启动调用链的顺序,画了这三个关键步骤被触发的时间点:1、springboot怎么根据package扫描出需要被管理的类?springboot是通过启动类上的@ComponentScan注解所指定的包路径来进行扫描的,

2020-12-02 22:56:31 11777 5

原创 Springboot 启动主流程总结

从《Springboot 启动流程一》到《Springboot 启动流程七》 讲完了在使用java -jar命令启动 maven打的springboot jar包的主流程,这里按顺序对主流程的关键步骤做个总结:一、从jar包里的META-INF里的MANIFEST.MF文件里配置的Main-class总方法作为总入口,自定义一个类加载器LaunchedURLClassLoader,并且指定这个类加载器负责的路径为:BOOT-INF/classes/和BOOT-INF/lib/下的所有资源,然后找到MANI

2020-11-27 15:57:58 331

原创 Springboot 启动过程七

用于源码分析的代码:Github接着上一篇继续debug。上一篇已经将源码4.3的逻辑分析完了,这一篇从源码4.5处继续:public ConfigurableApplicationContext run(String... args) { //StopWatch就是一个监控程序启动时间的类,start方法表示开始计时,stop方法表示计时结束 //用于日志输出启动时间 StopWatch stopWatch = new StopWatch(); stopWatch.start(

2020-11-27 15:57:07 269

原创 springboot 启动过程五

用于源码分析的代码:Github接着上一篇继续debug,这次看run方法里的源码,每次看的源码不贪多,慢慢嚼。上一篇已经将源码3.0的逻辑分析完了,这一篇就源码4.0处继续:public ConfigurableApplicationContext run(String... args) { //StopWatch就是一个监控程序启动时间的类,start方法表示开始计时,stop方法表示计时结束 //用于日志输出启动时间 StopWatch stopWatch = new Stop

2020-11-27 15:56:57 246 1

原创 springboot 启动过程四

用于源码分析的代码:Github接着上一篇继续debug,这次看run方法里的源码,每次看的源码不贪多,慢慢嚼。还是首先列出自己的问题,带着问题看源码:待解答的问题这段源码做了什么?为什么这么做?学到了哪些东西?源码分析因为这一节的源码会讲到Spring怎么解析环境变量、启动参数的一些内容,所以这一次需要使用远程debug的方式来启动,先将项目使用mvn package 命令打成jar包,然后cd到jar包所在目录,使用命令方式启动项目,我这里启动命令是:java -Xdebug -Xru

2020-11-27 15:56:46 335

原创 Springboot 启动过程一

用于源码分析的代码:Github我们首先从springboot的jar包的启动开始,因为这个里面有个知识点,java 程序的启动都是通过一个Main Class的main方法作为整个程序的入口来启动的,而启动的命令是通过jdk安装目录里的bin文件夹下的java命令脚本来启动的,jar包的启动命令就是 java -jar spring-boot-learn-1.0-SNAPSHOT.jar 这个命令没有指定main class,那么JVM是怎么知道启动这个jar里的那个class的main方法呢?一、J

2020-11-27 15:56:36 570

原创 Springboot 启动过程六

用于源码分析的代码:Github接着上一篇继续debug。上一篇已经将源码4.3的逻辑分析完了,这一篇从源码4.4处继续:public ConfigurableApplicationContext run(String... args) { //StopWatch就是一个监控程序启动时间的类,start方法表示开始计时,stop方法表示计时结束 //用于日志输出启动时间 StopWatch stopWatch = new StopWatch(); stopWatch.start(

2020-11-27 15:56:26 318 1

原创 springboot 启动过程三

用于源码分析的代码:Github接着上一篇继续debug,这次看run方法里的源码,每次看的源码不贪多,慢慢嚼。还是首先列出自己的问题,带着问题看源码:待解答的问题这段源码做了什么?为什么这么做?学到了哪些东西?源码一可以看出run方法里的代码有很好的可读性,用阿里java开发手册的原话来说,就是代码逻辑分清了红花和绿叶,个性和共性,绿叶逻辑单独出来成为额外方法,使主干代码更加清晰。由于这个run方法是Spring容器启动的主方法,包含的逻辑太多,所以这一节先debug完2.0的逻辑。p

2020-11-27 15:56:15 215

原创 Springboot 启动过程二

接着启动过程一中的代码,继续debug,这一篇主要看new SpringApplication(primarySources)的代码。首先还是列出问题,带着问题去看源码收获也会多些。待解答的问题这段代码的主要用途是什么?为什么这么设计?源码分析public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { return new SpringApplicati

2020-11-27 15:56:00 353

转载 Synchronized原理

1.Syncronized应用synchronized是java中加锁的关键字,可以用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程可以执行这段代码。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的非加锁代码块。1.1 三种应用方式synch...

2019-10-31 10:31:56 129

原创 Java中数组为什么不支持泛型,集合却支持泛型?

首先需要明白泛型是在编译器校验类型安全的,在运行期会将类型擦除,比如:List<String> list = new ArrayList<>();这段代码在允许期会被擦掉泛型,就等同于List list = new ArrayList();其次 要明白集合中的泛型是不可变的,但是数组里的类型是可变的,比如:List<String> list = new ...

2019-09-30 00:05:15 2665

原创 拜占庭将军问题对应的分布式一致性算法

拜占庭将军问题描述:  有N位将军一起合作进行军事行动,其中有M位叛将,这N位将军里有一位话事人(有可能由叛将担任话事人),话事人以通信的方式给其他将军发布军事指令,军事指令假设只有进攻和撤退两种,要有一种算法保证在该话事人给其他将军发送不一致的行动指令的情况下(部分将军收到进攻指令,部分将军收到撤退指令),所有的忠将都采取一致的动作,要么一起进攻,要么一起撤退。  翻译成分布式环境下的一致性...

2019-09-05 00:52:13 887

转载 HBase详解(很全面)

【转自:http://jiajun.iteye.com/blog/89963...

2019-09-02 10:53:36 483

原创 弄懂同步与阻塞

一次调用有两个参与者,调用方 和 被调用方。同步是对被调用方来说的,依据是被调用方的【反馈方式】,如果被调用方一直等到任务执行完才反馈给调用方执行结果,那么就是同步;如果被调用方在被调用时就回复【知道了】,而真正的执行结果以通知的方式告知调用方,那么就是异步。阻塞和非阻塞是对调用方的处理方式来说的,如果调用方在调用后,不需要等到任务执行结束就去做别的事,那么就是非阻塞的,如果调用方在调用后,需...

2019-08-06 18:08:22 253

转载 HTTPS数字证书验证原理

通常网络请求我们分为两种,分别是HTTP请求和HTTPS请求,而HTTPS是一种在HTTP的基础上加了SSL/TLS层(安全套接层)的安全的超文本传输协议。HTTP的传输属于明文传输,所以说是不安全的,在传输的过程中容易被人截取并且偷窥其中的内容,而HTTPS传输的信息是通过加密的,也是一种安全的传输。说到加密算法,先来了解一下两种常用的加密方式,分别是对称加密和非对称加密:1.对称加密:加...

2019-07-12 15:34:55 1113 1

转载 0拷贝的理解

引言传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。这样做最大的好处是可以减少磁盘 I/O 的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘 I/O 操作。但是数据传输过程中的数据拷贝操作却导致了极大的 CPU 开销,限制了操...

2019-07-11 11:34:08 1013

转载 逃逸分析-Java对象并不一定都是在堆上分配内存的

JVM内存分配策略关于JVM的内存结构及内存分配方式,不是本文的重点,这里只做简单回顾。以下是我们知道的一些常识:1、根据Java虚拟机规范,Java虚拟机所管理的内存包括方法区、虚拟机栈、本地方法栈、堆、程序计数器等。2、我们通常认为JVM中运行时数据存储包括堆和栈。这里所提到的栈其实指的是虚拟机栈,或者说是虚拟栈中的局部变量表。3、栈中存放一些基本类型的变量数据(int/short/l...

2019-07-09 09:46:24 264

原创 EnumSet原理介绍

为了便于理解EnumSet,需要先知道这种数据结构是为了解决什么问题而设计的。一、场景举例一个场景,你系统里的用户会有各种身份,而一个用户会有多个身份,你设计了一个UserDTO对象,这时候要考虑怎么来表示身份,有一种比较常用的方法,比如定义一个Long属性,long类型有64位,每一位对应一种身份,1标识拥有该身份,0标识没有该身份。这样做就比较节省空间,那么在对这个UserDTO增加身份、...

2019-06-27 01:34:20 460

原创 记一次JDK8的Metaspace区域的调优过程,及MetaspaceSize参数的误解

JDK8用metaSpace区域来代替了以前的永久区,这个区域主要存放被加载的class信息,我手上一个项目每次启动时候都会伴随一次fullgc,排查思路是:一、查看内存使用率命令:jstat -gcutil PID ,这里的PID是Java进程ID可以看到老年代使用率只有1.96%,但是MetaSpace区域使用率是96.13%,初步怀疑是metaSpace区域设置太小。二、查看gc日...

2019-04-30 18:09:03 10431 1

原创 bootstrap模态框报错modal is not a function

1、Jquery.js必须放到bootstrap.min.js之前但是我

2019-04-20 00:46:24 772

转载 VIPServer:阿里智能地址映射及环境管理系统详解

作者: 周遥,阿里技术专家,花名玄胤,毕业于四川大学。六年大型分布式与中间件系统经验,三项国家专利,参加过多次“双十一”。2013年从零开始带出VIPServer,目前已成为集团环境管理与路由的标准。 王建伟,阿里巴巴工程师,花名正己,西北工业大学计算机学院硕士毕业。目前在阿里中间件技术部软负载小组负责VIPServer系统。 本文为《程序员》原创文章,未经允许...

2019-03-25 21:01:02 556

转载 联合索引在B+树上的结构介绍

前言最近在学习MySQL的存储引擎和索引的知识。看了许多篇介绍MyISAM和InnoDB的索引的例子,都能理解。像这张索引图:PS:该图来自大神张洋的《MySQL索引背后的数据结构及算法原理》一文。但许多文章讲述的都是单列索引,我很好奇联合索引对应的结构图是怎样的。疑惑:联合索引的结构是怎样...

2019-03-25 20:45:44 1583 2

转载 章文嵩博士和他背后的负载均衡帝国

负载均衡的演变http://jm.taobao.org/2016/06/02/zhangwensong-and-load-balance/VipServer详解https://blog.csdn.net/zdy0_2004/article/details/52944867

2019-02-17 15:45:12 509

原创 互联网架构演变过程

前言:架构选型是根据当前业务需要来的,在满足业务需求的前提下,既要有足够的扩展性也不能过度设计,每次的架构升级都是为了解决系统瓶颈而做的。我根据个人理解梳理下web应用的架构演变过程。以电子商务网站为例:1.0时代这个时候是一个web项目里包含了所有的模块,一个数据库里包含了所需要的所有表,这时候网站访问量增加时,首先遇到瓶颈的是应用服务器连接数,比如tomcat连接数不能无限增加,线程数...

2019-02-14 17:44:24 1106

原创 Lock中的Condition源码解析

为什么要有condition及使用场景查看condition接口里的方法有:而Object的方法有:都说condition是对Object 的补充,那么到底是补充了什么?Object的wait、notify是和synchronized关键字组合的,而condition是和Lock配合使用,不同的是同一个Lock可以有多个对应的condition来对线程做更细致的控制,而Object做不...

2019-01-28 09:57:24 447 1

空空如也

空空如也

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

TA关注的人

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