自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

子月生的博客

分层,抽象

  • 博客(52)
  • 资源 (1)
  • 收藏
  • 关注

原创 源码详解系列(八)--全面讲解HikariCP的使用和源码

本文将包含以下内容(因为篇幅较长,可根据需要选择阅读):1. 如何使用 HikariCP(入门、JMX 等)2. 配置参数详解3. 源码分析

2020-02-19 10:07:32 1422 1

原创 kafka详解(二)--kafka为什么快

Kafka 有多快呢?我们可以使用 OpenMessaging Benchmark Framework 测试框架方便地对 RocketMQ、Pulsar、Kafka、RabbitMQ 等消息系统进行对比测试,因为暂时没有测试条件(后续补上),我直接用这篇文章的测试结果(Benchmarking Kafka vs. Pulsar vs. RabbitMQ: Which is Fastest?),可以看到,在某种条件下,Kafka 写入速度比 RabbitMQ 快 15 倍,比 Pulsar 快 2 倍,在最高

2022-10-13 16:23:30 1039 1

原创 kafka详解(一)--kafka是什么及怎么用

我准备开一个新的系列,希望可以帮助大家更简单、更连贯、更系统地了解 kafka。这是系列的第一篇,主要讲kafka是什么?如何使用kafka。

2022-08-31 09:07:17 1387

原创 配置中心的设计-nacos vs apollo

前面我们分析了携程的 apollo(见 详解apollo的设计与使用),现在再来看看阿里的 nacos。和 apollo 一样,nacos 也是一款配置中心,同样可以实现配置的集中管理、分环境管理、即时生效等等。不过,nacos 还具备了服务发现的功能。这篇博客将重点分析 nacos 和 apollo 在设计上的差异。...

2022-06-05 18:12:38 1129

原创 我的JAVA面试题备忘录

以下是我收集的一些问题,有的是网上摘录的,有的是自己参加面试被问到的,有的是工作或学习时遇到的,等等。为什么要记录这些呢?一方面,我相信,这样做对我自己的技术提升是有帮助的。在全文结构上我尽量**使问题连贯地形成知识体系**,而不是堆积的碎片,而且,每个问题我会尽量地给出答案。另一方面,我希望,有大佬可以指出我的错误。因为我的答案不一定对,尤其那些带 * 的问题。这份资料将会持续更新,如果有其他问题也可以留言讨论。欢迎交流,共同进步。

2022-05-03 18:21:09 443

原创 spring内嵌cglib包,这里藏着一个大坑

问题发现2022-01-21 早上 9 点,订单系统出现大面积的“系统未知错误”报错,导致部分用户无法正常下单。查询后台日志,可以看到大量的 duplicate class attempt。java.lang.LinkageError-->loader (instance of org/springframework/boot/loader/LaunchedURLClassLoader): attempted duplicate class definition for name: "com/

2022-01-24 11:24:26 1844

原创 如何设计一个通用的查询接口

临近放假,手头的事情没那么多,老是摸鱼也不好,还是写写博客吧。今天来聊聊:如何设计一个通用的查询接口。从一个场景开始首先,我们从一个简单的场景开始。现在,我需要一个订单列表,用来查询【我的订单】,支持分页,且支持高级搜索。整个查询流程我们先来设计下整个查询的流程,我认为大致如下图。简单来说就是:接收查询条件 -》 校验条件 -》添加条件 -》 执行查询 -》 转换 VO -》 返回结果。注意,因为不同公司用的语言或者代码分层可能不一样,所以,我们没必要纠结具体的代码实现,只要关注一些更高抽象层级

2022-01-19 14:33:10 3640

原创 简单的2021年终总结

当大家开开心心跨年的时候,我在补年终总结。小时候恨不得时间过得快一点,现在不这么想了。我的 2021年,都是平静、反复的一天天,没有出书、没有开源、没有跳槽、没有升官。没错,这可能是你看过的最 low、最不争气的总结,很抱歉给各位大佬拖后腿了。写博客的话,我是认真的。今年总共写了 15 篇,中间 4、5 月去重构以前的文章,9 月份嘛,稍有懈怠。在写法上,我越来越倾向于连贯的思路以及更高的抽象层级,所以源码分析就少了,因为很多优秀的类库厉害的地方在于设计,而非代码实现。文章质量方面,个人觉得还是可以

2021-12-31 21:26:10 409

