自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Maven插件打fatjar的一些技巧

最近做项目,Java实际上一般情况也不用fatjar,毕竟CICD都是流水线构建,不过在预研的过程中,使用fatjar可以内置manifest的main类直接启动,就很方便,尤其是在服务器运行环境。实际上golang还是很方便的,可以交叉编译二进制可执行文件,不过在交叉编译跨语言的能力的时候经常很难弄环境。实际上工作中大部分Java项目都是通过这种jar方式来来执行的,当然也可以封装java class -cp xxx的方式执行,不过文件太分散,不便管理。

2024-04-07 18:49:12 642

原创 VLC抓取m3u8视频

最近想看一些网络视频,但是很多时候网页上是m3u8推流的,如果在线看,速度又慢,所以就想下载下来,就想到了VLC的推流,转换能力,查阅资料,加上实践,总结心得。笔者在查资料发现有网站已经详细的说明了操作流程,可以直接去查看,本质上还是ffmpeg的应用通过这种方式就可以看m3u8的视频,而且网络卡顿时,可以下载视频文件,也可以直接用视频播放器在线看。

2024-03-13 22:29:32 807

原创 ubuntu 22.04LTS的一些使用心得

笔者一直在折腾ubuntu作为开发的主力系统,尤其是最近微信和各种软件陆续支持Debian系列,很多软件都可以用了,当然开源的软件大部分是跨平台的,尤其是idea系列。ubuntu上的软件实际上已经很完善了,唯一一点是界面不咋的,还有安装太痛苦了,要是都像mac一样,那么使用会大大简化,ubuntu还有双标题栏的问题说实在的,很难看,占地方,而且在卸载snap后,dock栏还有磁盘的图标这个暂时还没解决。

2024-02-25 17:06:40 747

原创 sonar-java 手写一个规则-单元测试分析

最近做项目,定制sonar规则,提高Java代码质量,在编写的sonar规则,做验证时,使用单元测试有一些简单的心得感悟,分享出来。sonar的自定义规则很简单,一般而言有2种模式可以使用:1. 自定义扫描代码逻辑,并对分类的Tree的结构处理2. 使用已扫描的分类,对分好类的Tree进行分析。

2024-02-25 15:09:54 1365

原创 sonar-java 自定义规则

最近在搞代码质量方面的项目,主要是针对Java语言,其他语言实际上也可以执行检查,核心原理是一样的,都是静态代码扫描,如果需要进行动态代码运行验证则可以通过单元测试的方式。以其中一个示例,实现自定义Java sonar规则。实际上这个很简单,如果需要考虑,那么需要考虑扫描算法怎么写,性能是否OK,毕竟一般执行扫描都是在代码编译打包的过程,本地很少单独执行扫描。

2024-02-18 17:58:58 969

原创 mybatis plus相同Id与xml配置错误时,mybatis plus解决逻辑

mybatis plus这个是直接丢弃相同Id的statement,安装先后顺序,会造成执行过程的误解,不过有日志可以查看,而且mybatis原生的starter是有校验的,直接报错了。mybatis的xml如果写错,那么启动居然不报错,执行任意statement前需要执行未完成的statement,来达到快速失败的情况,这种情况对健康检查提出了新挑战,否则可能出现启动OK,但是mybatis失败的情况。

2024-01-09 22:46:08 900

原创 Spring多个条件注解不同但BeanId相同的冲突

这个问题实际上出现不是很频繁,但是如果不经意就会出现我们不可预知的问题,尤其是初始化的情况,不同条件初始化绝对不一样,出现这种问题,我们很难知道根源,因为异常被吞了,启动也OK。当然解决问题是不使用id相同的Bean创建方式,因为如果异常,只要其中一个Bean创建成功即可成功,没异常我们发现不了问题;如果没有异常,相同的Bean id会被后创建的Bean替代,但是在相同id的时候是都会尝试创建,@ConditionOnXxx就不会执行,这个会跟我们需要的情况相违背。

2023-12-03 22:08:28 1079

原创 logback异步日志打印阻塞工作线程

