自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小道仙的后宫

快节奏,慢生活。

  • 博客(476)
  • 资源 (6)
  • 收藏
  • 关注

原创 Sentinel从入门到“精通”,从源码层面学习Sentinel

Sentinel提出了资源的概念,不管是如何使用本质都是在访问某个“资源”之前,先进行 SphU.entry。所以这个资源并不一定是接口,可以是我们想要限制的任何代码。可能有人好奇为啥dashboard 可以实时的添加/删除规则,如果熟悉代理的朋友应该知道,代理是可以动态的添加和删除的。基于上面实践发现使用Sentinel的限流可以有四种方式原生方式FilterAOP。

2024-02-18 16:05:08 1069

原创 JVM内存调优常用参数

查看某个参数的值:jinfo -flag ParallelGCThreads pid。查看某个参数的值:jinfo -flag G1HeapRegionSize pid。查看当前JDK版本所支持的垃圾回收器有哪些、以及默认使用的回收器。所谓的JVM调优,就是为了保证我们系统的稳定运行。注:pid 可以使用 jps/jcmd 查看。注: jstat -gc 结果描述。

2024-01-28 22:16:19 773

原创 JVM内存区域详解,一文弄懂JVM内存【内存分布、回收算法、垃圾回收器】

堆其实就是一大块内存区域,是用来存放对象的,对于一个应用来说最耗费内存的就是“对象”。因为在运行的过程中会创建无数个对象,所以内存回收(垃圾回收)的时候主要就是针对堆的垃圾进行回收。回收算法是理论,回收器是实践,不同回收器都是基于理论进行真正的实践,在讨论回收器之前需要先了解下面几个点。上面我们谈到内存空间,内存是有限的,想要健康持续的运行下去,就一定要回收“垃圾”。已经知道了哪些对象是可以回收的,那就需要按照某种回收算法,去回收它们。那怎么判定一个对象是不是垃圾呢,就成了新的问题。

2024-01-14 15:51:47 949

原创 一文弄懂@Async代理执行原理(从源码的角度深入理解@EnableAsync 注解开启原理)

一直只知道 @Async是通过代理来实现的,在同一个方法里面调用为什么不可以,只是懵懂知道一点,抽时间刚好研究一下它的原理,发现和 @Transactional 的实现原理完全一样。

2023-12-16 10:35:56 181

原创 基于MyBatis二级缓存深入装饰器模式

装饰器模式是一种能够在不改变原对象代码的情况下,动态地为对象添加新功能的设计模式。通过将对象包装在装饰器类中,可以透明地、在运行时选择性地、以任意顺序地应用这些功能。最终效果是通过组合不同的装饰器,扩展原对象功能,使系统更灵活可扩展。

2023-12-10 18:36:00 216

原创 布隆过滤器,Redis之 bitmap,场景题【如果微博某个大V发了一条消息,怎么统计有多少人看过了】

Bitmap是一种精简而高效的数据结构,通过二进制位存储大规模布尔值信息,常用于快速处理用户在线状态、权限管理以及行为记录等应用场景。可以简单把它想象成是趋于无限大的数组,每个位置只能存储 1 和 0。它可以快速统计出有多少个 1,也可以快速统计某个区间内有多少个 1。基于此我们可以创建一个 bitmap, key 就是这条消息的id,每个位置就对应一个用户,1 就表示看过。

2023-12-02 17:12:20 174

原创 ES 8.x开始(docker-compose安装、kibana使用、java操作)

其实可以简单把ES中的索引(index)理解成表,那对于表的操作,肯定就是创建表、增删字段,以及对表中数据的增删改查。这里使用docker-compose来安装,方便后续迁移,Elasticserach和kibina一起安装。配置文件有两个,一个是ES的配置文件,一个docker-compose的配置文件。除了用id精准匹配,使用ES更多的是做高亮搜索,比如想要搜索 tags中带。查询 my-index-two 索引中,id = 2,的数据。索引,添加一条 id = 2,的数据。的索引,里面有三个字段。

2023-11-27 22:08:02 390

原创 一文弄懂MySQL锁机制【记录锁、间隙锁、临键锁,共享锁、排他锁,意向锁】