原创 简单聊聊mysql的脏读、不可重复读、幻读

最近,在一次 mysql 死锁的生产事故中,我发现,关于 mysql 的锁、事务等等,我所知道的东西太碎了,所以,我试着用几个例子将它们串起来。具体做法就是通过不断地问问题、回答问题,再加上“适当”的比喻,来逐步构建脑子里的“知识树”。需要提醒一下,这篇博客并不适合小白,因为你需要先了解排它锁、共享锁、事务,最重要的是你需要知道事务中的锁是什么时候加上、什么时候打开的。而这篇博客更多的是希望把这些碎片化的知识给连接起来。项目环境mysql 版本:5.7.28-winx64OS:win 10数据库脚

2021-12-24 13:45:40 3341

原创 如何使用原生的Hystrix

前面已经讲完了 Feign 和 Ribbon,今天我们来研究 Netflix 团队开发的另一个类库--Hystrix。从抽象层面看,**Hystrix 是一个保护器**。它可以保护我们的应用不会因为某个依赖的故障而 down 掉。目前,官方已不再迭代 Hystrix,一方面是认为 Hystrix 已经足够稳定了,另一方面是转向了更具弹性的保护器(而不是根据预先配置来启用保护),例如 resilience4j。当然,停止迭代并不是说 Hystrix 已经没有价值,它的很多思

2021-11-18 13:47:43 282

原创 一个校验接口引发的思考--我真的了解Response吗

对应`{"success":true,"message":"操作成功","data":"OK"}`这种 Response 结构,大家应该并不陌生吧,但是呢,最近对接了一个校验接口,让我开始怀疑我是否真的了解 response,所以,希望能了解各位同行的看法。

2021-11-14 17:18:53 448

原创 如何使用原生的Ribbon

之前分析了如何使用原生的Feign,今天我们来研究 Netflix 团队开发的另外一个类库--Ribbon。Ribbon 和 Feign 有很多相似的地方,首先,它们本质上都是 HTTP client,其次,它们都具备重试、集成断路器等功能。最大的区别在于,Ribbon 内置了一个负载均衡器,而 Feign 没有。本文将介绍如何使用原生的 Ribbon,注意是原生的,而不是被 Spring 层层封装的 Ribbon。

2021-10-30 11:08:01 261

原创 记一次Orika使用不当导致的内存溢出

hprof 文件分析2021-08-24,订单中心的一个项目出现了 OOM 异常,使用 MemoryAnalyzer 打开 dump 出来的 hprof 文件,可以看到 91.27% 的内存被一个超大对象javassist.ClassPool占用了。那么,ClassPool是一个什么样的对象呢?我们知道,javassist 可以用来动态生成类,而生成的类就是放在这个ClassPool里面,具体以javassist.CtClass的形式存在。所以,初步分析是 OOM 的原因是 javassist 生成的

2021-08-25 14:39:03 877

原创 如何使用原生的Feign

Feign 是由 Netflix 团队开发的一款基于 Java 实现的 HTTP client,借鉴了 Retrofi、 JAXRS-2.0、WebSocket 等类库。通过 Feign,我们可以像调用方法一样非常简单地访问 HTTP API。这篇博客将介绍如何使用原生的 Feign,注意,是原生的,不是经过 Spring 层层封装的 Feign。

2021-07-09 09:51:34 586 2

原创 关于接口设计的思考--我们真的需要这么多入参吗

最近,我改造一个旧接口时发现,这个接口有 30 多个入参,而事实上并不需要那么多,而且,这个接口还存在比较大的安全隐患。所以,关于如何设计接口入参,我想谈谈自己的一些想法。当然,只是一家之言,不一定就是对的。

2021-07-04 10:29:38 552

原创 详解apollo的设计与使用

apollo 是一款由携程团队开发的配置中心,可以实现配置的集中管理、分环境管理、即时生效等等。在这篇博客中,我们可以了解到:1. 为什么使用配置中心2. 如何设计一个配置中心3. apollo 是如何设计的4. 如何使用 apollo

2021-06-22 14:58:05 381

原创 entitybuilder--一个简单的业务通用框架

业务系统是千差万别的,例如,保存、更新和删除订单,或者保存订单和保存客户,走的根本不是一个流程。但是,它们还是有共同点,它们的流程大致可以分成下面的几个部分。拿到增删改等操作所需的基础数据;初始化基础数据; 对基础数据进行校验;利用基础数据,构建出要进行增删改等操作的对象;持久化或其他操作。而entitybuilder就是来规范和简化这个过程的工具。

