自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(109)
  • 资源 (1)
  • 问答 (3)
  • 收藏
  • 关注

原创 SpringBoot3.x原生镜像-Native Image实践

前提之前曾经写过一篇《SpringBoot3.x 原生镜像-Native Image 尝鲜》,当时SpringBoot处于3.0.0-M5版本,功能尚未稳定。这次会基于SpringBoot当前最新的稳定版本3.1.2详细分析Native Image的实践过程。系统或者软件版本清单如下:组件版本备注macOS Ventura13.4.1(c)ARM架构sdkman5.18.2JDK和各类SDK包管理...

2023-08-20 19:52:12 394

原创 基于Go编写一个可视化Navicat本地密码解析器

前提开发小组在测试环境基于docker构建和迁移一个MySQL8.x实例,过程中大意没有记录对应的用户密码,然后发现某开发同事本地Navicat记录了根用户,于是搜索是否能够反解析Navicat中的密码掩码(这里可以基本断定Navicat对密码是采用了对称加密算法),于是发现了这个仓库:how-does-navicat-encrypt-password密码的解密算法显然是被泄露了,那么就可以利用起...

2023-08-03 08:30:20 575

原创 通过Nacos配置刷新进行RabbitMQ消费者在线启停

前提公司在做一些金融相关业务,某些时候由于数据提供商定期维护或者特殊原因需要暂停某些服务的消费者。之前选用的消息队列技术栈是RabbitMQ,用于微服务之间的消息投递,对于这类需要暂停消费者的场景是选用注释掉消费者Bean中的相应Spring(Boot)注解重新发布来实现,后面需要重新启动消费就是解开对应的注释再发布一次。这样的处理流程既繁琐,也显得没有技术含量,所以笔者就这个问题结合已有的配置中...

2023-02-12 19:22:03 443 1

原创 SpringBoot3.x中spring.factories功能被移除的解决方案

背景笔者所在项目组在搭建一个全新项目的时候选用了SpringBoot3.x,项目中应用了很多SpringBoot2.x时代相关的第三方组件例如baomidou出品的mybatis-plus、dynamic-datasource等。在配置好相关依赖、最小启动类和配置之后,发现项目无法启动。于是根据启动上下文日志和按行DEBUG找到原因并且在等待组件升级兼容之前进行临时性解决。关于spring.fac...

2022-12-04 15:21:17 650

原创 SpringBoot3.x原生镜像-Native Image尝鲜

