自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(96)
  • 收藏
  • 关注

原创 Java lambda表达式原理简述

注意,lambda表达式并不是`invokedynamic`调用执行的,`invokedynamic`调用只是生成了lambda方法对应的CallSite对象,具体执行还得靠`invokeinterface`或`invokevirtual`

2024-09-21 15:17:45 1286

原创 长业务事务的离线并发问题

当事务持续时间过长,并发请求的概率就会越大,会导致一系列并发问题,如:脏读,不可重复读,更新丢失甚至死锁等问题。

2024-09-15 22:37:59 471

原创 Java stream使用与执行原理

在stream内部会通过一个链表将这三个操作联系起来,一个操作被称为一个`stage`(或`pipeline`),每个`stage`会指向上下游的`stage`和`sourceStage`(即哨兵头节点)

2024-09-07 21:54:11 1096

原创 Java synchronized 原理

当被偏向的线程再次进入同步块时,发现锁对象偏向的就是当前线程,在通过一些额外的检查后,会往当前线程的栈中添加一条Displaced Mark Word为null的Lock Record,然后继续执行同步块的代码,因为操纵的是线程私有的栈,因此不需要用到CAS指令;当其他线程进入同步块时,发现已经有偏向的线程了,则会进入到撤销偏向锁的逻辑里,一般来说,会在safe point中去查看偏向的线程是否还存活,如果存活且还在同步块中则将锁升级为轻量级锁,原偏向的线程继续拥有锁,当前线程则走入到锁升级的逻辑里;

2024-09-04 01:20:12 1230

原创 JVM G1性能调优

G1整体上保持默认配置即可,最多配置一下 pause-time goal或堆内存大小(和)。不像其他的垃圾回收器,G1默认已经在最大吞吐和低时延之间做了平衡。但是,G1在堆中的增量式空间回收和pause-time控制机制给应用线程和回收效率上都带来了负担。如果需要大吞吐(非在线业务,如后台任务),可以适当调大期望最大停顿时间() 或者调大堆空间。如果需要低时延(在线业务),可以调小最大停顿时间。不要配置,等

2024-08-22 12:58:55 1038

原创 JVM G1垃圾回收器简介与常用配置

在内存空间划分上,G1将堆分为等大的一块区域(region),region是内存分配和垃圾回收的基本单位,其大小为2的幂,范围是 1 MB 到 32MB 之间,可通过进行配置。G1在逻辑上将堆分为年轻代和老年代两种逻辑类型,年轻代又包含和,所有新建的对象均创建在中,在经过young gc后,对象被复制整理到中(年龄不够到老年代时);老年代包含可横跨多个region的humongous区域。

2024-08-20 01:06:27 763

原创 分布式锁选型 Redis vs Zookeeper

分布式锁作为分布式环境下并发控制利器,使用场景广泛。分布式锁通常可利用中间件Redis或Zookeeper来实现, 例如针对Java语言Redis有Redisson组件, Zk有Curator组件。从其中间件属性就可以看出Redis是偏AP,而Zk是偏CP的。

2024-08-10 19:39:38 1031 1

原创 电商物流:配送管理系统实践

当今电商行业蓬勃发展,物流是其中不可或缺的一个环节,而配送管理系统(Delivery Management System, DMS)用于实物商品从下单到配货到发货到签收以及退换货的全流程管理(相对于实物商品,虚拟商品如教培行业的课程就不再DMS处理范围内,一般两者可以通过更为抽象的履约平台进行统一调度和管理)。注意DMS并不关心商品的实际配送本身,你可以在自营仓库发货,也可以在第三方仓库发货,你可以走顺丰,也可以走圆通,DMS负责管理这些数据,使得运营人员更高效的实现商品配送。

2024-08-09 00:09:05 944

原创 数据同步策略概览

数据同步在业务开发中比较普遍,例如 订阅MySQL的binlog将数据同步至异构数据库。数据同步方案需要考虑一下几点:数据实时性要求;数据量级;是否有数据转换逻辑

2024-08-01 18:58:10 888

原创 BigDecimal使用与存储计算原理

在Java中,金额计算通常使用或类型。在金额计算简单时,可以将金额单位设置为分,然后用Long表示多少多少分,这样的金额范围是分,金额范围基本能满足大多数场景了。但是涉及到复杂金额计算,尤其是除法时(例如:优惠分摊场景),Long则力不从心,而BigDecimal能够保证除法的精度,且范围扩大到。此外,金额计算尤其不推荐。

