自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

sun_tantan的博客

你在红楼 我在西游

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

原创 zookeeper 理论合集

用于管理分布式系统,使一个系统中的节点知道其他节点的状态。实现方式?通过维护和监控存储的数据变化,达到基于数据的集群一致性管理。简单说,zookeeper = 文件系统 + 监控通知机制配置维护、域名维护、分布式同步、服务发现等C:保证「,并不保证强一致性,在十几秒可以Sync到各个节点(如果保证强一致,写性能会很差)如果想保证取得是数据一定是最新的,需要手工调用Sync()A:保证了可用性,数据总是可用的,没有锁但是在集群选主期间,服务不可用C 一致性A 可用性zookeeperC。

2023-09-02 17:29:45 1192

原创 XXL-JOB 分布式任务调度平台

背景为什么需要任务调度平台?项目架构​编辑核心流程1——执行器自动注册背景为什么需要任务调度平台?Java中传统的定时任务实现方案,比如JDK 1.3 提供的 Timer、JDK 1.5 提供的 ScheduledExecutorService、Spring 3.0 提供的Spring Task但如果一个系统为分布式部署,由多台主机组成,在某一时间只需要由一台主机运行定时任务,就需要一个分布式的调度框架来实现。开源任务调度框架 Quartz 实现了这个功能。

2023-09-02 17:26:54 370

原创 【SpringBoot】启动过程之——SpringApplication初始化及运行

springApplication初始化及运行过程

2022-07-04 13:13:37 556

原创 【SpringBoot】中的 ApplicationContextInitializer 与 ApplicationListener

spring 中的 初始器与监听器,及如何自定义实现

2022-06-10 21:03:20 612 1

原创 【SpringBoot】启动过程之——注解

@SpringBootApplication注解详谈

2022-06-10 19:36:51 1068

原创 【SpringBoot】SPI 与 spring.factories

SPI 即 Service Provider Interface。是 JDK 内置的一种服务提供发现机制,为某个接口寻找服务的实现,在模块化设计中这个机制很重要。

2022-06-06 23:36:26 662

原创 【SpringBoot】实现自定义 spring-boot-starter

Spring Boot 的依赖管理、实现一个自定义的 spring-boot-starter

2022-06-06 23:30:34 1206

原创 【Kafka】KafkaConsumer消费者客户端实现原理

目录一、消费者和消费组二、消息投递模式三、消费者客户端1. 订阅主题与分区2. 消息消费四、消费端位移五、消费再均衡、再均衡监听器六、消费者拦截器七、多线程实现1. 每个线程实例化一个KafkaConsumer对象2. 仅多线程处理消息一、消费者和消费组消费者:订阅kafka中的主题Topic,并且从订阅的主题上拉取消息。消费组:每个消费者都有一个对应的消费组,当消息发布到主题后,只会被投递给订阅它的每个消费组中的一个消费者。如图,某个Topic中有4个分区,有俩个消费组都订阅了这个主

2021-10-27 19:48:13 1033

原创 【Kafka】KafkaProducer生产者客户端实现原理

目录一、发送消息发送消息的模式二、分区器三、生产者拦截器四、实现原理一、发送消息 KafkaProducer<String,String> producer = new KafkaProducer<>(props); ProducerRecord<String,String> record = new ProducerRecord<>(topic,"hello"); producer.send(record)构建的消息对象Produc

2021-10-17 00:32:02 232

原创 【Kafka】体系结构与基本概念

目录一、Kafka体系结构基本概念一、Kafka体系结构kafka被定位为一个分布式流式处理平台,以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。其所扮演的三大角色:消息系统与传统的消息中间件都具备系统解耦、冗余存储、流量削峰、异步通信、扩展性、可恢复性等功能。与此同时,kafka还提供了大多数消息系统难以实现的消息顺序性保障和回溯消费的功能。存储系统kafka把消息持久化到磁盘,相比于其他内存存储的系统而言,有效地降低了数据丢失的风险。流式处理平台不仅为

