自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 interrupt和interrupted和isInterrupted的区别

interruptCode Demopackage org.fool.thread;public class InterruptTest1 { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { for (i

2021-07-03 11:20:55 309

原创 SpringMVC源码分析

目录1.Tomcat和Servlet1.1servlet是什么?1.2Servlet 与 Servlet 容器(Tomcat)的关系​1.3Servlet接口设计1.4servlet生命周期2.SpringMVC2.1DispatcherServlet的初始化准备工作2.2DispatcherServlet接收用户请求2.2.1HandlerMapping为请求匹配处理器执行链HandlerExecutionChain2.2.2根据处理器方法handlerM.

2021-02-05 15:40:10 356

原创 Spring@Import注解的三种用法

目录1.直接引入2.引入ImportSelector的实现3.引入ImportBeanDefinitionRegistrar的实现4.Import源码解析4.1如果引入的类是ImportBeanDefinitionRegistrar.class的实现类4.2如果引入的类是ImportSelector.class的实现类4.3如果引入的类是其他的类4.4从配置类加载beanDefinition4.4.1普通引入类注册4.4.2ImportBeanDefinition..

2021-02-05 15:23:03 605

原创 Spring事务

1、使用spring事务 添加依赖spring-tx 开启事务管理 @EnableTransactionManagement 在类或方法上添加事物注解 @Transactional 2.事务是如何实现的Spring事务是基于aop实现的,大致流程和Spring类似: 解析切面生成advisor【因为这里只有一个切面,就是事务切面,所以不用解析,系统内置了事务切面的增强通知advisor】 根据切面匹配切点对象生成代理对象 调用代理对象注入事务管理.

2021-02-05 14:41:34 309 1

原创 Spring AOP源码解析

目录@EnableAspectJAutoProxy开启代理功能1.解析Aspect切面生成增强通知2.创建动态代理3.调用代理对象@EnableAspectJAutoProxy开启代理功能Spring容器在启动的时候,refresh方法中会调用bean工厂的后置处理器invokeBeanFactoryPostProcessors,其中有一个内置的配置类后置处理器ConfigurationClassPostProcessor,会去解析配置类,扫描到配置类上面的EnableA..

2021-01-26 10:32:20 140

原创 JDK动态代理和CGLIB动态代理

JDK动态代理基于InvocationHandler接口实现,demo如下public class JdkProxy implements InvocationHandler {private Object target;public void setTarget(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy...

2021-01-26 10:17:11 193

原创 Spring的事件监听

2021-01-26 10:11:20 115

原创 谈谈你对SpringIOC的理解

谈谈你对SpringIOC的理解什么是SpringIOCSpringIOC中文名称翻译过来就是spring的控制反转。就是bean对象的控制权利由程序员手里移交给容器,由容器来创建对象和控制bean的生命周期,使用时只需要从容器获取就行了。举个栗子:你中午想吃饭,但是因为各种原因,你拿出手机,点开美团点了个外卖,半个小时以后外卖小哥把饭送到你的手里。这个时候我们称之为饭菜的控制权由你反转给了美团,你并不关心这个菜是哪个厨师做的,具体怎么做的,全都交给平台来处理,需要的时候由平台来提供。Sp.

2021-01-26 09:53:37 464

原创 2.Dubbo动态扩展

我们知道dubbo通过SPI机制实现了灵活的动态扩展,但是这些扩展的优先级怎么样?怎么去判断最后采用的是哪个实现?先上结论:@Adaptive注解实现类 >配置名对应的实现(例如:<provider protocol=dubbo ..>)> @Spi注解上的默认值具体加载和选择执行流程图图片在线链接:https://www.processon.com/view/link/5fd4ae5c7d9c0806f72ee982接下来我们从这一行代码分析,Du...

2020-12-21 11:52:28 2900

原创 1.Dubbo中的SPI机制

1.JAVA SPIjava spi的具体约定为:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。jdk提供服务实现查找的一个工具类java.util.Serv.

2020-12-21 11:44:47 145

原创 4.Netty服务端源码分析

Netty线程模型图源码执行过程流程图图片链接:https://www.processon.com/view/link/5fc6f349e401fd0eb98da1e1Netty服务端代码// 管理连接线程组EventLoopGroup bossGroup = new NioEventLoopGroup(1);// 处理io任务线程组EventLoopGroup workerGroup = new NioEventLoopGroup();try {...

2020-12-07 23:17:25 107

转载 11.TiDB集群部署

最小规模的 TiDB 集群拓扑: 实例 个数 IP 配置 TiKV 3 10.0.1.1 10.0.1.1 10.0.1.1 避免端口和目录冲突 TiDB 1 10.0.1.1 默认端口 全局目录配置 PD

2020-12-01 16:43:33 260

转载 10.TiPD 调度

调度概述PD 是 TiDB 集群的管理模块,同时也负责集群数据的实时调度。本文档介绍一下 PD 的设计思想和关键概念。场景描述TiKV 集群是 TiDB 数据库的分布式 KV 存储引擎,数据以 Region 为单位进行复制和管理,每个 Region 会有多个 Replica(副本),这些 Replica 会分布在不同的 TiKV 节点上,其中 Leader 负责读/写,Follower 负责同步 Leader 发来的 Raft log。需要考虑以下场景: 为了提高集群的空间利用率,需要

2020-12-01 16:40:32 924

转载 9.TiDB数据库的计算

SQL 层简介TiDB 的 SQL 层,即 TiDB Server,负责将 SQL 翻译成 Key-Value 操作,将其转发给共用的分布式 Key-Value 存储层 TiKV,然后组装 TiKV 返回的结果,最终将查询结果返回给客户端。这一层的节点都是无状态的,节点本身并不存储数据,节点之间完全对等。SQL 运算最简单的方案就是通过上一节所述的表数据与 Key-Value 的映射关系方案,将 SQL 查询映射为对 KV 的查询,再通过 KV 接口获取对应的数据,最后执行各种计算。比如

2020-12-01 16:39:39 495

转载 8.存储引擎TiFlash

TiFlash 简介TiFlash 是 TiDB HTAP 形态的关键组件,它是 TiKV 的列存扩展,在提供了良好的隔离性的同时,也兼顾了强一致性。列存副本通过 Raft Learner 协议异步复制,但是在读取的时候通过 Raft 校对索引配合 MVCC 的方式获得 Snapshot Isolation 的一致性隔离级别。这个架构很好地解决了 HTAP 场景的隔离性以及列存同步的问题。整体架构上图为 TiDB HTAP 形态架构,其中包含 TiFlash 节点。TiFlash 提供列

2020-12-01 16:38:56 1066

转载 7.存储引擎TiKV

TiKV 简介TiKV 是一个分布式事务型的键值数据库,提供了满足 ACID 约束的分布式事务接口,并且通过Raft 协议保证了多副本数据一致性以及高可用。TiKV 作为 TiDB 的存储层,为用户写入 TiDB 的数据提供了持久化以及读写服务,同时还存储了 TiDB 的统计信息数据。整体架构与传统的整节点备份方式不同,TiKV 参考 Spanner 设计了 multi raft-group 的副本机制。将数据按照 key 的范围划分成大致相等的切片(下文统称为 Region),每一个切片会..

2020-12-01 16:38:05 1068

转载 6.TiDB数据库的存储

Key-Value Pairs(键值对)作为保存数据的系统,首先要决定的是数据的存储模型,也就是数据以什么样的形式保存下来。TiKV 的选择是 Key-Value 模型,并且提供有序遍历方法。 TiKV 数据存储的两个关键点: 这是一个巨大的 Map(可以类比一下 C++ 的 std::map),也就是存储的是 Key-Value Pairs(键值对) 这个 Map 中的 Key-Value pair 按照 Key 的二进制顺序有序,也就是可以 Seek 到某一个 Key 的位...

2020-12-01 16:37:10 988

原创 3.Netty编解码和粘包拆包

1.Netty组件ChannelHandlerChannelHandler充当了处理读写数据的应用程序逻辑容器,管理读写数据的生命周期。例如,实现ChannelInboundHandler接口(或ChannelInboundHandlerAdapter),你就可以接收read事件和数据,这些数据随后会被你的应用程序的业务逻辑处理。当你要给连接的客户端发送响应时,也可以从ChannelInboundHandler冲刷数据。你的业务逻辑通常写在一个或者多个ChannelInboundHand..

2020-11-30 17:04:02 165

转载 5.TiDB SQL优化(二)

1.物理优化物理优化是基于代价的优化,为上一阶段产生的逻辑执行计划制定物理执行计划。这一阶段中,优化器会为逻辑执行计划中的每个算子选择具体的物理实现。逻辑算子的不同物理实现有着不同的时间复杂度、资源消耗和物理属性等。在这个过程中,优化器会根据数据的统计信息来确定不同物理实现的代价,并选择整体代价最小的物理执行计划。1.1索引的选择从存储层读取数据是 SQL 计算过程中最为耗时的部分之一,TiDB 目前支持从不同的存储和不同的索引中读取数据,索引选择得是否合理将很大程度上决定一个查询的运...

2020-11-26 00:19:38 973 1

转载 4.Tidb SQL优化(一)

1.SQL 优化流程在 TiDB 中,从输入的查询文本到最终的执行计划执行结果的过程可以见下图。在经过了parser对原始查询文本的解析以及一些简单的合法性验证后,TiDB 首先会对查询做一些逻辑上的等价变化,通过这些等价变化,使得这个查询在逻辑执行计划上可以变得更易于处理。在等价变化结束之后,TiDB 会得到一个与原始查询等价的查询计划结构,之后根据数据分布、以及一个算子具体的执行开销,来获得一个最终的执行计划,同时,TiDB 在执行PREPARE语句时,可以选择开启缓存来降低...

2020-11-26 00:17:57 649

原创 2.Netty入门

简介NIO 的类库和 API 繁杂, 使用麻烦: 需要熟练掌握Selector、 ServerSocketChannel、 SocketChannel、 ByteBuffer等。开发工作量和难度都非常大: 例如客户端面临断线重连、 网络闪断、心跳处理、半包读写、 网络拥塞和异常流的处理等等。Netty 对 JDK 自带的 NIO 的 API 进行了良好的封装,解决了上述问题。且Netty拥有高性能、 吞吐量更高,延迟更低,减少资源消耗,最小化不必要的内存复制等优点。使用场景1)互联.

2020-11-26 00:13:36 90

原创 1.BIO、NIO和AIO

BIO(Blocking IO)同步阻塞模型,一个客户端连接对应一个处理线程缺点:1、IO代码里read操作是阻塞操作,如果连接不做数据读写操作会导致线程阻塞,浪费资源2、如果线程很多,会导致服务器线程太多,压力太大。应用场景:BIO 方式适用于连接数目比较小且固定的架构, 这种方式对服务器资源要求比较高,但程序简单易理解。NIO(Non Blocking IO)同步非阻塞,服务器实现模式为一个线程可以处理多个请求(连接),客户端发送的连接请求都会注册到多路复用器..

2020-11-26 00:07:39 112

转载 Netty java.lang.IndexOutOfBoundsException: srcIndex: 0异常错误

在用netty框架做采集程序时,控制台有时会输出 WARNio.netty.channel.AbstractChannelHandlerContext-Failed to mark a promise as failure because it has failed already: DefaultChannelPromise@630e0515(failure: java.lang.IndexOutOfBoundsException: srcIndex: 0), unnotified cause: ...

2020-11-25 16:12:22 2295

转载 3.理解TiDB执行计划

一、ExplainEXPLAIN语句仅用于显示查询的执行计划,而不执行查询。EXPLAIN ANALYZE可执行查询,补充EXPLAIN语句。如果EXPLAIN的输出与预期结果不匹配,可考虑在查询的每个表上执行ANALYZE TABLE。语句DESC和DESCRIBE是EXPLAIN的别名。EXPLAIN <tableName>的替代用法记录在SHOW [FULL] COLUMNS FROM下。TiDB 支持EXPLAIN [options] F...

2020-11-18 18:05:01 3952 1

转载 2.TIDB整体架构

与传统的单机数据库相比,TiDB 具有以下优势: 纯分布式架构,拥有良好的扩展性,支持弹性的扩缩容 支持 SQL,对外暴露 MySQL 的网络协议,并兼容大多数 MySQL 的语法,在大多数场景下可以直接替换 MySQL 默认支持高可用,在少数副本失效的情况下,数据库本身能够自动进行数据修复和故障转移,对业务透明 支持 ACID 事务,对于一些有强一致需求的场景友好,例如:银行转账 具有丰富的工具链生态,覆盖数据迁移、同步、备份等多种场景 在内核设计上,Ti

2020-11-18 18:01:55 550 1

转载 1.快速部署TIDB本地测试环境

适用场景:利用本地 Mac 或者单机 Linux 环境快速部署 TiDB 集群。可以体验 TiDB 集群的基本架构,以及 TiDB、TiKV、PD、监控等基础组件的运行。 耗时:1 分钟 1.下载并安装 TiUPcurl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh2.声明全局环境变量source /root/.bash_profile3.启动集群...

2020-11-18 18:00:26 1051 1

原创 kafka-03-kafka常见线上问题

一、kafka集群管理工具kafka-manager部署安装 https://www.cnblogs.com/dadonggg/p/8205302.html二、JVM参数设置kafka是scala语言开发,运行在JVM上,需要对JVM参数合理设置,参看JVM调优专题 修改bin/kafka-start-server.sh中的jvm设置 1 export KAFKA_HEAP_OPTS="‐Xmx16G ‐Xms16G ‐Xmn12G ‐XX:MetaspaceSize=256M ...

2020-10-12 11:59:23 373

原创 kafka-02-kafka设计原理详解

一、消费者消费消息的offset记录机制每个consumer会定期将自己消费分区的offset提交给kafka内部topic:__consumer_offsets,提交过去的时候,key是consumerGroupId+topic+分区号,value就是当前offset的值,kafka会定期清理topic里的消息,最后就保留最新的那条数据因为__consumer_offsets可能会接收高并发的请求,kafka默认给其分配50个分区(可以通过offsets.topic.num.partition..

2020-10-12 11:56:59 375

原创 kafka-01-高性能消息中间件Kafka实战

一、简介Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。二、使用场景 日志收..

2020-10-12 11:53:12 532 1

原创 RocketMq-02-特性详解&场景介绍

一、基本概念1、消息模型RocketMQ主要由 Producer、Broker、Consumer 三部分组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。2、消息生产者(producer)负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到broker服务器。RocketMQ提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要Broker返回确认信息,单向发送不需要。.

2020-10-10 17:31:48 423

原创 RocketMq-01-整体部署与快速实战

一、简介Apache RocketMQ是一个分布式消息传递和流媒体平台,具有低延迟,高性能和可靠性,万亿级容量和灵活的可伸缩性。 它由四个部分组成:nameserver,broker,生产者和使用者。 它们中的每一个都可以水平扩展,而没有单个故障点。 如上面的屏幕截图所示。nameserver:提供轻量级的服务发现和路由。 每个名称服务器记录完整的路由信息,提供相应的读写服务,并支持快速的存储扩展。Broker:通过提供轻量级的TOPIC和QUEUE机制来存储消息。二、集群部署与配置参...

2020-10-10 16:20:06 234

原创 RabbitMQ(六)镜像队列

一、镜像队列默认情况下,RabbitMQ集群中的队列只会存储在某一个节点上,就是队列声明的那个节点上。当访问集群中的其他节点时,会把请求转发给这个节点来进行处理。当这个节点故障时,集群中的这个队列就表现为不可用。队列可以在多个节点中复制镜像以保障可用性,称之为镜像队列。每一个镜像队列由一个master和若干个slave组成。队列的master通常存储在集群的主节点上,没个队列有自己的主节点,镜像队列的所有操作都会首先在mastEr上执行然后广播给其他镜像。包括消息入队,推送给消费者、和消费...

2020-10-10 15:43:20 1340

原创 RabbitMQ(五)集群部署

一、安装rabbitmq所需要的依赖包yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz二、下载安装包erlang、socat、rabbitmq安装最新版本wget www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos..

2020-10-10 15:35:58 235 1

原创 RabbitMq(四)集群属性

1.RabbitMQ节点标识RabbitMQ节点通过节点名称来标识,每个节点名称包含两个部分:前缀和主机名。例如:rabbit@node1.message.svc.local。rabbit是前缀,node1.message.svc.local是主机名。集群中的每个节点的名称必须是唯一的。如果有多个节点运行在同一台机器上(一般开发环境为了节省资源会部署在同一台机器上),可以通过前缀来进行区分,例如:rabbit1@hostname, rabbit2@hostName在集群中依赖阶段名称来进行标识和互相

2020-10-10 15:21:38 479

原创 Redis(五)缓存设计与性能优化

缓存设计缓存穿透缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。造成缓存穿透的基本原因有两个:第一, 自身业务代码或者数据出现问题。第二, 一些恶意攻击、 爬虫等造成大量空命中。缓存穿透问题解决方案:1、缓存空对象String get(String key) {// 从缓存中获取数据String cacheValue =

2020-09-03 19:03:50 260

原创 Redis(四)集群水平扩容和缩容

Redis3.0以后的版本虽然有了集群功能,提供了比之前版本的哨兵模式更高的性能与可用性,但是集群的水平扩展却比较麻烦,今天就来带大家看看redis高可用集群如何做水平扩展,原始集群(见下图)由6个节点组成,6个节点分布在三台机器上,采用三主三从的模式1、启动集群#启动整个集群/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8001/redis.conf/usr/local/redis-5.0.3/src/redis

2020-09-03 18:48:27 649

原创 Redis(三)集群高可用架构

1.Redis集群方案比较哨兵模式在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率高可用集群模式redis集群是一个由多个

2020-09-03 17:59:36 335

原创 Redis(二)主从哨兵架构

Redis主从工作原理如果你为master配置了一个slave,不管这个slave是否是第一次连接上Master,它都会发送一个SYNC命令(redis2.8版本之前的命令)给master请求复制数据。master收到SYNC命令后,会在后台进行数据持久化通过bgsave生成最新的rdb快照文件,持久化期间,master会继续接收客户端的请求,它会把这些可能修改数据集的请求缓存在内存中。当持久化进行完毕以后,master会把这份rdb文件数据集发送给slave,slave会把接收到的数据进行持久化生成r

2020-09-03 17:45:30 121

原创 Redis(一)Redis持久化

1.RDB快照(snapshot)在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集:save 60 1000关闭RDB只需要将所有的save保存策略注释掉即可还可以手动执行命令生成RDB快照,进入redis客户端执行

2020-09-03 17:30:50 97

原创 Zookeeper(三)(zookeeper集群)

zookeeper集群的目的是为了保证系统的性能承载更多的客户端连接设专门提供的机制。通过集群可以实现以下功能:读写分离:提高承载,为更多的客户端提供连接,并保障性能。主从自动切换:提高服务容错性,部分节点故障不会影响整个服务集群。半数以上运行机制说明: 集群至少需要三台服务器,并且强烈建议使用奇数个服务器。因为zookeeper 通过判断大多数节点的存活来判断整个服务是否可用。比如3个节点,挂掉了2个表示整个集群挂掉,而用偶数4个,挂掉了2个也表示其并不是大部分存活,因此也会挂掉。1.集群部署

2020-09-03 17:09:51 323

空空如也

空空如也

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

TA关注的人

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