自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 那年双十一,我们被Ribbon的“善意”重试,送进了ICU

一场双十一大促,一个看似无害的`@GetMapping`,竟让核心支付接口被打爆,引发P0级事故和百万级资损。为什么修复超时后,反而引爆了更可怕的重复支付灾难?Spring Cloud Feign中到底埋了多少默认配置的“地雷”?你的数据服务,是否正被HttpClient默认仅为2的并发数死死扼住喉咙?

2025-07-29 09:03:33 341

原创 为什么《阿里Java开发手册》强制禁用Executors?看完这篇血泪史你就懂了。

一个`Executors.newCachedThreadPool`,在双十一高峰期直接干崩了我们整个服务,P0级事故!复盘后,又因线程池“假复用”和“IO/CPU任务混用”导致系统性能雪崩。这篇血泪史将带你亲历三次由线程池引发的生产事故,从源码层面剖析`Executors`的致命缺陷,并揭示线程池复用与隔离的黄金法则。别再裸写线程池了,也别让它成为你下一个P0的元凶!

2025-07-29 09:01:14 402

原创 别再把 WebSocket 当万金油了!AI时代新宠SSE,让你的Java应用“活”起来!

还在用原始的轮询“骚扰”服务器?想知道ChatGPT那种“打字机”效果是怎么实现的吗?别再把WebSocket当成万金油了!本文将为你揭秘AI聊天场景下的“版本答案”——SSE(服务器发送事件)技术。我们将带你从零开始,用Java和前端代码,仅需10分钟,一步步搭建一个完整的流式对话系统,

2025-07-28 08:58:38 295

原创 从数据错乱到服务假死:一个连接池引发的三起连环血案

用户购物车惊现他人数据,P0级数据泄露!修复后,又遭“僵尸线程”围攻,系统濒临崩溃;最后,大促支付流程因连接池耗尽而全面瘫-痪!本文带你亲历三大连接池事故,从Jedis、HttpClient到数据库,彻底搞懂连接池的正确使用姿势。别让你的一次“方便”,成为团队的下一个不眠之夜。

2025-07-28 08:57:38 919

原创 别笑,这四种“锁“的错误用法,我敢说你的项目里至少中了一个

一个“幽灵”`synchronized`锁,引发了财务数据错乱;修复后,又因锁粒度太粗拖垮整个系统;优化后,更是在大促时遭遇致命死锁,P0告警响彻夜空!这不是故事,而是每个Java程序员都可能踩的坑。本文以一场惊心动魄的连环事故复盘,带你直击`synchronized`的四大核心陷阱:无效锁、对象锁与类锁混淆、锁粒度过粗、死锁。层层剥茧,让你彻底告别无效加锁和性能噩梦。别让你写的锁,成为埋给自己的雷。

2025-07-27 19:36:50 616

原创 我的用户信息,怎么被隔壁老王改了?元凶竟是ThreadLocal!

“我的用户信息怎么被别人改了?” 一场深夜P1级数据串乱事故,元凶直指我们曾信赖的性能工具ThreadLocal。因不了解Tomcat线程池的“线程重用”机制,忘记在请求结束后`remove()`数据,导致用户隐私暴露,数据相互覆盖。本文以血泪史复盘,揭示ThreadLocal、ConcurrentHashMap等并发工具的常见误区:它们只保障自身API的原子性,却不保障你的业务逻辑。并发工具是利刃,不懂原理,握住的就是刀刃。别让线程池的“重用”,变成你事故的“复用”。

2025-07-27 19:01:16 247

原创 一个@RequestBody竟让我们赔了上百万!—— 永远不要相信客户端的数据

凌晨三点的P0级告警,竟因一个@RequestBody参数导致公司瞬间损失上百万!我们惨痛的教训是:永远不要相信任何来自客户端的数据。文章通过一个虚拟的“1元购iPhone”线上事故,揭示了直接使用客户端计算的价格创建订单是多么致命。黑客能轻易绕过前端,通过curl等工具伪造请求,将任意商品价格修改为几乎为零。核心铁律:客户端只提供意图(如商品ID和数量),所有关键数据(如价格、总价、用户ID)必须由服务端重新查询和计算。前端校验防君子,后端校验才是系统的生命线。别让你的信任,成为黑客的提款机。

