自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 探究ThreadLocal和ThreadPoolExecutor中的内存泄露风险与防范策略

在多线程编程中,ThreadLocal和ThreadPoolExecutor是两个常用的工具类,但是它们也会带来内存泄露的风险。为了避免这种情况的发生,我们可以在使用完毕后手动删除变量或关闭线程池。希望本文能够对您有所帮助。

2023-07-13 09:36:38 2473

原创 redis四:redis实现分布式锁

比如说线程1业务流程执行时间超过了锁的过期时间,导致锁失效,此时其他线程继续设置锁,然后线程1执行删除锁操作的时候,把其他线程的锁给删除了,那么就会导致一些列的锁失效的问题。这部分代码不是原子性,如果判断成功后,系统卡顿,正好此时锁过期了,其他线程设置了锁,然后卡顿恢复在执行删除代码,任然会删除其他线程设置的锁。市面上有很多分布式锁的方案,但是通过手写分布式锁,可以更好了解分布式锁的原理,以及分布式锁逻辑流程。线程1获取锁成功,后台线程每隔10秒检查是否还持有锁,如果持有延长锁的过期时间。

2023-02-03 16:37:36 1484 1

原创 RocketMQ三:rocketmq进阶和深入理解

每个ConsumeQueue文件固定由30万个固定大小20byte的数据块组成,数据块的内容包括:msgPhyOffset(8byte,消息在文件中的起始位置)+msgSize(4byte,消息在文件中占用的长度)+msgTagCode(8byte,消息的tag的Hash值)。通常,一条消息进入了死信队列,意味着消息在消费处理的过程中出现了比较严重的错误,并且无法自行恢复。​ 首先对于广播模式的消息, 是不存在消息重试的机制的,即消息消费失败后,不会再重新进行发送,而只是继续消费新的消息。

2022-10-17 10:46:48 1038

原创 RocketMQ二 补充:springboot整合rocketmq

springboot整合rocketmq

2022-10-12 17:02:06 870

原创 RocketMQ二:java整合rocketmq开发模型

​2、为了避免单个消息被检查太多次而导致半队列消息累积,默认将单个消息的检查次数限制为 15 次,但是用户可以通过 Broker 配置文件的 transactionCheckMax参数来修改此限制。开源版本的RocketMQ中,对延迟消息并不支持任意时间的延迟设定(商业版本中支持),而是只支持18个固定的延迟级别,1到18分别对应messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h。你也可以很容易地扩展它。

2022-10-11 17:35:23 1303

原创 RocketMQ一:快速入门和集群架构

要注意的是,消费者组的消费者实例必须订阅完全相同的Topic。我们要对这个消息的结构有个大概的了解,其中比较关键的属性有:brokerName,queueId,msgId,topic,cluster,tags,body,transactionId。到此2主2从集群搭建完毕 案例搭建的集群是主从备份的集群,并非高可用的集群,两个从节点主要为了负载均衡,而主节点挂掉,从节点并不能升级为主节点。注意,这是官方提供的Demo,但是官方的源码中,这两个类都是没有指定nameServer的,所以运行会有点问题。

2022-10-09 17:07:15 711

原创 分库分表四:shardingjdbc内核解析和核心源码分析

ShardingSphere有3个产品。但是它们的数据分片主要流程是完全一致的。 流程核心由以下几部分组成。相对于其他编程语言,SQL是比较简单的。 不过,它依然是一门完善的编程语言,因此对SQL的语法进行解析,与解析其他编程语言(如:Java语言、C语言、Go语言等)并无本质区别。解析过程分为词法解析和语法解析。 词法解析器用于将SQL拆解为不可再分的原子符号,称为Token。并根据不同数据库方言所提供的字典,将其归类为关键字,表达式,字面量和操作符。 再使用语法解析器将SQL转换为抽象语法树。例如

2022-09-20 17:01:44 1578 1

原创 分库分表三:ShardingJDBC进阶实战案例下

首先来来了解什么是SPI。在Apache ShardingSphere中,很多功能实现类的加载方式是通过SPI注入的方式完成的。Service Provider Interface (SPI)是一种为了被第三方实现或扩展的API,它可以用于实现框架扩展或组件替换。Apache ShardingSphere之所以采用SPI方式进行扩展,是出于整体架构最优设计考虑。

