自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Java部落格

为了部落!!!

  • 博客(71)
  • 资源 (7)
  • 收藏
  • 关注

原创 Spring Cloud Alibaba-Sentinel源码阅读(三)-流控原理

  由上一篇《Spring Cloud Alibaba-Sentinel源码阅读(二)-流控的主流程》可知,Sentinel的流控主流程就是一条ProcessorSlot 处理链,调用 ProcessorSlotChain 的 entry 方法,就是依次调用这些ProcessorSlot 的方法。而流控相关的最重要的两个ProcessorSlot 就是StatisticSlot和FlowSlot。一、StatisticSlot 收集实时消息StatisticSlot#entrypublic void

2021-03-31 17:58:11 236

原创 Spring Cloud Alibaba-Sentinel源码阅读(二)-流控的主流程

一、流控的主流程1、流控的入口从上一篇《Spring Cloud Alibaba-Sentinel源码阅读(一)-Sentinel的使用》中可知,Sentinel流控的入口是SphU#entry方法,而SphU类据说是semaphore 信号量的缩写,这个SphU#entry方法的大概就是进入流控了,如果方法抛BlockException,则代表被流控了,如果正常返回一个Entry则正常放行。SphU#entry(java.lang.String, int, com.alibaba.csp.senti

2021-03-31 14:45:46 218

原创 Spring Cloud Alibaba-Sentinel源码阅读(一)-Sentinel的使用