2025-07-27 18:48:49 297

原创 别动!你写的@Transactional,80%都是定时炸弹——说说Spring事务那点事~~

还在天真地以为加上@Transactional就万事大吉了?醒醒吧!你写的事务80%可能都是“定时炸弹”!本文通过三段生产事故的“血泪史”,揭露@Transactional最常见的“三大谎言”:private方法和this调用下的“幻影事务”;try-catch和受检异常导致的“回滚背叛”;以及事务传播滥用引发的“致命连坐”。最后,我们将手把手教你打造一个终极“手动挡”——优雅的编程式事务工具,彻底解决注解失灵的尴尬。别再让烂事务毁了你的项目

2025-07-27 18:06:27 783

原创 代码命名:你以为是技术活儿?不,这是情商税!

还在用 data1, info, flag 命名吗?你写的每一个烂名字,都是亲手埋下的“地雷”,迟早会炸得团队鸡飞狗跳!本文为你揭示命名背后的“情商”与“薪商”,通过四大“军规”帮你彻底告别 processData 等废话代码,让你写的每一行都清晰体现业务价值。别再让命名成为你职业生涯的污点。点击查看,学习如何用命名将代码从“屎山”变成“名片”,告别无效加班!

2025-07-27 17:12:28 1081

原创 还在用System.currentTimeMillis()算耗时?求求你,快停手吧!

还在用 System.currentTimeMillis() 笨拙地测耗时?快别再忍受代码侵入、手忙脚乱的“上古”方法了!这篇文章将彻底颠覆你的性能排查习惯。我将揭示 currentTimeMillis 的“四宗罪”,并引出真正的神器——Spring StopWatch。你不仅能学会如何用它进行优雅的命名、分段计时,还能打印精美的统计报告。

2025-07-27 15:50:27 574

原创 别再把密码写在application.yml里了!这个神仙工具让你的 Spring Boot 配置又安全又优雅!

还在为application.yml中的密码泄露提心吊胆?还在手动切换不同环境的配置?本文为你介绍一个“神仙”工具dotenv-java,只需简单几步,就能将敏感配置安全地从代码中剥离,彻底告别硬编码!文章通过实战代码和原理解析,手把手教你如何让Spring Boot项目优雅地加载.env文件,实现配置与代码的完美分离,让你从此告别配置管理的噩梦,轻松拥抱更安全、更专业的开发方式。

2025-07-27 15:15:43 911

原创 Activiti modoler 整合后报错 TypeError: Cannot read property ‘namespace‘ of undefined

问题找了好久,一直以为是SpringSecurity请求限制没放开,所以找SpringSecurity的debug日志,浏览器请求有没有404、500、502等,结果一切正常,最后才想起来看浏览器控制台,然后百度一圈没有解决方案,只能自己慢慢找了。

2023-07-04 21:46:50 1405 10

原创 Uniapp引入彩色图标iconfont

执行完毕后,会出现一个文件夹,iconfont-xk857,进入iconfont-xk857文件夹下,复制iconfont-xk857-icon.css到项目。使用:其中xk857-icon开头是必须的,彩色图标当前对 vue文件有效,控制台会关于backgroud的相关警告,可忽略它。进入阿里巴巴矢量图标库https://www.iconfont.cn/,添加图标到项目,然后下载至本地。对下载的文件进行解压,命令行进入解压后的文件下,执行一下命令,全局安装iconfont-tools工具。

2023-02-20 22:35:07 660

原创 SpringBoot日志框架使用详解

几种常见的日志级别由低到高分为:TRACE < DEBUG < INFO < WARN < ERROR < FATAL 。如何理解这个日志级别呢?很简单,如果项目中的日志级别设置为INFO ,那么比它更低级别的日志信息 就看不到了,即是TRACE 、DEBUG日志将会不显示。

2023-02-20 22:21:53 720