没有使用索引做更新相关操作会锁表。通过唯一/主键索引等值加锁,只会锁具体的行,非唯一索引则不一定,SQL优化器会基于数据分布选择记录锁,或临键锁。只有在RR级别下才有间隙锁,目的是为了解决幻读,如果操作的数据是跨多个范围,就会加多个区间的间隙锁。MySQL默认的锁就是【临键锁】,所以在执行SQL的时候,记录锁和间隙锁是会同时存在的。范围是左开右闭的区间。

2023-11-10 23:17:10 1068 2

原创 Java日志源码详解,SpringBoot日志 slf4j、logback、log4j

在读取配置文件的时候无非就几种情况,既然有多种情况,那肯定是有一个优先级的——即下面的排序指定自己的配置文件 (logging.config: classpath:logback.xml)默认读取的配置文件,本质上和【1】一样,只是文件的位置不同logback自己的默认配置文件 (“logback-test.groovy”, “logback-test.xml”, “logback.groovy”, “logback.xml”)

2023-09-24 21:46:47 533

原创 EasyExcel导出模板实现下拉选(解决下拉超过50个限制)

先来看看最终实现效果,如果效果是你想要的,再看看实现逻辑。EasyExcel本身是支持设置下拉校验的,但有个问题,一旦下拉数据超过50个左右的时候就无法正常展示,当然,现在这个问题得到了解决。如果你之前使用过EasyExcel那上面主流程代码你将会很熟悉,下拉选相较于之前的导出只是多注册了一个 Handler。

2023-09-03 17:33:27 756

原创 Java进阶之Dump文件初体验

最近线上频繁的内存告警,同事A通过分析dump文件解决了这个问题,我当然是不会放过这种学习的机会。

2023-07-30 19:29:50 2270

原创 Spring事务源码解析【一次一篇文章弄懂】

上一篇文章我们已经知道了Java中Spring的事务,尤其是声明事务,这篇文章我们来深入探讨一下Spring的声明事务是如何实现的。首先Spring的声明事务是基于AOP实现的,说到AOP我们就要搞清楚两点:1. 何时何地基于什么规则生成的代理对象2. 生成了代理对象后,拦截器做了什么

2023-07-23 12:26:51 439 1

原创 Spring使用@Transactional 管理事务,Java事务详解。

声明事务声明式事务是通过配置的方式来管理事务的行为,声明式事务的好处是可以将事务管理与业务逻辑相分离,提高了代码的可读性和维护性。编程事务编程式事务是通过编写代码显式地管理事务的开始、提交和回滚。使用编程式事务可以更加灵活地控制事务的细节,但需要更多的代码来处理事务管理,可能导致代码的冗余和增加了复杂性。

2023-06-24 22:04:42 3751

原创 Git进阶之代码回滚、合并代码、从A分支选择N次提交,合并到B分支【revert、merge、rebase、cherry-pick】

Git进阶之代码回滚、合并代码、从A分支选择N次提交,合并到B分支【revert、merge、rebase、cherry-pick】

2023-05-28 15:21:48 3617

原创 RocketMQ 消费者运行原理,Consumer 集群消费、广播消费

上次我们整体的看了一下RocketMQ Consumer 的消费过程,今天再来聚焦看一下 Consumer 是如何进行集群消费和广播消费的。

2023-05-23 22:54:21 778

原创 RocketMQ之 Consumer,消费者消费原理解析

每个使用了 @RocketMQMessageListener 注解的消费者,都会被解析成一个 ListenerContainerListenerContainer 在解析出来后,就被开启了,它会运行一个死循环的代码(如果当前线程不终止的话,会一直运行),这段代码会不停的去 pull 消息如果 pull到了消息,就会被丢入一个线程池,等待资源去处理消息。

2023-04-16 19:07:16 1075

原创 谈谈我理解的SpringCloud和Kubernetes的区别

个人觉得它们最大的区别在于一个是为了解决Java微服务架构问题,一个是容器架构和语言无关,所有功能都是自己这个架构所自带的,只是为了解决架构的某些问题而产生的。

2023-03-26 10:36:25 2875 1

原创 K8S、kubernetes no resolver defined to resolve could not be resolved (3: Host not found) 问题解决