一、调用sentinel-core API方式1、加入依赖<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.4.1</version></dependency>2、使用public static void main(String[]

2021-03-31 11:29:51 320

原创 配置中心-Lion源码学习

一、源码入口<dependency> <groupId>com.dianping.lion</groupId> <artifactId>spring-boot-starter-lion</artifactId> <version>2.2.4</version></dependency>spring.factoriesorg.springframework.boot.autoconfigure.En

2021-03-26 17:17:20 2082

原创 JUC源码阅读(三)-CountDownLatch

一、CountDownLatch简介  CountDownLatch是一个基于AQS实现的同步辅助类,它允许一个或多个主任务线程一直等待,直到一组子任务线程完成。内部采用的公平锁和共享锁的机制实现。  由AQS的数据模型可推测,CountDownLatch应该是将一个或多个主任务线程放入到CLH等待队列中,等待所有子线程执行完后再获取锁执行下一步操作,而每个子任务执行完都会将计数-1,CLH等待队列中主任务需要不停的检测计数是否归零。二、CountDownLatch的核心方法1、CountDownL

2021-03-16 22:51:51 70

原创 JUC源码阅读(二)-ReentrantLock

一、ReentrantLock简介ReentrantLock基于AQS实现的可重入锁,是一个跟synchronized具有相同行为和语义的持有锁来访问方法和语句的互斥锁,但是reentrant还拥有被扩展的能力,可以有公平锁和非公平锁的不同实现,只要在构造它的时候传入不同的布尔值,就可以实现。public ReentrantLock(boolean fair) { // 默认是非公平锁 sync = fair ? new FairSync() : new NonfairSync();}二、Re

2021-03-16 21:25:29 77

原创 JUC源码阅读(一)-AQS

一、AQS简介AbstractQueuedSynchronizer,简称AQS,JUC并发包中常用的ReentrantLock, CountDownLatch等都依赖AQS。子类通过继承AQS并实现它的抽象方法来管理同步状态,它简化了锁的实现方式,屏蔽了同步状态管理、线程的排队、等待与唤醒等底层操作,但是通过AQS实现的功能却是不同的。二、AQS数据结构下图就是AQS的数据模型:接下来再来看看AbstractQueuedSynchronizer的成员变量// CLH队列头结点private t

2021-03-14 12:22:26 183

原创 HashMap、ConcurrentHashMap核心要点

一、HashMap1、JDK7数组+单向链表头插法存在死循环bug2、JDK8数组+单向链表+红黑树尾插法3、HashMap头插法死循环问题可以参考如下文章:《HashMap头插法为什么会出现死循环 产生循环链表的影响是什么》二、ConcurrentHashMap1、JDK7分段锁,每个Segment有独立的锁,Segment实现了ReentrantLock,也就带有锁的功能。1、分为16个Segment(相当于HashTable)2、对每一个小的Segment加

2021-03-13 15:28:14 86

原创 Kafka参数调优(二)-消费者Consumer

一、Consumer参数说明1、enable.auto.commit该属性指定了消费者是否自动提交偏移量,默认值是true。为了尽量避免出现重复数据(假如,某个消费者poll消息后,应用正在处理消息,在3秒后kafka进行了重平衡,那么由于没有更新位移导致重平衡后这部分消息重复消费)和数据丢失,可以把它设为 false,由自己控制何时提交偏移量。如果把它设为true,还可以通过配置 auto.commit.interval.ms 属性来控制提交的频率。2、auto.commit.interval.

2021-03-13 14:48:29 2072

原创 Spring源码阅读(八)-设计模式

一、责任链模式1、DispatcherServlet#doDispatchgetHandler 方法的处理使用到了责任链模式,handlerMappings 是之前 Spring 容器初始化好的,通过遍历 handlerMappings 查找与 request 匹配的 Handler, 这里返回 HandlerExecutionChain 对象2、Spring AOPJdkDynamicAopProxy#invoke()方法核心代码:public Object invoke(Object pro

2021-03-07 22:11:10 177 1

原创 ThreadPoolExecutor源码阅读

一、Executors创建线程池的工厂方法Executors是线程池的工具类,它提供了四种创建线程池的工厂方法:newFixedThreadPool:该方法返回一个固定数量的线程池,线程数不变,当有一个任务提交时,若线程池中空闲,则立即执行,若没有,则会被暂缓在一个任务队列中,等待有空闲的线程去执行;newSingleThreadExecutor: 创建一个线程的线程池,若空闲则执行,若没有空闲线程则暂缓在任务队列中;newCachedThreadPool:返回一个可根据实际情况调整线程个数的线

2021-03-07 20:42:52 94

原创 线程私有变量—ThreadLocal

一、ThreadLocal数据结构Thread类中有个变量threadLocals,这个类型为ThreadLocal中的一个内部类ThreadLocalMap,这个类没有实现map接口,就是一个普通的Java类,但是实现的类似map的功能。Thread中的成员变量threadLocals: /* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */

2021-02-28 17:52:44 667 1

原创 高性能内存队列—Disruptor

一、Disruptor介绍1、Disruptor特点:基于数组实现的,数组相比链表,查询更快,但是新增/修改操作较慢,而Disruptor的数组是环形数组,是定长的数组,无需扩容,直接覆盖旧数据,所以相比ConcurrentLinkedQueue,性能更好。对比下也是基于数组实现的HashMap,每次扩容耗时较长;基于CAS无锁化,高并发,使用环形Buffer,直接覆盖(不用清除)旧的数据,降低GC频率;实现了基于事件的生产者消费者模式(观察者模式);2、Disruptor的使用定义

2021-02-28 17:04:40 573

原创 Spring自定义注解实战

  JDK1.5开始引入了注解,Spring框架也正好把Java注解发挥得淋漓尽致,以下通过自定义一个日志注解@LogAnnotation,在被注解的方法执行前后打印日志,来深入了解Spring注解。一、创建自定义注解创建注解类LogAnnotationpackage com.ztesoft.bss.prod.cust.service.impl.annotation;import java.lang.annotation.Documented;import java.lang.annotatio

2021-02-26 13:55:03 276

原创 零拷贝技术:mmap和sendFile

一、传统的IO操作通过上面的步骤可以发现传统的 IO 操作执行,有 4 次上下文的切换(用户态—内核态之前的切换)和 4 次拷贝(2次CPU拷贝,2次DMA拷贝),操作繁琐,性能较差。接下来就来看看两种所谓的“零拷贝”技术,mmap和sendFile。二、mmapmmap 是一种内存映射技术,将用户空间的虚拟地址和内核空间的虚拟地址指向同一个物理内存地址,这样用户空间和内核空间共享同一个内存数据。上图中的虚线方框中就是mmap技术的应用,相比传统的IO操作,减少了一次内核缓冲区—用户缓冲区的拷贝

2021-02-25 19:36:18 822

原创 Dubbo源码阅读(四)-Dubbo 服务发现

一、Dubbo服务注册成ReferenceBean和上篇一样,消费端也是通过DubboComponentScanRegistrar注册成ReferenceBean,它用到的处理器是ReferenceAnnotationBeanPostProcessor,具体注册过程暂不详细展开,可以自行翻阅源码。二、Dubbo服务发现上面的服务注册到Spring IOC容器每一个服务其实就是一个ReferenceBean,ReferenceBean是一个FactoryBean,直接看下这个工厂Bean的getObje

2021-02-23 10:52:59 149

原创 Dubbo源码阅读(三)-Dubbo 服务注册

一、Dubbo服务注册通过注解来注册Dubbo服务的时候,在服务端和消费端都需要用到一个组件DubboComponentScanRegistrar,先看下registerBeanDefinitions()方法:public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { Set<String> packagesToScan

2021-02-23 10:30:53 224 1

原创 Dubbo源码阅读(二)-Dubbo SPI机制

一、Java原生 SPISPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。1、使用在扩展类的 jar 包内,放置扩展点配置文件 META-INF/services/接口全限定名,内容为:配置名=扩展实现类全限定名,多个实现类用换行符分隔。2、缺点:a、接口的所有实现类全部都需要加载并实例化;b、无法根据参数来指定实现类;c、不能解决IOC、A

2021-02-23 09:52:43 77

原创 RocketMQ源码阅读(二)-Consumer消费消息

一、Consumer启动流程Consumer启动时序图:DefaultMQPushConsumerImpl#startpublic synchronized void start() throws MQClientException { switch (this.serviceState) { case CREATE_JUST: this.defaultMQPushConsumer.getMessageModel(),

2021-02-21 15:36:28 708 5

原创 RocketMQ源码阅读(一)-Producer消息发送

一、Producer消息发送时序图二、Producer消息发送源码分析DefaultMQProducerImpl#sendDefaultImpl

2021-02-20 16:39:57 344

原创 浅谈JDK 9—Flow

一、响应式编程JDK 9 Flow 是JDK对Reactive Stream (响应式流/反应流) 的实现,Reactive Stream是一套基于发布/订阅模式的数据处理规范。响应式流从2013年开始,作为提供非阻塞背压的异步流处理标准的倡议。 它旨在解决处理元素流的问题——如何将元素流从发布者传递到订阅者,而不需要发布者阻塞,或订阅者需要有无限制的缓冲区或丢弃。更确切地说,Reactive流目的是“找到最小的一组接口,方法和协议,用来描述必要的操作和实体以实现这样的目标:以非阻塞背压方式实现数据的异步

2021-02-18 16:45:47 1410

原创 浅谈JDK异步编程演进史

一、JDK 5以前—Runnable缺点:异步线程没有返回值,并且无法抛出返回结果的异常。二、JDK 5—CallableCallable功能更强大一些,被线程执行后,可以通过Future拿到返回值。缺点:Future是它没有提供通知的机制,我们无法得知Future什么时候完成。要么使用阻塞,在future.get()的地方等待future返回的结果,这时又变成同步操作。要么使用isDone()轮询地判断Future是否完成,这样会耗费CPU的资源。三、JDK 7—Fork/joi

2021-02-18 16:44:48 136

原创 浅谈JDK 8—Stream

一、Stream是高级的集合迭代器流和集合的区别:1、集合是一种内存数据结果,必须先计算出来才能放到集合中,而流是按需计算;2、流只能遍历一次,如果需要再次遍历,必须重新获取数据源,流只能被消费一次,而集合因为是内存中的一个确定数据结构,所以可以遍历多次;3、流的迭代在内部完成,而集合必须在外部通过代码显式迭代。 4、流用于描述对于数据的计算,集合主要是为了存储和访问数据。二、Stream API 函数式编程1、声明式编程:专注于”做什么”而不是”zhi如何去做”。在更dao高层面zhua

2021-02-18 16:43:04 91 1

原创 Dubbo源码阅读(一)-服务调用流程

在消费端基于Dubbo API的方式调用服务:public class ApiConsumerApplication { public static void main(String[] args) { // 1. 创建服务引用对象实例 ReferenceConfig<IGreetingService> referenceConfig = new ReferenceConfig<IGreetingService>(); //

2021-02-09 14:08:37 164

原创 Java锁的同步队列和等待队列

一、线程状态的流转说明:线程共包括以下5种状态。新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。运行状态(Running) : 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进

2021-02-07 15:32:57 1421 2

原创 Netty源码阅读(二)-Netty启动流程源码

一、Netty启动流程源码上一篇文章中的Netty服务端启动代码中,bind()方法才是Netty真正开始启动的地方。跟踪代码,会进入AbstractBootstrap#doBind()方法private ChannelFuture doBind(final SocketAddress localAddress) { //初始化并注册一个channel final ChannelFuture regFuture = initAndRegister(); final Channel channel

2021-02-06 16:31:20 106

原创 Netty源码阅读(一)-核心组件

一、Netty服务端启动先看下启动代码:public final class NettyServer { public static void main(String[] args) throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try {

2021-02-06 14:44:18 116 1

原创 Mybatis源码阅读(四)-Spring集成Mybatis-Mapper接口的注入:MapperScannerConfigurer

一、Spring包扫描注解注入会过滤掉接口类在Spring IOC容器启动的过程中,Spring会在扫描@CompopnentScan指定的路径时,会将被@Component,@Service等注解的类自动注册BeanDefinition到Spring IOC容器中,但是会过滤掉接口、抽象类,无法生成BeanDefinition,具体的源码可以查看之前的一篇文章《Spring源码阅读(四)-注册BeanDefinition-ConfigurationClassPostProcessor》的第三点。但是M

2021-01-31 19:16:47 308

原创 Mybatis源码阅读(三)-Spring集成Mybatis

一、DefaultSqlSession的线程安全问题从DefaultSqlSession类的注释可知,它不是一个线程安全的对象,通过DefaultSqlSessionFactory创建使用之后必须立即销毁,不能复用,只能局限于request或者方法的范围。而且在同一个Spring事务内的SqlSession只能有一个,所以Mybatis如果想集成到Spring就必须解决线程安全的问题!二、SqlSessionTemplateSqlSessionTemplate是Mybatis为了接入Spring提供

2021-01-29 21:27:49 104

原创 Mybatis源码阅读(二)-二级缓存

一、二级缓存介绍由上一篇文章,Mybatis的执行流程可知,CRUD实际上是交给Excetor去处理的,如下图:从图中可以看到Mybatis一二级缓存所在位置:一级缓存在BaseExecutor,二级缓存在CachingExecutor。而BaseExecutor、CachingExecutor都是Executor的子类,且CachingExecutor包含BaseExecutor。直接看下CachingExecutor#query()的源码:public <E> List<E&

2021-01-29 20:09:18 225

原创 Mybatis源码阅读(一)-启动过程和执行流程

一、Mybatis的启动过程:1、通过SqlSessionFactoryBuilder去读取mybatis的配置文件,封装成一个Configuration对象,然后build一个DefaultSqlSessionFactory。注意:Configuration对象有个属性mapperRegistry,而mapperRegistry对象里的knownMappers就是mybatis存放DAO的数据结构!2、获取到SqlSessionFactory之后,就可以通过SqlSessionFactory去

2021-01-29 19:32:36 218

原创 Tomcat源码阅读(四)-热部署

热部署热部署和热加载是类似的,都是在不重启Tomcat的情况下,使得应用的最新代码生效。但热部署表示重新部署应用,它的执行主体就不能是Context了,而是Host。在上一篇《Tomcat源码阅读(三)-热加载》阅读中发现,StandardEngine会开启一个由ContainerBase中定义的守护线程ContainerBackgroundProcessor,来执行当前容器以及所有子容器的backgroundProcess方法,并且一般容器(如StandardContext)在调用完自己的backgr

2021-01-25 11:04:20 182 1

原创 Tomcat源码阅读(三)-热加载

热加载热加载是在不重启Tomcat的情况下,在Context- StandardContext中重新加载应用的class。热加载是由一个专门的守护线程执行操作的,这个守护线程是ContainerBackgroundProcessor。在StandardEngine启动时,会调用父类ContainerBase的threadStart()方法,就是在此方法中开启了ContainerBackgroundProcessor 线程!此方法代码如下:protected void threadStart()

2021-01-25 10:43:50 139

原创 Tomcat源码阅读(二)-请求处理流程

一、请求处理流程图上图中有两个重要的组件:Connector和Engine,接下来重点介绍下这两个组件。二、Http服务器-Connector1、由上图可知,Connector组件包含三部分:Http11NioProtocol、Mapper、CoyoteAdapter。Http11NioProtocol包含NioEndpoint和Http11ConnectionHandler,NioEndpoint是Http11NioProtocol中负责接收处理socket的主要模块;Http11Connecti

2021-01-23 18:01:32 149

原创 Tomcat源码阅读(一)-启动流程

一、初始化流程二、启动流程三、Tomcat组件生命周期的管理-Lifecycle由前两点的初始化、启动的流程可以看到一个重要的接口Lifecycle,Tomcat 中组件的生命周期就是通过 Lifecycle 接口来控制的。组件只要继承这个接口,并实现其中的方法,该组件的生命周期就会由包含它的父组件控制,这样一层一层的,直到一个最高级的组件Server,它就可以控制 Tomcat 中所有组件的生命周期,而控制 Server 的是启动和关闭 Tomcat,所以它的 Start 方法自然就是调用它下面

2021-01-23 18:00:52 163

原创 SpringBoot 源码阅读(二)-启动

一、SpringBoot项目的两种启动方式SpringBoot项目的启动方式有两种,一种是以jar包的方式启动,一种是以war包的方式启动。二、jar包的方式启动启动类:@SpringBootApplicationpublic class MySpringbootApplication { public static void main(String[] args) { SpringApplication.run(MySpringbootApplication.clas

2021-01-21 11:07:45 107 2

原创 SpringBoot 源码阅读(一)-自动装配

一、自动装配直接看下自动装配流程图:二、自动装配的触发1、直接debug一下,通过调用堆栈信息,可以看到自动装配是由AbstractApplicationContext#invokeBeanFactoryPostProcessors()触发的。2、ConfigurationClassPostProcessor该类主要处理@Configuration注解的,它实现了BeanDefinitionRegistryPostProcessor, 那么也间接实现了BeanFactoryPostProces

2021-01-20 15:34:50 76

原创 Spring MVC源码阅读(三)-HandlerMapping

一、HandlerMapping的类图可以看到HandlerMapping家族有两个分支,分别是AbstractUrlHandlerMapping和AbstractHandlerMethodMapping,而我们熟知的RequestMappingHandlerMapping就是它的子类。二、HandlerMapping的加载RequestMappingHandlerMapping实现了InitializingBean接口,在其初始化时执行afterPropertiesSet方法。在此方法中其遍历Ap

2021-01-19 10:43:51 94

原创 Spring MVC源码阅读(二)-DispatcherServlet处理流程

一、 DispatcherServlet处理流程图二、DispatcherServlet#doDispatch等核心源码接下来看下DispatcherServlet的核心代码://经过精减的DispatcherServlet:public class DispatcherServlet extends FrameworkServlet { //DispatcherServlet分发请求 protected void doDispatch(HttpServletRequest requ

2021-01-18 16:35:38 71

原创 Spring源码阅读(七)-事务

一、InfrastructureAdvisorAutoProxyCreator先看下继承关系:

2021-01-17 15:37:23 120

风控项目实战代码-enter

风控项目实战代码-enter

2019-04-10

SpringBoot入门基础以及应用

SpringBoot入门基础以及应用

2019-04-09

深入实践Spring+Boot.陈韶健

深入实践Spring+Boot.陈韶健 高清扫描版

2019-04-03

Java性能优化权威指南

Java性能优化权威指南高清扫描版

2019-04-03

Java 并发编程实战

Java 并发编程实战 高清扫描版 Java 并发编程实战 高清扫描版

2019-04-03

[深入理解Java虚拟机:JVM高级特性与最佳实践].周志明.高清扫描版

[深入理解Java虚拟机:JVM高级特性与最佳实践].周志明.高清扫描版

2019-04-03

idea相关文档

idea基本使用方法,包含安装、激活、设置、使用、插件安装文档

2019-04-03

空空如也

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

TA关注的人

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