实际上这个问题是使用问题,非常简单,不过越是简单的使用,却可能出现致命问题,一般公司都会统一脚手架或者统一规范的方式来实现标准的日志配置文件,防止错误配置导致业务问题,不知道未来Java虚拟线程大规模使用会不会缓解日志打印阻塞工作线程的问题,毕竟调度更优,不过如果线程池满载,虚拟线程也是无能为力。还是需要在丢日志和存储消费日志的能力作取舍。

2023-11-12 16:59:23 1425

原创 CURL简单使用

最近做项目,需要服务器实现网络是否通畅,比如通过健康检查接口,但是只能linux服务器测试,很可能还需要测试h2,所以想到了curl,整理一版简单用法。通过上面的分析,实际上curl一个命令就可以干很多命令的事情,功能非常强大。只是有时候我们形成固定习惯了,但是在有些命令不能安装,或者没机会安装的时候,curl可以用来执行各种命令,非常方便,而且基本上都操作系统内置了,尤其是linux服务器领域,基本上都可以使用这个程序。

2023-10-24 22:37:54 245

原创 macOS telnet替代方式

经过使用Linux,常常用Linux的telnet查看端口畅通,是否有防火墙,但是在mac上已经没有这个命令了,那么怎么使用这个命令或者有没有其他替代呢,win和linux是否可以使用相同的替代。macOS可以原生用nc命令替代,当然也可以安装telnet: brew install telnet(python3)nc经过测试macOS特有,可以用来做TCP和UDP的连接和监听,实际上linux和win也可以通过安装nc的方式使用nc,不过Ubuntu默认源没有发现安装包。

2023-10-22 09:48:18 2626

原创 国密https访问

现在的SSL的加密算法实际上主要是国际算法,包括JDK,Go等语言也仅支持国际算法加密(毕竟是国外开源项目),hash。随着国密算法的普及,比如openssl就支持国密了,还要新版本的Linux内核也开始支持,以openssl为例:那么如果需要国密证书,或者访问国密https的时候就需要特定的sslsocket的握手算法传输层密码协议(TLCP)GB/T 38636-2020:传输层密码协议该协议与TLS协议的最重大区别,就是要求通信端提供两个证书:认证证书和加密证书。

2023-10-21 22:04:32 2478

原创 Java SSL/TLS证书认证逻辑

实际上证书的认证就是链式认证,加入根证书链,因为根证书是信任的,CA机构是认可的,那么CA颁发的根证书是信任的,经常报道的Chrome移除xxx机构颁发的根证书,表示这些证书链下的证书不信任了,毕竟公钥和私钥任何证书都能生成,证书链也可以仿造。

2023-10-21 14:49:06 1440

原创 双活架构设计-连接集群

双活的设计是很有必要的,而且很传统的解决方案,融合了单元化思想,存算分离思想,实际上是矛盾又是统一的整体,单元化是有状态的,存算分离又是让运算无状态。那么设计存储一致性就很重要,保证一致性和最佳的性能,又会大量的使用缓存的思想。

2023-10-06 18:48:22 344

原创 Spring Cloud zuul扩展能力设计和心得

实际上Spring Cloud已经废弃zuul了,改用gateway,但是webflux的技术并没在实际项目大规模普及,还有很多servlet NIO的应用,所以zuul还是很有必要改造的,实测zuul调优(调节转发的连接池)跟gateway性能上差不多,所以研究了下zuul,发现设计理念很不错。

2023-10-06 12:23:48 152

原创 Spring Cloud zuul与CloseableHttpClient连接池,TLS证书认证

实际上,对于技术而言,无论使用任何框架,设计思路都是有异曲同工的地方,对于HTTP代理,无论是zuul(servlet)还是gateway(netty),或者NGINX;本质处理逻辑还是IO的区别,HTTPS协议对于所有的逻辑都是一样的,关键在于定制化吧,zuul对于简单应用还是很不错的,方便定制化,也可以使用gateway,相对要复杂一点。

2023-09-08 19:58:44 293

原创 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 386

原创 检查网站是HTTP那种协议与获取域名的ipv6地址