K8S、kubernetes no resolver defined to resolve could not be resolved (3: Host not found) 问题解决

2023-03-01 10:57:06 1092

原创 Java线程池运行原理,线程池源码解读【Java线程池学习二】

但随着时间的推移在闲下来的时候我突然想,当任务进入了队列之后是怎么取出来的呢?然后列举了几个问题毫无疑问想要解决上面的问题,那只有研究源码,下面我们就来看下 ThreadPoolExecutor 的源码,此次目的就是解决上面的问题,先对线程池的核心工作原理进行理解,后面我们再来对线程池来一个全面的解读。1. 添加的一个任务是怎么运行的?2. 任务丢到了队列,怎么取出来呢?3. 过了时间怎么销毁线程?4. 怎么拒绝的?5. 线程池,这个池是什么? 线程怎么放进去?

2023-02-19 13:08:37 414

原创 线程池最优使用策略【Java线程池学习一】

本篇博客的主要目的是指导如何在Java中优雅的使用线程池。这篇博客的内容是截止一周前我对线程池的理解,简单说就是工作了三年的人对线程池的理解。使用多线程的时候要注意 全局变量 和 异常处理对我以往的面试来说(一年多工作经验的时候),掌握下面的理论知识就很充足了。

2023-02-12 21:40:28 727

原创 Java锁之ReentrantLock(源码详解)

ReentrantLock 这个Java中重要的锁,我想可能很多人只是听过,并没有使用过,我在看RocketMQ客户端源码的时候发现大量的使用了这个ReentrantLock,从而引起了我的兴趣,下面我们一起从源码的角度来学习ReentrantLock。我们先来看一下ReentrantLock的继承关系。

2023-01-12 21:46:27 903

原创 java线上问题排查工具——Arthas

Arthas 支持修改每个类的日志级别,这里只演示修改整个系统的日志级别 https://arthas.aliyun.com/doc/logger.html。上面的监控虽然很好,但在实际的项目中,我们的访问量很大,我们想要监控某个请求这时候通过参数过滤将会是完美的方案。新的class 加载到JVM 里面去。打印整个栈的信息,太长了感觉没啥用。方法一就没什么好说了,来看方式二。查看当前堆和非堆的内存使用情况。,生成 class的方式有2种。

2022-12-28 21:12:43 514

原创 经典算法之LRU算法

LRU算法算是个常见的算法,很有必要去了解它,现在我们就来看看什么是 LRULRU 的全称是 Least Recently Used(最近最少使用),就如它的含义一样,最近最少使用的。在实际的场景中大多会把它当作一种 淘汰策略它的应用场景也很简单,我们的存储空间总是有限的,一旦超过了最大限度就必须要淘汰一些数据,那淘汰哪种数据才算是合理的呢?合理的方式有很多,不同的场景也不一样,但淘汰 最近最少使用的数据,在绝大部分场景下都是合理的,所以LRU算法很常见。

2022-12-07 22:39:25 1025 1

原创 记一次服务宕机、优化全流程(以后也可以装X了)

服务宕机可能很多人第一反应就是限流,我们也做了,如果不限流一个 pod都起不来,以前对于限流也没有什么思考,现在觉得:限流的第一步是要考虑你的系统最大并发量,不然限流就是个借口。exhibition 服务在1.5w/min 的时候就开始挂机,顶峰4.5w, 或许我们的服务达不到4.5w,但绝对不会是1.5w。

2022-11-19 17:03:26 1071

原创 深入理解MyBatis一级缓存和二级缓存【超详细源码解析】

深入理解MyBatis一级缓存和二级缓存【超详细源码解析】一级缓存的作用域为何是 sqlSession、二级缓存的作用域为何是 mapper怎么理解 一、二级缓存都是基于 PerpetualCache 的HashMap的本地缓存为什么一级缓存无法被关闭怎么才能使用二级缓存?如果使用了二级缓存一级缓存还有用么如果一级缓存不可以关闭,那在分布式的系统中,如何解决数据一致性问题如果开启了二级缓存,那缓存的命中顺序将是如何呢

2022-11-04 16:55:48 958 1

原创 Maven插件初体验【附源码】