2021-03-03 10:05:45 395

原创 Java源码详解系列(十二)--Eureka的使用和源码

eureka 是由 Netflix 团队开发的针对中间层服务的负载均衡器,在微服务项目中被广泛使用。相比 SLB、ALB 等负载均衡器,eureka 的服务注册是无状态的,扩展起来非常方便。在这个系列中,我将深入研究 eureka,包括它的使用、源码等,总计分成五篇博客讲完,后面发现有趣的东西也会继续补充。

2021-02-10 11:00:37 141

原创 Eureka详解系列(五)--Eureka Server部分的源码和配置

按照原定的计划,我将分三个部分来分析 Eureka 的源码:1. Eureka 的配置体系;2. Eureka Client 的交互行为;3. Eureka Server 的交互行为。今天,我们来研究第三部分的源码。分析的思路和第二部分的一样,先明确 Eureka Server 需要具备哪些功能,再从源码层面分析如何实现这些功能,最后补充 Eureka Server 的配置解读。

2021-02-10 10:37:12 198

原创 Eureka详解系列(四)--Eureka Client部分的源码和配置

<img src="https://images.cnblogs.com/cnblogs_com/ZhangZiSheng001/1920994/o_210122134252eureka-logo-2624.png" class="desc_img">按照原定的计划,我将分三个部分来分析 Eureka 的源码:1. Eureka 的配置体系;2. Eureka Client 的交互行为;3. Eureka Server 的交互行为。今天,我们来研究第二部分的源码。

2021-02-06 12:42:19 295

原创 Eureka详解系列(三)--探索Eureka强大的配置体系

通过前面的两篇博客,我们知道了:什么是 Eureka?为什么使用 Eureka?如何适用 Eureka?今天,我们开始来研究 Eureka 的源码,先从配置部分的源码开始看,其他部分后面再补充。补充一点,我更多地会从设计层面分析源码,而不会顺序地剖析每个过程的代码。一方面是因为篇幅有限,另一方面是因为我认为这样做更有意义一些。

2021-02-04 17:40:22 185

原创 Eureka详解系列(二)--如何使用Eureka(原生API,无Spring)

通过上一篇博客,我们知道了 Eureka 是什么以及为什么要使用它,今天,我们开始研究如何使用 Eureka。在此之前,先说明一点。网上几乎所有关于 Eureka 的文章都是基于 Spring 的,但**本文的例子不会有任何 Spring 的代码,我尽量使用 Eureka 原生的 API**,后面的源码分析也是如此。因为 Spring 把 Eureka 藏得越好,我们研究起来就会越困难,毕竟我写这个系列不是只为了学会怎么使用 Eureka,我们还要分析它的源码。当然,实际项目中就没必要这么搞了。

2021-01-28 09:09:05 364

原创 Eureka详解系列(一)--先谈谈负载均衡器

这个系列开始研究 Eureka,在此之前,先来谈谈负载均衡器。本质上,Eureka 就是一个负载均衡器,可能有的人会说,它是一个服务注册中心,用来注册服务的,这种说法不能说错,只是有点片面。在这篇博客里,我将尽可能循序渐进、图文并茂地回答下面的几个问题。至于 Eureka 的使用、配置、源码分析、集群配置等等,这些后续博客再补充。

2021-01-22 14:26:26 1053 1

原创 cglib、orika、spring等bean copy工具性能测试和原理分析

在实际项目中,考虑到不同的数据使用者,我们经常要处理 VO、DTO、Entity、DO 等对象的转换,如果手动编写 setter/getter 方法一个个赋值,将非常繁琐且难维护。通常情况下,这类转换都是同名属性的转换(类型可以不同),我们更多地会使用 bean copy 工具,例如 Apache Commons BeanUtils、Cglib BeanCopier 等。在使用 bean copy 工具时,我们更多地会考虑性能,有时也需要考虑深浅复制的问题。本文将对比几款常用的 bean copy 工具的

2020-12-09 13:45:57 1453

原创 jackson、fastjson、kryo、protostuff等序列化工具性能对比

实际项目中,我们经常需要使用序列化工具来存储和传输对象。目前用得比较多的序列化工具有:jackson、fastjson、kryo、protostuff、fst 等,本文将简单对比这几款工具序列化和反序列化的性能。