2021-10-17 00:20:59 198

原创 【Zookeeper】服务启动、请求处理、数据存储...内部实现原理

目录一、服务器启动1. 单机版服务器启动2. 集群版服务器启动二、请求处理三、客户端四、数据与存储一、服务器启动1. 单机版服务器启动大概可以分为以下五个步骤:配置文件解析初始化数据管理器创建Zookeeper数据管理器FileTxnSnapLog,FileTxnSnapLog是Zookeeper上层服务器和底层数据存储之间的对接层,提供了一系列操作数据文件的接口,包括事务日志文件和快照数据文件。初始化网络IO管理器创建ServerCnxnFactory,在Zookeeper中可

2021-10-15 00:38:19 227

原创 【Zookeeper】应用场景及实现原理

目录1. 数据发布订阅——Watch机制2. 负载均衡——Watch机制3.命名服务(分布式全局ID)——顺序节点4. 集群管理——临时节点 + Watch机制5. Master选举——并发安全6. 分布式锁——临时顺序节点 + Watch机制6.1 排它锁6.2 共享锁7. 分布式队列——临时顺序节点 + Watch机制1. 数据发布订阅——Watch机制如:全局配置信息(配置更新频繁)推拉结合客户端向服务器注册自己关注的节点、一旦该节点的数据发生变更,那么服务器就向相应的客户端发送Watch

2021-09-28 19:43:22 185

原创 【Zookeeper】Session会话机制及实现

目录Session结构会话创建会话管理会话清理会话激活会话重连Session结构Zookeeper在执行任何请求之前,都需要在客户端和服务端之间先建立Session,如客户端的请求顺序执行、watcher的通知机制等。所谓Session,就是客户端与服务端之间创建的一个 TCP长链接 。Session结构SessionId:会话idTimeOut:会话从新建到关闭的时长,由Zookeeper服务端管理ExpirationTime:创建时间+TimeOut。是一个绝对时间。IsClosing:

2021-09-27 19:22:45 412

原创 【Zookeeper】Watcher监听机制实现分析

目录一、Zookeeper的节点模型——ZNode二、Watcher监听机制涉及到的关键接口、类关键流程1. 客户端注册watcher2. 服务端注册watcherWatcher注册流程图3. 服务端触发Watcher4. 客户端回调Watcher监听机制的特点一、Zookeeper的节点模型——ZNode路径引用:我们可以通过路径引用的方式访问ZNode节点。对节点的访问必须从根节点开始写起,因为Zookeeper中是通过绝对路径作为key,Znode本身作为value进行存储的。与Linux文件

2021-09-23 17:42:19 724

原创 【Zookeeper】分布式原理与ZAB协议、顺序一致性保证

目录一、Zookeeper——分布式协调系统二、分布式理论分布式原理CAP最终一致性原理BASE分布式事务2PC、3PC三、Zookeeper的节点模型——ZNode四、Watcher监听机制涉及到的关键接口、类关键流程1. 客户端注册watcher2. 服务端注册watcherWatcher注册流程图3. 服务端触发Watcher4. 客户端回调Watcher监听机制的特点一、Zookeeper——分布式协调系统Zookeeper是一个分布式的、开源的分布式应用程序协调服务。是Google的Chubb

2021-09-23 17:40:56 394

原创 Java中的网络IO模型:BIO/NIO/AIO

目录Java IO类型Java网络IO模型:BIO/NIO/AIO1. Java BIO(同步阻塞)2. Java NIO(同步非阻塞)3. Java AIO(异步非阻塞)BIO、NIO、AIO 适用场景分析Java IO类型Java IO常见使用场景磁盘操作: File字节操作: InputStream 和 OutputStream字符操作: Reader 和 Writer对象操作: Serializable网络操作Java 中的网络支持InetAddress: 用于表示网络上的硬

2021-08-19 19:47:54 293

原创 【Redis】多路复用IO、Reactor模型