2024-07-30 00:36:51 865

原创 数据库实例迁移实践

库本身的迁移好办,麻烦的是库下游的依赖迁移,比如DTS、大数据等依赖。所以在迁移前需要对待迁移库的流量做全面梳理,梳理完好库读写来源后再确立方案。一个库的上下游依赖关系可以大致表示为...

2024-07-25 13:57:39 977

原创 SQL窗口函数实践

当年在校招面试时,面试官出了一道SQL题:一次年级考试,求每个班级内的成绩前10名。最近又遇到一个查询需求,假设一张表有(id,a,b,c)使用窗口函数即可以一次满足上面两个查询需求。先看下窗口函数的定义:In SQL, aor可以看出,窗口函数即是对每一个row都会生成对应的row数据(n:n),而aggregate function可以聚合多行成一行数据(n:1)。其中 partition by 表示根据字段进行分组求窗口函数,不加则表示所有行;order by 表示一个分组内的排序规则;

2024-07-19 00:46:48 1017

原创 IDEA中Git常用操作及Git存储原理

Git是一款分布式版本控制系统(VSC),是团队合作开发的必备工具。

2024-07-13 14:28:42 1466

原创 树型结构数据存储实践

很多业务场景会遇到树形结构的数据,如公司的人员职级树、行政区划树等。使用类似MySQL的数据库进行存储,需要将树形结构(二维)存储到行格式(一维)的db中。本文介绍了树型结构数据存储的三种方式:Adjacency List , Nested Set , Bridge Table (Closure Table)。

2024-07-05 23:41:13 919

原创 业务模型扩展字段存储

构建业务模型时,通常模型会设置扩展信息,存储上一般使用`JSON`格式存储到db中。`JSON`虽然有较好的扩展性,但并没有结构化存储的类型和非空等约束,且强依赖代码中写入/读取时进行序列化/反序列化操作,当扩展信息结构简单且不作为查询条件时使用`JSON`可以满足需求,但有些场景要求根据扩展字段进行查询,虽然有类似`JSON_CONTAINS`关键字匹配JSON内部字段,但不是所有db及其版本都支持`JSON`加内部索引的,且SQL语句复杂,难以维护。

2024-06-30 22:53:44 462

原创 业务代码插件式开发实践

本文讨论了一些业务研发过程中常用的插件式开发形式,以及衍生出常用的两种设计模式:策略模式和责任链模式。

2024-06-29 11:03:33 865

原创 ElasticSearch索引架构与存储

本文介绍了ES索引的存储架构和数据结构。

2024-06-27 01:03:14 1361

原创 ES数值类型慢查询优化

在设置mapping时请结合查询场景合理设置type:numeric 类型在数据区分度很高、量不大(如订单编号这种唯一属性)时,可以使用Term Query;在区分度低、数据量大(如枚举值、状态值)时不要设为numeric类型而是设为Keyword类型进行Term Query,若已经设为numeric类型请使用Range Query,参考本文endIdx查询DSL的优化。

2024-06-22 11:05:02 868

原创 Log4j2异步打印可变对象的问题

WEBAPP能在不重启Servlet容器的情况下重新加载应用,如果使用ThreadLocals,共用的线程池的线程的ThreadLocals会引用老版本的LogEvent,这样LogEvent不会被GC到,导致内存泄漏。代码中打日志都用日志门面的api打印,而日志配置文件根据你的日志实现不同而不同。接入日志实现还得加桥接包,太麻烦,不如自己搞个新的日志实现,于是Ceki。的字符串填充对象的时机不同,填充时占位符的对象内容才是真正被log到appender的内容。日志门面使用Slf4j;

2024-06-21 19:36:39 951

原创 SpringBoot测试实践

通常需求开发后需要经过RD单测&自测后进行提测,提测往往需要达到一定的单测/自测代码覆盖率,或者某些基本case通过(冒烟测试),符合提测要求后QA对整体功能进行端到端测试。完善的测试流程有助于提升代码质量和研发效率,这中间一方面对RD自身的业务素养有要求,另一方面对团队研发流程的规范性有要求。成熟的研发流程和体系应减少“人性”带来的不稳定性,测试即是应对该不稳定性的有效方法之一。

2024-06-21 13:36:43 1173