2020-11-09 14:32:19 2948

原创 Java源码详解系列(十一)--Spring的使用和源码

Spring 是一个一站式的 Java 框架,致力于提高我们项目开发的效率。通过 Spring,我们可以避免编写大量额外代码,更专注于我们的核心逻辑。目前,Spring 已经成为最受欢迎的 Java 框架。Spring 的全家桶包含非常多的项目,而且还在不断增加,但我们可以发现,最核心的就是 spring-bean 和 spring-aop,其他大部分都是基于这两个项目而来。本系列将重点分析这两个项目,其他项目的内容后续也会增加。

2020-10-12 15:57:16 101

原创 Spring源码系列(四)--spring-aop是如何设计的

顾名思义,spring-aop 是用来做 AOP 开发的,搭配 spring-bean 一起使用的话,AOP 将更加解耦、方便。在实际项目中,spring-aop 被广泛用来实现日志、权限、事务、异常等的统一管理。上一篇博客简单讲了 spring-aop 的基础组件、架构和使用方法,本文将开始研究 spring-aop 的源码,主要分成以下部分:1. spring-aop 的几个重要的组件,如 Joinpoint、Advice、Pointcut、Advisor 等;2. spring-aop 是如何设

2020-09-28 15:56:49 127

原创 Spring源码系列(三)--spring-aop的基础组件、架构和使用

顾名思义,spring-aop 是用来做 AOP 开发的,搭配 spring-bean 一起使用的话,AOP 将更加解耦、方便。在实际项目中,spring-aop 被广泛用来实现日志、权限、事务、异常等的统一管理。我将通过两篇博客来详细介绍 spring-aop 的使用、源码等。这是第一篇博客,主要介绍 spring-aop 的组件、架构、使用等。

2020-09-15 09:10:48 364 1

原创 JMH--一款由OpenJDK开发的基准测试工具

JMH 是 OpenJDK 团队开发的一款基准测试工具,一般用于代码的性能调优,精度甚至可以达到纳秒级别,适用于 java 以及其他基于 JVM 的语言。和 Apache JMeter 不同,**JMH 测试的对象可以是任一方法,颗粒度更小**,而不仅限于rest api。本文将使用入门例子介绍如何使用 JMH,并结合官方示例代码介绍 JMH 的详细配置方法。

2020-08-29 11:07:03 527

原创 关于maven的一份小笔记

本文主要讲解以下内容:1. 什么是 maven?maven有什么用?2. 安装和使用 maven3. maven 的构建生命周期4. 配置 maven5. 常见问题(持续更新)

2020-07-22 13:51:30 198

原创 Java源码详解系列(十)--全面分析mybatis的使用、源码和代码生成器(总计5篇博客)

针对 Mybatis 的分析,我拆分成使用、源码分析、生成器等部分,已更新5篇博客,都放在 [Mybatis]这个系列里,内容将持续更新。1. Mybatis详解系列(一)--持久层框架解决了什么及如何使用Mybatis2. Mybatis源码详解系列(二)--Mybatis如何加载配置及初始化3. Mybatis源码详解系列(三)--从Mapper接口开始看Mybatis的执行逻辑4. Mybatis源码详解系列(四)--你不知道的Mybatis用法和细节5. Mybatis详解系列(五)--M

2020-07-05 09:34:45 135

原创 Spring源码系列(二)--bean组件的源码分析

在上一篇博客中,我们讨论了 spring-bean 是什么?用来解决什么问题?如何使用 spring-bean?等等问题,算是从使用者的角度对 spring-bean 有了一定了解。这篇博客我们将开始分析 spring-bean 的源码,大致的思路如下:1. spring-bean 是如何设计的2. 开始看源码--从哪里开始3. bean 冲突的处理4. 先看看是否需要创建5. 开始创建 bean6. bean 的实例化7. bean 的属性装配8. bean 的初始化(省略)

2020-06-26 20:20:14 169

原创 Spring源码系列(一)--详细介绍bean组件

spring-bean 是 spring 家族中最核心的一个组件,从抽象层面来说,我们可以把它当成:1. **通用的对象工厂**。这个有点像我们常用的`**Factory`,通过它,我们可以获取到所需的对象。2. **全局的上下文**。我把某个对象丢进这个上下文,然后可以在应用的任何位置获取到这个对象。针对 spring-bean 组件,我计划分成 2 到 3 篇博客来分析。本文主要讲的是:1. spring-bean 是什么?用来解决什么问题?2. 几个重要的概念,例如什么是 bean?3.