目录一、UnixIO的五种类型非阻塞IO事件轮询(多路复用)附. Java中的线程模型Redis是个单线程程序。因为它所有的数据都存在内存中,所有的运算都是内存级别的运算。那么既然是单线程,如何处理并发的客户端连接?一、UnixIO的五种类型一个输入操作通常包括两个阶段:等待数据准备好:等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区。从内核向进程复制数据:把数据从内核缓冲区复制到应用进程缓冲区。一般情况下有5种类型:(同步)阻塞式 I/O应用进程被阻塞,直到数

2021-08-19 00:41:54 949

原创 【Redis】分布式Redis与高可用性——主从同步、哨兵模式、集群模式

35-CodisVSRedisCluster:我该选择哪一个集群方案?Redis(9)——史上最强【集群】入门实践教程目录一、主从同步CAP原理同步策略:指令同步、快照同步二、Sentinel哨兵模式自动故障转移配置提供三、集群部署:Codis、ClusterCodisRedis ClusterCodis与Redis Cluster的对比一、主从同步即使一些企业没有使用Redis集群,但至少都做了主从。当Master节点挂掉的时候,让Slave节点过来接管,服务就可以继续。否则主节点需要经过数据.

2021-08-17 00:30:21 513

转载 【Redis】持久化

Redis(7)——持久化【一文了解】目录为什么要持久化?一、快照COW机制二、AOF日志三、Redis 4.0混合持久化为什么要持久化?Redis的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证Redis的数据不会因为故障而丢失,这种机制就是Redis的持久化机制。Redis的持久化机制有两种,第一种是快照,第二种是AOF日志。一、快照快照是一次全量备份,是内存数据的二进制序列化形式,在存储上非常紧凑。但我们知道,Redis 是一个 单线程 的程序,这意味着,.

2021-08-10 09:12:48 117

原创 【Redis】常见功能:分布式锁、延时队列、限流...

分布式锁的实现之 redis 篇Redis(3)——分布式锁深入探究《Redis深度历险 核心原理与应用实战》目录一、为什么要使用分布式锁?二、Redis分布式锁的实现——setnx问题1. setnx与expire是两条指令不能保证原子性问题2. 超时问题超时导致锁误解除超时导致并发问题3. 可重入性借助线程ThreadLocal使用Hash结构问题4. 集群环境下RedLock一、为什么要使用分布式锁?我们在系统中修改已有数据时,需要先读取,然后进行修改保存,此时很容易遇到并发问题。由于修.

2021-08-08 23:49:49 380

原创 【Redis】五种存储类型及其底层数据结构

Redis(Remote Dictionary Service远程字典服务)目录1. Redis的五种存储类型1.1 String字符串1.2 List列表1.2.1 ZipList压缩列表1.2.1 QuickList快速链表1.3 Hash字典1.4 Set集合1.5 Zset有序列表1. Redis的五种存储类型1.1 String字符串字符串是redis中最简单的数据结构,其内部表示就是一个字符数组。SDS动态字符串(simple dynamic string)Redis中所有场景中.

2021-08-07 23:27:53 1941

原创 【JVM】常见调试排错场景、内存与线程Dump分析