原创 SpringEvent扩展性利器

执行过程中遇到异常终止,则后续的同步&异步EventListener都不会执行(之前的会执行,使用@Order控制顺序),而TransactionalEventListener相互之间不受影响。所以使用EventListener要做好异常处理。propogation=REQUIRES_NEW)或使用编程式事务,但是如果@Async异步时,就不需要指定,因为事务是绑定线程的。使用Spring Event来发布应用内部领域事件,对于事件监听器可通过注解或类的方式来扩展,Spring。

2024-06-21 13:29:55 254

原创 异步任务使用场景与实践

任务执行一般耗时较长,中断可能性高,比如任务在执行过程中有上线行为,则该任务必须被强制打断(虽然有优雅下线的处理方式,但是任务执行时长是不可预知的,所以一般直接打断)。打断后重启执行需要保证上次执行没处理完的任务接续执行,不会因为任务打断导致任务数据不可重试。单机调度情况下不一定是串行执行的,任务执行时长可能大于调度间隔,仍然存在并发修改数据问题,这里任务组件可配置【丢弃执行】【排队等待】等阻塞策略,任务处理通常需要批量查询/变更表数据,最好加batchSize限制单次任务执行的数量,减少单次任务耗时。

2024-06-20 18:59:20 1256

原创 基于DDD的编码实践

领域层作为核心不应该依赖具体实现,借鉴六边形架构,领域层中定义了仓储协议(Repository接口),业务逻辑只需要从仓储接口中获取数据,至于实现领域层并不关系,而具体的实现由其他模块如infrastructure层来实现;实体之间的一致性要求,同时有一些事务、锁的使用在某些时候会侵入领域层(并非不能这样,实践中往往在实现时会借鉴DDD的思想,但不会全套照搬);除此之外,结合事件驱动的方式,虽然领域层与业务逻辑强关联,但是为了技术实现,在设计时也会有一些妥协,如,聚合不宜设计的过大,聚合的设计需要考虑。

2024-06-18 19:42:56 1002

原创 IDEA插件开发:自动生成setter

在给Java局部变量的实体赋值时,往往有很多setter,一个一个写很麻烦,也会漏掉,因此开发一款插件,可以自动生成局部变量实体的所有setter。

2024-06-01 10:22:23 1278

原创 IDEA主题Drcula个性化改造

Darcula 主题整体色调看着舒服,但是代码区分不直观,比如直接看代码是看不出这个这个是类、接口、抽象类、枚举还是啥,而且左侧图标也很难区分。

2024-05-26 02:57:31 331

原创 手写MyBatis代码生成器Maven插件

在使用MyBatis时,需要根据库表结构编写一些通用的Mapper interface、XML、Entity,这些重复操作可以通过代码生成器自动生成,大大提高开发效率。velocityjavapoet本文使用直接生成Java代码,使用生成XML文件。

2023-07-31 15:57:53 272

原创 @Value源码解读

KaTeX parse error: Expected 'EOF', got '#' at position 5: {} 和#̲{}的能力,默认解析。: 配置文件、Environment variables、Program arguments、VM options等。,对每一个Bean的初始化过程定义了很多了钩子做处理。{},可以继承该类自定义解析字符和解析方式。其中,value可输入。

2023-05-29 18:46:07 242

原创 TransmittableThreadLocal和ThreadPoolTaskExecutor

ThreadLocal用于线程隔离,常用与纪录用户登陆状态、事务状态等。在链路追踪中,也可用于记录TID,但通常遇到线程池时,即时使用时TID无法被传递到执行线程中,归根结底是因为,而ITL只能在线程创建时继承父类线程的变量,而在任务执行时,父类这些变量可能已经变化了,这时是无法同步到ITL的。

2023-05-19 15:25:55 516 1

原创 Java stream流处理常用操作

【代码】Java stream流处理常用操作。

2023-05-15 10:22:30 243

原创 Netty中的HttpServerCodec和HttpObjectAggregator

会将一个Http请求分为多个数据类型,如请求头、请求体、数据过大时分片(有限状态机实现),后续的ChannelHandler可以根据不同的类型来处理,如果想直接处理完整的Http请求,可在pipeline后面加上。作为HttpServer,需要加入来自client的Request的Http协议的Decoder和server回复Response的Http协议的Encoder,而这两个部分集成在了Netty提供的。(只处理入站请求),该类会聚合一个请求的所有东西生成一个。都继承自该类,而这里。