前提Spring团队致力于为Spring应用程序提供原生映像支持已经有一段时间了。在SpringBoo2.x的Spring Native实验项目中酝酿了3年多之后,随着Spring Framework 6和Spring Boot 3的发布,对应的项目就是Spring Native,原生镜像支持将会发布GA版本(换言之就是,Native Image相关支持会在Spring Boot 3的GA版本中一...

2022-10-30 11:06:38 1144

原创 ULID规范解读与实现原理

前提最近发现各个频道推荐了很多ULID相关文章,这里对ULID的规范文件进行解读,并且基于Java语言自行实现ULID,通过此实现过程展示ULID的底层原理。ULID出现的背景ULID logoULID全称是Universally Unique Lexicographically Sortable Identifier,直译过来就是「通用唯一按字典排序的标识符」,它的原始仓库是https://gi...

2022-10-16 22:37:32 738

原创 在Tomcat中启用虚拟线程特性

前提趁着国庆前后阅读了虚拟线程相关的源码,写了一篇《虚拟线程 - VirtualThread源码透视》,里面介绍了虚拟线程的实现原理和使用示例。需要准备做一下前期准备:安装OpenJDK-19或者Oracle JDK-19准备好嵌入式Tomcat的依赖,需要引入三个依赖包,分别是tomcat-embed-core、tomcat-embed-el和tomcat-embed-websocket,版本选...

2022-10-08 00:01:21 713

原创 虚拟线程 - VirtualThread源码透视

前提JDK19于2022-09-20发布GA版本,该版本提供了虚拟线程的预览功能。下载JDK19之后翻看了一下有关虚拟线程的一些源码,跟早些时候的Loom项目构建版本基本并没有很大出入,也跟第三方JDK如鹅厂的Kona虚拟线程实现方式基本一致,这里分析一下虚拟线程设计与源码实现。Platform Thread与Virtual Thread因为引入了虚拟线程,原来JDK存在java.lang.Thr...

2022-10-06 21:05:07 795 2

原创 JDK19新特性使用详解

前提JDK19于2022-09-20发布GA版本,本文将会详细介绍JDK19新特性的使用。新特性列表新特性列表如下:JPE-405:Record模式(预览功能)JPE-422:JDK移植到Linux/RISC-VJPE-424:外部函数和内存API(预览功能)JPE-425:虚拟线程,也就是协程(预览功能)JPE-426:向量API(第四次孵化)JPE-427:switch匹配模式(第三次预览)J...

2022-09-24 20:04:41 1013

原创 插件化注解处理API(Pluggable Annotation Processing API)

插件化注解处理(Pluggable Annotation Processing)APIJSR 269提供一套标准API来处理AnnotationsJSR 175,实际上JSR 269不仅仅用来处理Annotation,我觉得更强大的功能是它建立了Java 语言本身的一个模型,它把method、package、constructor、type、variable、enum、annotation等Java语言元素映射为Types和Elements,从而将Java语言的语义映射成为对象,我们可以在javax.lan

2022-06-14 20:52:19 268 1

原创 基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇

最近对网络编程方面比较有兴趣,在微服务实践上也用到了相对主流的框架如底层也切换为,像底层也是使用封装通讯协议,最近调研和准备使用的也是基于封装实现了多种协议的兼容。因此,基于造一个轮子,在的加持下,实现一个轻量级的框架。这篇博文介绍的是框架协议的定义以及对应的编码解码处理的实现。截止本文()编写完成之时,的最新版本为,而的最新版本为,因此引入这两个版本的依赖,加上其他工具包和序列化等等的支持,文件的核心内容如下:部分参数的序列化会依赖到或者,具体看偏好而定。为了提高协议传输的效率,需要定制一套高效的协议,

2022-06-14 20:42:43 424

原创 使用Redis实现UA池

最近忙于业务开发、交接和游戏,加上碰上了不定时出现的犹豫期和困惑期,荒废学业了一段时间。天冷了,要重新拾起开始下阶段的学习了。之前接触到的一些数据搜索项目,涉及到请求模拟,基于反爬需要使用随机的,于是使用实现了一个十分简易的池。最近的一个需求,有模拟请求的逻辑,要求每次请求的请求头中的要满足下面几点:这里三点都可以从数据的来源解决,实际上我们应该关注具体的实现方案。简单分析一下,流程如下:在设计池的时候,它的数据结构和环形队列十分类似:上图中,假设不同颜色的是完全不同的,它们通过洗牌算法打散放进去环形队列中

2022-06-14 20:40:52 172

原创 彻底告别加解密模块代码拷贝-JCE核心Cipher详解

javax.crypto.Cipher,翻译为密码,其实叫做密码器更加合适。Cipher是JCA(Java Cryptographic Extension,Java加密扩展)的核心,提供基于多种加解密算法的加解密功能。在不了解Cipher之前,我们在完成一些需要加解密的模块的时候总是需要到处拷贝代码,甚至有些错误的用法也被无数次拷贝,踩坑之后又要拷贝补坑的代码。为什么不尝试理解Cipher然后合理地使用呢?转换模式transformation一般由三个部分组成,格式是:算法/工作模式/填充模式(algori

2022-06-14 20:38:57 748 2

原创 通过源码浅析Java中的资源加载

最近在做一个基础组件项目刚好需要用到JDK中的资源加载,这里说到的资源包括类文件和其他静态资源,刚好需要重新补充一下类加载器和资源加载的相关知识,整理成一篇文章。这一节主要分析类加载器和双亲委派模型。虚拟机设计团队把类加载阶段中的"通过一个类的全限定名来获取描述此类的二进制字节流"这个动作放到了Java虚拟机外部实现,以便让应用程序自己决定如何去获取所需要的类,而实现这个动作的代码模块称为"类加载器(ClassLoader)"。类加载器虽然只用于实现类加载的功能,但是它在Java程序中起到的作用不局限于类加

2022-06-14 20:37:02 208

原创 浅析JDK中ServiceLoader的源码

紧接着上一篇《通过源码浅析JDK中的资源加载》,ServiceLoader是SPI(Service Provider Interface)中的服务类加载的核心类,也就是,这篇文章先介绍ServiceLoader的使用方式,再分析它的源码。这里先列举一个经典的例子,MySQL的Java驱动就是通过ServiceLoader加载的,先引入的依赖:查看这个依赖的源码包下的META-INF目录,可见:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BuV1i3Em-165521023

2022-06-14 20:35:51 382

原创 JAVA中神奇的双刃剑--Unsafe

参考资料:在Oracle的Jdk8无法获取到sun.misc包的源码,想看此包的源码可以直接下载openjdk,包的路径是:当然,不同的openjdk版本的根目录(这里是openjdk-8u40-src-b25-10_feb_2015)不一定相同。sun.misc包含了低级(native硬件级别的原子操作)、不安全的操作集合。Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。Unsafe类提供了硬件级别的原子操作,提供了一些绕开JVM的更底层功能,

2022-06-14 20:32:50 737 1

原创 轻量级DI框架Guice使用详解

背景在日常写一些小工具或者小项目的时候,有依赖管理和依赖注入的需求,但是Spring(Boot)体系作为DI框架过于重量级,于是需要调研一款微型的DI框架。Guice是Google出品的一...

2022-02-22 08:30:00 723

原创 logback1.3.x配置详解与实践

前提当前(2022-02前后)日志框架logback的最新版本1.3.0已经更新到1.3.0-alpha14版本,此版本为非stable版本,相对于最新稳定版1.2.10来说,虽然slf4...

2022-02-13 18:24:15 2027

原创 JDK中的BitMap实现之BitSet源码分析

前提本文主要内容是分析JDK中的BitMap实现之java.util.BitSet的源码实现,基于JDK11编写,其他版本的JDK不一定合适。❝文中的图比特低位实际应该是在右边,但是为了提...

2022-01-03 16:56:12 161

原创 理解HTTP协议中的multipart/form-data

前提之前在写一个通用HTTP组件的时候遇到过媒体(Media)类型multipart/form-data的封装问题,这篇文章主要简单介绍一下HTTP协议中媒体类型multipart/for...

2021-12-27 08:40:00 5109

原创 JDK中Lambda表达式的序列化与SerializedLambda的巧妙使用

前提笔者在下班空余时间想以Javassist为核心基于JDBC写一套摒弃反射调用的轻量级的ORM框架,过程中有研读mybatis、tk-mapper、mybatis-plus和spring...

2021-11-27 12:49:30 626

原创 13万字详细分析JDK中Stream的实现原理

前提Stream是JDK1.8中首次引入的,距今已经过去了接近8年时间(JDK1.8正式版是2013年底发布的)。Stream的引入一方面极大地简化了某些开发场景,另一方面也可能降低了编码...

2021-10-06 13:14:36 1311 3

原创 Java协程编程之Loom项目尝鲜

前提之前很长一段时间关注JDK协程库的开发进度,但是前一段时间比较忙很少去查看OpenJDK官网的内容。Java协程项目Loom(因为项目还在开发阶段,OpenJDK给出的官网https:...

2021-08-20 00:06:28 1486

原创 基于Java和Bytemd用120行代码实现一个桌面版Markdown编辑器

前提某一天点开掘金的写作界面的时候,发现了内置Markdown编辑器有一个Github的图标,点进去就是一个开源的Markdown编辑器项目bytemd(https://github.co...

2021-08-15 13:08:34 289

原创 透视RPC协议:SOFA-BOLT协议源码分析

前提最近在看Netty相关的资料,刚好SOFA-BOLT是一个比较成熟的Netty自定义协议栈实现,于是决定研读SOFA-BOLT的源码,详细分析其协议的组成,简单分析其客户端和服务端的源...

2021-08-07 19:54:13 729

原创 基于BIT数组实现全局功能开关

前提某一天巧合打开了sofa-bolt项目,查找部分源码,看到了项目中使用bit数组实现功能开关的特性,感觉这种方式可以借鉴,于是写下这篇文章。原理bit数组的布局如下:由于每个bit都可...

2021-07-24 14:00:00 194

原创 冷饭新炒:理解布隆过滤器算法的实现原理

前提这是《冷饭新炒》系列的第六篇文章。本文会翻炒一个用途比较广的算法 - 「布隆过滤器算法」。布隆过滤器的一些概念主要包括:简介算法参数优势和劣势布隆过滤器简介布隆过滤器是「一种空间高效概...

2021-03-06 12:52:42 655 1

原创 冷饭新炒:理解JWT的实现原理和基本使用

前提这是《冷饭新炒》系列的第五篇文章。本文会翻炒一个用以产生访问令牌的开源标准JWT,介绍JWT的规范、底层实现原理、基本使用和应用场景。JWT规范很可惜维基百科上没有搜索到JWT的条目,...

2021-02-19 08:20:00 2146 7

原创 冷饭新炒:理解JDK中UUID的底层实现

前提UUID是Universally Unique IDentifier的缩写,翻译为通用唯一标识符或者全局唯一标识符。对于UUID的描述,下面摘录一下规范文件A Universally...

2021-01-29 08:30:00 1427

原创 冷饭新炒:理解Redisson中分布式锁的实现

前提在很早很早之前,写过一篇文章介绍过Redis中的red lock的实现,但是在生产环境中,笔者所负责的项目使用的分布式锁组件一直是Redisson。Redisson是具备多种内存数据...

2021-01-11 21:53:13 2189 4

原创 短链接服务Octopus的实现与源码开放

前提半年前(2020-06)左右,疫情触底反弹,公司的业务量不断提升,运营部门为了方便短信、模板消息推送等渠道的投放,提出了一个把长链接压缩为短链接的功能需求。当时为了快速推广,使用了一...

2020-12-27 20:39:28 5485 13

原创 Mybatis代码生成器Mybatis-Generator使用详解

前提最近在做创业项目的时候因为有比较多的新需求,需要频繁基于DDL生成Mybatis适合的实体、Mapper接口和映射文件。其中,代码生成器是MyBatis Generator(MBG),用到了Mybatis-Generator-Core相关依赖,这里通过一篇文章详细地分析这个代码生成器的使用方式。本文编写的时候使用的Mybatis-Generator版本为1.4.0,其他版本没有进行过调研。引入插件Mybatis-Generator的运行方式有很多种:基于mybatis-generator-c

2020-12-19 12:14:57 4949 2

原创 CentOS7搭建Hadoop-3.3.0集群手记

前提这篇文章是基于Linux系统CentOS7搭建Hadoop-3.3.0分布式集群的详细手记。基本概念Hadoop中的HDFS和YARN都是主从架构,主从架构会有一主多从和多主多从两种...

2020-12-14 08:30:00 5647 4

原创 ClickHouse数据库数据定义手记-不一般的DDL和DML

前提前面一篇文章已经很详细地介绍了ClickHouse中每种数据类型的定义和基本使用,这篇文章会详细地介绍ClickHouse中的DDL和DML,很多操作区别于传统的DBMS,特别是代价...

2020-12-08 08:33:00 3794

原创 ClickHouse数据库数据定义手记之数据类型

前提前边一篇文章详细分析了如何在Windows10系统下搭建ClickHouse的开发环境,接着需要详细学习一下此数据库的数据定义,包括数据类型、DDL和DML。ClickHouse作为...

2020-11-22 12:59:07 4716

原创 Windows10系统下使用Docker搭建ClickHouse开发环境

前提随着现在业务开展,几个业务系统的数据量开始急剧膨胀。之前使用了关系型数据库MySQL进行了一次数据仓库的建模,发现了数据量上来后,大量的JOIN操作在提高了云MySQL的配置后依然有...

2020-11-19 08:30:00 5391 3

原创 Windows10系统下Hadoop和Hive开发环境搭建填坑指南

前提笔者目前需要搭建数据平台,发现了Windows系统下,Hadoop和Hive等组件的安装和运行存在大量的坑,而本着有坑必填的目标,笔者还是花了几个晚上的下班时候在多个互联网参考资料的...

2020-11-03 08:30:00 6590

原创 冷饭新炒:理解断路器CircuitBreaker的原理与实现

前提笔者之前在查找Sentinel相关资料的时候,偶然中找到了Martin Fowler大神的一篇文章《CircuitBreaker》。于是花了点时间仔细阅读,顺便温习一下断路器Circ...

2020-10-25 18:01:00 5814

原创 深入理解RabbitMQ中的prefetch_count参数

前提在某一次用户标签服务中大量用到异步流程,使用了RabbitMQ进行解耦。其中,为了提高消费者的处理效率针对了不同节点任务的消费者线程数和prefetch_count参数都做了调整和测...

2020-10-17 14:03:44 9358 1

原创 简化ETL工作,编写一个Canal胶水层

前提❝这是一篇憋了很久的文章,一直想写,却又一直忘记了写。整篇文章可能会有点流水账,相对详细地介绍怎么写一个小型的"框架"。这个精悍的胶水层已经在生产环境服役超过半年,这...

2020-10-06 13:37:11 6417 5

CDH6.3.2安装包下载

CDH6.3.2安装包下载,最后一个免费的版本,已经在生产环境实践安装过,集群环境是3台阿里云ECS,12C48G,1TB ESSD云盘

2021-10-12

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

TA关注的人

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