自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(106)
  • 问答 (1)
  • 收藏
  • 关注

原创 Kubernetes 单节点集群搭建

本人尝试基于Ubuntu搭建一个单节点K8S集群,其中遇到各种问题,最大的问题就是网络,各种镜像源下载不下来,特此记录!注意:文中使用了几个镜像,将看来可能失效导致安装失败,但安装的逻辑不变可以自行寻找可以用的镜像。文末附上一个无脑脚本,保存为 xx.sh 直接bash 执行即可。

2025-03-15 23:42:47 452

原创 10亿手机号去重在1G内存下的去重方案

位图分块压缩在数据分布集中时是最快的方案,时间复杂度低且无冗余计算。布隆过滤器在重复率极高时表现最优,显著减少磁盘I/O。哈希分片法是通用场景下的平衡选择,实现简单且扩展性强。外部排序仅在需要有序输出时适用,性能代价较高。实际选择时,需结合数据特征优先测试位图或布隆过滤器方案,若不符合条件再退而求其次选择哈希分片。

2025-03-06 22:29:20 553

原创 自定义类加载器国密版本冲突

对接三方接口经常使用到国密加密包(bcprov),此时系统已经引入了1.5版本,而三方提供的sdk中引用了1.6版版本,两个版本有冲突,如果系统加载到1.5版本的将会加密异常(各种奇怪的异常),本文的解决方案是指定一个类加载器,完成指定加载sdk和1.6版本的加密包

2025-03-01 00:01:58 212

原创 RocketMq学习笔记

本文记录作者基于RocketMq 4.9x版本对RocketMq部分功能特性的学习,并尝试从源码角度分析其实现原理。

2025-02-23 19:20:45 807

原创 Nacos1.x Raft算法实现

Nacos作为一款分布式注册中心,在一致性的构架设计上支持了AP以及CP,其中CP使用了Raft来作为其强一致性的算法实现,本文基于Nacos 1.x版本分析其部分功能的源码实现

2024-12-27 16:47:57 1005

原创 Eureka学习笔记-客户端

而刷新通常都是增量更新,即从Service获取最近的增量数据,然后根据增量类型(注册、下线、修改)来更新本地缓存。发生失败时将会记录这次失败的Service到隔离集合,而重试的需要请求的Service将会重新选择,选择的过程将会优先排除掉之前失败的Servie,但在隔离结合的数量超过阈值后将会清空隔离集合。这里根据请求类型以及响应码来判断是否**“成功”**,但这里的在非2xx返回的成功实际上意味着真正的成功,只表明无需进行重试,在调用上游还是会根据响应码判断操作本身是否成功,如。

2024-12-20 19:26:00 1075

原创 Connection lease request time out 问题分析

使用apache的HttpClient,我们知道可以通过setConnectionRequestTimeout()配置从连接池获取链接的超时时间,而正是从连接池获取链接超时的报错,这通常意味着总连接池数不够,或者说单个rote的连接池太小。但生产中二者在当时都接口请求量都足够的情况下依旧出现了这个问题可以看到总的连接池数是3800,单个路由是300,这在实际的环境运行中是完全足够的但依旧出现了。

2024-12-19 18:20:44 539

原创 Eureka学习笔记-服务端

其内部维护了一个如下的Map结构,key为应用标识,value同样是一个Map,后者的key为单个应用实例的标识,value为单个实例的详细信息(被Lease包装了实例的租期信息)

2024-12-14 21:23:49 1192

原创 老生常谈ThreadLocal内存泄露问题

我们知道ThreadLocal中的值实际是和线程绑定的,从上面的关系示意中我们可以看到我们放在set到ThreadLocal中的值实际被放到了的Entry中作为key,这个key从源码中我们可以看到是一个,当我们使用的ThreadLocal引用使用结束说,ThreadLocal对象 会被回收,但这并不意味着整个Entry会被回收,因为Entry实际还被Thread所引用,在实际应用中Thread通常被线程池管理重复使用除非重启几乎不会销毁。

2024-12-14 11:33:13 238

原创 Java自定义重试工具类

Spring-retry、guava的Retry都提供有重试工具,但二者均存在一个确缺点,即如果重试等待过程中会一直阻塞工作线程,这对于在生产环境使用是存在风险的,如果存在大量长时间等待的重试任务将会耗尽系统线程资源,下文基于线程池来完成一个简易的重试工具类。

2024-11-28 19:01:03 377

原创 徒步旅行中的补给问题

徒步旅行中的补给问题

2024-11-23 10:11:59 486

原创 Spring 配置绑定原理分析

Spring 应用中存在诸多配置,有的是系统配置,有的命令行启动参数配置,有的是yaml配置,有的是分布式配置中心配置,但对使用者而言总是可以通过@ConfigurationProperties将它关联到一个JavaBean当中或者使用@Value绑定,使得获取这这些来自不同地方的配置就像获取一个对象属性那么简单,那么它是如何来完成这个工作的呢?

2024-11-06 21:48:47 902

