自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 《深入理解Kafka核心设计与实践原理》读书笔记

Kafka为什么不支持减少分区代码逻辑是可以实现,但是比较复杂,而且使用场景很少,完全可以新建一个topic去替代第一,如果不保留原来分区的消息,可靠性得不到保障。第二,把消息移到其他分区的话,如果直接存储到尾部则会破坏消息的时间戳排序,如果要做时间排序则会移动队列消息,消息很大的话,内部复制会占用很大资源。同时事务性,分区和副本问题都要考虑。删除主题方式第一,使用kafka.topics.sh脚本,会在zk生成一个标记节点,标记主题删除状态,然后kafka去删除。第二,手动删除

2021-09-19 18:39:36 333

原创 《Redis深度历险:核心原理与应用实践》读书笔记

5种基础数据结构(还有其他高级结构)需要再研究数据类型内部的结构-ziplist,int数组。1.string(字符串):可以存int,string,byte[]。相当于ArrayList,数组保存字符,有数据冗余,长度小于1M时扩容是扩一倍,长度大于1M时,扩容最多是1M,最多是512M。刚创建是len和capacity一样大,因为大部分情况不会append。如果保存的是整数,那么可以做累计,set age 30, incr age。最大最小是long的最大最小值。redis存字符串的最大长度

2021-08-20 01:29:29 460

原创 《从Paxos到ZooKeeper分布式一致性原理与实践》读书笔记