2022-09-16 14:27:16 1775

原创 分库分表番外:多数据源/动态数据源实现

比如在电商网站中可能会有这样的需求:根据用户所在城市不同,查询不同城市的商品数据。而在后台,这些不同城市的数据被分配在不同的数据库当中。很多人想当然的就觉得需要使用ShardingJDBC来实现多数据源管理。这种场景就是一个典型的多数据源切换的场景。但是我们仔细分析这样的场景,他跟分库分表其实并不太相同。ShardingJDBC固然可以使用Hint策略实现快速的数据库分库查询。

2022-09-15 18:18:50 1036

原创 分库分表二:ShardingJDBC进阶实战案例上

在实际生产中,我们通常根据id作为分片键,但是往往在查询的时候会根据时间来查,比如订单,某个时间段,或者根据某个时间段进行统计订单的数量,这种情况如果只用id作为分片键,就会导致全表全库扫描。虽然到此功能实现了,但是还有一些瑕疵,比如根据id查询的时候如何确定查询那个库而不是全部都查,其实这个可以把时间添加到id上面去,这需要自定义主键生成策略,这个后面在优化。根据时间可以确定了要查哪些库,但是没法确定查哪些表,所以根据时间范围都是6月份以内,所以查1库,由于没法确定id奇偶数所以表1表2都查。

2022-09-15 11:27:55 1224

原创 分库分表一:ShardingSphere介绍和入门实战

​ShardingSphere是一款起源于当当网内部的应用框架。在2017年开始开源。并逐渐由原本只关注于关系型数据库增强工具的ShardingJDBC升级成为一整套以数据分片为基础的数据生态圈,更名为ShardingSphere。到2020年4月,已经成为了Apache软件基金会的顶级项目。ShardingSphere包含三个重要的产品,ShardingJDBC、ShardingProxy和ShardingSidecar。

2022-09-14 16:29:00 2417

原创 springBoot 源码五:springboot启动源码补充和配置优先级

上一篇分析了springboot的启动流程,其中还有一些部分没有分析完全。接下来通过一下方面进行分析。

2022-09-07 18:58:48 1090 1

原创 springBoot 源码四:springboot启动流程源码分析

这一步就开始解析配置类,也就是解析@SpringBootApplication注解,扫描我们定义bean,解析扫描到的bean,加载到spring容器中。这些步骤就和spring启动流程是一样,spring怎么扫描的,怎么解析的,这里就是一样的。这一步会发送两个事件,最终会把spring容器准备完成。注意这个阶段只是spring容器准备好,并没有进行扫描和解析,也就是说此时的spring容器中没有我们定义的bean。MyApplication.class等价于spring的配置类,启动的时候会解析这个类。

2022-09-07 10:43:23 390

原创 springBoot 源码三:Starter机制和springboot整合tomcat

springboot整合tomcat的过程中,首先通过依赖导入了tomcat的相关依赖。通过自动配置类,加载EmbeddedTomcat,也就是加载了TomcatServletWebServerFactory。通过TomcatServletWebServerFactory的getWebServer方法启动tomcat。

2022-09-05 11:14:26 864

原创 springBoot 源码二:各种条件注解解析

对于springboot各种条件注解,首先获取的条件注解中@Conditional的值。调用其抽象父类SpringBootCondition的matches方法。该方法中通过方法将结果封装成ConditionOutcome。同时是抽象方法,具体实现在子类。如果matches方法返回true表示可以加载,返回false表示不需要加载。在自动配置过程中,从MATE-INF/spring.factories获取到自动配置类和过滤器filter。在过滤的过程中调用了的match方法。该方法中。

2022-09-01 18:36:12 1650

原创 springBoot 源码一:自动配置底层源码分析

本次springboot源码来自2.6.6版本。

2022-09-01 13:53:59 481

原创 spring5.3 十四:spring AOP源码分析