最近在做HTTPS的应用,可能需要使用ipv6的地址做SLB,但是怎么检查配置正确,总不能每次都看日志吧,实际上客户端也很容易查看,总结工作经验。实际上就是些经验总结,没什么技术难度,只不过网上很多时候没说清楚,实际上很多情况是有前提条件的,比如windows,比如js执行的函数等。

2023-08-05 20:41:47 2398 1

原创 M1/M2 通过VM Fusion安装Win11 ARM,解决联网和文件传输

最近新入了Macmini M2,但是以前的老电脑的虚拟机运行不起来了。😅,实际上用过K8S的时候,会发现部分镜像也跑不起来,X86的架构和ARM实际上还是有很多隐形兼容问题。所以只能重新安装ARM Win11,幸好微软开放了win11 ARM正式版,可以虚拟机安装,实机是不行的。笔者安装了使用,日常转移还是可以的,ARM运行X86软件。

2023-07-29 17:18:26 4922 4

原创 Java文件的相对路径规则

最近做项目,又涉及到Linux Java文件的相对路径,但是相对路径在不同的服务器或者docker上居然不一样,这个就很难受,只能用绝对路径解决,因为绝对路径是固定的路径,但是相对路径为什么会在不同的服务器不一样呢?

2023-07-24 16:36:04 377

原创 word 目录创建与提取

word实际上一直在用,但是笔者在写文档都没关注目录的概念,实际上目录就是富文本或markdown编辑器的标题,可以起到跳转的作用。笔者的毕业论文的目录居然还是手打的。这篇文章比较简单,因为笔者在写文章过程中,学习到的一些简单知识,网上很多不是很全,经常说一部分,导致折腾很久。

2023-07-09 16:54:00 737

原创 跨数据中心高可用架构设计

随着常年的码代码,做设计,笔者做过基础编码,云计算平台,架构师,见过不少应用设计,系统设计,中间件,了解现有的技术体系发展模式,集中式->分布式;cap与base理论,基本上绝大部分时候可用性都是设计的必要目标,那么可用性在分布式的情况下是如何实现的呢,答案就是副本,即多部署几个资源,理论上部署越多,可用性越高,但是状态这个并不是所有情况都是无状态的,所以取舍在所难免。笔者仅仅简单的介绍了跨数据中心的做法,方案等;

2023-06-03 18:09:41 789

原创 go 使用pprof分析性能,trace追踪

pprof是Go程序自带的性能分析工具,prof是profile(画像)的缩写,用于分析go程序的性能。A sampling of all past memory allocations 已分配内存采样Stack traces that led to blocking on synchronization primitives 导致同步原函数阻塞的堆栈追踪The command line invocation of the current program 当前程序的命令调用列表。

2023-05-05 22:15:26 1419 1

原创 ubuntu 创建快捷方式图标,解决2个图标的问题

因为ubuntu上软件有微信可用,准备试试ubuntu,加上deepin也是基于Debian,所以软件理论上可用通用。使用ubuntu发现作为开发主力机没什么问题,写写代码,基本上主力的驱动都有,可能部分笔记本会有驱动问题。微信可用去ukylin下载,不过有些软件是没有应用程序图标和快捷方式的,这点需要一点点动手能力。

2023-05-02 22:39:31 1048

原创 javaagent 使用注意

最近做项目,需要实现一个agent,实现运行过程替换字节码,当笔者实现这些功能时发现还是很多注意事项的。而且字节码的替换过程如果类的属性与方法升级了,那么加载就会报错。这种做法的好处是代码无侵入,缺点也很明显,严重依赖特定的jvm版本和中间件等。javaagent实际上是JVMTI使用的技术,核心依靠Instrumentation实现。

2023-04-17 20:50:14 678

原创 brew 使用fatal: not in a git directory Error: Command failed with exit 128: git

最近看点新东西,有开源的auto-gpt,看了是python写的,安装python时使用brew install python,然后报错了,考虑到前些天刚刚更新了系统小版本,是不是没更新的缘故,执行brew upgrade,然后还是报错,而且跟最开始报错一模一样brew安装实际上节省了很多时间,但是经常因为各种原因有各种问题,需要brew -v按照提示执行。

2023-04-17 11:50:20 336

原创 API-Server的监听器Controller的List分页失效