2020-06-14 18:22:20 271

原创 Mybatis详解系列(五)--Mybatis Generator和全注解风格的MyBatis3DynamicSql

本文内容大致如下,由于篇幅较长,可选择阅读:1. 如何使用 MBG 生成代码;2. 详解 MBG 的配置,将配置使用自定义注释生成器、实体类中添加 toString/equals/hashCode方法等。3. MyBatis3DynamicSql 风格(无 XML) API 的使用。通过本文的学习,你将能够通过简单改造 MBG 来生成自己想要的代码,另外,我们也将认识强大的 MyBatis3DynamicSql 风格(它提供的条件类使用 Lambda 解耦,全注解,支持单表查询、多表查询、分页、排序

2020-05-03 12:57:33 4646

原创 Mybatis源码详解系列(四)--你不知道的Mybatis用法和细节

这是 Mybatis系列博客的第四篇,我本来打算详细讲解 mybatis 的配置、映射器、动态 sql 等,但[Mybatis官方中文文档](https://mybatis.org/mybatis-3/zh/index.html)对这部分内容的介绍已经足够详细了,有需要的可以直接参考。所以,我将扩展一些其他特性或使用细节,掌握它们可以更优雅、高效地使用 mybatis。

2020-04-25 21:52:29 255

原创 Mybatis源码详解系列(三)--从Mapper接口开始看Mybatis的执行逻辑

本文继续分析Mybatis的源码,第1点内容上一篇博客已经讲过,本文将针对 2 和 3 点继续分析:1. 加载配置、初始化SqlSessionFactory;2. 获取SqlSession和Mapper;3. 执行Mapper方法。

2020-04-23 15:56:38 235

原创 Mybatis源码详解系列(二)--Mybatis如何加载配置及初始化

前面已经说完 mybatis 的使用,现在开始分析源码,和使用例子一样,我用的 mybatis 是 3.5.4 版本的。考虑连贯性,我会按下面的顺序来展开分析,计划两篇博客写完,本文只涉及第一点内容:1. 加载配置、初始化SqlSessionFactory;2. 获取SqlSession和Mapper;3. 执行Mapper方法。

2020-04-15 11:25:55 196

原创 Mybatis源码详解系列(一)--持久层框架解决了什么及如何使用Mybatis

mybatis 是一个持久层框架,它让我们可以方便、解耦地操作数据库。 相比 hibernate,mybatis 在国内更受欢迎,而且 mybatis 更面向数据库,可以灵活地对 sql 语句进行优化。针对 mybatis 的分析,我会拆分成使用、配置、源码、生成器等部分,都放在 Mybatis 这个系列里,内容将持续更新。这篇博客是系列里的第一篇文章,将从下面两个问题展开 :1. 为什么要用持久层框架?2. 如何使用 mybatis?

2020-03-31 13:07:33 1257

原创 详解POI的使用方法(DOM和SAX的方式)及存在的不足

本文包含以下内容,由于篇幅较长,可以根据需要选择阅读:1. POI的介绍2. 如何使用POI及POI的不足3. 如何使用easyexcel

2020-03-20 15:42:58 3586 2

原创 源码详解系列(七) ------ 全面讲解logback的使用和源码

本文将介绍以下内容,由于篇幅较长,可根据需要选择阅读:1.如何使用 logback:将日志输出到控制台、文件和数据库,以及使用 JMX 配置 logback;2.logback 配置文件详解;3.logback 的源码分析。

2020-01-31 18:16:46 583

我的JAVA面试题备忘录1.0.0.pdf

以下是我收集的一些问题,有的是网上摘录的,有的是自己参加面试被问到的,有的是工作或学习时遇到的,等等。 为什么要记录这些呢? 一方面,我相信,这样做对我自己的技术提升是有帮助的。在全文结构上我尽量使问题连贯地形成知识体系,而不是堆积的碎片,而且,每个问题我会尽量地给出答案。 另一方面,我希望,有大佬可以指出我的错误。因为我的答案不一定对,尤其那些带 * 的问题。 这份资料将会持续更新,如果有其他问题也可以留言讨论。欢迎交流,共同进步。

2022-05-18

空空如也

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

TA关注的人

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