上一篇分析过spring 通过ProxyFactory来创建代理对象。下面来分析下ProxyFactory的原理上一篇aop的介绍中有提到这两行代码关键是getProxy方法。决定好通过那个方式进行代理后,真正调getProxy()方法由下面两个实现类这里通过jdk的动态代理为例子这个类就是jdk动态代理源码。这个方法就是放回一个代理对象,不做过多分析。jdk动态代理中,执行代理逻辑和目标方法是通过方法整个方法的大致流程是:过滤掉equal()、hashcode()这两个方法,这两个方法执行不触

2022-08-16 09:08:37 212

原创 spring5.3 十三:spring AOP分析

AOP的实现离不来动态代理。代理模式的解释:为其他对象提供一种代理以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。动态代理实现方式一般有两种cglib和jdk的动态代理上面是通过cglib来实现的代理对象的创建,是基于父子类的,被代理类(BookService)是父类,代理类是子类,代理对象就是代理类的实例对象,代理类是由cglib创建的,对于程序员来说不用关心。......

2022-08-10 15:32:56 446

原创 spring5.3 十二:spring配置类解析源码解析

一:在启动Spring时,需要传入一个配置类,例如上面传入AppConfig.class。ApplicationContext会根据AppConfig类封装为一个BeanDefinition,这种BeanDefinition我们把它称为配置类BeanDefinition。二:ConfigurationClassPostProcessor中会把配置类BeanDefinition取出来。......

2022-08-05 16:04:16 357

原创 spring5.3 十一:spring启动过程源码分析

以AnnotationConfigApplicationContext为例子。一:在调用AnnotationConfigApplicationContext的构造方法之前,会调用父类GenericApplicationContext的无参构造方法,会构造一个BeanFactory,为DefaultListableBeanFactory。

2022-08-03 09:06:58 812

原创 spring5.3 十:推断构造方法源码分析

Spring中的一个bean,需要实例化得到一个对象时需要用到构造方法。一般情况下,一个类只有一个构造方法要么是无参的构造方法,要么是有参的构造方法。如果只有一个无参的构造方法,那么实例化就只能使用这个构造方法了。如果只有一个有参的构造方法,那么实例化时用这个构造方法的入参类型去找BeanFactory有没有符合的参数,没有的话会报错。如果有多个构造方法呢?这就要分两种情况。那么如何解决上述的错误呢,或者有多个构造方法我想指定使用哪个怎么做呢?...

2022-08-01 18:01:10 462

原创 spring5.3 九:循环依赖底层分析

二级缓存(earlySingletonObjects)缓存未经过完整生命周期的bean,在循环依赖过程中,二级缓存的是三级缓存中的lambda表达式的结果,该表达式返回的是原始对象,那么就缓存原始对象,如果返回代理对象那么就缓存代理对象。这是难点,基于上面的场景想一个问题如果A的原始对象注入给B的属性之后,A的原始对象进行了AOP产生了一个代理对象,此时就会出现,对于A而言,它的Bean对象其实应该是AOP之后的代理对象,而B的a属性对应的并不是AOP之后的代理对象,这就产生了冲突。...

2022-07-25 23:08:51 262

原创 spring5.3 八:依赖注入源码分析下

先根据spring的自动注入就是@Bean(autowire=Autowire,BY_TYPE)进行判断。这个方法已经过期,一般不会触发这个判断,可以忽略。在BeanDefinition后置处理的时候开始找注入点,对于被@Autowired、@Value、@Inject、@Resource注解标记的方法或属性属性填充阶段开始属性注入,找出之前缓存的注入点,处理@Value、再处理@Autowired。...

2022-07-25 11:41:56 169

原创 spring5.3 七:依赖注入源码分析中

依赖注入底层原理流程图。

2022-07-21 16:32:20 176

原创 spring5.3 六:依赖注入源码分析上

方法找到那些属性是需要自动注入的,说白了就是找set方法,set后面的名称就是属性名称,遍历所有找到的名称通过getBean方法获取对应的bean然后放入到RootBeanDefinition。autowireByType也类似,找到所有需要自动注入的属性名称后在找到对应的类型,然后根据类型找到对应的bean放入到RootBeanDefinition中。到此依赖注入部分就分析完了,但是如何根据属性找到具体的bean和如何根据方法找到对应的参数下篇在分析。第一个是给属性赋值的,第二个是给方法赋值的。...