原创 SpringBoot之DEBUG远程调试黑科技?

随着项目的体量越来越大,启动的时间的也是随之增长,甚至远程DEBUG更能反映出真实业务环境下可能出现的问题,毕竟平常开发大多在windows或mac环境,部署时使用的一般是linux,个别情况下的兼容问题可能是致命的,且非常难以排查,因此远程DEBUG就非常有必要。

2023-02-20 22:20:44 868

原创 @ConfigurationProperties才是YYDS,别再迷信@Value了!——盘点SpringBoot获取配置文件内容的几种方式

又是因为@Value!一个配置遗漏,引发P0级雪崩,整个团队被从床上薅起来,年终奖差点泡汤。别再迷信@Value的“简单”了,它的背后是难以维护的屎山和潜在的生产深渊。本文以一场真实的线上事故复盘,带你直击@Value的致命缺陷,并彻底掌握`@ConfigurationProperties`的正确姿势,从根源上杜绝此类灾难。更有加载自定义YML文件的独家秘笈,让你配置管理能力再升一级。避免下一个P0,从放弃滥用@Value开始。

2023-02-20 22:16:51 1251

原创 Nacos控制台显示注册成功,可视化web管理界面找不到服务?

比较建议的做法是,bootsrtap.yml配置cloud相关配置,nacos远程配置里删除cloud相关配置。创建namespace时ID和命名空间名可以相同,这样在配置文件中也就不用去配置生成的ID了,直接配置自己设置的即可。bootsrtap.yml指定了namespace,但是配置中心的配置文件指定的还是命名空间名称,也就是说系统根据。还有一种是时区问题,Nacos服务器和项目运行的电脑时间不一致,我没遇到这个问题,所有这里也不多说了。这应该是最常见的问题了,大多数小伙伴问题应该都出在这里。

2023-01-14 11:24:51 7823 4

原创 Docker中的网络模式

Docker的默认网络模式可以分为:Host 模式、Bridge 模式或者 None 模式。其中Bridge模式是创建容器默认的网络模式,Host模式和主机共享一个网络,None模式则代表无网络。

2023-01-12 11:19:42 1166

原创 使用Docker搭建主从数据库(MySQL)

很多人对主从数据库有一个误区,把多个MySQL搭建在同一个服务器上,性能提升是不是很有限?这个理念是错误的,数据库的性能瓶颈主要是在IO和CPU负载过高,在同一台服务器运行多个数据库,能带来更低的延迟,还能减少很多其他问题,如果不是数据量大到了一定程度,在同一台服务器上创建多个数据库带来的性能提示是非常可观的。

2023-01-09 17:19:55 1353

原创 java微信支付v3系列——9.微信支付之商家转账API

这里和发起创建支付订单的请求相似,因此不单独列出,首先是封装转账请求参数,然后是获取请求对象发起请求,完成签名验证发送请求,最后解析数据,如果转账失败则返回提示信息给用户。商家转账支持一次性多次转账,一次最多可以发起3000笔转账,估计是为了防止营销手段,所以该接口设置了QPS为50,注意自己的业务,别踩雷!这个功能就比较复杂了,首先是得有90天的资金流水才能开通,其次开通后还需要在官网进行配置,不能直接调用,并且限制了IP地址。那么数据可以理解为,转账说明,和详细说明。

2022-12-21 22:10:36 6010 7

原创 java微信支付v3系列——8.微信支付之退款成功回调

还记得WxPayCallbackUtil回调接口工具类吗,当时是用于支付成功的回调,我们接下来向里面添加一个退款成功的回调方法,在添加前我们先来做一个准备操作。more。

2022-12-21 22:09:15 4844 12

原创 java微信支付v3系列——7.微信支付之申请退款

不得不说,申请退款和创建订单是非常相似的,流程都一样,只是请求的数据变了,那么我们第一步就是封装请求数据成对象形式,方便后续调用。

2022-12-21 22:08:13 4438 2

原创 java微信支付v3系列——6.微信支付查询订单API

