- 博客(74)
- 收藏
- 关注

原创 一文讲解如何写高质量的接口
实际工作中,可能出现需求考虑不全或人员操作失误等情况,可能需要变更需求(或数据);这时,产品轻描淡写的一句修改就完了,殊不知变更可能带来大量的工作量或风险;很多时候产品对于需求都是模糊的,就让开发来做,后面将会无休止的变更,并让开发背锅,所以需求详细之后再开始,磨刀不误砍柴工!:通常情况下,数量相关的往往和金钱、库存等相关,因此数据准确性就很重要,如果数量出错,往往会导致很严重问题;按墨菲定律讲,可能会发生的,或早或晚会发生;:在产品看来,可能注重的是功能,但是对开发来说,关注的是关联和逻辑;
2023-03-08 17:26:56
569
原创 记一次OOM异常问题排查
本文基于一次典型的CPU打满问题,逐步分析,最终定位到发生OOM的代码行,并处理修复。在后续遇到类似问题时,可以参考此排查思路,进行处理。同时,根据此次爆发OOM的原因,也可以发现,我们在查询列表数据时,特别是没有分页时,尤其要注意,返回的数据体量,避免返回数据过多,导致OOM问题。
2025-03-12 23:01:26
824
原创 一种Git代码分支管理的简单方式
上述简单介绍一种,普适通用的代码分支管理方式,以及对应开发流程。当然实际场景,可能还会有UAT环境,和对应分支等,可以根据需要对上述方式,进行扩展完善。也还有基于Cherry-Pick方式来合并增量代码的方式,代码管理方式多种多样,也带来不同的管控效果。实际应用时,也需要因地制宜,动态调整管理方式。
2025-03-09 10:36:35
277
原创 漫谈如何更好的应对面试
总的来说,我们要优化自己的简历,给出好的第一印象;对于技术面试,主要还是考察技术,扎实的技术是根本,应该提高对自己的技术要求,保证技术面试,不成为自己求职的关卡。愿大家都找面试顺利,找到心仪的工作。
2025-03-08 21:32:15
370
原创 一文盘点开发中的设计原则
如果单一职责,即一个类或方法承担过多,可能会导致出现歧义,同时耦合性增强,如果不同的职责需要变更和分化,将会使代码的影响点过多,从而容易导致BUG。在满足需求的前提下,有一些行业积累的设计原则,可以指导我们编码时,结构更清晰、更便于扩展,以及更好的解耦或复用。需要对扩展的功能,实现类似可插拔的功能。在开发设计时,遵循开闭原则,可以让我们的代码扩展性更强、代码解耦、更小程度的降低扩展对已有代码的影响,增强了程序的稳定性。里氏替换原则,简单来说就是:能使用父类的地方,也可以使用子类,且不破坏系统的正确性。
2025-01-29 19:51:51
683
原创 从源码中学习包的命名
根据单一职责原则,更好的额做法是,我们根据代码的职责,将其划分为各个不同的模块、文件夹和类文件。在日常开发中,我们通常不会将全部代码,写在一个文件夹或一个类文件中。如果这样,文件结构很混乱,且代码可读性非常差,也不容易定位和查找类文件。:存放一些门面模式的方法类;一些逻辑较复杂的服务类,通过门面模式,再去调用具体的Service类;:存放一些配置类,往往在配置类中映射配置文件,并注入Bean容器等;:存放一些和定时任务执行相关的类;:定义缓存相关的一些类文件;:存放一些通用的枚举类等;
2025-01-29 17:47:33
503
原创 一文了解性能优化的方法
上述简单罗列了,一些开发中常用的性能优化方向。我们可以根据实际业务场景,针对性的采取具体的优化措施。同时,在进行性能优化时,也别忘了进行性能瓶颈的定位,只有先定位好,瓶颈在哪里,才好针对性的进行优化。
2025-01-27 19:15:53
1174
原创 一文学会记录Controller请求信息
日常开发中,Controller作为对外暴露的接口,承担者业务请求入口的角色。但请求出现问题时,我们经常需要查看请求的参数信息,因此统一记录一下Controller的请求信息,对于后续排查问题,还是很方便的。
2025-01-22 22:54:43
244
原创 一文详解Filter类源码和应用
在日常开发中,经常会有需要统一对请求做一些处理,常见的比如记录日志、权限安全控制、响应处理等。此时,ServletApi中的Filter类,就可以很方便的实现上述效果。例如,我们可以在每次请求中,记录请求的耗时时长,并在注入TRACE_ID参数,以方便后续根据日志,进行链路追踪。是一个接口,属于 Java Servlet API 的一部分,主要用于在。从Filter的源码,可以看出:Filter是一个接口,:记录请求的详细信息,如请求的 URL、参数、时间戳等。之前,可以对请求进行预处理。
2025-01-22 22:12:57
1078
原创 一文了解日志的不同级别
例如,在一个软件系统中,如果检测到某个配置文件的格式不符合最新的规范,虽然当前系统仍然可以按照旧的格式解析并运行,但未来可能会出现兼容性问题,这时就会记录一个WARN级别的日志。例如,一个电商系统的订单处理模块,如果数据库连接池突然全部断开,且无法重新建立连接,就属于FATAL级别的错误,因为订单处理是电商系统的核心功能,无法继续处理订单意味着整个业务流程中断。例如,在一个算法实现的代码中,记录每一步计算的中间结果,或者在调用某个复杂函数时,记录函数的输入参数和返回值等,都属于DEBUG级别的日志。
2025-01-16 22:15:58
790
原创 从Arrays源码学习定义工具类
工具类最大的便利就是复用,而复用势必会带来与调用者的耦合。为了尽量减少工具类和调用者的耦合,就要保持工具类的业务无关性、单一职责和精简。假如工具类、为了兼容上游A/B/C/D不同调用者,而在类本身引入大量if-else等判断分支,这虽然满足了复用,但极大增加了代码耦合,反而得不偿失。
2025-01-16 21:56:00
400
原创 如何快速适应新入职的公司
梳理这些技术,在项目中的具体应用情况,比如项目中使用了哪个版本的框架,框架的哪些特性被重点使用等。在遇到技术难题时,及时向有经验的同事请教,分享自己的想法和思路,共同探讨解决方案。同时,在工作中要主动与上下游同事沟通,了解他们的工作进度和需求,确保工作的顺利衔接。如果没去主动了解这些,后续凭个人感觉,随意操作,势必会给人留下不专业的印象。重点来了,我们需要熟悉,团队对于本岗位的要求。一方面,对自己的岗位职责有个比较清晰的了解,可以有方向的去问问题。,知道后续什么问题,该向谁咨询,提高效率。
2025-01-12 21:37:53
338
原创 启动异常:Caused by: java.lang.IllegalStateException: Failed to introspect Class
在Idea的Maven配置处,看下是否勾选了Use settings from。执行成功之后(如下图);重新导入下Maven项目。
2024-12-19 20:00:33
416
原创 多问这几个问题,写出高质量代码
高质量的代码,让人赏心悦目,阅读起来干净整洁。相反,垃圾代码让人没看下去的欲望,更别说接手去修改了。那么平时工作中,如何写出高质量代码呢?接下来,我们日常多问自己几个为什么,通过思考来提升自己的代码水平。是否职责过多,可以拆为多个小类吗(工具类、常量类、门面类等)?最小影响原有代码(开闭原则)哪些其他模块、分支功能吗?代码臃肿吗,是否可以。
2024-12-18 22:51:59
154
原创 SQL报错:ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property
在多数据源环境下,大家在写SQL时,要注意数据源不要弄混了,做好区分隔离;尤其是基于注解做数据源隔离时,不要把非此数据源的SQL,写到该方法下了。
2024-12-05 19:07:51
1010
原创 从源码学习递归结构
递归是一种在编程中常用的技术,它允许一个函数直接或间接地调用自身。在代码中,我们经常会看到一个类中,定义了类本本身的对象,进而在方法直接或间接地调用自身。这些例子展示了递归结构如何在代码中实现,并说明了它们在表示层次结构数据时的有用性。在API设计中,递归可以用于构建灵活的、可以处理嵌套结构的接口,如JSON、XML解析器。递归是实现分治算法的核心,如归并排序、快速排序等,它们通过递归将问题分解成更小的子问题。在处理文件系统、组织结构、继承关系等树形结构时,递归提供了一种简洁的解决方案。
2024-11-25 20:28:04
311
原创 一文详解@Async注解
可以通过实现AsyncConfigurer接口或继承AsyncConfigurerSupport类来自定义线程池。自定义线程池可以对系统中线程池进行更细粒度的控制,方便调整线程池大小配置,线程执行异常控制和处理
2024-11-10 20:54:40
374
原创 缓存雪崩是什么
上,造成数据库压力激增,甚至可能导致数据库宕机。这种情况类似于雪崩效应,突然的大量请求涌入数据库,系统无法承受。Redis的缓存雪崩是指在某。分布式缓存失效时,本地缓存可以作为备份。增加一个随机值,避免大量缓存同时过期。本地缓存和分布式缓存相结合。
2024-10-24 21:03:22
375
原创 一文详解Mysql索引
在Mysql中,索引是存储在引擎层而不是服务器层实现的,所以不同的存储引擎有不同的实现,并没有统一的索引标准。B-Tree 索引是最常见的索引类型,几乎所有的数据库系统都支持这种索引。索引失效是指在数据库查询过程中,由于某些原因导致索引无法被有效利用,从而使查询性能下降,甚至退化为全表扫描的情况。它们被用作包含所关心数据的表指针,通过一个索引,能从表中直接找到一个特定的记录,而不必连续顺序扫描这个表。:数据库优化器的其他优化策略,比如优化器认为在某些情况下,全表扫描比走索引快,则它就会放弃索引。
2024-10-18 16:40:39
929
原创 一文详解线程池ThreadPoolExecutor
虽然实现线程池的方式有多种,由于阿里规范中,推荐使用ThreadPoolExecutor来实现线程池,且实际使用中也较多,所以这里主要结合ThreadPoolExecutor来探索。线程池的状态代表了线程池当前的运行状态,并且这些状态在对线程池进行操作(如关闭线程池、尝试执行任务等)时起着关键作用。:一个拒绝策略,当任务太多,无法被线程池及时处理,且工作队列已满时,线程池会使用这个拒绝策略来处理新来的任务。:这是线程池的初始状态,表示线程池正常运行,可以接受新任务,并且可以处理阻塞队列中的任务。
2024-10-18 15:38:28
1045
原创 如何更好的进行表设计
在实际开发中,我们经常需要根据业务需求,抽象建模、设计表结构。然而如果表结构设计不合理,后期可能带来很多麻烦,比如:关联查询困难、数据不一致和查询效率低下等。那么如何设计表结构呢?接下来就来盘点下,如何进行好的表结构设计,所需要考虑的建议。
2024-10-13 16:45:49
479
原创 一文详解数据库范式
第一范式:确保数据的原子性。第二范式:消除部分依赖,确保非主键属性完全依赖于主键。第三范式:消除传递依赖,确保非主键属性之间没有依赖关系。
2024-10-13 15:46:39
1004
原创 一文详解Mysql事务隔离级别
较低的隔离级别(如READ UNCOMMITTED和READ COMMITTED)可能会提高并发性能,但增加了数据不一致的风险。无论实在实际使用中,还是面试中,都经常会联系到Mysql的事务隔离级别。在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。简单来说,它会在读取的每行数据上都加锁,所以肯呢个导致大量的超时和锁争用问题。允许一个事务读取另一个并发事务已经提交的数据。,即使在这个事务执行期间,其他事务已经提交了修改这些数据的操作。
2024-10-12 16:21:00
900
原创 Redis数据结构和使用场景
ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用。字符串类型是Redis最基础的数据结构。有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。
2024-10-10 16:38:00
1679
原创 Redis是单线程为何性能还高
Redis 将所有数据存储在内存中,内存的读写速度远远高于磁盘,因此 Redis 能够提供极高的数据处理速度。Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,这是Redis达到每秒万级别访问的重要基础。Redis 使用了多种高效的数据结构来存储不同类型的数据,如链表、跳跃表、哈希表等,这些数据结构都经过了优化,能够提供快速的读写操作。同样我们知道,Redis是单线程执行命令,那为何还能保持如此的高性能呢?,对于服务端开发来说,锁和线程切换通常是性能杀手。,而不会因为等待某个网络操作而阻塞。
2024-10-10 15:09:28
838
原创 从源码中学习动态代理模式
MapperProxy实现了InvocationHandler接口,并重写了invoke方法,从它的代码实现逻辑中,我们可以看到,实际是调用了Method的invoke方法,也即通过传入的Class/Method参数,使用反射技术,实现方法调用
2024-09-30 18:40:09
331
原创 如何实现Mybatis自定义插件
在MyBatis的配置文件中使用@Intercepts注解来指定要拦截哪些对象的哪些方法。例如,可以拦截StatementHandler的prepare方法、Eexcutor的query/update等方法。
2024-09-30 17:34:04
1128
原创 为什么要自定义异常
自定义异常允许你根据错误的类型进行分类。例如上述Mybatis的持久化异常,你可以创建一个基础异常类PersistenceException,然后为不同场景类型的持久化错误创建子类BindingException、CacheException、DataSourceException等。这样通过不同的子类异常,我们就可以更方便的区分不同的异常场景。
2024-09-30 12:11:32
749
原创 初始化的代码块和@PostConstruct有什么区别
特性静态代码块非静态代码块@PostConstruct 注解定义位置类级别实例级别类中的方法执行时机类加载时执行每次实例化时执行依赖注入后执行调用次数只调用一次每次创建对象时调用每个 bean 创建时调用,单例只调用一次访问权限只能访问静态成员可以访问实例和静态成员可以访问实例、静态成员和依赖注入的Bean适用场景类级别初始化实例级别初始化Spring 容器管理的 bean 初始化静态代码块适用于类级别的静态初始化,非静态代码块适用于每个对象的初始化,而。
2024-09-26 21:25:31
584
原创 Dubbo和Http的调用有什么区别
我们在项目开发中,需要进行调用外部接口时,往往使用Dubbo和Http方式都能实现远程调用。那么他们在使用上,有什么区别呢?选择 Dubbo 还是 HTTP ,主要取决于具体的业务需求和系统架构。如果需要高性能、低延迟、一个是分布式环境下的框架,一个是通信协议。,Dubbo 是更好的选择;,HTTP 则更加合适。
2024-09-26 20:13:14
882
原创 盘点编程方法论中的一些思想
举个实际场景的案例:在曾经的一个项目中,有同事为省事,在使用消息队列时,没有很好的根据业务拆分话题和队列,大杂烩式的使用统一的话题与队列。如果可以很好的掌握和理解他们,将为我们处理开发中的问题,提供极大的帮助,做的有的放矢。在编程中也是很常用的,比如动静分离(将变经常动态变化的,和静态资源做隔离)、主次隔离(将核心业务、和普通业务做隔离,避免普通业务影响核心业务的流程)等。这时,就可以采用拆分的方法,将单体的组织,根据业务、共性或一些其他方面的特点,拆分为多个不同的部分,来达到解耦合的目的。
2024-04-06 12:20:32
484
原创 从源码学习单例模式
在需要保证线程安全的情况下,饿汉式单例模式是一个很好的选择,因为它在类加载时就创建实例,不需要进行额外的同步操作,避免了线程安全问题。在该模式中,实例被静态初始化,因此在程序运行时实例已经存在,不需要在获取实例时进行额外的判断和同步操作,从而。:如果单例对象的初始化和占用的资源比较小,可以在程序启动时就创建实例,避免在后续使用过程中频繁创建和销毁对象,提高性能。:如果单例对象的初始化比较简单,并且不依赖于外部参数或环境,饿汉式单例模式是一个合适的选择,可以在类加载时完成初始化。饿汉式单例模式是一种在。
2024-02-24 17:46:22
673
原创 从源码学习static的使用
static意味静态的,在Java中,主要用来修饰类级别的变量或方法等,被修饰的内容,表示随着类的加载而加载,而不是具体的实例级别。 具体到static的使用场景,主要有以下用途:静态变量、静态方法、静态代码块和静态内部类。
2024-02-24 16:29:41
1130
原创 从源码学习访问控制符使用
在Java中,有四个访问控制符:public、protected、default(默认或缺省,不使用关键字)和private。 通过合理使用访问控制符,可以控制类、方法、变量等成员的访问权限,从而提高代码的封装性和安全性。 访问控制符,可以用来修饰类、方法和变量。使用不同的控制符,可以达到不同的权限控制效果。 根据迪米特法则,也即最少知道原则,我们应该尽可能少的暴露内部细节,只需要暴露需要对外暴露的部分,已提高封装性和安全性。
2024-02-08 17:13:56
1244
原创 从源码学习final的使用
final字面意思,意为最终的、不可变的。在Java中,final可以用来修饰类、方法和变量,可以分别起到不同的作用。 上面的概念我们都很清楚,那具体到应用场景,有该如何使用呢?下面集合JDK的源码,看看final在源码中的使用;
2024-02-08 10:56:05
1003
原创 浅谈防御性编程
防御性编程,基于我的理解,主要在于两点:不信任和防御。不信任,就是不要总是乐观的认为外部传参都是没问题的、“好”队友提供的方法都是可靠的、第三方的Api都是稳定的、用户都不是“抽象”的,会按照正常的流程来操作等等。防御,就是针对不信任,所引出来的意外情况,做出一些防御保护措施,来避免外部的不合理情况,对我们既有程序的不利影响。
2023-12-16 14:05:53
734
原创 RocketMQ任意延时消息导致重复消费问题
通过上述分析,这次出现的重复消费的问题,还是挺严重,但幸好还是在测试环境,发生在了生产,估计都得提桶跑路了。使用消息队列时,考虑可能出现的常见问题:重复消费,消息积压、消息丢失等;充分测试确保不会出现上述问题;慎重使用递归、死循环;我们相信正常流程执行的话,递归和死循环是不会有大问题的;但根据墨菲定律,虽然意外情况概率小,但仍可能出现。所以使用递归、死循环时,一定要慎重,考虑各种意外场景,且考虑中断策略。
2023-12-09 22:40:26
422
原创 如何避免在编码层面产生质量事故
在日常开发中,产生BUG似乎看起来是习以为常的事情,但是如果在生产环境出现BUG,将会是蛮严重的问题,轻则警告处罚,重则扫地出门。虽然不同的公司对待生产BUG的严厉程度,可能不甚相同,但往往越大的公司,在高并发的场景下,小小的BUG也可能产生蝴蝶效应,最终造成大的问题。为了避免BUG可能在生产环境导致事故,还是应该从日常做起,避免在生产环境出现质量事故。作为一名优秀的程序员,应该养成好的编码习惯,避免因代码层面BUG,在生产环境造成的质量问题。
2023-11-19 22:45:32
418
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人