原创 CountDownLatch与CyclicBarrier的比较&应用

在数据分析的流程中,分为数据清洗和数据分析,数据因为量比较大,清洗和分析都分为了多个任务执行,但在执行任务分析之前,必须保证所有的数据都完成清洗

2024-10-30 21:59:18 321

原创 RocketMq集成Sleuth

通过Aop的形式在使RocketMq能在生产端的时候携带tracId和spanId,在消费端获取前面二者并且基于tracId创建新的span,达到一个业务请求经过Mq传递后tracId仍然保持一致的目的ps:Sleuth基于2.2.8版本。

2024-10-24 22:27:15 382

原创 Chrome Cookie最大有效期

代码设置了cookie有效期是10年,但在浏览器上实际上发现只有一年多一点,查证后发现chrome对cookie的最大有效期做了限制(400)天,实际上99.9999%的场景也是可以满足的。

2024-09-25 22:39:39 827

原创 基于Spring JDBC AbstractRoutingDataSource 实现动态数据源

AbstractRoutingDataSource 即抽象的路由数据源,提供了动态数据源切换的机制。你可以通过实现它的 determineCurrentLookupKey() 方法,根据不同的条件返回对应的数据源 key,基于这点可以根据外部输入完成数据源的动态选择。

2024-09-21 12:48:00 503

原创 Spring Cloud Config 动态刷新原理分析

底层工作原理依赖于Sping Actuator组件,在数据源发生变化的时候调用 /actuator/refresh 来应用实例完成config配置的的刷新。

2024-09-16 12:29:15 769

原创 Lucene查找过程源码分析

Lucene查找过程源码分析

2024-08-11 12:04:24 529

原创 固定窗口限流&滑动窗口限流Java实现

我们知道常用的限流算法有固定窗口、滑动窗口、漏通、令牌桶算法,这里给出前面两种的算法Java实现

2024-07-27 11:13:01 659

原创 Lua 语法学习笔记

Lua 语法学习笔记

2024-07-22 22:32:35 973

原创 Hkari连接的管理

某天发现一个流量不大的系统启动时启动时居然产生大量获取数据库连接慢的告警(>50ms),分析系统代码发现系统启动会有将一堆任务提交到线程池中执行,每个任务都会查询数据库,任务总数不到100个,核心线程30,最大200,相当于100个并发查询SQL。系统系统使用的连接池为Hikari,初始连接配置为15,按理100个并发查询并不算很大的流量,为什么会告警呢?于是有了本文。

2024-07-16 22:31:33 334

原创 JDK 方法中的小坑

【代码】JDK 方法中的小坑。

2024-07-14 21:08:02 205

原创 自定义方法耗时监控告警

自定义方法耗时监控告警:用于记录代码耗时,当代码耗时超过指定阈值时打印告警日志

2024-07-14 20:19:20 233

原创 ThreadPoolTaskExecutor 优雅关闭

ThreadPoolTaskExecutor 是Spring封装过的线程池,使用其可以在应用下线时,实现一定程度上的优雅关闭。

2024-07-13 01:04:38 1311

原创 Spring 外部jar包Bean自动装配

公共代码模块被作为jar包引入业务项目,前者定义的bean即使添加了@Component注解由于不会被扫描到也就无法被Spring管理。此处通过Spring SPI机制来完成。

2024-07-08 21:59:59 408 1

原创 HttpAsyncClient#excuete执行分析

HttpAsyncClient#excuete执行流程分析及其部分源码解读

2024-04-28 21:43:57 458

原创 Windows开机自动关闭系统代理

Windows开机自动关闭系统代理

2024-03-21 21:37:29 1259 1

原创 mysql修改字段的长度锁表问题

MySQL(这里指5.6及其后续版本=)修改字段的长度锁表会锁表吗?答案是可能会但不一定会。这是使用异常包含两万数据数据的表,字段初始长度为50(使用字符集为utf8)

2024-02-28 22:42:15 2009

原创 fastjson 导致的OOM

fastjson 导致的OOM。

2024-02-04 22:14:55 1021 1

原创 页面嵌入iframe Cookie丢失问题解决

自身页面以iframe的形式嵌入三方页面中,双方域名不一致导致自身页面的cookie被某些浏览器拦截无法正常被保存到客户端。

2024-01-17 23:07:27 4303

原创 关于httpClient 使用的注意事项

关于httpClient 使用的注意事项

2024-01-11 22:23:55 750

原创 TLS加密远程连接Docker

TLS加密远程连接Docker官方文档操作流程1、创建证书保存目录2、创建CA证书私钥:过程中需要输入并确认密码3、以此秘钥创建CA证书,自己给自己签发证书,自己就是CA机构,也可以交给第三方机构去签发4、创建服务端私钥5、创建服务端证书签名请求文件(csr即certificate signing request,里面包含公钥与服务端信息)6、配置白名单7、将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证。

2023-03-28 21:23:43 1002

原创 解决多版本jar包冲突问题