最近做项目,还是K8S的插件监听器(理论上插件都是通过API-server通信),官方的不同写法居然都能出现争议,争议点就是对API-Server的请求的耗时,说是会影响API-Server。实际上通过源码分析两着有差别,但是差别不大,对API-Server的影响几乎一样。知其然知其所以然,要想知道为什么分页不生效,需要自定义API-Server debug才行,看代码很难看出原因,因为K8S实际上估计设计的时候也考虑过这个。

2023-03-18 22:08:55 514

原创 浅析C++指针与引用,栈传递的关系

目前做了很多项目,接触到各种语言,基本上用什么学什么,语言的边际就会很模糊,实际上语言的设计大同小异,只是语言具备各自的特性区别。其中一个重要的概念是指针,这个在C语言就风靡的技术,实际上在各个语言或显示或隐世的体现出来,而且在函数或者方法栈的调用展现本质相同的现象。相对而言Golang和Java在设计的时候差不多,C++概念真多。实际上语言学多了,设计都差不多,只不过出于不同的能力考虑,功能就有额外的区别,所以就会有xx语言适合xx开发的说法,在实际运用中,可以一边做项目一边学习。

2023-02-19 17:03:23 456

原创 client-go监听apiserver,监听http2逻辑分析

最近做项目,需要写一个controller(k8s的插件),需要从k8s的apiserver取数据,就用了自带的client-go,但是client-go是怎么从apiserver获取数据的一直没有研究过,只是看网上,看官方文档说是chunk读取数据,然而事实上,笔者却发现使用http2.0的长轮询。强烈建议使用linux或者mac开发机。

2023-01-31 18:45:49 1052

原创 go 函数或者方法参数调用的过程

最近做项目,使用go开发,但是在发生函数调用传参数时,对指针的指针的传递有难以理解的代码,就此分析过程。尤其是对于多重指针作为参数,而且对于一些内置函数的修改逻辑也需深入的理解。这里的问题是切片本身是指针,如果再加入指针,就是指针的指针,很难理解。而且再结合函数的参数,本身函数的参数是一个引用,栈变量自己又会分配内存地址,就更难理解了😅。这里的关键还有切片是一个结构体存储的,但是结构体又是内存值拷贝,而非内存地址引用。实际上可以结合内存分配的流程结合函数的入栈出栈,外加参数的存储结构很容易就明白原理了。

2023-01-17 22:09:52 737

原创 OpenRASP agent源码分析

目录前言准备源码分析1. manifest 2. agent分析3. agent卸载逻辑 总结笔者在很早前写了(231条消息) OpenRASP Java应用自我保护使用_fenglllle的博客-CSDN博客实际上很多商业版的rasp工具都是基于OpenRASP的灵感来的,主要就是对核心的Java类通过Javaagent技术,对特定的方法注入字节码,做参数验证。核心技术就是Javaagent,那么分析OpenRASP的agent实现原理,即可明白主流的rasp实现逻辑。 在OpenRASP上优化部分实现逻

2022-12-04 13:14:28 654

原创 go return返回值屏蔽

最近需要写一个云环境的可执行程序,一般使用go语言,毕竟GC+原生运行,结合了不需要回收指针的能力和原生运行,但是在程序返回时,笔者看到一个sdk的源码懵了,返回的数据居然可以隐式返回。go 版本笔者看到的代码,可以明显看到返回值是没写的,go却是一个强类型语言,返回值不匹配是会报错的,那么可以推断,这个go编译器自己把返回值变量的数据返回,所以没有定义返回值变量的不能这样使用。 1. 没有任何数据的时候那么就会返回一个初始化的符合要求的值,即返回值的变量(因为返回值的变量会默认初始化一个值) 验证正

2022-12-03 18:21:55 497

原创 go slice 扩容机制

go语言没有ArrayList这样的封装,但是官方原生提供slice,底层就是数组存储,并且能自动扩容,相较于ArrayList的默认10,扩容5,slice的逻辑是有区别的。slice默认容量0。数组本质是不可扩容的,数组的扩容实际上就是创建新的数组,分配新的内存,然后执行数组的拷贝,所以slice实际上就需要数组新的内存地址的返回,指针指向新的内存地址。扩容时:当前需要容量如果小于当前的容量,无需扩容;否则2倍扩容当前需要容量大于当前容量2倍,直接扩容至当前容量。