2023-04-13 14:41:41 812

原创 Maven依赖冲突分析和解决

使用maven管理jar包依赖时,可能会出现jar包版本冲突,不同版本的api调用方式可能不同,会出现和问题,甚至编译不通过,如:在的3.8.1版本中方法在3.4版本中不存在相同的函数签名方法,如果使用该api并依赖到了低版本会编译不通过。

2023-04-11 14:40:15 845

原创 定时任务:从Timer、STPE、Quartz 到 XXL-JOB

注意,心跳检测是执行器向调度中心每隔30s向*/api/registry*发送心跳(参见`ExecutorRegistryThread`),该api同样也是注册接口;而执行器端的 */beat*是调度中心在Failover路由模式下向执行器分配任务时主动检测时用的,只能说作者api命名地太抽象了:see_no_evil:。

2023-04-09 01:41:02 762

原创 java原生http/https请求

java原生http/https请求。

2023-04-08 18:58:45 252

原创 spring-retry注解调用原理

则默认重试执行3次,之后再去执行recover方法。可以设置异常类型、重试次数、退避策略。的一部分,后来单独成为一个项目了。调用service方法如果抛出。

2023-04-01 14:44:04 309

原创 OpenFeign 源码解读:动态代理+负载均衡实现

由于实现了懒加载,所以并不会在应用启动时就开始OpenFeign生成代理的流程。接口实现类最终执行远程调用,Client接口实现类中可以实现负载均衡(默认实现是。,所以即使存在重复类型的bean,依然会走OpenFeign的代理。实现负载均衡(OpenFeign老版本通过Ribbon实现负载均衡)的接口方式时,spring会自动依赖注入,此时会使用。只能注解在接口上,且该接口的所有方法都必须有。中拿代理对象,动态代理和负载均衡实现的入口。),注意OpenFeign的负载均衡需要引入。开启服务,该注解标有。

2023-03-29 22:44:23 1408

原创 Spring Transaction 源码解读

判断是否存在事务应用事务传播方法暂停或恢复事务提交时检查rollback-only标识对回滚做适当修改(直接回滚?还是设置rollback-only标识)调用事务同步器回调方法(如果同步器开启)关于事务同步器:callbacks事务同步器相当于一个事务扩展点,在事务的最后阶段提供了事务同步器的方法方便扩展,接口提供了四个回调方法#beforeCommit #beforeCompletion #afterCommit #afterCompletion事务同步器由进行管理,所有的。

2023-03-24 22:39:00 1443 2

原创 Spring 远程加载配置

可以看到从远程获取配置都是通过向ConfigurableEnvironment插入从远程获取的数据转化的PropertySource。而从远程获取就涉及到长轮询、本地缓存等内容,设计都比较一致。

2023-03-22 21:35:27 629 1

原创 Spring AOP及代理类执行顺序

关于 Spring AOP和Aspectj的关系,两个都实现了切面编程,Spring AOP更多地是为了Spring框架本身服务的,而Aspectj具有更强大、更完善的切面功能,我们在写业务时一般使用AspectJ。不过他们的概念、原理都差不多。Spring AOP说:可参考AspectJ项目中提供了@AspecJ注解,Spring interprets the same annotations@AspectSpring AOP提供了定义切面的两种方式。

2023-03-19 10:42:19 689

翻译 Spring Transaction Management

Spring事务抽象的关键是的概念。定义在接口该接口的实现可以通过spi机制或直接编码的方式引入IoC容器。无论是编程式事务还是声明式事务,该接口的实现都很重要。该接口方法抛出的运行时异常。方法入参返回。对象可以代表一个新的事务,或者一个已经存在的事务,JavaEE中和执行线程绑定(Isolation:隔离级别Propagation:事务传播方式,如果一个事务已经存在,此时又有一个事务发生如何处理?timeout:超时时间Read-only status:只读状态。

2023-03-19 00:04:01 175

原创 Spring 中的事件发布与监听

主要代码在包中引入@Component关于注解方法注入是通过的一个,同时该类也是一个,但扫描方法和注入逻辑不在该接口的方法中,而是接口的方法。关于的接口作用注释如下:看到其作用和类似,用于构造函数后的初始化操作。

2023-03-17 22:43:47 1579 2

空空如也

空空如也

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

TA关注的人

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