在和三方对接的过程中,我们可能会不断引入一些三方jar包,但这个时候就有可能出现一个项目需要依赖两个版本不同且功能不兼容的jar包,本文记录一种方法解决方法。我们知道jvm加载类是通过判断类的全限定名来判断当前类是否被加载,这个导致多版本jar包不兼容的原因,那么我们就从里下手。...

2022-08-01 23:54:41 3956 3

原创 ConsurrentHashMap InitTable 疑问与思考

第二个问题说到需要循环等待所有自然不可能提前return,那为什么不用sleep,因为我们并不知道另一个线程什么时候完成初始化,也就不知道sleep多少秒,多了、少了都不合适,所以干脆就让出cpu时间片,等下一次再看看,如果其他线程完成了初始化就返回,否则重复以上。ConsurrentHashMap作为单机下经常使用的一个线程安全Map值得我们学习一下,以下其初始化的过程的代码,以及学习过程中遇到的疑惑与自己的思考。通常意义下的加锁,都是去检查一个东西是否被“其他”持有,如果被持有则本次加锁尝试失败。...

2022-07-27 23:21:01 289

原创 十大排序之快速排序

1、因为我们选择的标兵是在左侧,所以我们要从右侧开始遍历那为什么因为我们选择的标兵是在左侧,就要从右边开始?进一步的分析,我们最终需要将标兵把i==j停下来的位置的值做交换,所以停下来的位置,一定要是比标兵更小的值,否则就不满足,标兵左边的值小于标兵的前提。假定如果我们从左开始,那么就有最终在比标兵大的地方停下来,导致最终发生交换的时候违背了前面说的原则。而从右边开始我们能够保证一定是遇到比标兵小的值或者回到标兵的位置才停下来。2、如果你希望从左边开始,那么标兵选择最右边即可。......

2022-07-23 23:22:40 203

原创 关于RSA加密与加签之一个小故事

RSA加密与加签首先强调加密与加签不同,加密是为了保证请求中的敏感数据不泄露,加签是为了保证请求不被伪造。举个栗子🌰故事背景女神小红和他的前男友小军分手了,另寻新欢找了小明做新男友。敏感数据泄露小明写了一封情书给小红,为了表达自己的忠诚,小明直接在信中写出了微信账号、密码,让小红可以随便查看,可信中途被小军拦截了,小军打开信看到了微信账号密码于是把小明号给盗了。加密小明又写了一封情书给小红,为了情书里面的内容不被篡改,所以让小红生成了一对密钥,并且把公钥给了小明,小明使用公钥对情书加了密

2022-05-13 23:34:09 333

原创 四种常见的限流算法

常见的限流算法计数器大致原理就好像他的名字一样,我们去维护一个计数器,每有一个请求过来我们就加1,一但达到我们设置的上限我们就拒绝掉。优点实现简单,单机使用AtomicInteger ,分布式场景使用redis的incr都能简单的实现,也十分容易理解。缺点1、存在“毛刺现象”,如我们一分钟内限流100次,在持续性大流量下,很有可能出现这种情况,第一秒钟解收了100个请求,后面59秒都是拒绝状态,61秒又接收了100个请求,后面59持续拒绝。。。也就是他无法均匀的限制流量,容易造成应用服务器处理

2022-05-10 23:37:04 688

原创 限流算法-漏桶算法和令牌桶的区别

限流算法-漏桶算法和令牌桶的区别这里通过两个例子来说明1、漏桶高速路上有一个收费的公共厕所,突然有一堆人都想进行上厕所,能直接进去吗?不行啊,收费的,得先交钱啊,于是乎一堆人在厕所门口排起了队,一个个给老板扫码付了钱才能进去上厕所。2、令牌桶老板说,我给你们发一张纸片,拿着纸片直接就能进去,能自动扣费并作废,老板只要看有一个空着的地就写一个纸片,没地方了就不写了,存着等人过来直接就能发出去。前者与后者关键的区别就在于前者无论是无流量高低,吞吐的速率都始终相同,后者则可以在从低流量突发遇到高流量时

2022-05-07 13:03:02 250

原创 Vue prop 传递对象到子组件刷新页面数据消失

Vue prop 传递对象到子组件刷新页面数据消失父组件向子组件传递了一个对象,当页面我们直接刷新页面时发现子组件接收到的这个对象总的属性不见了。父组件<ArticlePublishForm :content="content" :article-id="editorArticleId" // 这个就是被传递的对象 :article-message="articleMessage" :title="title"

2022-04-29 20:16:21 3293

原创 Axios 传递数组问题

Axios 传递数组问题后端框架Spring,前端Vue,使用的请求方式是axios,当后端接收的形式为数组(如String[]),始终无法很好的解决,后改为 List 才解决了这个问题后端接收方式 public void test(@RequestParam List<String> tags){ }前端请求方式 let tags: ['java','后端'], let {data: result} = await pushOrUpdat

2022-04-29 14:41:18 3000 1

空空如也

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

TA关注的人

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