2022-07-21 09:39:55 217

原创 spring5.3 五:Bean的生命周期源码解析下

bean在创建过程中经历以下步骤生成BeanDefinition合并BeanDefinition加载类实例化前实例化BeanDefinition的后置处理实例化后自动注入和处理属性执行Aware回调初始化前初始化初始化后记录所有定义了销毁逻辑的beanbean销毁的步骤首先发布ContextClosedEvent事件调用lifecycleProcessor的onCloese()方法销毁单例Bean。...

2022-07-18 14:04:20 189

原创 spring5.3 四:Bean的生命周期源码解析中

上述代码大致流程就是,首先根据传进来的name做处理获取到beanName,根据beanName从单例池中获取,如果获取到判断是不是FactoryBean,然后出对应处理。在Spring中,实例化对象之前,Spring提供了一个扩展点,允许用户来控制是否在某个或某些Bean实例化之前做一些启动动作。可以在这个步骤中,对Bean最终进行处理,Spring中的AOP就是基于初始化后实现的,初始化后返回的对象才是最终的Bean对象。的处理,该方法包含了实例化,实例化后,属性赋值,初始化前后等过程。......

2022-07-15 16:40:50 317

原创 spring5.3 三:Bean的生命周期源码解析上

Spring最重要的功能就是帮助程序员创建对象(也就是IOC),而启动Spring就是为创建Bean对象做准备,所以我们先明白Spring到底是怎么去创建Bean的,也就是先弄明白Bean的生命周期。Bean的生命周期就是指:在Spring中,一个Bean是如何生成的,如何销毁的。Bean生命周期流程图:https://www.processon.com/view/link/5f8588c87d9c0806f27358c1根据上面流程图,要想生成bean,首先要生成对应的BeanDefinition扫描

2022-07-11 14:56:35 269

原创 Elasticsearch7.17 七 :Logstash与FileBeat详解以及ELK整合

ELK架构分为两种,一种是经典的ELK,另外一种是加上消息队列(Redis或Kafka或RabbitMQ)和Nginx结构。经典的ELK主要是由Filebeat + Logstash + Elasticsearch + Kibana组成,如下图:(早期的ELK只有Logstash + Elasticsearch + Kibana)整合消息队列+Nginx架构:Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的存储库中。Logstas

2022-06-29 18:19:01 2730

原创 Kafka 二:Java整合kafka

引入maven依赖生产者同步发送消息如果发送之后还有业务逻辑,可以采用异步发送的方法异步发送指定分区和不指定分区发送消息其他重要的参数配置消费者Spring Boot整合Kafka引入spring boot kafka依赖配置文件配置类发送代码消费者代码...

2022-06-27 15:35:50 683

原创 Kafka 一:快速实战和基础概念

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

2022-06-24 16:07:55 124

原创 Elasticsearch7.17 六 :ES高级功能和数据建模

关系型数据库范式化(Normalize)设计的主要目标是减少不必要的更新,往往会带来一些副作用:反范式化(Denormalize)的设计不使用关联关系,而是在文档中保存冗余的数据拷贝。关系型数据库,一般会考虑Normalize 数据;在Elasticsearch,往往考虑Denormalize 数据。Elasticsearch并不擅长处理关联关系,一般会采用以下四种方法处理关联:案例1: 博客作者信息当我们查询博客信息的同时需要知道作者信息,那么把作者信息当成一个对象放到博客信息当中案例2:包含对象数

2022-06-23 20:59:17 946

原创 Elasticsearch7.17 五 :ES读写原理、分片设计和性能优化

单个分片7.0开始,新创建一个索引时,默认只有一个主分片。单个分片,查询算分,聚合不准的问题都可以得以避免单个索引,单个分片时候,集群无法实现水平扩展。即使增加新的节点,无法实现水平扩展两个分片集群增加一个节点后,Elasticsearch 会自动进行分片的移动,也叫 Shard Rebalancing如何设计分片数当分片数>节点数时,一旦集群中有新的数据节点加入,分片就可以自动进行分配,分片在重新分配时,系统不会有downtime多分片的好处: 一个索引如果分布在不同的节点,多个节点可以并

2022-06-23 16:56:26 3327

