
Java
文章平均质量分 93
Throwable文摘
这个作者很懒,什么都没留下…
展开
-
插件化注解处理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 · 335 阅读 · 1 评论 -
基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇
最近对网络编程方面比较有兴趣,在微服务实践上也用到了相对主流的框架如底层也切换为,像底层也是使用封装通讯协议,最近调研和准备使用的也是基于封装实现了多种协议的兼容。因此,基于造一个轮子,在的加持下,实现一个轻量级的框架。这篇博文介绍的是框架协议的定义以及对应的编码解码处理的实现。截止本文()编写完成之时,的最新版本为,而的最新版本为,因此引入这两个版本的依赖,加上其他工具包和序列化等等的支持,文件的核心内容如下:部分参数的序列化会依赖到或者,具体看偏好而定。为了提高协议传输的效率,需要定制一套高效的协议,原创 2022-06-14 20:42:43 · 492 阅读 · 0 评论 -
使用Redis实现UA池
最近忙于业务开发、交接和游戏,加上碰上了不定时出现的犹豫期和困惑期,荒废学业了一段时间。天冷了,要重新拾起开始下阶段的学习了。之前接触到的一些数据搜索项目,涉及到请求模拟,基于反爬需要使用随机的,于是使用实现了一个十分简易的池。最近的一个需求,有模拟请求的逻辑,要求每次请求的请求头中的要满足下面几点:这里三点都可以从数据的来源解决,实际上我们应该关注具体的实现方案。简单分析一下,流程如下:在设计池的时候,它的数据结构和环形队列十分类似:上图中,假设不同颜色的是完全不同的,它们通过洗牌算法打散放进去环形队列中原创 2022-06-14 20:40:52 · 209 阅读 · 0 评论 -
彻底告别加解密模块代码拷贝-JCE核心Cipher详解
javax.crypto.Cipher,翻译为密码,其实叫做密码器更加合适。Cipher是JCA(Java Cryptographic Extension,Java加密扩展)的核心,提供基于多种加解密算法的加解密功能。在不了解Cipher之前,我们在完成一些需要加解密的模块的时候总是需要到处拷贝代码,甚至有些错误的用法也被无数次拷贝,踩坑之后又要拷贝补坑的代码。为什么不尝试理解Cipher然后合理地使用呢?转换模式transformation一般由三个部分组成,格式是:算法/工作模式/填充模式(algori原创 2022-06-14 20:38:57 · 946 阅读 · 2 评论 -
通过源码浅析Java中的资源加载
最近在做一个基础组件项目刚好需要用到JDK中的资源加载,这里说到的资源包括类文件和其他静态资源,刚好需要重新补充一下类加载器和资源加载的相关知识,整理成一篇文章。这一节主要分析类加载器和双亲委派模型。虚拟机设计团队把类加载阶段中的"通过一个类的全限定名来获取描述此类的二进制字节流"这个动作放到了Java虚拟机外部实现,以便让应用程序自己决定如何去获取所需要的类,而实现这个动作的代码模块称为"类加载器(ClassLoader)"。类加载器虽然只用于实现类加载的功能,但是它在Java程序中起到的作用不局限于类加原创 2022-06-14 20:37:02 · 274 阅读 · 0 评论 -
浅析JDK中ServiceLoader的源码
紧接着上一篇《通过源码浅析JDK中的资源加载》,ServiceLoader是SPI(Service Provider Interface)中的服务类加载的核心类,也就是,这篇文章先介绍ServiceLoader的使用方式,再分析它的源码。这里先列举一个经典的例子,MySQL的Java驱动就是通过ServiceLoader加载的,先引入的依赖:查看这个依赖的源码包下的META-INF目录,可见:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BuV1i3Em-165521023原创 2022-06-14 20:35:51 · 426 阅读 · 0 评论 -
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 · 881 阅读 · 1 评论 -
JDK中Lambda表达式的序列化与SerializedLambda的巧妙使用
前提笔者在下班空余时间想以Javassist为核心基于JDBC写一套摒弃反射调用的轻量级的ORM框架,过程中有研读mybatis、tk-mapper、mybatis-plus和spring...原创 2021-11-27 12:49:30 · 748 阅读 · 0 评论 -
13万字详细分析JDK中Stream的实现原理
前提Stream是JDK1.8中首次引入的,距今已经过去了接近8年时间(JDK1.8正式版是2013年底发布的)。Stream的引入一方面极大地简化了某些开发场景,另一方面也可能降低了编码...原创 2021-10-06 13:14:36 · 1691 阅读 · 4 评论 -
深入理解Java中的Garbage Collection
前提最近由于系统业务量比较大,从生产的GC日志(结合Pinpoint)来看,需要对部分系统进行GC调优。但是鉴于以往不是专门做这一块,但是一直都有零散的积累,这里做一个相对全面的总结。本文只针对HotSpot VM也就是Oracle Hotspot VM或者OpenJDK Hotspot VM,版本为Java8,其他VM不一定适用。什么是GC(Garbage Collection)Garbage Collection可以翻译为“垃圾收集” – 一般主观上会认为做法是:找到垃圾,然后把垃圾扔掉。在VM.原创 2020-07-01 23:02:37 · 3973 阅读 · 2 评论 -
基于Quartz编写一个可复用的分布式调度任务管理WebUI组件
前提创业小团队,无论选择任何方案,都优先考虑节省成本。关于分布式定时调度框架,成熟的候选方案有XXL-JOB、Easy Scheduler、Light Task Scheduler和Elastic Job等等,其实这些之前都在生产环境使用过。但是想要搭建高可用的分布式调度平台,这些框架(无论是否去中心化)都需要额外的服务器资源去部署中心调度管理服务实例,甚至有时候还会依赖一些中间件如Zookee...原创 2020-04-11 22:57:30 · 3695 阅读 · 0 评论 -
基于Canal和Kafka实现MySQL的Binlog近实时同步
前提近段时间,业务系统架构基本完备,数据层面的建设比较薄弱,因为笔者目前工作重心在于搭建一个小型的数据平台。优先级比较高的一个任务就是需要近实时同步业务系统的数据(包括保存、更新或者软删除)到一个另一个数据源,持久化之前需要清洗数据并且构建一个相对合理的便于后续业务数据统计、标签系统构建等扩展功能的数据模型。基于当前团队的资源和能力,优先调研了Alibaba开源中间件Canal的使用。这篇文...原创 2020-03-13 00:45:21 · 8251 阅读 · 2 评论 -
编写一个可复用的SpringBoot应用运维脚本
前提作为Java开发者,很多场景下会使用SpringBoot开发Web应用,目前微服务主流SpringCloud全家桶也是基于SpringBoot搭建的。SpringBoot应用部署到服务器上,需要编写运维管理脚本。本文尝试基于经验,总结之前生产使用的Shell脚本,编写一个可以复用的SpringBoot应用运维脚本,从而极大减轻SpringBoot应用启动、状态、重启等管理的工作量。本文的Sh...原创 2020-03-03 23:43:08 · 3726 阅读 · 0 评论 -
ThreadLocal源码分析-黄金分割数的使用
前提最近接触到的一个项目要兼容新老系统,最终采用了ThreadLocal(实际上用的是InheritableThreadLocal)用于在子线程获取父线程中共享的变量。问题是解决了,但是后来发现对ThreadLocal的理解不够深入,于是顺便把它的源码阅读理解了一遍。在谈到ThreadLocal之前先买个关子,先谈谈黄金分割数。本文在阅读ThreadLocal源码的时候是使用JDK8(1.8.0...原创 2020-02-14 12:48:04 · 4509 阅读 · 0 评论 -
项目架构级别规约框架Archunit调研
背景最近在做一个新项目的时候引入了一个架构方面的需求,就是需要检查项目的编码规范、模块分类规范、类依赖规范等,刚好接触到,正好做个调研。很多时候,我们会制定项目的规范,例如:硬性规定项目包结构中service层不能引用controller层的类(这个例子有点极端)。硬性规定定义在controller包下的Controller类的类名称以"Controller"结尾,方法的入参类型命名以"...原创 2020-02-12 09:47:34 · 4020 阅读 · 0 评论 -
理解和运用Java中的Lambda
前提回想一下,JDK8是2014年发布正式版的,到现在为(2020-02-08)止已经过去了5年多。JDK8引入的两个比较强大的新特性是Lambda表达式(下文的Lambda特指JDK提供的Lambda)和Stream,这两个强大的特性让函数式编程在Java开发中发扬光大。这篇文章会从基本概念、使用方式、实现原理和实战场景等角度介绍Lambda的全貌,其中还会涉及一些函数式编程概念、JVM一些知...原创 2020-02-10 09:52:50 · 3806 阅读 · 0 评论 -
深入理解JDK中的Reference原理和源码实现
前提这篇文章主要基于JDK11的源码和最近翻看的《深入理解Java虚拟机-2nd》一书的部分内容,对JDK11中的Reference(引用)做一些总结。值得注意的是,通过笔者对比一下JDK11和JDK8对于java.lang.ref包的相关实现,发现代码变化比较大,因此本文的源码分析可能并不适合于JDK11之外的JDK版本。Reference的简介和分类在JDK1.2之前,Java中的引用的...原创 2020-02-07 00:12:17 · 3546 阅读 · 0 评论 -
Redis高级客户端Lettuce详解
前提Lettuce是一个Redis的Java驱动包,初识她的时候是使用RedisTemplate的时候遇到点问题Debug到底层的一些源码,发现spring-data-redis的驱动包在某个版本之后替换为Lettuce。Lettuce翻译为生菜,没错,就是吃的那种生菜,所以它的Logo长这样:既然能被Spring生态所认可,Lettuce想必有过人之处,于是笔者花时间阅读她的官方文档,整理...原创 2020-02-06 09:58:04 · 7295 阅读 · 0 评论 -
一个基于RabbitMQ的可复用的事务消息方案
前提分布式事务是微服务实践中一个比较棘手的问题,在笔者所实施的微服务实践方案中,都采用了折中或者规避强一致性的方案。参考Ebay多年前提出的本地消息表方案,基于RabbitMQ和MySQL(JDBC)做了轻量级的封装,实现了低入侵性的事务消息模块。本文的内容就是详细分析整个方案的设计思路和实施。环境依赖如下:JDK1.8+spring-boot-start-web:2.x.x、spring...原创 2020-02-05 21:44:40 · 4289 阅读 · 0 评论 -
从源码上理解Netty并发工具-Promise
前提最近一直在看Netty相关的内容,也在编写一个轻量级的RPC框架来练手,途中发现了Netty的源码有很多亮点,某些实现甚至可以用苛刻来形容。另外,Netty提供的工具类也是相当优秀,可以开箱即用。这里分析一下个人比较喜欢的领域,并发方面的一个Netty工具模块 - Promise。环境版本:Netty:4.1.44.FinalJDK1.8Promise简介Promise,...原创 2020-01-24 10:07:05 · 3476 阅读 · 0 评论 -
线程上下文类加载器ContextClassLoader内存泄漏隐患
前提今天(2020-01-18)在编写Netty相关代码的时候,从Netty源码中的ThreadDeathWatcher和GlobalEventExecutor追溯到两个和线程上下文类加载器ContextClassLoader内存泄漏相关的Issue:ThreadDeathWatcher causes custom classLoader script memory leaksEnsure...原创 2020-01-20 08:37:48 · 4002 阅读 · 0 评论