学过Java的小伙伴对Maven一定很熟悉了,但对于Maven除了用来进行版本管理之外,你还用它做过什么呢?或许很多人和我一样,用了几年的Maven压根就没想过Maven除了版本管理还可以做其它事情。

2022-10-19 17:09:56 1028

原创 Redis分布式锁进阶之事物分布式锁

在实际使用分布式锁还存在一个问题,我们很多方法是有事物的,如果在上述方法加了一个事物,事物是要在方法执行完之后才提交的,也就是会先释放锁,后提交事务,如果在释放锁和提交事务之间有一个线程访问了,这时候它获取到了锁,但是去查询数据库的时候还无法读取前一个事物没有提交的数据,这时候就会造成数据错乱。

2022-09-21 22:07:17 637

原创 MyBatis 执行原理,源码解读,基于SpringBoot讲解

这里是讲解MyBatis执行的逻辑的一个基础版本,虽说如此,但东西已经很多了,可以先理解个大概,然后再逐步去细化理解,比如 - xml具体是如何解析的- 事务是如何执行的- 缓存是如何处理的- 怎么创建自定义插件、插件在何时执行

2022-09-17 18:24:54 643

原创 HTTP执行流程,SpringMVC执行流程,Java一次HTTP请求容器做了哪些事情,过滤器、拦截器、AOP执行流程【超详细解答】

HTTP执行流程,SpringMVC执行流程,Java一次HTTP请求容器做了哪些事情,过滤器、拦截器、AOP执行流程

2022-07-24 21:36:43 608

原创 MySQL 日期【加号/+】条件筛选问题

今天在修改一个SQL的时候发现一个关于时间格式的问题,原SQL如下(已简化)的时候就不再进行后续了。当然这是一种不规范的写法,还是不要这样写为妙。想着会不会是MySQL按照字符串去对比,当对比到。SQL运行也没有问题,但执行结果却和预期不一样。写了一个日期对比的SQL,执行结果如下。...

2022-07-21 14:30:35 328

原创 小道仙博客【开源个人博客】

以前也很多人问我现在的博客是否开源,讲真不开源第一个是舍不得,第二个是因为里面代码写的很稀烂,为了技术而技术,加了很多没啥用的“高级”技术。对博客一直情有独钟,从大二开始做博客,从技术的变换来看已经做了4个版本。这个版本就想用最简单的技术来做成这件事,代码尽可能去写的优雅。至于博客的意义是什么那就仁者见仁智者见智了。这一次开源的版本也是基于。...

2022-07-17 18:14:36 367

原创 Deadlock found when trying to get lock; try restarting transaction 【MySQL死锁问题解决】

Deadlock found when trying to get lock; try restarting transaction 【MySQL死锁问题解决】最近在调试接口的时候遇到了MySQL死锁问题,我自己测试的时候一切都好好的,但在并发下,就死锁了 其实死锁问题,并没有一个类似“万金油”的解决办法,解铃还需系铃人,能做的只有写这个代码的人自己去解决 第一次出现死锁,想必你也会和我一样整个人都是懵的,不知道如何下手,等你看过下面的文章明白了死锁,就不会害怕了.........

2022-06-20 09:26:48 35419 2

原创 MySQL之监控binlog日志,解决系统响应慢的问题【maxwell】

不知道你是否有无数次吐槽公司的架构设计,比如某一个关键的列表, `join` 了无数张表 (join 代表了left join、 inner join 等) 做了一个新功能,新增了几张表,列表为了展示一个字段,又去关联一张大表,这样的操作,速度不慢才怪嘞很遗憾我们现在的系统就是这样的,不知道你们有没有听说过ADB这样的数据库,它们主要是用来处理大数据的,性能超强,我们一个查询`20s`的SQL,迁移到ADB里面那就`0.Ns`了 (我们不去探索它为什么这么快哈) ...

2022-06-11 18:22:34 1113

原创 基于ThreadLocal和JWT登录的问题,微服务登录架构解决方案