什么时候会用到这个API?常规情况下,回调接口已经足够我们使用,用户支付成功后,微信会自动调用我们的回调接口进行回调,那么还需要这个API吗?使用场景:微信服务器故障,我们的服务器故障,服务器端正在进行更新导致用户付款后端没有及时接收到微信的回调请求,那么此时我们就可以让用户点击按钮“更新支付状态”,此时再来调用这个API。来看一下下面的java对象,是不是很熟悉?没错,这个接口的返回数据和回调接口是一样的,我们直接拿来复用一下。

2022-12-21 22:05:35 5618 7

原创 java微信支付v3系列——5.微信支付成功回调

还记得WxPayCallbackUtil回调接口工具类吗,当时是用于支付成功的回调,我们接下来向里面添加一个退款成功的回调方法,在添加前我们先来做一个准备操作。

2022-12-21 22:04:00 17921 19

原创 java微信支付v3系列——4.创建订单的封装及使用

经过了微信支付之创建订单准备操作的准备操作,接下来我们就能够非常快速的开发出各种支付类型的创建订单接口。商户Native支付下单接口,微信后台系统返回链接参数code_url,商户后台系统将code_url值生成二维码图片,用户使用微信客户端扫码后发起支付,也就是说后端只需要返回code_url即可。使用方式也很简单,通过注入的方式获取到wxPayConfig和wxPayClient对象后,创建支付请求参数对象,调用刚刚编写的wxNativePay方法即可。

2022-12-21 22:02:50 5237 7

原创 java微信支付v3系列——3.订单创建准备操作

微信支付的下单操作分为了5种,分别是JSAPI、APP、H5以及Native支付及小程序支付,之所以将支付放在单独一个章节,而不是按照支付类型划分一个章节,是因为支付所传递的数据都是相似的,方便我们更好的封装。more本章节是支付编写支付前的准备操作,发送请求需要请求地址,用户支付成功后微信会通过我们传入的回调地址进行回调,这两个地址都通过枚举进行管理。然后就是方法的封装,如果都写在一个方法里面,代码冗余,毕竟发送请求的代码都很相似。

2022-12-21 22:00:48 4815 11

原创 java微信支付v3系列——2.微信支付基本配置

配置商户信息、证书、密钥等。将客户端对象构建到Bean中,方便后续使用。more我们可以使用官方提供的,帮助我们完成开发。实现了请求签名的生成和应答签名的验证。

2022-12-21 21:59:56 7120 1

原创 java微信支付v3系列——1.微信支付准备工作

准备工作即微信支付开发前,需要先获取商家信息,包括商户号、AppId、证书和密钥。

2022-12-21 21:51:11 5080 15

原创 Redis数据结构Bitmap实战之用户签到

前言bitmap就是通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态。一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。换句话来说它的优势是占用空间小、处理速度快业务分析我们可以设置Redis的key为user:sign:customerId:yyyyMM 那么可推出如下命令说明:签到天数从0开始,倒数第二位是偏移量代表天数,最后一位1代表已签到第一天签到:setbit user:sign:1001:202203 0 1第二天签到:setb

2022-03-02 16:31:06 1309

原创 全国城市信息的SQL文件

省市区的SQL地址:……包含乡镇的SQL文件地址:……

2022-01-21 09:44:28 1138 1

原创 一文看懂SpringCloudAlibaba组件

文章目录分布式架构理论CAP理论CAP里面下的注册中心选择思考BASE理论 - 一致性和可用性的权衡结果线上部署(Docker)环境部署部署Nacos部署Sentinel环境准备数据库准备使用Maven创建聚合工程引入MybatisNacos注册中心基本使用简单实现服务调用Ribbon负载均衡负载均衡Ribbon和OpenFeign负载均衡策略调整OpenFeign基本使用案例GET方式POST方式流量防卫兵-Sentinel基本使用流控的使用和规则使用流控规则效果熔断降级规则Sentinel自定义异常Se

2021-10-26 16:08:51 5714

原创 Vite+Vue3+Ts项目搭建(全套解决方案Vuex、VueRouter、elementplus、NaiveUI、全局深色模式、中英文切换)