原创 Elasticsearch7.17 四 : ElasticSearch集群架构

分布式系统的可用性与扩展性:高可用性服务可用性-允许有节点停止服务数据可用性-部分节点丢失,不会丢失数据可扩展性请求量提升/数据的不断增长(将数据分布到所有节点上)ES集群架构的优势:提高系统的可用性,部分节点停止服务,整个集群的服务不受影响存储的水平扩容集群一个集群可以有一个或者多个节点不同的集群通过不同的名字来区分,默认名字“elasticsearch“通过配置文件修改,或者在命令行中 -E cluster.name=es-cluster进行设定’节点节点是一个Elastics

2022-06-23 15:19:42 2721

原创 Elasticsearch7.17 三 : ElasticSearch搜索技术深入与聚合查询

搜索的相关性算分,描述了一个文档和查询语句匹配的程度。ES 会对每个匹配查询条件的 结果进行算分_score。打分的本质是排序,需要把最符合用户需求的文档排在前面。ES 5之 前,默认的相关性算分采用TF-IDF,现在采用BM 25。如下例子:显而易见,查询JAVA多线程设计模式,文档id为2,3的文档的算分更高TF-IDFTF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。对于TF-IDF的算法和公式不做过多解

2022-06-22 00:40:16 790

原创 Elasticsearch7.17 二:mapping映射和高级语法查询DSL

Mapping类似数据库中的schema的定义,作用如下:ES中Mapping映射可以分为动态映射和静态映射。动态映射:在关系数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段、类 型、长度、主键等,最后才能基于表插入数据。而Elasticsearch中不需要定义Mapping映射(即关系型数据库的表、字段等),。静态映射: 静态映射是在Elasticsearch中也可以事先定义好映射,包含文档的各字段类型、分词器 等,这种方式称之为静态映射新增加字段dynamic设为true

2022-06-20 18:35:56 1013

原创 Elasticsearch7.17 一: 快速入门

ElasticSearch(简称ES)是一个分布式、RESTful 风格的搜索和数据分析引擎,是用Java开发并且是当前最流行的开源的企业级搜索引擎,能够达到近实时搜索,稳定,可靠,快速,安装使用方便。客户端支持Java、.NET(C#)、PHP、Python、Ruby等多种语言官方网站: https://www.elastic.co/下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearchElasticSearch vs

2022-06-16 16:35:54 2083

原创 jvm调优六:GC日志分析和常量池详解

对于java应用我们可以通过一些配置把程序运行过程中的gc日志全部打印出来,然后分析gc日志得到关键性指标,分析GC原因,调优JVM参数。打印GC日志方法,在JVM参数里增加参数,%t 代表时间部分日志展示图中第一行红框,是项目的配置参数。这里不仅配置了打印GC日志,还有相关的VM内存参数。这里默认是使用Parallel垃圾收集器第二行红框中的是在这个GC时间点发生GC之后相关GC情况从日志可以发现几次fullgc都是由于元空间不够导致的,所以我们可以将元空间调大点对于CMS和G1收集器的日志会

2022-06-10 15:51:01 458

原创 jvm调优五:jvm调优工具和调优实战

jps是用于查看有权访问的hotspot虚拟机的进程id. 当未指定hostid时,默认查看本机jvm进程id此命令可以用来查看内存信息,实例个数以及占用内存大小信息量多的话可以输出到文件中查看 、查看堆信息导出堆信息 导出堆信息,可以将导出的信息文件放入可视化工具进行分析,例如设置内存溢出时导出当时堆的信息-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=./ (路径)如果要了解内存使用情况,可以使用这个工具进行分析用jstack加进

2022-06-09 10:17:42 398

原创 jvm调优四:垃圾收集器和CMS底层三色标记算法

标记-复制算法为了解决效率问题,“复制”收集算法出现了。它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。标记-清除算法算法分为“标记”和“清除”阶段:标记存活的对象, 统一回收所有未被标记的对象(一般选择这种);也可以反过来,标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象 。它是最基础的收集算法,比较简单,但是会带来两个明显的问题:标记-整理

2022-06-07 11:50:41 329 1

空空如也

空空如也

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

TA关注的人

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