- 博客(132)
- 资源 (28)
- 收藏
- 关注

原创 安利一个好用的IDEA插件 object-helper-plugin
因为它很早之前就停止维护了,新版本IDEA无法使用该插件,所以自己参考它的交互模式,基于新版本API开发了初版。File->Settings->Tools->Object Helper 即可进入插件的配置页面。中提出宝贵意见,也可以联系我成为一名插件开发者,共同完善插件的功能。代表当目标字段在源对象中不存在时,是否以注释的形式生成代码,如果为。插件是一个日常开发工具集插件,提供丰富的功能,最开始是基于。代表以方法入参类型的字段为基础生成对象拷贝。插件不断迭代,提供着我们的开发效率。根据日常开发中的痛点,
2022-10-29 12:50:13
7301
原创 探寻快速排序的局限性及其优化策略
本文深入探讨了快速排序的局限及语言层面的排序优化思路。快速排序平均时间复杂度为O(nlogn),但基准选取不当会退化为O(n²),存在被复杂度攻击的风险。优化方面,选择合适基准元素(如随机基准、三数取中)和采用双轴快速排序可改善性能,虽双轴快排在时间复杂度上无提升,但在处理部分有序或大量重复元素序列时,因其三叉树结构能降低递归深度、减少栈空间和函数调用开销,且数据访问更易利用缓存,所以被许多语言库采用。
2024-12-20 23:35:59
2279
原创 重新认识HTTPS
HTTP 由于是明文传输,所谓的明文,就是说客户端与服务端通信的信息都是肉眼可见的,随意使用一个抓包工具都可以截获通信的内容。窃听风险,比如通信链路上可以获取通信内容,用户号容易没。篡改风险,比如强制植入垃圾广告,视觉污染,用户眼容易瞎。冒充风险,比如冒充淘宝网站,用户钱容易没。HTTPS 在 HTTP 与 TCP 层之间加入了 TLS 协议,来解决上述的风险。
2024-11-01 21:20:58
4450
原创 RocketMQ实现原理十问十答
在生产端,客户端通过四层的 TCP 协议和 NameServer 建立连接,通过 Remoting 协议从NameServer 获取到集群的元数据信息。根据元数据信息,和对应的 Broker 的建立 TCP 连接。如果客户端指定了目标 Topic,消息则先经过消息分区分配,然后才将数据发送到Broker 中。因为 Remoting 也没有支持 Batch 的协议,所以数据会直接发送到对应的Broker,可以使用单向发送、同步发送、异步发送三种发送形式。
2024-10-07 10:31:37
3726
原创 详细剖析RocketMQ消息消费原理
消息消费以组的模式开展,一个消费组可以包含多个消费者,每个消费组可以订阅多个主题,消费组之间有集群模式和广播模式两种消费模式。集群模式是当前主题下的同一条消息只允许被其中一个消费者消费。广播模式是当前主题下的同一条消息将被集群内的所有消费者消费一次。消息服务器与消费者之间的消息传送也有两种方式:推模式和拉模式。所谓的拉模式,是消费端主动发起拉取消息的请求,而推模式是消息到达消息服务器后,再推送给消息消费者。RocketMQ消息推模式基于拉模式实现,在拉模式上包装一层,一个拉取任务完成后开始下一个拉取任务。
2024-09-21 21:31:19
4364
原创 Raft协议深度解析:RocketMQ中基于DLedger的日志主从复制
Raft 协议主要包含两个部分:Leader选举和日志复制。前面我们在 Raft协议深度解析:RocketMQ中的自动Leader选举与故障转移 一文中已经详细介绍了DLedger如何实现Leader选举的,而本文主要聚焦于Leader选举完成后的日志复制的过程。说起日志的复制,就必须要从日志存储实现说起,它约束着Raft每一个结点如何存储数据。下面先介绍一次Raft存储的核心实现类:DLedgerStore:存储抽象类,该类有如下核心抽象方法:DLedgerMemoryStore:DLedger基于内存实
2024-07-27 17:40:31
4460
原创 Raft协议深度解析:RocketMQ中的Leader选举与故障转移
在分布式系统应用中,高可用、一致性是经常面临的问题,针对不同的应用场景,我们会选择不同的架构方式,比如master-slave、基于ZooKeeper选主。随着时间的推移,出现了基于Raft算法自动选主的方式,Raft 是在 Paxos 的基础上,做了一些简化和限制,大大简化了算法的复杂度。Raft协议是目前分布式领域一个非常重要的一致性协议,RocketMQ 的主从切换机制也是介于Raft协议实现的。Raft 协议主要包含两个部分:Leader选举和日志复制。
2024-07-27 16:55:42
5160
原创 深度解析 Raft 分布式一致性协议
对于我们的KV服务,要像操作一台机器一样,对用户来说在写入成功后,就应该能读到最近写入的值,而不关心具体底层是如何分布式实现。最终一致性:读取可能暂时读不到但是总会读到线性一致性:最严格,线性时间执行(写完KV确保就能读到),是最理想中的状态选主(Leader election)就是在分布式系统内抉择出一个主节点来负责一些特定的工作。在执行了选主过程后,集群中每个节点都会识别出一个特定的、唯一的节点作为 leader。
2024-07-06 21:42:14
5561
原创 手把手教你改造Sentinel Dashboard 实现配置持久化
Sentinel客户端默认情况下接收到 Dashboard 推送的规则配置后,可以实时生效。但是有一个致命缺陷,Dashboard和业务服务并没有持久化这些配置,当业务服务重启后,这些规则配置将全部丢失。通过 API 直接修改 (loadRules通过DataSource适配不同数据源修改// 修改流控规则// 修改降级规则手动修改规则(硬编码方式)一般仅用于测试和演示,生产上一般通过动态规则源的方式来动态管理规则。上述。
2024-06-16 13:36:20
6182
原创 一文读懂Apollo客户端配置加载流程
Apollo 启动时会在扩展点开始加载远端配置,而Apollo客户端获取配置采用多层设计->->,最终由完成远端配置拉取负责拉取远端配置并通知更新配置。负责将远端配置缓存至本地文件,设计这一层主要是为了在Apollo Server 不可用时保证业务服务的可用性。当配置发生变更时负责通知更新配置。负责缓存Apollo配置信息在内存中,当配置发生变更时,会回调方法更新Java Bean 中的属性。
2024-05-26 16:41:36
8616
转载 Java21 GA新特性-虚拟线程详解
然虚拟线程建造器屏蔽了执行器Executor实例的公共访问权限,在目前预留功能版本下只能所有虚拟线程的任务最终都是由全局的执行,可以通过VarHandle/***/});Class
2023-12-17 19:38:12
8355
原创 Java21新特性-虚拟线程
是轻量级线程(类似于 Go 中的 “(Goroutine)”),可以减少编写、维护和调度高吞吐量并发应用程序的工作量。是可供调度的最小处理单元,它与其他类似的处理单元并发运行,并且在很大程度上是独立运行的。线程()有两种,和。
2023-12-17 16:22:14
13282
原创 RocketMQ阅读源码前的准备
本文将讲解如何在IDEA中导入 RocketMQ 源码,并运行 Broker 和 NameServer,编写一个消息发送与消息消费的示例。
2023-12-02 10:39:54
8126
原创 RocketMQ主从同步原理
主从同步这个概念相信大家在平时的工作中,多少都会听到。其目的主要是用于做一备份类操作,以及一些读写分离场景。比如我们常用的关系型数据库mysql,就有主从同步功能在。主从同步,就是将主服务器上的数据同步到从服务器上,也就是相当于新增了一个副本。而具体的主从同步的实现也各有千秋,如mysql中通过binlog实现主从同步,es中通过translog实现主从同步,redis中通过aof实现主从同步。那么,rocketmq又是如何实现的主从同步呢?另外,主从同步需要考虑的问题是哪些呢?数据同步的及时性?
2023-12-02 10:18:25
9013
原创 RocketMQ事务消息源码解析
半事务消息:指的是发送至broker但是还没被commit的消息,在半事务消息被确认之前都是无法被消费者消费的。消息回查:由于网络闪断、生产者应用重启等原因,导致某条事务消息的二次确认丢失,broker 通过扫描发现某条消息长期处于“半事务消息”时,需要主动向消息生产者询问该消息的最终状态(commit 或是 rollback),该询问过程即消息回查。
2023-12-02 10:07:16
8172
原创 RocketMQ消息过滤机制源码详解
RocketMQ支持两种方式的消息过滤:TAG/SQLTAG 过滤分两个阶段完成:第一阶段:broker率先根据tag的hashcode完成过滤第二阶段:consumer根据tag值完成最后的过滤SQL过滤只能在Broker中完成。
2023-12-02 09:55:47
8296
原创 详解RocketMQ消息存储原理
RocketMQ存储的文件主要包括CommitLog文件、ConsumeQueue文件、Index文件。RocketMQ将所有topic的消息存储在同一个文件中,确保消息发送时按顺序写文件,尽最大的能力确保消息发送的高性能与高吞吐量。因为消息中间件一般是基于消息主题的订阅机制,所以给按照消息主题检索消息带来了极大的不便。为了提高消息消费的效率,RocketMQ引入了ConsumeQueue消息消费队列文件,每个topic包含多个消息消
2023-10-15 20:16:51
10650
原创 ShardingJDBC使用不当引发的线上事故
本文由故障现象定位到了具体的问题点是因为 MyBatis-Plus 批量插入没有返回数据库组件,而跟踪源码后我们却发现是因为ShardingJDBC不支持批量插入获取主键值。ShardingJDBC不支持批量插入后获取主键,主要是因为在批量插入操作中,ShardingJDBC可能需要将数据插入到多个不同的数据库节点,在这种情况下,每个节点都可能有自己的主键生成规则,并且这些节点可能并不知道其他节点的主键值。
2023-09-24 21:10:03
9449
原创 JVM Sandbox入门详解
在日常开发中,经常会接触到面向AOP编程的思想,我们通常会使用Spring AOP来做统一的权限认证、异常捕获返回、日志记录等工作。之所以使用Spring AOP来实现上述功能,是因为这些场景本质上来说都是与业务场景挂钩的,但是具有一定的抽象程度,并且绝大多数业务逻辑类都已经被Spring容器托管了。
2023-05-27 21:36:53
12385
原创 Immich让你从此告别百度网盘备份手机照片
Immich是一个开源的图片自托管服务,它能实现类似于百度网盘的照片自动备份、分类等功能,它同时提供了Web管理页面,和移动端APP,可以轻松备份手机中的照片至家庭服务器中。这一应用也在很多群辉玩家中用于替代“群辉相册”。
2023-05-14 15:05:11
14491
原创 Java应用的优雅停机
static {} }在的静态块中,Dubbo 注册了一个 shutdown hook,用于执行 Dubbo 预设的一些停机逻辑,继续跟进。本文从操作系统、语言、框架层面分别阐述了一个Java应用优雅停机流程,从进程层面,优先推荐使用 SIGTERM 信号通知进程进入销毁流程,JVM虚拟机进程会监听该事件,并执行注册的ShutdownHook。在框架层面不同的框架都会自行注册自身框架的ShutdownHook,从而保证各种框架的正常销毁退出。
2023-04-21 22:38:27
13150
原创 CentOS搭建Jellyfin影音服务器
要使用 JellySkin 主题,请将下面的行复制到“仪表板 -> 常规 -> 自定义 CSS”并单击保存,它将立即在服务器范围内应用到所有用户可能正在使用的任何主题之上。要删除主题,请清除“自定义 CSS”字段,然后单击保存。「硬件转码」是流媒体中很重要的一部分,不管是 PLEX 亦或是 Emby,硬解功能都是收费的。所以只要进入「控制台」-「播放」,选择「Intel QuickSync (QSV)」,把能勾选的视频编码格式全勾上,其他选项根据自己的理解勾选。相当简单的是吧,复杂的地方在后头。
2023-04-05 12:19:25
12140
2
原创 动态类型语言 VS 静态类型语言
动态编程语言是是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力。
2023-02-03 17:15:09
7507
原创 深入剖析Arthas源码
Arthas 相信大家已经不陌生了,肯定用过太多次了,平时说到 Arthas 的时候都知道是基于Java Agent的,那么他具体是怎么实现呢,今天就一起来看看Arthas源码。Arthas。至此 Arthas 整体流程分享完成,我们从 arthas-boot 开始,它的核心作用就是启动引导用户选择需要增强的Java进程PID,最终将PID传入 arthas-core 中;arthas-core根据用户选择的PID,利用Java Agent机制使用 arthas-agent 对目标进程进行增强;
2022-12-23 20:27:58
9223
3
原创 Dubbo SPI扩展机制源码详解(基于2.7.10)
本文主要分享 Dubbo 的拓展机制 SPI。想要理解 Dubbo ,理解 Dubbo SPI 是非常必须的。在 Dubbo 中,提供了大量的拓展点,基于 Dubbo SPI 机制加载在看具体的 Dubbo SPI 实现之前,我们先理解 Dubbo SPI 产生的背景:Dubbo 的扩展点加载从 JDK 标准的 SPI (Service Provider Interface) 扩展点发现机制加强而来。Dubbo 改进了 JDK 标准的 SPI 的以下问题:用户能够基于 Dubbo 提供的扩展能力,很方便基于
2022-12-04 17:29:27
5535
原创 详解 XSS 攻击原理
跨站脚本攻击(Cross Site Scripting)本来的缩写为CSS,为了与层叠样式表(Cascading Style Sheets,CSS)的缩写进行区分,将跨站脚本攻击缩写为XSS。因此XSS是跨站脚本的意思。XSS跨站脚本攻击(Cross Site Scripting)的本质是攻击者在web页面插入恶意的script代码(这个代码可以是JS脚本、CSS样式或者其他意料之外的代码),当用户浏览该页面之时,嵌入其中的script代码会被执行,从而达到恶意攻击用户的目的。
2022-10-29 10:53:21
11609
转载 算法的本质
坦白说,大部分开发岗位工作中都是基于现成的开发框架做事,不怎么会碰到底层数据结构和算法相关的问题,但另⼀个事实是,只要你想找技术相关的岗位,数据结构和算法的考察是绕不开的,因为这块知识点是公认的程序员基本功。而计算机解决问题的思维恰恰相反有没有什么数学公式就交给你们人类去推导吧,如果能找到⼀些巧妙的定理那最好,但如果找不到,那就穷举呗,反正只要复杂度允许,没有什么答案是穷举不出来的,理论上讲只要不断随机打乱⼀个数组,总有⼀天能得到有序的结果呢!其实计算机思维也没什么高端的,你想想计算机的特点是啥?...
2022-07-30 11:39:24
5332
原创 一文读懂Spring的SPI机制
一. 从类加载说起Java中的类加载器负载加载来自文件系统、网络或者其他来源的类文件。jvm的类加载器默认使用的是双亲委派模式。三种默认的类加载器Bootstrap ClassLoader、Extension ClassLoader和System ClassLoader(Application ClassLoader)每一个中类加载器都确定了从哪一些位置加载文件。于此同时我们也可以通过继承 java.lang.classloader 实现自己的类加载器。Bootstrap ClassLoader:负责
2022-05-22 10:46:27
11876
5
原创 一文搞懂 Spring Bean 的生命周期
一. 前言在学习Spring框架的IOC、AOP两大功能之前,首先需要了解这两个技术的基础——Bean。在Spring框架中,Bean无处不在,IOC容器管理的对象就是各种各样的Bean。理解Bean的生命周期有助于我们更好的理解和使用Spring框架的IOC功能,也有助于我们理解框架如何初始化、使用和管理Bean。接下来我们通过代码实现观察 BeanFactory 与 ApplicationContext 中bean的生命周期。二. BeanFactory中Bean的生命周期Bean 的生命周期概括
2022-05-03 17:19:59
2628
原创 详解Spring循环依赖
一. 什么是循环依赖循环依赖,就是两个或则两个以上的bean互相依赖对方,最终形成闭环。比如“A对象依赖B对象,而B对象也依赖A对象”,或者“A对象依赖B对象,B对象依赖C对象,C对象依赖A对象”;类似以下代码:public class A { private B b;}public class B { private A a;}常规情况下,会出现以下情况:通过构建函数创建A对象(A对象是半成品,还没注入属性和调用init方法)。A对象需要注入B对象,发现对象池(缓存)
2022-04-10 18:36:35
5137
2
原创 布隆过滤器在缓存系统中的实践
一. 背景在业务开发中,在并发量很高的情况下,通常会使用缓存对系统查询性能进行优化,在缓存命中率很高的情况下,缓存的使用能够大幅提升系统查询性能。但是在缓存命中率非常低场景下,如果采用传统缓存读取模式,大部分的请求会穿透至数据库,造成数据库的巨大压力。例如:最近上线一个“贵族”功能,由于贵族价格比较贵,拥有比较强的特权,该功能也主要面向平台头部大R用户,所以如果采用传统的缓存模式,查询一个用户的贵族信息就会大概率出现缓存无法命中去读库的情况。有些同学可能会将“空结果”缓存至数据库,这样下次去查询该用户
2022-04-03 13:59:02
1688
原创 开发中你不得不知的一个Git小技巧
一. 背景在工作中大家应会碰到需要频繁在两个分支中切换工作的情况,我们通常做法是利用git stash命令暂存当前工作区中的变更,然后git checkout到目标分支中工作,工作完成后回到刚刚分支使用git stash pop命令还原历史工作区变动。整体流程大致如下:# 当前工作分支,存在变更$ worktree-test (dev1) git statusOn branch testChanges not staged for commit: (use "git add <file
2022-03-20 11:11:02
3751
原创 tcc-transaction源码详解
本文主要介绍TCC的原理,以及从代码的角度上分析如何实现的;不涉及具体使用示例。本文通过分析tcc-transaction源码带大家了解TCC分布式事务的实现原理。需要注意的是,本文所有代码都基于master-1.7.x分支,不同版本的源码会存在一定的差异。完整代码注释请参考:bigcoder84/tcc-transaction一. 概述1.1 项目模块本文对 tcc-transaction 源码分析。主要涉及如下四个模块:tcc-transaction-core:tcc-transaction
2022-01-02 22:02:04
3974
5
原创 Linux进程Fork详解
一. fork函数详解一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。我们来看一个例子:#include <unistd.h>#include <
2021-10-24 11:36:18
4773
原创 深入理解Docker原理
本文参考转载至:《深入剖析Kubernetes - 张磊》更过优秀博文请关注:https://blog.bigcoder.cn容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。对于 Docker 等大多数 Linux 容器来说,Cgroups 技术是用来制造约束的主要手段,而Namespace 技术则是用来修改进程视图的主要方法。你可能会觉得 Cgroups 和 Namespace 这两个概念很抽象,别担心,接下来我们一起动手实践一下,你就很容易理解这两项技术了。一.
2021-08-01 18:58:32
1025
原创 synchronized锁升级过程
更过博文请关注:https://blog.bigcoder.cnJDK 1.6后锁的状态总共有四种,级别由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁,这四种锁状态分别代表什么,为什么会有锁升级?其实在 JDK 1.6之前,synchronized 还是一个重量级锁,底层使用操作系统的 Mutex Lock(互斥锁)实现,而操作系统实现线程之间的切换需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么重量级锁效率低的原因。但是在JDK 1.6后,JVM为了提.
2021-07-02 20:48:50
871
原创 线上内存泄露排查
一. 排查过程前不久测试环境一直无缘无故的挂掉,这可苦了我们一线开发人员,每次测试都得把挂掉服务全部起起来。面对几十个微服务模块,我想大家看到这样的场景内心也是一万个草泥马飞过….硬着头皮把代码写完了,但是大规模的服务宕机显然不正常,看了一波还是热乎的日志,发现是服务器OOM了,顺道看了一下JVM配置,居然没有任何配置,看到这里嘴角丝丝上扬,觉得自己破案了。随即给核心服务都加上了JVM参数:JAVA_OPTS: "-server -Xmx256m" #因为是测试环境对扩容抖动并不敏感,所以没有设置
2021-06-04 09:08:20
577
原创 探寻Dubbo集群容错机制
一. timeout 与 retriesDubbo的服务可以通过timeout配置超时时间,防止远程调用失败,该属性的默认值为1000(ms),用户可以在多个地方配置服务的超时时间:图中涉及的配置方式从上至下优先级越来越低,总体来说配置覆盖遵循以下规律:consumer配置优先于provider配置,细粒度配置优先于整体配置。我们在消费者中sleep一段时间人为制造超时效果:@DubboService(timeout = 3000)@Slf4jpublic class UserServiceI
2021-06-02 09:06:07
354
1
原创 Java SPI详解
SPI的英文全称为Service Provider Interface,字面意思为服务提供者接口,它是jdk提供给“服务提供厂商”或者“插件开发者”使用的接口。在面向对象的设计中,模块之间我们一般会采取面向接口编程的方式,而在实际编程过程过程中,API的实现是封装在jar中,当我们想要换一种实现方法时,还要生成新的jar替换以前的实现类。而通过jdk的SPI机制就可以实现,首先不需要修改原来作为接口的jar的情况下,将原来实现的那个jar替换为另外一种实现的jar即可。总结一下SPI的思想:在系统的各个
2021-05-14 17:18:18
5661
1
《Linux就该这么学 刘遄 著》高清
2019-01-09
《Spring Boot2企业应用实战》PDF高清
2018-12-08
《HeadFirst设计模式》PDF高清版
2018-10-30
Tomcat架构解析 刘光瑞 PDF
2018-10-21
《java多线程编程核心技术》高洪岩著
2018-07-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人