- 博客(1075)
- 资源 (2)
- 收藏
- 关注
原创 基于抽象 HandlerInterceptor 快速实现接口鉴权
本文主要探讨了基于抽象的 HandlerInterceptor 来实现鉴权注解,它可以灵活地控制用户的访问权限。
2024-07-09 20:28:09 691
原创 使用 Git Hooks 防止敏感信息泄露
在日常开发中,我们可能会不小心将敏感信息提交到 Git。为了防止这种情况,可以利用 Git Hooks 编写一个简单的脚本,当发现提交中包含敏感词时,给出提示。通过这种方式,可以有效地防止敏感信息的泄露。你可以根据需要添加更多的敏感词。
2024-07-04 18:27:13 495
原创 从单体服务到微服务:预初始化属性多模式 Web 应用开发记录<四> FreeMarker 视图首次渲染优化
本文探讨了一个在项目迁移过程中遇到的性能问题:FreeMarker 视图首次渲染速度慢。使用了 Trace 分析和 Async-profiler 工具定位到问题后,然后提出了三种可能的优化策略。最终选择了预加载资源的策略,并使用 Spring 提供的来实现。优化结果非常显著,首次渲染的时间从4秒以上降低到了0.2秒以上。
2024-07-04 16:48:33 850
原创 每天学习一点点之注解处理器 APT
APT 是一个可以在编译阶段发挥作用的强大工具,它能够识别并处理源代码中的注解。APT 的主要用途包括生成新的源代码、执行编译时检查以及生成文档等。APT 能够生成新的源代码文件,但它无法修改已经存在的源文件,此外如果我们的项目需要使用 APT 生成的代码,可能还需要通过反射来处理,这其实也不太方便。
2024-03-29 13:05:30 988
原创 性能与实用性:为什么我不推荐使用MapStruct
本文深入探讨了MapStruct的性能和使用成本。虽然MapStruct在性能上表现出色,但其引入的复杂度和学习成本可能会超过其性能优势带来的收益。在大规模工程化或技术成为流行趋势的情况下,性能并非首要考虑因素,更重要的是实用性、灵活性和性价比。因此,我们需要根据具体的场景和需求来选择最合适的工具,而不是盲目追求性能。要注意,即使我们选择不使用某个工具,但也可以从其设计和实现中学习有价值的知识。
2024-03-25 13:53:24 2045 3
原创 做一名有经验的开发人员(三)无意义的 null 检查
在Java开发中,过度的null检查可能会导致代码复杂和难读。理解库和框架:了解你正在使用的库和框架的行为,可以帮助你避免不必要的null检查。使用Optional类:Java 8的Optional类提供了一种优雅的方式来处理可能为null的值。使用注解:一些库和框架,如Spring,提供了注解(如@NonNull),可以帮助我们标记不应该为null的参数和返回值。重新考虑设计:如果代码中有大量的null检查,可能是设计问题。考虑是否有更好的方式来处理null值。
2024-03-11 13:49:01 940
原创 做一名有经验的开发人员(二)关于 Boolean 和 boolean
boolean是基本数据类型,它的值只能是true或false,默认值为false。如果你的变量必须有一个真/假值,并且不能为null,那么应该使用boolean。Boolean是boolean的包装类,它的值可以是truefalse或null。如果你的变量可能需要表示一个未定义的状态,那么应该使用Boolean。在Java Beans或者其他需要使用getter和setter的场景中,通常推荐使用Boolean,因为它可以处理null值。这在数据库交互中尤其有用,因为数据库中的布尔字段可能是。
2024-03-11 13:47:28 948
原创 一个快速合并多个 Git Commit 的工具
它通过交互式 rebase 的方式,将除了指定 commit 之后的所有提交标记为 squash,这样在 rebase 过程中,这些提交将被合并到一个新的提交中.在日常的软件开发过程中,有时我们可能需要将多个提交(commit)合并成一个,以保持提交历史的清晰和简洁。为了解决这个问题,本文实现了一个 Shell 脚本,可以快速将一个提交和它之前的所有提交合并成一个。:如果不合并提交,那么提交历史可能会充满了大量的小修改和修复,这会使得提交历史变得冗余和混乱。虽然 Git 提供了。
2024-03-06 21:17:48 446
原创 从单体服务到微服务:多模式 Web 应用开发记录<三>预初始化属性
这是因为在 Struts2 中,当一个 Action 被调用时,Struts2 会尝试将 HTTP 请求的参数绑定到 Action 的属性。这个过程是通过调用 Action 的 setter 方法完成的。这里完全可以改成基于 setter 方法进行参数绑定,那么就可以实现跟 Struts2 类似的“预初始化属性”机制。函数的预初始化属性和请求中的 repairVO.xxx 属性。也就实现了预初始化属性的设置。所以后端 Struts 的 Action 的成员属性会接收。居然还有其他的属性也有值。
2024-02-29 21:33:45 392
原创 从单体服务到微服务:多模式 Web 应用开发记录<二>自己动手写一个 Struts
既然要迁移,那必然要对 Struts2 和 FreeMarker 这样的技术有一定的了解。不过在 Spring Boot 大行其道的今天,以及越来越多的前后端分离开发模式,SSH 早已风光不再,很多年轻的同学甚至都不知道 Struts2,如果快速的了解 Struts2 和 FreeMarker 这种模版引擎呢?本文实现了一个非常简单的 Struts,支持简单的参数绑定和 JSP 页面的渲染。也提到过,由于服务的拆分,后续会将我们现在的 Web 应用改造成结合了静态页面渲染和动态数据交互的。
2024-02-29 10:52:18 363
原创 从单体服务到微服务:多模式 Web 应用开发记录<一>背景&全局变量优化
最近在做一个事:下线一个超级大单体服务。单一统计代码行数其实不够全面,反正项目 git clone 下来文件就有这么大:这是一个已经存在了十年以上的服务,随着业务的发展,这个服务已经无法满足我们的需求。我们统计了一下,有近 400 个页面菜单需要迁移到已经划分好领域的各个微服务之中。其实最麻烦的还是前端页面,因为页面重写是比较麻烦的,涉及到大量的细节梳理,可能还需要前端、设计和产品同学的介入,想在 1 年甚至几个月全部重写完成在有限的资源情况下是不可能完成的任务。所以我提出了一个方案,
2024-02-23 16:44:33 958
原创 计算机专业必看的几部电影
随着科技的不断发展,人工智能已经逐渐渗透到我们的生活中,这部电影提供了一个引人深思的未来展望。对于研究人工智能和机器学习的计算机专业学生来说,这部电影将是一次启发性的思想碰撞,引发对未来科技发展方向的思考。通过复杂的密码学技术和坚韧的毅力,他们最终成功地改变了战争的进程,成为了历史上的英雄。通过展示不同背景、不同领域的程序员的工作和生活,这部电影向观众展示了计算机科学的广阔领域和无限可能性。以下是几部计算机专业必看的电影,它们以不同的方式展现了计算机科学的魅力和挑战,为观众提供了思考和启发。
2024-02-20 12:39:11 433
原创 Properties 文件顺序读取问题
是一个基于哈希表的数据结构,元素的存储位置是通过元素的键的哈希值计算出来的,而不是按照元素插入的顺序。因此,当你遍历哈希表的元素时,元素的顺序通常会看起来是随机的,这取决于元素键的哈希值。如果需要一个能保持插入顺序的键值对集合,可以使用。
2024-01-30 10:12:36 569
原创 扩展实现Dubbo Pipeline机制优化接口调用的思路
在许多业务研发团队中,都会有一些底层的基础数据服务,如用户服务、机构服务、商品服务和地址服务等。例如,在我们的团队中,就有一个名为“基础数据服务”的应用,它提供了商品、用户、机构等多种维度数据的 Dubbo 服务。相较于其他业务服务,这个服务承受的压力是最大的。如果需要查询一万次订单信息,那么基础数据服务的访问量就会被放大三倍,达到三万次。这种情况下,基础数据服务的压力会非常大。因此,我们需要寻找一种方法来优化这个过程,以减少对基础数据服务的压力。
2024-01-24 11:52:09 1160
原创 快速理解数据库行/列存储
行存储和列存储是数据库存储数据的两种主要方式,它们在数据组织、性能优化和使用场景上有一些关键的区别。在行存储数据库中,数据按照行来存储。每一行包含了该行所有的数据,这些数据在存储时是连续的。这种方式非常适合 OLTP(在线事务处理)系统,如订单处理、银行交易等,因为这些系统通常需要处理大量的短小查询,每次查询只涉及到少量的行。在列存储数据库中,数据按照列来存储。每一列的数据都存储在一起,这使得数据库可以在处理大量数据时提供更好的性能。
2024-01-23 12:45:29 1518
转载 记一次HandlerMethodArgumentResolver失效的问题
从上面的方法可以看出,mvc在获得参数解析器时, 会先从缓存中获得参数解析器,若不存在,则遍历argumentResolvers,若有一个解析器的supportsParameter结果为true,则对该解析器进行缓存,并退出遍历。先说结论,因为在获得参数解析器的过程中,Controller的入参存在@RequestHeader注解的Map参数,mvc优先解析到其他的参数解析器,从而跳过了自定义参数解析器的判断与执行。或者我们可以在Controller中添加一个自定义参数,即解决走不到自定义解析器的问题。
2024-01-21 00:25:03 1004
原创 自己动手写一个 Arthas 在线诊断工具&系列说明
本文实现一个非常 Demo 级别的类 Arthas 诊断工具,其中涉及到了 JLine、Java Agent、ClassLoader、Javassist、Socket 等技术。尽管工具还很简单,功能也很有限,但它为理解和学习如 Arthas 这样的复杂诊断工具提供了一个实践入口。后续也会继续扩展这个工具,添加更多的功能,如更详细的方法追踪,更丰富的 JVM 信息获取,甚至是内存和 CPU 的监控等。
2024-01-15 17:53:16 2805
原创 小议CompletableFuture 链式执行和响应式编程
本文以一个实际的场景设计问题为出发点,详细探讨了的链式执行机制,对执行流程和线程切换进行了深入的分析,并对响应式编程的概念和应用进行了简单的讨论。
2024-01-12 00:27:42 2582
原创 每天学习一点点之 Spring Boot 1.x 升级 2.x 之 allowBeanDefinitionOverriding
本文对 Spring Boot 2.x 中新增的配置进行了简要分析,并通过实际示例说明了这个配置的底层原理并非源自 Spring Boot 2.x。实际上,即使在 Spring Boot 1.x 中,我们也可以实现这个功能,只是 Spring Boot 官方并没有提供现成的配置项。
2024-01-10 21:15:15 1274
原创 结合 Java Swing 实现 Java 文件和 JAR 包的拖拽执行
本文实现了一个简单的工具,用户可以通过拖拽的方式执行 Java 文件和 JAR 包。同时,通过使用胖 JAR 来解决依赖类的加载问题;通过自定义类加载器打破双亲委派机制,从而解决了类冲突问题。源码地址:https://gitee.com/dongguabai/blog/tree/master/others。
2024-01-05 18:02:57 929
转载 Spring Cloud各个微服务之间为什么要用http交互?难道不慢吗?
拿通信协议来说,HTTP肯定比TCP慢,HTTP协议本身有一个变长的头,TCP不需要这个东西,但是反过来,HTTP这个头可以用来做很多扩展性的东西,用TCP就需要一些自己定义一个类似的头,这么来看,TCP的复杂度就上升了。但是反过来,1s序列化20万次,跟1s序列化22万次,虽然性能相差了10%,但是我们一次RCP请求里,相对于几ms的网络,几ms的数据库处理,10-200ms这个区间的RT来看,HTTP和JSON序列化的这点性能损失,在99%的场景下可以直接作为误差忽略掉。作者:kimmking。
2024-01-03 13:48:28 328
原创 记一次半夜蹲守异常请求(半夜频繁 FullGC)
防御性编程:我们应始终考虑到各种可能的异常情况,并在编程时采取预防措施一次彻底解决因数据库全表扫描引发系统卡顿问题的实践线上问题排查的关键在于“现场”:这就像破案一样,如果现场没有保存好,破案的难度会大大提升。
2023-12-09 17:37:09 1438
原创 每天学习一点点之 MySQL TINYINT
我已经不是第一次遇到关于TINYINT的问题了。在 MySQL 中,当我们将某个字段设置为TINYINT,随着业务的扩展,我们可能会发现TINYINT的范围无法满足需求。这时需要修改字段属性。但如果表的数据量很大,或者由于分表导致涉及的表数量众多,这个过程可能会变得比较复杂。更糟糕的是,如果代码中的数据类型为int,而 MySQL 中的数据类型为TINYINT,可能会导致存储异常数据。
2023-11-30 21:04:27 1927
原创 每天学习一点点之从 Control character in cookie value or attribute 异常看 Cookie 字符编码限制
这是因为在 Chrome 中设置一个包含中文的 Cookie 时,Chrome 会将非 ASCII 字符进行 URL 编码,自动将中文字符转换为 UTF-8 编码,然后在 HTTP 头部中使用这些字节的 ISO-8859-1 编码的表示。昨天,我们接到了来自其他团队的反馈,他们表示在访问我们的服务时,偶尔会遇到 HTTP 500 错误。主要遵循的是早期的 Cookie 规范,也就是 Netscape 的规范和 RFC 2109,这两个规范通常被称为 “Version 0” 或 “V0” 规范。
2023-11-28 18:47:22 1476
原创 每天学习一点点之 Tomcat 是如何清除过期 Session 的
在 Tomcat 中,Session惰性删除是通过方法实现的,每次在判断Session是否有效的时候,如果Session已经无效,就会让Session过期(移除)在内存持久化策略中在内存持久化策略中,定期删除是通过方法实现的,该方法会定期遍历所有的Session,对每个Session判断是否过期,如果发现Session已失效,就会让Session过期在 Tomcat 中,Session的更新机制并不会直接受到Session过期时间设置的长短的影响,但是,如果Session的数量过多,可能导致。
2023-11-23 14:21:16 543
原创 每天学习一点点之 Spring Web MVC 之抽象 HandlerInterceptor 实现常用功能(限流、权限等)
本文首先阐述了虽然 Spring AOP 可以实现限流、鉴权等需要代理的功能,但由于依赖动态代理,会带来一定的性能损耗。然后通过对的抽象,我们实现了一套在 Spring Web MVC 层面的静态代理机制,从而方便快速地在 Web 端实现代理功能。
2023-11-20 22:37:36 382
原创 为什么我们在Springmvc拦截器的时候要加判断 handler instanceof HandlerMethod
在Spring MVC中,拦截器(Interceptor)的preHandlepostHandle和方法的第三个参数是一个Object类型的handler参数。这个handler参数实际上就是处理当前请求的处理器。在Spring MVC中,处理器不一定是类型的。例如,当请求的URL对应的是一个静态资源时,处理器可能是类型的。另外,如果你自定义了处理器类型,那么处理器也可能是你自定义的类型。因此,如果你的拦截器的代码只适用于类型的处理器,你需要在代码中加入。
2023-11-19 23:53:31 740
原创 服务容错之限流之 Tomcat 限流 & Tomcat 线程池的拒绝策略
最后再回过头看文章开头的两个问题:每次提到服务限流为什么都不考虑基于 Tomcat 来做呢?Tomcat 的确可以用来做限流,比如可以控制最大线程数,这样后续的任务均会在队列等待,并不会执行。从Connector的角度设置,这块不在本文探讨范围之内。可扩展性:基于 Tomcat 的限流方案通常只能在单个服务实例上工作,且只能针对HTTP/HTTPS协议的请。而在微服务或者分布式系统中,我们可能需要分布式限流方案和针对多协议的 限流。灵活性。
2023-11-18 22:43:05 724
原创 每天学习一点点之从 SonarQube Bug 看对线程中断异常的处理
最近在基于 SonarQube 对代码进行质量优化,说实话,之前觉得 SonarQube 这种很无聊,但最近静下心来看了一些扫描出来的问题后,发现这种工具作用还是挺大的,能够帮助我们找到代码中的隐藏缺陷,从而夯实基础。本文的议题就是基于 SonarQube Bug 探讨一下线程中断。在 SonarQube 中的异常为“即 SonarQube 认为异常不应该被忽视,即本文探讨的关键点就是异常该如何处理。
2023-11-15 13:56:55 419
原创 每天学习一点点之从 SonarQube Code Smell 看 Serializable
昨天组内同学在进行代码合并的时候发现了一个 SonarQube 异常:其实我之前也遇到过这个异常,但觉得“这种异常很无聊”,毕竟让 Spring Bean 去序列化,这不是扯么,就“偷懒”没有仔细去看。
2023-11-15 13:50:28 160
原创 优化单元测试效率:Spring 工程启动耗时统计
数据库连接可以延迟初始化移除无用的依赖注入内部封装的 Dubbo 组件存在很多优化点,如:Dubbo Provider 在本地没必要对外暴露服务懒加载创建 Reference 代理尽管不同项目的耗时原因各有差异,但只要能够确定具体的耗时点,问题就不会太棘手。本文介绍了一个简单的工具,用于获取 Spring Bean 初始化的时间,借此能够准确定位具体的 Bean,从而有针对性地进行优化。通过优化这些耗时操作,就能够有效提升整个项目的启动速度,显著增强研发工作的效率。
2023-10-24 21:09:07 770
转载 Q: How can I define a isSubTypeOf without using loaded classes on AgentBuilder transformations?
【代码】Q: How can I define a isSubTypeOf without using loaded classes on AgentBuilder transformations?
2023-10-24 10:35:02 143
转载 Byte-Buddy 常用注解
String 动态类的toString()的返回值。Constructor 被调用的原始构造器。Class 当前动态创建的类。int 动态方法的修饰符。Method 被调用的原始方法。
2023-10-23 19:45:54 242
原创 服务监控与优化之负载均衡之负载最低优先
负载最低优先” 的负载均衡策略在分布式系统中非常常见,目的是将负载较低的服务器优先分配请求,以确保资源的最佳利用。负载最低优先可以使用如最小连接数、CPU/IO 负载等。但也要注意的是这种策略会极大增加系统的复杂度,这里引入《从零开始学架构》中的介绍:负载最低优先算法基本上能够比较完美地解决轮询算法的缺点,因为采用这种算法后,负载均衡系统需要感知服务器当前的运行状态。当然,其代价是复杂度大幅上升。
2023-09-22 18:56:02 367
原创 服务监控与优化之一次对服务内存占用过高的排查
本次对系统内存进行了一次粗粒度的优化,但仔细看系统仍然有很大的优化空间,如果有进一步的优化进展,将分享并与大家进行讨论。实际上,在网上有很多关于内存持续升高问题的分析,尽管原因不尽相同,但它们为我们提供了宝贵的思路,尤其当我们自己遇到困惑时,这些分享能够为我们提供新的启发。而这正是经验分享的真正价值所在。
2023-09-19 23:53:13 192
原创 由 System.gc() 频繁引起 Full GC 的问题排查
早上服务频繁出现 Full GC 报警(由于昨晚下掉了参数,其实会有 Full GC 产生已经在意料之中,但属实没想到会触发的这么频繁),这里 JVM 总共运行了 4531.278 s,可以看到差不多半分钟一次 Full GC,单次 Full GC 大概耗时 1.5s。根据经验可以判断出是由于被调用引起的,(在网上最著名的案例之一是由 JXL API 框架引发的)。
2023-09-13 23:12:46 532
转载 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
因此,这里LZ借着这个机会,再次强调一下,千万不要试图去研究你研究了很久都整不明白的东西,或许是你的层次不到,也或许是你从未在实际的应用场景接触过,这种情况下你去研究,只会事倍功半,徒劳一番罢了。而对于客户端来说,不管是长轮询还是短轮询,客户端的动作都是一样的,就是不停的去请求,不同的是服务端,短轮询情况下服务端每次请求不管有没有变化都会立即返回结果,而长轮询情况下,如果有变化才会立即返回结果,而没有变化的话,则不会再立即给客户端返回结果,直到超时为止。这个也毫无疑问,当然是的。
2023-08-25 17:33:41 136
原创 实现一个自动保存高CPU占用现场的简易工具
CPU 使用率在系统监控中是一个非常重要的指标。对于大多数 Web 应用来说,它们往往是 IO 密集型的,因此只会在某些时刻可能会出现 CPU 突然飙升的情况,随后很快就恢复正常。然而,当收到报警并想要排查问题时,CPU 飙升的情况可能已经过去,无法直接查看当时 Java 进程内的线程堆栈信息。为了解决这个问题,本文实现了一个小工具,它在 CPU 飙升时自动保存堆栈信息,方便后续问题的追踪。
2023-08-18 16:06:44 231
skywalking 6.5、6.6、6.6 es7 版本 tar 包
2021-02-04
IDEA查看Java运行代码的汇编指令工具
2018-09-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人