目录ZK原生APIZkClient叶子节点的监听和限制Curator客户端ZK的典型应用场景ZK两个特性ZK加锁和master选举原理各个服务器角色介绍数据与存储ZK初始化ZK原生API1. api是异步连接,但可以同步创建节点2. 保存字节数组3. 不能递归创建节点,只能在父节点下面创建子节点4. 只能删除叶子节点5. 事件通知要反复注册Watcher,客户端需要反复调用方法去注册(因为服务端保存Watcher在列表里,每次触发会做清理,如果

2021-08-05 00:18:59 234

原创 《深入理解Dubbo原理与实践》读书笔记

目录第1章 Dubbo-高性能RPC通信框架第2章 开发第一款Dubbo应用程序第4章 Dubbo扩展点加载机制第5章 Dubbo启停原理解析第6章 Dubbo远程调用第7章 Dubbo集群容错第8章 Dubbo扩展点第9章 Dubbo高级特性第10章 Dubbo过滤器第11章 Dubbo注册中心扩展实践第13章 Dubbo未来展望第1章 Dubbo-高性能RPC通信框架1.1 应用架构演进过程:EJB单体 --> 垂直化服务( MVC )--&gt

2021-08-02 00:40:22 430 1

原创 《深入理解Java虚拟机》读书笔记

中心主题第1章 走进Java虚拟机介绍Graal VM:在HotSpot的基础上增强的全栈虚拟机。HotSpot:热点检测,运行时间越长性能越好。第一次运行慢。版本升级:支持模块化,可以裁剪功能,重构垃圾收集器接口Substrate VM:提前编译,启动时间和内存占用少Java技术体系JRE:基础类库,Java虚拟机,集成库,用户界面APIJKD=JRE+Java语言+工具及工具API第2章 Java内存区域与内存溢出异常运行时内存数据区域线程共享1.堆。几乎所有对象实

2021-06-28 03:21:41 381

原创 《高性能MySQL》读书笔记

高性能MySQL存储引擎和事务InnoDB引擎MySQL5.5(包括)默认引擎,行级锁,支持事务事务隔离级别:默认是可重复读(RR)MVCC多版本并发控制基于undo来实现,每条记录都有隐藏的事务id字段,回滚指针字段,删除flag字段,以及构建聚族索引的rowid。快照读基于read view,第一次查询的时候才会生效,相当于框定了查询记录的版本号范围。select是快照读,不加锁当前读读取数据的最新版本,插入/更新/删除操作,都是当前读,需要加锁

2021-05-30 20:28:45 182

原创 SpringCloudGateway注册发现源码分析

上一篇文章简单地介绍了SpringCloudGateway配合Eureka来实现服务的注册与发现,本篇我们进入的SCG的源码来看看它是如何实现的。首先来弄明白,服务发现是何时启动的,其实在SCG的启动文件里有服务发现的引导类:进入到GatewayDiscoveryClientAutoConfiguration,可以发现如下代码,看到配置就明白了,只要我们在配置文件中设置这spring.cloud.gateway.discovery.locator.enabled=true,则服务注册发现就会注入Dis

2021-04-02 23:33:44 318

原创 SpringCloudGateway配合注册中心的使用

SpringCloudGateway是微服务中的一员,其结合注册中心的使用场景是比较常见的,比如在统一鉴权方面,一般是向网关发起访问某个服务的请求,网关校验客户端是否登录,验证通过才向目标服务发起调用,目标服务的地址是从注册中心获取,而不是通过配置文件或者java类配置了。...

2021-04-02 00:53:17 1544

原创 Spring Cloud Gateway各种路由的配置与用途

Spring Cloud Gateway有多种方式配置路由

2021-04-01 02:46:11 1845

原创 Spring Cloud Gateway自定义Filter

今天我们来研究自定义Filter

2021-03-31 06:40:37 1221 1

原创 Spring Cloud Gateway源码分析:GatewayFilter的加载机制

要搞清楚GatewayFilter的加载流程得用剥洋葱方式,要一层一层深入进去,总感觉特别绕。其实我只是想看看GatewayFilterFactory是如何生成GatewayFilter的,正常逻辑是加载完配置就立刻生成GatewayFilter以备后面使用,但是SCG为了延迟加载route和缓存route,硬生生的把GatewayFilter的生成放在了第一次路由转发的时候。下面我们从读取配置文件的方式来理解GatewayFilter的加载。1. GatewayProperties加载配置文件在这里插

2021-03-30 02:22:53 712

原创 Spring Cloud Gateway:GlobalFilter和GatewayFilter的区别与联系

通过前面的学习,我们知道

2021-03-29 02:10:46 3872 6

原创 Spring Cloud Gateway学习笔记:DispatcherHandler的调用,filter链

今天的文章内容比较散,本来想搞明白请求是如何调到DispatcherHandler的,debug一通发现里面逻辑也太复杂了,全是Netty Reactor编程,这就无法啃了,留着后面去研究了。这篇文章解答下昨天留的两个下问题,最后再添加一个Flux的相关使用方法。1. DispatcherHandler上层调用从debug的调试来看,可以确认DispatcherHandler是在HttpWebHandlerAdapter#handle方法中调用的,因此我们可以进一步总结出SCG的调用链路:HttpWe

2021-03-27 03:22:11 1436

原创 Spring Cloud Gateway源码分析:请求是如何路由的

上一篇文章分析了route、predicate和filter的自动装配,但是还不清楚SCG(Spring Cloud Gateway简称)是如何把三个组件联系起来的,也不知道predicate和filter是如何做选择的,今天带着这些疑问,我们一起从源码中找出答案。1. 请求分发SCG是通过DispatcherHandler来做请求分发的,所有的请求会被拦截到这个类的handle方法做处理,其调用链大概是:DispatcherHandler -->RoutePredicateHandlerMap

2021-03-26 02:28:04 327

原创 Spring Cloud Gateway路由加载分析

1. 请求流程前面分析过Spring Cloud Gateway由三个组件来完成请求的分发和增强,predicate判定走哪个路由route,然后经过各个过滤器的处理,大致的类图流程如下:2. 源码分析我们从源码中来看看上面三个类是如何加载的,基于Spring Boot的加载套路,我们可以从spring-cloud-gateway-server组件中找到META-INF/spring.factories文件,从配置的类里找出答案。进入GatewayAutoConfiguration类,可以发现这几个

2021-03-25 04:40:29 421

原创 Spring Cloud Gateway的应用场景

网关在微服务架构里相当于是客户端请求的一个总入口,有解耦和隐藏后端服务作用。除此之外,网关还有多种功能,本篇文章我们用SCG来模拟实现网关的各种应用场景1. 流控(金丝雀发布,蓝绿发布)目前很多公司都实现了生产不停机发布版本,在生产中同时存在新老版本代码,很多是通过ngnix来做流量的分流。发版时让流量都往老版本的服务走,等新版本发布完后再把流量慢慢切到新版本去验证,这就是所谓的金丝雀发布,也叫做蓝绿发布。下面我们用Spring Cloud Gateway来模拟实现这种分流 @Bean pub

2021-03-24 01:56:14 1910 1

原创 Spring Cloud Gateway源码分析-环境搭建以及入门使用

1、初次认识Spring Cloud Gateway是Spring官方推荐使用一个代理网关,以后可能会替代掉Zuul。其基于Spring Boot 2.x,Spring WebFlux,Reactor之上来构建运行,但在使用时我们可以不用太关心底层的网络协议,只要熟悉它的配置规则就可以上手。总的来说,Spring Cloud Gateway跟其他网关类似,能够提供如下功能:权限控制;限流;路由转发;负载均衡;黑白名单控制Route、Predicate、Filter组成的三件套是我们学习Sp

2021-03-23 04:14:19 641

原创 Mockito单元测试的使用

作为一个java开发,如果不会用mock工具做单元测试是不合格的。mock可以理解为一个模拟对象,即一个替代者,可以替换掉依赖的对象,这样一来我们就可以把注意力集中在我们本省的业务代码逻辑,从而自我验证代码正确性。如下图所示,A类依赖了B类和C类假如我们要测试A类,于是我们就需要Mock B和C,也就是用模拟的对象替换B和CMockito是一款优秀的mock工具,也可以叫做mocking框...

2020-04-22 07:04:54 2901

原创 excel文件上传下载问题总结

最近做项目跟excel打交道比较多,很多业务需求涉及到excel文件的上传、解析和下载,在这个过程中,我们难免会遇到一些棘手的问题。下面我将对这些问题做一个描述,提供出我的解决方案以及思考和总结。一、斜线的问题考虑到要用poi来开发如下带有斜线的表格,我之前也没遇过这样的需求,在网上也苦苦找寻了许久,一直没答案。后来突然来了灵感,为何不用读取模板的方式呢,我们可以直接在模板上把这个斜线给画好。...

2020-03-29 22:36:57 776

原创 ThreadLocal的使用及原理

一、概述ThreadLocal简单理解就是针对一个线程做资源的共享,通过set方法把某些资源放到线程中保存,然后通过get方法获取这个资源。它的出现解决了同一个线程中,不同类的方法中可以共享同一个对象或者变量。注意他不是为解决并发中多线程的资源共享(这种场景一般需要加锁),而是为了在多线程之间维护每个线程单独持有的资源(不需要加锁)。可以想象ThreadLocal的使用场景是在一个线程中共享数...

2020-02-06 14:53:00 345

原创 JAVA并发包(二十五):Semaphore

Semaphore也是高并发中控制并发量的工具,它维护一系列的运行许可。每个线程运行之前来获取许可,许可的数量有限,只有获得的线程才能继续运行,否则阻塞等待。通过前面对CountDownLatch的学习,现在来理解Semaphore应该会轻松点。一、基本代码结构public class Semaphore implements java.io.Serializable { /** S...

2020-02-05 21:11:11 208

原创 JAVA并发包(二十四):CyclicBarrier

CyclicBarrier中文翻译是循环栏栅,用在并发中,可以理解为它要求指定数量的线程必须都到达某个指定位置时才能往下走。为什么叫循环,因为这个栏栅可以多次循环使用,一次放开栏栅后,所有线程都会通过。然后关闭栏栅,后面就可以接着使用。生活中的例子是,比如一个团队准备去爬山,约定在某个时间地点,要每个成员都到达才会出发。先到达的只能在集合地等待了,只要最后一个成员到达,大家才会出发。代码例子如下...

2020-02-05 18:55:55 391

原创 JAVA并发包(二十三):CountDownLatch

CountDownLatch用在一个操作需要等待其他多个操作都执行完毕之后才会执行的场合,可以理解有一个计数器,某个动作需要等待计数器减到0的时候会发运行。用汽车等待乘客的例子好理解些,比如一辆小汽车,必须等待满3个乘客才会发车,我们来看看例子: public static void main(String[] args) throws InterruptedException { ...

2020-02-05 15:43:16 226

原创 JAVA并发包(二十二):CopyOnWriteArraySet

CopyOnWriteArraySet是基于CopyOnWriteArrayList实现的,它能保证数组里的对象是唯一的。由于在上篇文章中对CopyOnWriteArrayList做了较详细的讲解,这里就简要分析下CopyOnWriteArraySet的原理。一、代码结构CopyOnWriteArraySet继承了AbstractSet,它具备Set属性和方法,最重要的是保证集合里对象唯一,这...

2020-02-05 13:10:01 305

原创 JAVA并发包(二十一):CopyOnWriteArrayList

CopyOnWriteArrayList实现了List接口,从名字可以看出它在写入数据的时候复制一份数组。CopyOnWriteArrayList是数组结构,写数据可以大概描述为首先获取锁,接着把旧数组的数据复制到新数组,然后往新数组里插入数据,最后把list的数组替换为新数组。读数据不会加锁,直接读取数组的数据。下面我们从代码层面去理解。一、基本代码结构以下代码可以看出CopyOnWri...

2020-02-05 12:31:01 281

原创 JAVA并发包(二十):ConcurrentHashMap

ConcurrentHashMap也是并发环境中常见的Map,如果在高并发中没有排序等特别的需要,我们可以优先选择ConcurrenHashMap存储key-value键值对。ConcurrentHashMap一般有两个版本的实现,jdk7(包括7)之前是Segment+链表的数据结构,jdk8(包括8)之后是synchronized+cas+红黑树的数据结构。下面我们先来比较下各种常见Map...

2020-02-05 00:16:23 267

原创 JAVA并发包(十九):ConcurrentSkipListSet

ConcurrentSkipListSet基于ConcurrentSkipListMap实现的,与HashSet基于HashSet实现相像。阅读该篇文章之前请先学习ConcurrentSkipListMap,下面我将简要介绍下ConcurrentSkipListSet实现原理。一、代码结构从ConcurrentSkipListSet的构造器中,可看到实例化时会初始化m对象为Concurren...

2020-02-04 19:56:33 1703

原创 JAVA并发包(十八):ConcurrentSkipListMap

ConcurrentSkipListMap内部是一种新的数据结构,可以叫它是跳跃链表结构,其节点相当于是excel中的表格,用了存储空间换取操作时间的,其查询时间复杂度是log(n)。另外插入时已做好节点的排序,遍历的时候就是排好序的了。ConcurrentSkipListMap是可以并发操作的map,其key和value不能为null。其插入操作会比较耗性能,可以用在并发环境,插入少查询多的场...

2020-02-04 16:59:01 723

原创 JAVA并发包(十七):ConcurrentLinkedQueue

ConcurrentLinkedQueue的直接翻译叫做并发链表队列,它以自旋非阻塞的方式实现队列的功能,内部维护链表结构,没有容量的限制。可以结合LinkedBlockingQueue原理去理解ConcurrentLinkedQueue,其中的最重要区别就是线程是否阻塞等待。下面我们还是从其内部代码结构去学习ConcurrentLinkedQueue。一、内部代码结构从以下基本代码可以看到...

2020-02-04 00:58:56 2044 3

原创 JAVA并发包(十六):LinkedBlockingDeque

LinkedBlockingDeque是双端阻塞队列,它跟LinkedBlockingQueue的区别在于它可以做到后进先出,也就是实现栈的功能,本篇文章我们主要来看看它是如何实现后进先出的。一、基本代码结构从以下代码结构中可以看到,它跟LinkedBlockingQueue没什么差别,可以猜测它也是用重入锁控制并发访问。另外有两个等待队列用来阻塞队列满了或者空了的情况。public cla...

2020-01-29 15:44:15 203

原创 JAVA并发包(十五):ScheduledThreadPoolExecutor

通过之前对线程池和延迟队列的研究,我们现在来学习ScheduleThreadPoolExecutor(简称STPE)就比较轻松了。可以把STPE理解为这样一个线程池,它里面的任务可以延迟一次性执行(叫做定时任务),也可以每隔一个周期重复执行(周期任务)。STPE继承了ThreadPoolExecutor类,所以它的线程池运作原理就是ThreadPoolExecutor那一套,只是任务队列用了延迟...

2020-01-29 14:05:54 258

原创 JAVA并发包(十四):DelayQueue

DelayQueue可以说是加了定时的PriorityBlockingQueue,它也是最小堆的结构,不过节点的取出必须要等到延迟的时间。一、内部代码结构public class DelayQueue<E extends Delayed> extends AbstractQueue<E> implements BlockingQueue<E> {...

2020-01-19 22:54:30 185

原创 JAVA并发包(十三):PriorityBlockingQueue

PriorityBlockingQueue中文名可以叫做优先阻塞队列,它的内部是数组结构的最小堆,能够保证每次取出的都是队列中最小的节点(比较器返回的最小元素)。但是它在数组中不是有序,只保证数组的第一个节点是最小的,也就是说第一个优先权最高,首先会被取出。下图就是一个最小堆的示意图,它可以说是一个二叉树的结构,只需要保证父节点大于子节点,就满足最小堆的要求。然后就是从父节点开始,从上往下,从左...

2020-01-16 21:29:37 243

原创 JAVA并发包(十二):SynchronousQueue

SynchronousQueue也是阻塞队列中的一种,它用在线程池中可以让线程池动态调整线程数量,任务多它就创建多点线程去执行任务,任务少它就会把多余的线程释放掉。这在一定程度上提高了并发的吞吐量,但是需要注意的是系统资源是否承受的起线程的扩容。在代码层中,我们可以把SynchronousQueue说成是配对管道,管道中只有一种类型的它也是Collection...

2020-01-11 13:36:35 513

原创 JAVA并发包(十一):ArrayBlockingQueue

ArrayBlockingQueue 可以理解为环形数组的结构保存元素,里面只用了一把重入锁来控制出入队列的操作。另外,它虽然可以保证先进先出,但是入队列或者出队列有公平和非公平的选择,是通过重入锁实现的,默认是非公平的,那么入队列或者出队列不一定是先来的先请求到。一、代码结构从下面代码中可以看到ArrayBlockingQueue内部是维护了一个数据items,以及一个重入锁控制访问。 p...

2020-01-05 23:34:46 179

原创 JAVA并发包(十):LinkedBlockingQueue

LinkedBlockingQueue中文名叫链表阻塞队列,内部是链表结构,拥有先进先出的特性。说的阻塞的特性,是当队列满的时候插入元素会阻塞掉线程知道队列有空余位置,当队列为空的时候取出元素会阻塞直到队列有元素为止。LinkedBlockingQueue是BlockingQueue接口的实现类,我们首先来看看BlockingQueue接口。一、BlockingQueueBlockingQu...

2020-01-05 22:36:15 245

原创 JAVA并发包(九):Executors

Executors就是Executor多了一个s,但是它跟Executor没有依赖关系。它其实是一个工厂或者说是一个工具类,能够生产ExecutorService、ScheduleExecutorService、Callable、ThreadFactory实例。本篇文章暂时就讲解生产线程池的方法。一、单线程线程池从以下代码知道,单线程的线程池核心线程数和最大线程数都是1,所以不管什么情况它都是...

2020-01-05 20:29:16 296

原创 JAVA并发包(八):ExecutorCompletionService

ExecutorCompletionService它专门为那些需要返回的结果的任务设计的,它内部维护了一个阻塞队列,当任务执行完毕后会把结果放到这个队列里,调用poll就可以获取到这些结果。当调用take方法的时候,如果队列中没有结果,会阻塞等待。在之前介绍AbstractExecutorService类的invokeAny方法中提到了ExecutorCompletionService,invo...

2020-01-05 17:42:01 178

原创 JAVA并发包(七):ThreadPoolExecutor

从上篇文章中我们知道ThreadPoolExecutor继承于AbstractExecutorService,它是java并发的主要实现类,我们通常使用的三类线程池,都是通过ThreadPoolExecutor实现的。可以这样说,只要把ThreadPoolExecutor掌握了,那么对java线程池运作原理有了80%的理解。...

2020-01-05 16:30:15 226

原创 JAVA并发包(六):AbstractExecutorService

接下来我们开始研究激动人心的java并发的核心–线程池,并发包里的很多api都是服务于线程池的,像前面讲到AQS,重入锁,以及后面会讲解的阻塞队列等等,都可以在线程池的源码中看到。由于线程池设计到的api有多个,我这里就一步步来讲,先研究比较简单的AbstractExecutorService。一、接口关系图从以下关系图中可以看到,AbstractExecutorService作为抽象执行服务...

2019-12-09 23:33:21 361

空空如也

空空如也

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

TA关注的人

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