2022-11-23 19:39:00 1549 1

原创 godoc安装与go文档查询

最近在用go语言做项目,语法还是很简单的,但是API不熟悉,😅,另外也没有类似Java的Spring这样的独秀的IOC和AOP框架,灵活度很大,经常需要查询文档,但是godoc从go1.14.2开始就从内置SDK移除了。实际上godoc是一个很方便的文档查询工具,不知道为什么go sdk移除掉了,但是可以通过手动安装的方式安装,实现本地文档查看。

2022-11-22 22:00:07 696

原创 grpc Java demo与Springboot改造支持grpc通信

最近调研grpc的情况,发现grpc实际上还是HTTP2协议,实际上就是http2+proto传输。那么是否可以在现有的server支持呢,试了下,还真可以,但是笔者在返回数据时有个问题一直没有思路。

2022-11-13 11:50:36 1073

原创 macOS 下JD-GUI报JDK1.8+的问题

这里不就是jvm的版本不对,那么设置版本号即可,也可以写的灵活一点,执行java -version。注意=号两边不能有空格,shell基本常识。实际上是sh脚本获取的jdk的版本不对。然后取第一行第3列的值。

2022-11-06 23:01:02 819

原创 容器下进程退出产生僵尸进程的过程与原因

最近容器部署标准化,本来很简单,也没什么特殊的要求,但是在容器里,因为临时需要启动进程,结果停止后出现了僵尸进程。在容器下进程id为1的进程是不能kill掉的,当容器下需要创建进程,运行时启动,那么创建进程的过程非常重要,因为销毁需要逆过程,否则会出现僵尸进程。容器下当新创建的进程(id为1的进程除外)的父进程被kill或者自然退出,当前进程的父进程id会被设为1,即容器下不能被kill的进程,导致僵尸进程的产生。

2022-10-29 22:31:06 1080

原创 docker 网络

随着容器的普及,经常使用docker创建容器来跑应用,结合开源的kubernetes和istio等,对于无状态的服务有极好的支持能力,秒级调度,弹性伸缩等优势。实际上kube的容器仅仅是接口,实际的容器可以是docker,podman等,以docker为例。实际上kube就是容器的管理器,核心思想是调度,调度就需要网络、流量治理能力(kube目前薄弱环节),就出现了各种网络方案,istio等。容器的核心网络在kube是pause容器创建的,其他容器通过container沿用网络方案,即一个POD。

2022-10-24 22:59:24 882

原创 rust 开发环境的安装,以win和mac为例

最近在看云环境下的原生运行,语言最好是可以直接运行,而不经过虚拟机。那么go、rust等天生就有很大优势,尤其是rust设计就是无gc的语音。根据实测搭建rust开发环境还是很方便的,而且rust无需自己回收引用,实际上go语言虽然也不需要回收指针,但是编译时会携带gc回收器,编译后的文件会很大,而且内存gc本身会消耗较多的内存。看看rust环境搭建。

2022-10-08 12:34:57 1372

原创 容器环境注入Spring属性不一致却能生效

最近使用容器部署应用,Spring应用,会注入一些环境变量,然而这些环境变量的大小写和真实的取值差异很大,而且也不是xxx.xxx,而是xxx_xxx,非常奇怪,代码里也没发现原因。通过分析Spring源码发现,原理就是Spring的特殊处理,以及Spring的设计。

2022-09-19 22:03:38 242

原创 intellij idea在macOS下卡顿的问题解决方法

不知道从什么时候开始intellij idea的run和debug Springboot项目时非常卡,经常要卡顿很久才能启动,笔者只以为是idea的优化不太好,但是通过搜索,发现很多提问卡顿的,有说退回2018版本就不卡了。也有说配置jvm的堆大小的,但是笔者配置堆大小没用。...

2022-08-26 22:34:49 2950

lldb工具包。macos x64

lldb工具包。macos x64

2022-10-08

空空如也

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

TA关注的人

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