目录OOM分析Java堆内存溢出元空间/方法区溢出线程DumpOOM分析Java堆内存溢出启动参数:-Xms250m -Xmx250m ,最大最小堆内存250m,禁止自动扩展内存-XX:+HeapDumpOnOutOfMemoryError:在发生OOM时进行堆内存Dump生成快照public class oomController { @RequestMapping(value = "/test", method = RequestMethod.GET) publ

2021-07-21 01:09:35 554 1

原创 【JVM】字节码与ASM字节码增强、Instrument实现类的动态重加载

字节码与ASM字节码增强以下内容摘自:字节码增强技术探索什么是字节码?Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用之所以被称之为字节码,是因为字节码文件由十六进制值组成,而JVM以两个十六进制值为一组,即以字节为单位进行读取。在Java中一般是用javac命令编译源代码为字节码文件,一个.java文件从编译到运行的示例如图所示。编译:由javac编译,

2021-07-14 09:59:39 1603 1

原创 【JVM】类加载过程与类加载器的双亲委派模型

目录概述——类加载机制类加载的过程1. 加载2. 验证3. 准备4. 解析5. 初始化类加载器的双亲委派模型类与类加载器概述——类加载机制Class文件中描述的各种信息,最终都需要加载到虚拟机中才能运用和使用,而虚拟机如何加载这些文件?Class文件中的信息进入到虚拟机后会发生什么变化?虚拟机的类加载机制:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。这些过程都是在程序运行期间完成的,即运行期类加载。类加载的过程

2021-07-09 00:01:46 176 1

原创 【JVM】JIT即时编译器的优化、JVM中基于解释+编译工作模式

目录解释与编译?Java程序的运行过程JIT即时编译器JVM工作模式解释器+编译器工作模式分层编译模式(1个解释器+2个编译器)编译优化解释与编译?高级程序语言按照程序的执行方式分为解释与编译两种。解释型语言指解释器对源程序逐行解释,成为特定平台的机器码并立即执行。其执行效率不高,却有着好的移植性。编译型语言指编译器针对特定的操作系统,将源代码一次性翻译成可被该平台执行的机器码。最大的优势是执行速度快。Java程序的运行过程JVM是Java虚拟机,目的为在不同的平台上(W

2021-07-04 22:50:21 233 2

原创 【JVM】SafePoint与各类垃圾收集器工作过程

垃圾回收器新生代可配置的回收器:Serial、ParNew、Parallel Scavenge老年代配置的回收器:CMS、Serial Old、Parallel Old新生代和老年代区域的回收器之间进行连线,说明他们之间可以搭配使用。G1是一个独立的收集器不依赖其他6种收集器...

2021-07-03 18:33:06 281 1

原创 【JVM】垃圾回收算法、堆内存分配与GC过程

目录内存模型1. 程序计数器2. 栈本地方法栈3. 堆4. 方法区运行时常量池常量池垃圾回收1.方法区2. 堆堆内存回收内容GC角度区域划分GC类型垃圾回收算法(新生代)复制算法内存分配策略内存模型1. 程序计数器它是一块很小的内存空间,是JVM中唯一一块没有规定任何OutofMemeryError的内存。它的生命周期与线程一致,Cpu切换不同的线程执行,当切换到一个线程时,需要知道从哪里开始继续执行,寄存器中的值就储存了下一条应该执行什么字节码指令,具体存储的是下一条指令的偏移地址。2. 栈

2021-07-03 15:53:45 236

原创 【JVM】内存模型之运行时数据区

目录运行时数据区1. 程序计数器2. 栈本地方法栈3. 堆4. 方法区运行时常量池常量池Q:是否所有new出来的对象都分配在堆内存中?运行时数据区1. 程序计数器它是一块很小的内存空间,是JVM中唯一一块没有规定任何OutofMemeryError的内存。它的生命周期与线程一致,Cpu切换不同的线程执行,当切换到一个线程时,需要知道从哪里开始继续执行,寄存器中的值就储存了下一条应该执行什么字节码指令,具体存储的是下一条指令的偏移地址。2. 栈线程私有,它的生命周期与线程相同。每当创建

2021-07-03 15:52:47 101

原创 【SpringMVC】请求的执行过程与源码分析

目录1. SpringMVC是什么?2. SpringMVC框架工作过程组件说明启动过程1. ContextLoaderListener2. DispatcherServletQ&A1. SpringMVC是什么?JavaEE是用来开发传统的B/S架构的一种思想,它为我们提供了一系列的标准,如Servlet、JPA等而Spring的定位就是帮助我们解决直接使用JavaEE的过程中的问题,并总结到了一套框架中,比如IOC控制翻转。经过多年发展,Spring发布了很多组件:spring-co

2021-06-14 23:56:29 162 1

原创 About MyBatis——有关Mybatis,自问自答系列

目录1. Mybatis为什么只调用接口就可以运行SQL?2. Mybatis中的批处理3. Mybatis中的二级缓存4. Spring + Mybatis1. Mybatis为什么只调用接口就可以运行SQL?存储首先是xml配置文件的解析,一开始mybatis将每一个CRUD的节点,解析为一个MappedStatement存储在Configuration中,其唯一标志statemenId:namespace+methodName;创建代理客户端首先需要调用SqlSession.getMapp

2021-06-09 11:49:22 96

原创 【MyBatis详解】——动态SQL解析与执行原理

目录Demo:动态SQL1. Xml中Sql节点解析——存储到SqlSource对象2. Sql执行——通过调用SqlSource.getBoundSql得到动态处理过的Sql1. SqlNode.apply处理动态内容2. SqlSourceParser.parse替换#符号为?Demo:动态SQL<select id="countByMap" resultType="int"> select count(id) from person <where&

2021-06-02 00:54:55 648

原创 【MyBatis详解】——从Xml配置解析到SQL执行过程

目录架构使用DemoMybatis核心流程1. 创建SqlSessionFactory配置解析——SQL解析(存储MappedStatement到Configuration中)架构Mybatis的架构整体可以分为3层:接口层也就是和数据库进行交互,核心接口为SqlSession,一个SqlSession对应着一次数据库会话,那么其生命周期不是永久的,理论上每次访问数据库时都需要创建它。形式分为两种,一种是使用Mapper接口,一种是基于Mybatis提供的Api;Mybatis提供的Api

2021-06-02 00:39:31 3661 6

原创 【J.U.C-executors】执行器框架——Fork/Join模式简要概述

与ThreadPoolExecutor不同的是,ForkJoin线程池中有多个WorkerQueue任务队列,每个队列对应一个线程,执行分割好的小任务;还使用了工作窃取机制,避免某些线程的空闲。

2021-05-13 19:00:25 120 1

原创 【J.U.C-executors】执行器框架——Future模式

Future给我们提供了异步获取任务执行结果的模式,依赖于对任务维护了一系列状态。当线程调用get获取结果,但是任务未结束时,将会进入栈中被挂起。

2021-05-13 19:00:10 137

原创 【J.U.C-executors】执行器框架—— ThreadPoolExecutor线程池实现原理分析

本文分析了ThreadPoolExecutor线程池的实现,我们创建线程池时通过调整corePoolSize、maximumPoolSize、workQueue等待队列长度的参数,来适应不同的场景需求。

2021-05-07 18:29:28 91

原创 【J.U.C-executors】执行器框架——Executor接口

Executor提供了一种将Runnable任务本身与任务执行解耦的方法,我们可以不再关注线程的创建过程。

2021-05-01 21:59:04 117

原创 About AQS——有关AQS与其实现的同步器,自问自答系列

是时候总结一下了

2021-04-27 10:43:32 148

原创 【J.U.C-synchronizer】同步器框架——Semaphore信号量

Semaphore信号量,它可以控制某个共享资源被同时访问的线程个数。也实现了AQS中的共享模式,但是与CountDownLatch相反,允许多个线程同时对state++

2021-04-26 17:56:35 73

原创 【J.U.C-synchronizer】同步器框架——CyclicBarrier循环栅栏

CyclicBarrier循环栅栏,没有直接实现AQS中接口,而是借助ReentrantLock与Condition实现,当到达栅栏等待的线程满足一定数量时,栅栏才会放行。

2021-04-25 17:56:41 95

原创 【J.U.C-synchronizer】同步器框架——CountDownLatch倒数计数器

CountDownLatch是多线程环境下倒数计数器,实现了AQS中的共享模式:允许多个线程同时countDown对计数器减1、当计数器倒数到0时,唤醒所有await阻塞的线程。

2021-04-25 16:06:08 79

空空如也

空空如也

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

TA关注的人

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