springboot kafka在kafka server AUTH变动后consumer自动销毁 kafka在发送者和消费者是区分开的,发送者如果连接kafka broker失败后可以一直重试直到成功,但是消费者确有各种各样的逻辑,可以精准控制,比如消费者重启的配置可以控制消费者在停止时重启,如果仅仅是授权失败,而且不需要反复重启(消耗资源),那么可以通过。
mapstruct和lombok同时使用的问题解析 mapstruct实际使用过程一言难尽啊,本身与idea有兼容性问题,不过新版本确实在一定程度上规避了问题,不过与lombok一起使用必须依赖lombok-mapstruct-binding才行,否则因为与lombok的顺序问题,运行过程并不会报错,结果很难保证。建议还是自己写getter和setter吧,性能没区别。
Tomcat servlet response关于中文乱码的经验 实际上这个问题很简单,而且也很容易解决,只不过不同的软件有不同的标准,所以即使是utf-8并不能解决问题,而是需要根据实际的情况,比如http,根据mime-type明显比指定utf-8更能表达具体的意义,毕竟mime是具体的标准。
springboot kafka多数据源,通过配置动态加载发送者和消费者 如果消费者或者发送者逻辑需要写在当前kafka网关应用,那么只能通过自定义扫描方式支持配置不同,所有配置的生成者和消费者必须代码实现逻辑,通过配置加载方式,自定义扫描注入bean即可。以消费者为例,生产者不涉及注解发送方式相对简单。});写了一个初始化的bean,用于通过配置加载bean。消费者是注解方式扫描,bean需要根据配置加载,不能写在代码里面这里仅仅是注册bean,并不会被beanpostprocessor处理关于第1点。
hutool 解压缩读取源文件和压缩文件大小失败导致报错 最近处理老项目中的问题,升级安全jar,发现hutool的jar在解压缩的时候报错了,实际上是很简单的防御zip炸弹攻击的手段,但是却因为hutool的工具包取文件大小有bug,造成了解压缩不能用,报错:invalid sizes: compressed -1, uncompressed -1,理论上使用这个API的所有方法都有问题。影响范围hutool 5.8.11~5.8.16,5.8.17修复。demo准备构建一个demo吧:JDK8+hutool 5.8.16没考虑流关闭问题,实际生
关于数字存储和byte[]数组的一些心得 实际上这次是一些碎碎念,核心还是计算机的原理,计算机因为电气性能只设计有0、1,所以是2进制,存算都是2进制。而且计算机在设计之初只设计了加法,没设计或者设计减法有问题,导致数据相减运算都是加运算,所以需要存储和运算负数,那么就需要定义负数的存储和相加逻辑,就设计了反码和补码来存储负数。另外一个字节存储能力有限,往往需要很多字节来存储一个内容,那么符号位的定义在总体结构很明晰,但是对于字节数组的单个字节就会存在歧义,造成数据可读性很迷惑,因为符号位的特殊意义。
雪花算法的一些问题解析 雪花算法实际上设计极为巧妙,通过时间戳,机器码,序列号(自增)来达到某个时间段(默认1毫秒)在某个并发下(并发超出自增ID就会重复或者阻塞等问题,不过我们一般达不到,且可以通过负载均衡增加资源规避),不重复ID。实现了加资源的方式来达到分布式ID不重复,且自增的特性。
Tomcat get请求传数组集合参数 最近做项目,需要通过GET传参,来实现查询的能力,本来是RPC调用,直接参数序列化即可。但是服务最近修改为HTTP,本来Spring Cloud的feign也可以直接传参数,但是当使用Nginx访问时参数到底传啥呢,笔者传入?list=['xxx']直接就报错了,错误类型。
Spring boot 注入成员变量HttpServletRequest的原理 最近做项目,springboot项目,本来我们在controller的requestmapping取参数值或者返回写时,使用方法参数,但是发现老项目直接注入了成员变量,Spring本身是单例的,如果是成员变量注入,那么也是单例的,怎么实现不同的请求读取不同的参数呢,如果实现线程安全呢,笔者立马想到了ThreadLocal,但是如果要说就是这个原理,那么必须源码证明。
Postman历史版本安装与runner测试 实际上就是笔者本地做demo,postman使用了最新版本,本身也没问题,不过postman不支持不登录做runner测试了,很多功能必须登录账号才能使用,否则只能使用http工具发送的能力,而postman本身就是一个简单工具本地使用,为了这些功能不值得,所以降级,可以使用了。postman截止现在最新版本(mac)如果点击lightweihgt,可以发送各种测试请求,但是只要点击保存,就要登录云账号,且没有runner的功能可使用。
@Configuration自身循环依赖及解决办法 实际上循环依赖不仅是Spring Bean的循环依赖,还有接口调用的循环依赖,不过Springboot在2.6.0版本已经默认不允许循环依赖,就是不解决这个问题了,如果spring.main.allow-circular-references配置true,那么还是可以跟以前一样,不过不确定什么时候就移除这个配置。另外自身循环依赖比较特别,主要是Springboot下动态代理的结果,本身方法的引用是不会出现循环依赖的。
M2 Mac mini跑Llama3 在4-19左右,Meta 宣布正式推出下一代开源大语言模型Llama 3;共包括 80 亿和 700 亿参数两种版本,号称 “是 Llama 2 的重大飞跃”,并为这些规模的 LLM 确立了新的标准。实际上笔者早就体验过,只不过自己电脑没什么显卡(核显),所以一直没跑llama,但是最近听说m2芯片可以运行,就体验了一下。看图表8B的数据可以在本地运行,70B就不用想了。试了一下真的可行。
Chrome 侧边栏开发示例 最近做项目,需要开发浏览器扩展,但是考虑页面布局兼容性问题,使用了Chrome114开始的侧边栏,浏览器自带的能力毕竟不会出现兼容性问题,不过Chrome123开始,侧边栏居然又可以选择固定右侧扩展栏了,交互变化很大。
Maven插件打fatjar的一些技巧 最近做项目,Java实际上一般情况也不用fatjar,毕竟CICD都是流水线构建,不过在预研的过程中,使用fatjar可以内置manifest的main类直接启动,就很方便,尤其是在服务器运行环境。实际上golang还是很方便的,可以交叉编译二进制可执行文件,不过在交叉编译跨语言的能力的时候经常很难弄环境。实际上工作中大部分Java项目都是通过这种jar方式来来执行的,当然也可以封装java class -cp xxx的方式执行,不过文件太分散,不便管理。
VLC抓取m3u8视频 最近想看一些网络视频,但是很多时候网页上是m3u8推流的,如果在线看,速度又慢,所以就想下载下来,就想到了VLC的推流,转换能力,查阅资料,加上实践,总结心得。笔者在查资料发现有网站已经详细的说明了操作流程,可以直接去查看,本质上还是ffmpeg的应用通过这种方式就可以看m3u8的视频,而且网络卡顿时,可以下载视频文件,也可以直接用视频播放器在线看。
ubuntu 24.04LTS的一些使用心得 笔者一直在折腾ubuntu作为开发的主力系统,尤其是最近微信和各种软件陆续支持Debian系列,很多软件都可以用了,当然开源的软件大部分是跨平台的,尤其是idea系列。ubuntu上的软件实际上已经很完善了,唯一一点是界面不咋的,还有安装太痛苦了,要是都像mac一样,那么使用会大大简化,ubuntu还有双标题栏的问题说实在的,很难看,占地方,而且在卸载snap后,dock栏还有磁盘的图标这个暂时还没解决。
sonar-java 手写一个规则-单元测试分析 最近做项目,定制sonar规则,提高Java代码质量,在编写的sonar规则,做验证时,使用单元测试有一些简单的心得感悟,分享出来。sonar的自定义规则很简单,一般而言有2种模式可以使用:1. 自定义扫描代码逻辑,并对分类的Tree的结构处理2. 使用已扫描的分类,对分好类的Tree进行分析。
sonar-java 自定义规则 最近在搞代码质量方面的项目,主要是针对Java语言,其他语言实际上也可以执行检查,核心原理是一样的,都是静态代码扫描,如果需要进行动态代码运行验证则可以通过单元测试的方式。以其中一个示例,实现自定义Java sonar规则。实际上这个很简单,如果需要考虑,那么需要考虑扫描算法怎么写,性能是否OK,毕竟一般执行扫描都是在代码编译打包的过程,本地很少单独执行扫描。
mybatis plus相同Id与xml配置错误时,mybatis plus解决逻辑 mybatis plus这个是直接丢弃相同Id的statement,安装先后顺序,会造成执行过程的误解,不过有日志可以查看,而且mybatis原生的starter是有校验的,直接报错了。mybatis的xml如果写错,那么启动居然不报错,执行任意statement前需要执行未完成的statement,来达到快速失败的情况,这种情况对健康检查提出了新挑战,否则可能出现启动OK,但是mybatis失败的情况。
Spring多个条件注解不同但BeanId相同的冲突 这个问题实际上出现不是很频繁,但是如果不经意就会出现我们不可预知的问题,尤其是初始化的情况,不同条件初始化绝对不一样,出现这种问题,我们很难知道根源,因为异常被吞了,启动也OK。当然解决问题是不使用id相同的Bean创建方式,因为如果异常,只要其中一个Bean创建成功即可成功,没异常我们发现不了问题;如果没有异常,相同的Bean id会被后创建的Bean替代,但是在相同id的时候是都会尝试创建,@ConditionOnXxx就不会执行,这个会跟我们需要的情况相违背。