Vite+Vue3+Ts项目搭建(全套解决方案Vuex、VueRouter、elementplus、NaiveUI、全局深色适配、国际化)使用Vite创建vue3+ts项目# 创建vite项目npm init @vitejs/app# 输入项目名称? Project name: » vite-devil-control# 然后选择vue (通过上下箭头切换,回车确定)# 然后选择vue或vue+ts集成 Vue-Router安装(两个任选其一)# router4.x版本npm in

2021-08-14 23:28:17 5115 2

原创 CSS也有设计模式?带你走进CSS架构设计

首先我个人是主学java的,所以用java来举例,尝试用后端的思想来理解前端。java是一门面向对象的语言,在java中我们可以使用继承来实现,不修改原有代码,对功能进行增强。在不改动原有样式代码的情况下,将下面第一个div的字体颜色改成红色。font-size;}

2021-07-27 15:18:04 437

原创 windows下MYSQL5.5升级到5.7

卸载MYSQL5.5服务中,关闭MYSQL服务,点击属性,查看mysql安装的位置,先记录,后面用控制面板里的增加删除程序内进行删除win+r-> regedit 看看注册表里这几个地方删除没有HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL目录删除HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\Eventlog\Applic

2021-07-23 13:52:34 3308 2

原创 如何设计新零售行业数据库?不懂SKU、SPU?带你走进数据库设计,用最容易理解的方式讲述数据库设计思想

数据库设计思想—使用新零售行业数据库带你走进数据库设计本篇文章会详细描述数据库设计中问题的解决思路,为什么不用其他方案都会说明。可能有的小伙伴只是想找数据库做参考,帮忙帮到底,点击下载概述像酒店管理系统,财务报表系统,在线教育系统的表设计相对来说是比较简单的,因为他的属性是固定的。比如在线教育的课程表,大致包含课程详情、价格、教师等信息,比较容易抽象出来。设计的难点在于要提前规划好可能会用到的属性,避免后期修改造成前后端大量改动,费时费力,而新零售系统的数据库设计可能会比你想想中困难一些,来举

2021-07-20 10:13:45 3377 2

原创 MySQL中国省份和城市数据(不包含县级数据)

省份表结构和数据CREATE TABLE `t_province` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键', `province` varchar(100) NOT NULL COMMENT '省份', `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除', PRIMARY KEY (`id`) USING BTREE, UNIQUE IN

2021-07-19 22:32:57 1979

原创 java增效系列—Guava常用工具集(不可变集合、集合工具、增强集合)

Guava使用前请先引用依赖<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.1.1-jre</version></dependency>不可变集合创建对象的不可变拷贝是一项很好的防御性编程技巧。优点:当对象被不可信的库调用时,不可变形式

2021-07-18 15:12:00 575

原创 java增效系列—jdk8新特性之Optional优雅处理null值情况

Optional三种创建optional对象方式public void test01(){ // 1.创建空optional Optional.empty(); // 2.使用非null值创建optional对象,使用null会报错 Optional.of("test"); // 3.可以使用任意值创建 Optional.ofNullable(null);}正常引用和引用缺失情况下的使用public void test01() { Op

2021-07-18 10:16:17 614

原创 java增效系列—高效关闭资源

资源关闭传统的资源关闭写法先来体验一下传统的资源关闭方式,注意 finally 类中的代码,其繁琐程度大家体验一下@Testpublic void copyFile() { // 定义输入路径和输出路径 String originalUrl = "lib/FileCopyTest.java"; String targetUrl = "targetTest/target.txt"; // 声明文件输入流,文件输出流 FileInputStream origin

2021-07-18 09:41:47 308

原创 Steam流编程—jdk增效锦集

Stream流编程Stream流编程—创建相关方法集合Collection.stream/parallelStream数组Arrays.stream数字lntStream/LongStream.range/rangeClosed数字Random.ints/longs/doubles自定义Stream.generate/iterate测试public static void main(String[] args) { // 从集合创建

2021-07-17 22:52:22 293 3

空空如也

空空如也

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

TA关注的人

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