架构设计
文章平均质量分 90
fenglllle
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
MySQL rewriteBatchedStatements参数对批量性能的提升与源码分析,驱动BUG分析
使用MySQL 8.0.30驱动时,rewriteBatchedStatements=true参数对批量插入性能影响显著。未开启时,驱动会退化为串行执行,性能与JPA saveAll相近;开启后,驱动可将多条INSERT合并为单条语句,性能提升10倍。但8.0.30存在bug:当字段名含“value”时,解析错误导致重写失败,仍退化为串行。升级至8.0.33后修复该问题,性能恢复。建议在JDBC URL中启用该参数,并避免字段名包含敏感关键字。原创 2026-09-14 14:47:59 · 67 阅读 · 0 评论 -
JDK8升级JDK17使用CompletableFuture在线程中classloader的变化
本文探讨了从JDK8升级到JDK17时遇到的CompletableFuture线程ClassLoader差异问题。作者发现JDK9引入的模块化设计改变了ForkJoinPool的ClassLoader加载机制,且在2核CPU环境下ClassLoader表现不同。通过源码分析指出,ForkJoinPool的并行度设置与CPU核心数相关,当核心数为2时使用自定义线程而非ForkJoinPool。建议在JDK升级时注意测试环境资源配置,必要时为ForkJoinPool设置独立线程池以避免ClassLoader问题原创 2026-05-22 21:23:32 · 392 阅读 · 0 评论 -
SLB收到HTTP请求时,URL域名是A,但是请求Host为B
文章摘要:作者在Spring项目中遇到通过域名访问时Feign调用出现404的问题,发现根源在于SLB Nginx的域名路由机制。Nginx转发时使用HTTP头中的Host字段进行路由匹配,而非默认模式。通过实验发现,当使用HttpURLConnection时,Host等受限Header会被丢弃,而Apache HttpClient等工具则会保留,导致Nginx路由失败。解决方案包括:1) 在Nginx配置中添加Host域名规则;2) 在Feign调用时修改或删除Host Header。文章深入分析了Fei原创 2026-05-01 00:29:22 · 426 阅读 · 0 评论 -
commons-beanutils在lombok的Access注解下属性复制失效
本文分析了使用Commons-beanutils和Lombok时出现的属性复制失效问题。当Lombok的@Accessors(chain=true)注解生成的非void返回值set方法时,Commons-beanutils无法识别这些方法,导致复制失败。而Spring的BeanUtils能正确处理这种情况,但存在浅拷贝问题。文章建议使用MapStruct进行属性复制,虽然需要编写更多代码但能保证性能和稳定性。最终结论是:框架封装方法虽提高开发效率,但在性能和兼容性上存在妥协,手写set/get方法才是最稳定原创 2026-01-03 00:19:22 · 761 阅读 · 0 评论 -
mybatis-plus SQL 注入漏洞导致版本升级引发的问题
摘要:本文记录了MyBatis-Plus升级至3.5.7版本时遇到的问题及解决方案。主要存在两个问题:一是与MyBatis 3.5.7存在兼容性问题,需升级MyBatis至3.5.16;二是与Spring Data JPA存在jsqlparser依赖冲突。此外还发现QueryWrapper的IN查询处理逻辑在3.4+版本对空集合的处理方式发生变化,导致SQL语法错误。建议在项目中避免同时使用MyBatis-Plus和Spring Data JPA,并减少使用动态SQL拼接,改用代码动态拼接方式以降低风险。原创 2025-11-03 22:45:22 · 1221 阅读 · 0 评论 -
http trailer 与 http2
本文探讨了gRPC通信中HTTP Trailer的实现机制。通过Go和Java示例代码,作者发现HTTP/1.1下使用chunked传输时可以在body后附加Trailer头信息,但在HTTP/2环境下因协议限制无法直接使用chunked传输。实验表明,虽然HTTP Trailer设计允许在body传输后附加元数据,但在HTTP/2中实现与gRPC相同的Trailer机制仍存在技术障碍。文章揭示了HTTP Trailer这一较少使用的协议特性,并为理解gRPC通信机制提供了实践参考。原创 2025-10-24 23:11:17 · 694 阅读 · 0 评论 -
nginx自编译重现gzip和chunked的现象
其实gzip并不是最近才有的,以前我们经常压缩html,节省前端资源的传输带宽,只不过最近发现一些老旧项目对chunked支持不友好,导致nginx 1K以上就chunked导致请求报错。然后发现SpringBoot默认就chunked😁。nginx编译中实际上网上很多内容是复制的,笔者自己实践发现有些参数实际上不应该加上,理解也是跟我们认知有一定的理解偏差,实践发现without 状态要为disable,表示默认已经支持了,不需要加参数, with的模块需要编译加上参数,状态为enable。原创 2025-04-15 22:02:14 · 940 阅读 · 0 评论 -
K8S下nodelocaldns crash问题导致域名请求响应缓慢
实际上这个问题并不是应用的问题,是平台搭建的时候就有问题,但是仅仅是nodelocaldns并不影响最终的结果,毕竟coredns还是正常的,所以仅仅是超时,对于业务研发人员,K8S里面的逻辑是不可见的,所以问题很难解决,最终需要应用分析,抓包和基础设施层共同配合才能解决问题。原创 2025-03-15 19:43:38 · 1365 阅读 · 0 评论 -
MySQL数据库连接池泄露导致MySQL Server超时关闭连接
我们在写代码时,尽量还是使用框架封装的逻辑,比如连接池,比如Spring声明式事务,可以避免编程式事务在写代码时的逻辑漏洞,因为在没触发的时候很难出现,测试很多时候不充分。实际上一起写jdbc的时候还很少出现这个问题,因为那个时候会非常注意连接的回收,事务的提交逻辑,但是Spring自动管理后,这个就很少注意了,因为注解声明式事务太方便了,只有特殊时候才会自己管理事务。原创 2025-02-24 23:37:04 · 1179 阅读 · 0 评论 -
kafka 3.5.0 raft协议安装
kafka从3.0.0开始推出了raft模式的元数据中心,实际上类似zk,kafka自己命名kraft。使用这种方式搭建kafka集群将不再需要zk,同理,kafka的集群的每个节点可以同时是broker和controller(以前zk充当),也可以是单独的broker,controller(负载不重,不建议单独controller,跟zk没区别),官方说明需要jdk11及以上,实测jdk8可以运行,但是生成建议严格按照官方标定的jdk执行,jdk是向下兼容的,但是不确定是否会涉及新api或新特性的使用。原创 2025-02-08 17:07:11 · 1379 阅读 · 0 评论 -
flowable expression和json字符串中的双引号内容
通过示例可以看到字符串包括json需要对字符串的"内容进行转义,包括代码编写,class文件,但是jvm内存是不认"的转义符的,存储的就是真实的值,不存在转义的说法,而类似groovy脚本这样的类class语言实际上也是如此,毕竟操作在内存操作,class虚拟机不会有任何不同,毕竟class不一定能反编译Java,但是Java一定是编译为class,所以groovy并不会影响值操作的"结果。原创 2025-01-31 17:09:52 · 1085 阅读 · 0 评论 -
springboot kafka在kafka server AUTH变动后consumer自动销毁
kafka在发送者和消费者是区分开的,发送者如果连接kafka broker失败后可以一直重试直到成功,但是消费者确有各种各样的逻辑,可以精准控制,比如消费者重启的配置可以控制消费者在停止时重启,如果仅仅是授权失败,而且不需要反复重启(消耗资源),那么可以通过。原创 2024-12-01 18:38:14 · 2013 阅读 · 0 评论 -
mapstruct和lombok同时使用的问题解析
mapstruct实际使用过程一言难尽啊,本身与idea有兼容性问题,不过新版本确实在一定程度上规避了问题,不过与lombok一起使用必须依赖lombok-mapstruct-binding才行,否则因为与lombok的顺序问题,运行过程并不会报错,结果很难保证。建议还是自己写getter和setter吧,性能没区别。原创 2024-11-13 23:11:34 · 2653 阅读 · 0 评论 -
Tomcat servlet response关于中文乱码的经验
实际上这个问题很简单,而且也很容易解决,只不过不同的软件有不同的标准,所以即使是utf-8并不能解决问题,而是需要根据实际的情况,比如http,根据mime-type明显比指定utf-8更能表达具体的意义,毕竟mime是具体的标准。原创 2024-10-30 22:33:12 · 1235 阅读 · 0 评论 -
springboot kafka多数据源,通过配置动态加载发送者和消费者
如果消费者或者发送者逻辑需要写在当前kafka网关应用,那么只能通过自定义扫描方式支持配置不同,所有配置的生成者和消费者必须代码实现逻辑,通过配置加载方式,自定义扫描注入bean即可。以消费者为例,生产者不涉及注解发送方式相对简单。});写了一个初始化的bean,用于通过配置加载bean。消费者是注解方式扫描,bean需要根据配置加载,不能写在代码里面这里仅仅是注册bean,并不会被beanpostprocessor处理关于第1点。原创 2024-10-07 15:55:46 · 1997 阅读 · 1 评论 -
关于数字存储和byte[]数组的一些心得
实际上这次是一些碎碎念,核心还是计算机的原理,计算机因为电气性能只设计有0、1,所以是2进制,存算都是2进制。而且计算机在设计之初只设计了加法,没设计或者设计减法有问题,导致数据相减运算都是加运算,所以需要存储和运算负数,那么就需要定义负数的存储和相加逻辑,就设计了反码和补码来存储负数。另外一个字节存储能力有限,往往需要很多字节来存储一个内容,那么符号位的定义在总体结构很明晰,但是对于字节数组的单个字节就会存在歧义,造成数据可读性很迷惑,因为符号位的特殊意义。原创 2024-08-31 23:07:13 · 1656 阅读 · 0 评论 -
雪花算法的一些问题解析
雪花算法实际上设计极为巧妙,通过时间戳,机器码,序列号(自增)来达到某个时间段(默认1毫秒)在某个并发下(并发超出自增ID就会重复或者阻塞等问题,不过我们一般达不到,且可以通过负载均衡增加资源规避),不重复ID。实现了加资源的方式来达到分布式ID不重复,且自增的特性。原创 2024-07-29 18:05:59 · 1070 阅读 · 0 评论 -
Tomcat get请求传数组集合参数
最近做项目,需要通过GET传参,来实现查询的能力,本来是RPC调用,直接参数序列化即可。但是服务最近修改为HTTP,本来Spring Cloud的feign也可以直接传参数,但是当使用Nginx访问时参数到底传啥呢,笔者传入?list=['xxx']直接就报错了,错误类型。原创 2024-06-24 22:54:32 · 1485 阅读 · 0 评论 -
Spring boot 注入成员变量HttpServletRequest的原理
最近做项目,springboot项目,本来我们在controller的requestmapping取参数值或者返回写时,使用方法参数,但是发现老项目直接注入了成员变量,Spring本身是单例的,如果是成员变量注入,那么也是单例的,怎么实现不同的请求读取不同的参数呢,如果实现线程安全呢,笔者立马想到了ThreadLocal,但是如果要说就是这个原理,那么必须源码证明。原创 2024-05-21 22:25:12 · 1393 阅读 · 0 评论 -
Chrome 侧边栏开发示例
最近做项目,需要开发浏览器扩展,但是考虑页面布局兼容性问题,使用了Chrome114开始的侧边栏,浏览器自带的能力毕竟不会出现兼容性问题,不过Chrome123开始,侧边栏居然又可以选择固定右侧扩展栏了,交互变化很大。原创 2024-04-21 21:33:30 · 9140 阅读 · 6 评论 -
sonar-java 手写一个规则-单元测试分析
最近做项目,定制sonar规则,提高Java代码质量,在编写的sonar规则,做验证时,使用单元测试有一些简单的心得感悟,分享出来。sonar的自定义规则很简单,一般而言有2种模式可以使用:1. 自定义扫描代码逻辑,并对分类的Tree的结构处理2. 使用已扫描的分类,对分好类的Tree进行分析。原创 2024-02-25 15:09:54 · 2778 阅读 · 0 评论 -
mybatis plus相同Id与xml配置错误时,mybatis plus解决逻辑
mybatis plus这个是直接丢弃相同Id的statement,安装先后顺序,会造成执行过程的误解,不过有日志可以查看,而且mybatis原生的starter是有校验的,直接报错了。mybatis的xml如果写错,那么启动居然不报错,执行任意statement前需要执行未完成的statement,来达到快速失败的情况,这种情况对健康检查提出了新挑战,否则可能出现启动OK,但是mybatis失败的情况。原创 2024-01-09 22:46:08 · 1406 阅读 · 0 评论 -
Spring多个条件注解不同但BeanId相同的冲突
这个问题实际上出现不是很频繁,但是如果不经意就会出现我们不可预知的问题,尤其是初始化的情况,不同条件初始化绝对不一样,出现这种问题,我们很难知道根源,因为异常被吞了,启动也OK。当然解决问题是不使用id相同的Bean创建方式,因为如果异常,只要其中一个Bean创建成功即可成功,没异常我们发现不了问题;如果没有异常,相同的Bean id会被后创建的Bean替代,但是在相同id的时候是都会尝试创建,@ConditionOnXxx就不会执行,这个会跟我们需要的情况相违背。原创 2023-12-03 22:08:28 · 1869 阅读 · 0 评论 -
logback异步日志打印阻塞工作线程
实际上这个问题是使用问题,非常简单,不过越是简单的使用,却可能出现致命问题,一般公司都会统一脚手架或者统一规范的方式来实现标准的日志配置文件,防止错误配置导致业务问题,不知道未来Java虚拟线程大规模使用会不会缓解日志打印阻塞工作线程的问题,毕竟调度更优,不过如果线程池满载,虚拟线程也是无能为力。还是需要在丢日志和存储消费日志的能力作取舍。原创 2023-11-12 16:59:23 · 4146 阅读 · 0 评论 -
双活架构设计-连接集群
双活的设计是很有必要的,而且很传统的解决方案,融合了单元化思想,存算分离思想,实际上是矛盾又是统一的整体,单元化是有状态的,存算分离又是让运算无状态。那么设计存储一致性就很重要,保证一致性和最佳的性能,又会大量的使用缓存的思想。原创 2023-10-06 18:48:22 · 1352 阅读 · 0 评论 -
Spring Cloud zuul扩展能力设计和配置动态生效
实际上Spring Cloud已经废弃zuul了,改用gateway,但是webflux的技术并没在实际项目大规模普及,还有很多servlet NIO的应用,所以zuul还是很有必要改造的,实测zuul调优(调节转发的连接池)跟gateway性能上差不多,所以研究了下zuul,发现设计理念很不错。原创 2023-10-06 12:23:48 · 428 阅读 · 0 评论 -
SLF4J日志绑定原理分析
最近做项目,实际上也知道日志冲突的事,不过涉及MDC NDC数据传递,当日志框架冲突后,MDC和NDC就失效了,这里就涉及slf4j-api的MDC的绑定的过程,顺便分析了日志冲突实际生效的原因,理解SLF4J的设计思想。SLF4JSimple Logging Facade for Java(SLF 4J)作为一个简单的facade或抽象,用于各种日志框架(例如logback、log4j2),从而允许最终用户在部署时插入所需的日志记录框架。简称门面模式,就是接口外加绑定实现。原创 2023-08-12 16:37:13 · 821 阅读 · 0 评论 -
Java文件的相对路径规则
最近做项目,又涉及到Linux Java文件的相对路径,但是相对路径在不同的服务器或者docker上居然不一样,这个就很难受,只能用绝对路径解决,因为绝对路径是固定的路径,但是相对路径为什么会在不同的服务器不一样呢?原创 2023-07-24 16:36:04 · 796 阅读 · 0 评论 -
client-go监听apiserver,监听http2逻辑分析
最近做项目,需要写一个controller(k8s的插件),需要从k8s的apiserver取数据,就用了自带的client-go,但是client-go是怎么从apiserver获取数据的一直没有研究过,只是看网上,看官方文档说是chunk读取数据,然而事实上,笔者却发现使用http2.0的长轮询。强烈建议使用linux或者mac开发机。原创 2023-01-31 18:45:49 · 1606 阅读 · 0 评论 -
go 函数或者方法参数调用的过程
最近做项目,使用go开发,但是在发生函数调用传参数时,对指针的指针的传递有难以理解的代码,就此分析过程。尤其是对于多重指针作为参数,而且对于一些内置函数的修改逻辑也需深入的理解。这里的问题是切片本身是指针,如果再加入指针,就是指针的指针,很难理解。而且再结合函数的参数,本身函数的参数是一个引用,栈变量自己又会分配内存地址,就更难理解了😅。这里的关键还有切片是一个结构体存储的,但是结构体又是内存值拷贝,而非内存地址引用。实际上可以结合内存分配的流程结合函数的入栈出栈,外加参数的存储结构很容易就明白原理了。原创 2023-01-17 22:09:52 · 929 阅读 · 0 评论 -
OpenRASP agent源码分析
目录前言准备源码分析1. manifest 2. agent分析3. agent卸载逻辑 总结笔者在很早前写了(231条消息) OpenRASP Java应用自我保护使用_fenglllle的博客-优快云博客实际上很多商业版的rasp工具都是基于OpenRASP的灵感来的,主要就是对核心的Java类通过Javaagent技术,对特定的方法注入字节码,做参数验证。核心技术就是Javaagent,那么分析OpenRASP的agent实现原理,即可明白主流的rasp实现逻辑。 在OpenRASP上优化部分实现逻原创 2022-12-04 13:14:28 · 1048 阅读 · 0 评论 -
grpc Java demo与Springboot改造支持grpc通信
最近调研grpc的情况,发现grpc实际上还是HTTP2协议,实际上就是http2+proto传输。那么是否可以在现有的server支持呢,试了下,还真可以,但是笔者在返回数据时有个问题一直没有思路。原创 2022-11-13 11:50:36 · 2082 阅读 · 0 评论 -
macOS istio bookinfo示例搭建
上一章安装了k8s,安装dashboard,实际上容器的应用才刚刚开始,容器由于灵活度,网络和管理难度大大增加,加上架构和业务分离(sidecar)的微服务架构。一般而言,分布式的粒度越细,管理越难,网络复杂度也大大增加,所以k8s就是专门管理容器的,但是流量负载却需要另外实现,比如istio。实际上这些都是demo性质的,关键还是管理和网络,比如sidecar可以自动注入和手动注入,可以使用ebpf实现网络加速,还可以集成其他sidecar模式,(istio默认使用envoy,即proxyv2)。...原创 2022-07-28 22:39:14 · 606 阅读 · 2 评论 -
websocket 传输文件
上一章实现了websocket传输文本信息,实际上网络传输的都是二进制0和1,因而也可以传输文件。实际上websocket是tcp上的双工协议,传输文件是没有问题的,只是需要定义应用层协议才行。如果使用Tomcat的websocket传输,注意传输内容大小。而且HTTP2.0和HTTP3.0并不能使用websocket,尤其是http3.0UDP协议。httpshttpshttps。...原创 2022-07-17 17:27:37 · 11776 阅读 · 0 评论 -
Java 双工通信与websocket协议
最近做项目,需要双工通信,考虑http协议,但是是单向的通信,只能请求响应,不能从服务端推送,如果要服务器推送,方式有很多,http轮训,长轮训,websocket等,实际上tcp传输层是双向通信的,原始的socket就可以实现。现在最常用的是websocket,因为可以复用http的底层tcp连接,方便,当然http3使用udp通信,基于QUIC保证连接可靠。...原创 2022-06-26 12:01:53 · 1405 阅读 · 0 评论 -
go 语言指针,值引用和指针引用
最近做项目,开发go的sdk,其中就涉及接口编程,类似typescript,指针,指针类型。就像C语音一样,指针就涉及指针引用。在go语言中*类型 在类型上表示当前类型是指针类型,在变量上表示指针的值&变量 表示是当前变量的指针使...原创 2022-06-23 22:50:02 · 489 阅读 · 0 评论 -
goreplay 录制回放源码解析
goreplay 录制回放源码解析前言流量录制流量回放数据模拟goreplay的源码分析goreplay demo构造goreplay源码分析启动分析运行时监听前言一般而言流量的录制与回放经常在测试过程中使用,自动化批量验证功能,或者用来做ABTest实验。流量在互联网公司就是数据,是用户,因而很多互联网公司就是流量公司,就是风口,本质上讲大数据分析就是分析流量,比如:杀熟。流量的回放仅仅是流量的一种用途,流量的录制是基础,只有录制好流量,可以有很多用途。流量录制流量的录制实际上有很多种方式,常见的原创 2022-05-07 11:33:35 · 1767 阅读 · 0 评论 -
内网穿透原理
前言内网穿透一般在家庭用户下NAS设备在经常折腾,实际上企业云服务就是典型的内网穿透,只不过方式原理有点不同,家庭网络因为宽带的上传限制和没有公网IP,难度大于企业宽带。实际上内网穿透就是反向代理,域名解析,DNS切换的技术通过一定方式组合起来的应用。方式所谓的内网穿透,本质就是提供各种访问,与网站、app等提供的方式类似,就是把本地的数据,通过HTTP、SMB、socket等方式提供给外部访问,数据来源可以是数据库、文件。1. 反向代理+公网ip一般而言几乎所有的服务器都是这种方式,私原创 2022-04-17 14:41:33 · 5820 阅读 · 1 评论 -
OpenRASP Java应用自我保护使用
前言笔者上一章写了编译openrasp-v8的JNI编译过程,实际上是百度开源的OpenRASP的引擎依赖包,简单体验了,基础功能非常不错,只是很多管理功能需要2次开发,体验了以下,分享过程。1. RASP与WAFRASP(Runtime application self-protection)运行时应用自我保护,将自身注入到应用程序中,与应用程序松耦合,进行实时监测、阻断攻击。对于JAVA而言,应用本身通过javaagent技术注入agent来实现,原有代码无需修改。实际上WAF的部分功能原创 2022-03-20 17:02:27 · 10140 阅读 · 0 评论 -
Tomcat线程居高不下的原因
前言笔者在解决业务的问题中发现,如果Tomcat在并发延迟突变高后,很容易线程数量飙高,而且短时间是降不下去的,除非重启,但是不能线程飙高就重启吧,实际上是线程池的逻辑,然而Tomcat开放的配置是限制的。1. Tomcat运行的线程配置Tomcat运行过程一般都是在server.xml中配置catalina-exec-xxx和http-nio-8080-xxx另外的配置2. Tomcat线程飙高很久的原因线程池的线程数量要超过core数量必须要正在执行的任务线.原创 2022-01-24 22:30:21 · 4429 阅读 · 0 评论
分享