公司之前是以JWT + ThreadLocal 做的登录系统,在使用的过程发现了如下的问题,下面我们一起来看看,后面也会给出更好的解决方案。一、基于JWT + ThreadLocal实现登录1-1、JWT所谓的JwtToken,你可以理解成把一个数据进行一系列的加密后生成的一个字符串,所以你也可以把它解密成原本的数据。1-2、ThreadLocal这个可能很多人听过,但却很少人用过,其实很简单,在多线程的情况下,如果你不想用同步的方式解决就可以用ThreadLocal线程本地变量来解决。你

2022-05-22 19:28:29 1269

原创 MySQL分组后取最大一条数据【最优解】

有一个简单而又常见的需求:分组后取每组的最大一条数据

2022-05-03 23:08:28 17443 4

原创 自定义平台MQ,SpringBoot自动注入【xdx-mq-starter】

之前面试的时候都会被问到为什么使用MQ,使用MQ的好处是什么,我都会照本宣科的说:异步、解耦、削峰,这几个词也好理解,都是字面意思,今天我们就来进一步加深理解异步和结解耦。一、引入问题先思考这样一个问题,在多个系统之间我们想要异步的调用怎么做呢?当然MQ就是一个很好的解决办法如何去用呢?在A系统引入MQ,作为生产者,在B系统也引入MQ做消费者,当然可以实现功能,但会不会很麻烦?每个系统都要引入一套重复的东西。大多数我们的业务场景的并发量其实很小,如果我们对每个业务场景都弄一个自己的

2022-04-23 18:17:45 2196

原创 RabbitMQ实现延迟消息【死信队列实现、插件实现】

可以理解成,给A队列发送一个设置了过期时间的消息(过期分为**消息过期**和**队列过期**),但是不给A队列设置消费者,这个A队列就是死信队列(其实就是一个普通队列,不给它设置消费者而已)。等到了时间还没有被消费,这个消息就会被投递到配置的队列,我们可以给这个队列设置一个消费者,然后去消费这个消息就可以达到延迟的目的。

2022-03-28 16:11:13 2975 1

原创 MyBatis/MyBatis-Plus 使用枚举参数异常, SpringBoot枚举参数异常

在开发中,有很多字段使用枚举类型可以更好地表达我们想要的效果。但在实际使用过程中,却存在两个问题1. 枚举参数映射到数据库的时候类型匹配不上2. 接收枚举参数的时候也会存在结果不对的情况

2022-03-14 21:23:37 4654 1

原创 SpringBoot使用异步无法获取自定义注解

但是今天遇到一个问题,由于数据量的递增需把原来的方法改成异步。接到需求的时候眉头紧锁看似在思考如何处理,心里却想这难不倒我,两个注解即可完成。但在实际操作中却出了问题,加上注解后启动项目报了空指针异常,经过定位发现错误是因为无法获取bean上自定义注解导致的。

2022-03-07 17:39:22 863

原创 源码学习之【OpenFeign工作原理】

我们知道openfeign是一个rpc远程调用框架,目的是使的我们调用接口和调用本地方法一样简单,本质上还是需要http请求。openFeign是通过jdk代理来实现这个操作的,下面我们将通过源码一步步探寻它的运作原理。我们的目的很简单,因为我们在使用的时候是直接进行注入的,我们只需要知道每一个接口是如何被注入到Spring容器的,找到代理所做的事情即可。

2022-02-28 20:00:32 2043 1

mybatis-generator-gui-0.9.0

window界面版,代码生成器。最简单的代码生成器,资源共享

2019-03-22

springmvc实现上传文件到七牛云

此包包含了springmvc单独运行的jar包,和java上传文件到七牛云的jar包

2018-08-14

java上传文件到七牛云需要的jar

此包是java上传七牛云所需要的官方jar包,从七牛云文档上copy的代码加上此包,直接使用

2018-08-14

okio-1.6.0.jar

内容如标题所示。 用七牛云上传文件异常。可以用此包

2018-08-14

hibernate基本配置

本资源,是hibernate配置的基本资料,因为写了个关于hibernate基本配置的博客,为了方便读者操作,便一同公布这个配置资料。

2018-06-14

表单校验-validate

此包里面有,validate的详细文档,和相对应的js包。也有我自己写的关于validate的校验规则,和自定义校验(判断用户名是否存在)。

2018-05-12

空空如也

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

TA关注的人

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