- 博客(44)
- 收藏
- 关注
原创 chain.doFilter(servletRequest, servletResponse)的作用是
场景是否调用含义静态资源 / 首页✅ 是不需要鉴权,继续处理白名单 API✅ 是允许匿名访问,继续处理Token 有效✅ 是设置用户上下文,交给业务逻辑处理Token 无效或缺失❌ 否返回错误,终止请求💡 简单说:chain.doFilter(...)就是“让请求继续走下去”的开关。
2026-01-04 15:11:50
365
原创 MDC(Mapped Diagnostic Context)来存储和管理请求 ID
问题回答为什么没用?因为MDC内部已经用了,无需重复。这样安全吗?在同步请求处理中是安全的、线程隔离的。有什么隐患?异步/多线程场景下MDC不会自动传递,需额外处理。当前实现是否合理?对于大多数 Web 应用(无复杂异步),完全合理且推荐。
2026-01-04 14:10:49
302
原创 Filter 的加载机制 和 Servlet 容器(如 Tomcat)的请求处理流程
关键点说明Filter 是 Servlet 规范的一部分所有请求必须先经过 Filter 链Spring Boot 自动注册 Filter通过或@WebFilter执行顺序由 Order 决定数字越小越先执行AuthFilter 在 Order=3 位置在它之前的 Filter 已执行,之后的还没执行认证失败可中断链路不调用即可阻止请求到达 Controller。
2026-01-04 11:07:47
657
原创 进程和线程举例
进程是操作系统进行资源分配和调度的基本单位。一个进程拥有独立的内存空间、代码、数据和系统资源(如打开的文件、网络连接等)。线程是进程内的执行单元,是 CPU 调度的基本单位。一个进程可以包含多个线程,它们共享进程的内存和资源(如全局变量、打开的文件等),但每个线程有自己的栈和程序计数器。特性进程(Process)线程(Thread)资源占用较大(独立内存空间)较小(共享进程资源)创建开销大小通信方式需 IPC(管道、消息队列等)直接读写共享内存(需同步)独立性。
2026-01-03 11:28:55
354
原创 Netty 与 Spring Boot + HTTP 客户端(如 RestTemplate、WebClient)应用场景区别
协议支持 任意二进制/文本协议(HTTP、WebSocket、MQTT、自定义等) 主要面向 HTTP/HTTPS(部分支持 WebSocket)生态集成 需自行构建(如鉴权、监控、日志) 自动集成 Spring 生态(Actuator、Security、OpenFeign 等)抽象层级 低层(操作 ByteBuf、Channel、EventLoop) 高层(操作对象、URL、注解)编码复杂度 高(需处理粘包/拆包、编解码、生命周期等) 低(一行代码发请求,自动序列化)
2025-12-31 15:19:55
516
原创 Gbps和GBS的区别和用途
Gbps”和“GB/s”(注意大小写)是两个常被混淆但含义完全不同的单位,它们分别用于衡量数据传输速率的不同方面。GB/s Gigabytes per second 每秒千兆字节(Byte) 1 GB/s = 10⁹ Bytes/s。❌ 把“1 Gbps 网络”误认为能跑“1 GB/s 下载速度” → 实际只有 125 MB/s。以太网标准:10/100/1000 Mbps(即 1 Gbps)、10 Gbps 网卡。存储用大写 B(Byte):MB/s、GB/s。因此:1 GB/s = 8 Gbps。
2025-12-24 10:56:53
236
原创 @Scheduled注解使用
它的作用是在上一次任务执行完成后,延迟指定的时间(这里是 5000 毫秒,即 5 秒)再执行下一次任务。→ 无论上次任务是否完成,每 5 秒从上一次任务开始时间点触发下一次。可能导致任务重叠(如果任务执行时间 > 5 秒),除非使用 @Async 或配置线程池。10:00:07 第二次任务开始(因为 fixedDelay = 5s,从上一次结束算起)⚠️ 注意:fixedDelay 是基于任务完成时间计算的,而不是任务开始时间。任务执行完毕 → 等待 5 秒 → 再次执行任务 → 循环往复。
2025-12-23 13:54:35
268
原创 一个接口可以有多个实现类
一个接口可以有多个实现类(或实现),这是面向对象编程(OOP)中“多态性”的核心体现之一。在 Java、C#、Go、TypeScript 等支持接口的语言中,这种设计非常常见。在微服务或插件系统中,可能通过 SPI(Service Provider Interface,如 Java 的 ServiceLoader)或配置中心动态加载实现。接口定义的是行为契约(what to do),而具体实现类决定如何做(how to do)。具体用哪个实现,应该由外部配置、上下文或容器决定,而不是在业务逻辑中硬编码。
2025-12-23 13:54:04
243
原创 一个接口可以有多个实现类
一个接口可以有多个实现类(或实现),这是面向对象编程(OOP)中“多态性”的核心体现之一。在 Java、C#、Go、TypeScript 等支持接口的语言中,这种设计非常常见。在微服务或插件系统中,可能通过 SPI(Service Provider Interface,如 Java 的 ServiceLoader)或配置中心动态加载实现。接口定义的是行为契约(what to do),而具体实现类决定如何做(how to do)。具体用哪个实现,应该由外部配置、上下文或容器决定,而不是在业务逻辑中硬编码。
2025-12-19 17:18:26
445
原创 Java Stream API的map方法
在 Java Stream API 中,map 的作用是将流(Stream)中的每个元素按照指定的函数进行转换,生成一个新类型的流。
2025-12-15 10:42:38
64
原创 LAMBDA的排序写法和方法引用(类名::成员)使用规范
使用 .sorted((a, b) -> Double.compare(a.rating, b.rating))→ 比较 4.5 vs 3.8 → 正数 → item1 排在 item2 后 → [3.8, 4.5](升序)使用 .sorted((a, b) -> Double.compare(b.rating, a.rating))→ 比较 3.8 vs 4.5 → 负数 → item1 排在 item2 前 → [4.5, 3.8](降序)实例方法:String::length。更简洁的写法(推荐)
2025-12-15 10:30:13
183
原创 MyBatis-Plus 的默认命名转换规则
如果你的数据库列名遵循标准的下划线命名规范(vip_id),就不需要这个注解。但因为你的数据库列名使用了驼峰命名(vipId),所以必须用 @TableField 明确告诉 MyBatis-Plus:“别自动转换了,我的数据库列名就叫 vipId”。所以必须使用 @TableField(value = “vipId”) 来显式指定数据库的真实列名是 vipId,覆盖 MyBatis-Plus 的默认转换规则。但你的数据库设计中,列名本身就是:vipId(保持驼峰命名,而不是 vip_id)
2025-12-09 14:06:55
217
原创 logback-spring.xml优先级更高
应用启动 ↓Logback初始化 → 查找 logback.xml(如果存在会加载) ↓Spring Boot启动 ↓LoggingSystem初始化 → 查找 logback-spring.xml ↓如果找到 logback-spring.xml → 重新初始化并覆盖之前的配置 ✅ ↓最终生效:logback-spring.xml。设计目的:logback-spring.xml 是Spring Boot为了增强Logback功能而设计的。🔍 为什么这样设计?
2025-12-08 15:38:45
358
原创 Spring Boot 的核心目标
这是一个非常好的收尾问题!Spring Boot 的核心目标是 “约定优于配置” + “开箱即用”,但要真正用好它,除了基础注解和启动类,还有一些关键概念和最佳实践值得你掌握。
2025-12-08 15:12:43
549
原创 RestTemplate.exchange使用格式实例
RestTemplate.exchange() 是 Spring Framework 中用于发送 HTTP 请求并获取完整响应(包括状态码、响应头和响应体)的方法。它支持所有 HTTP 方法(GET、POST、PUT、DELETE 等),并且可以处理泛型类型,非常适合需要精细控制请求/响应的场景。requestEntity 封装请求头(headers)和请求体(body)的对象,可为 null(如 GET 请求)url 请求的 URL,可以包含占位符(如 /users/{id})
2025-11-20 16:41:40
671
原创 K8s修改deployment的三种方式
在 Kubernetes 中修改一个已存在的 Deployment 有多种方式,以下是 最常用、安全且推荐 的几种方法:✅ 方法一:使用 kubectl edit(交互式在线编辑)这是最直接的方式,适合临时或小范围修改:bash编辑会打开默认编辑器(如 vi)。修改 .spec 下的内容(如 replicas、containers.image、env、resources 等)。保存退出后,Kubernetes 会自动触发 滚动更新(Rolling Update)。
2025-10-22 17:04:04
895
原创 查看数据库用户的权限
输出通常包括该用户被授予的所有权限,例如对特定数据库或表的 SELECT、INSERT、UPDATE 等操作权限,以及是否具有 GRANT OPTION。在大多数默认安装中,这个用户拥有所有权限(ALL PRIVILEGES)并带有 WITH GRANT OPTION。查看用户名为 my_app_user、允许从任意主机(% 表示通配符,代表任何主机)连接的用户的权限。查看本地 root 用户(仅限从 localhost 连接)的权限。
2025-10-14 15:07:14
168
原创 Java 对象的字段或属性进行数据校验
Pattern(regexp) 字符串需匹配正则表达式 @Pattern(regexp = “^1[3-9]\d{9}$”) String phone。@Size(min, max) 长度/大小在 [min, max] 之间 @Size(min=2, max=20) String name。@Max(value) 数值 ≤ value @Max(150) int age。@Min(value) 数值 ≥ value @Min(0) int age。普通 Java 对象赋值 ❌ 不会自动触发 否。
2025-09-30 10:38:24
132
原创 curl命令参数详解
curl -w “状态码: %{http_code}\n总耗时: %{time_total}s\n” -o /dev/null -s https://example.com。-d <数据> --data <数据>:发送 POST 数据(默认 Content-Type: application/x-www-form-urlencoded)所有选项都可以用 --help 查看:curl --help 或 curl --help all。
2025-09-23 19:16:07
741
原创 docker和K8s修改yaml文件后起服务
✅ Kubernetes deployment.yml, service.yml, configmap.yml 等 kubectl apply -f xxx.yml。✅ Docker Compose docker-compose.yml docker-compose up -d 或 docker-compose restart。✅ CI/CD 流水线 .gitlab-ci.yml, Jenkinsfile 重新触发流水线(push / merge / 手动 run)
2025-09-22 17:17:09
219
原创 聚集索引(Clustered Index)和非聚集索引(Non-Clustered Index)
聚集索引(Clustered Index)和非聚集索引(Non-Clustered Index)是两种不同的索引类型,它们在数据存储和访问方式上有显著的区别。定义:非聚集索引中的数据与原始数据表的数据之间没有直接关联,即它不会影响数据的实际存储顺序。由于数据按索引键的顺序存储,可能导致页分裂(page splits),特别是在高并发写入的情况下。唯一性:每个表只能有一个聚集索引,因为数据行的物理顺序只能由一个索引来决定。对于按照索引列值顺序查询的数据检索非常高效,因为它直接反映了数据的存储顺序。
2025-09-19 11:10:09
268
转载 云原生组成
k8s是整个云原生的基石,云原生的整个生态体系都是依靠k8s建立起来的。容器、微服务、服务网格(服务发现等)、不可变基础设施、声明式API。服务网格是微服务的辅助,建立在k8s上的针对请求的扩展功能。容器(Container)是k8s的底层引擎。Docker是应用最广的容器工具。不可变基础设施是现代运维的基石。声明式API是k8s的编码方式。微服务是docker的好搭档。
2025-09-16 20:12:54
35
原创 Keepalived + HAProxy实现APISIX的高可用访问入口和路由配置
安装keepalive,配置主备节点的keepalive.config,keepalive为HA的VIP提供高可用保障,可以飘到健康的节点,实现高可用。#以上的ACL就是url中包含服务名,就会转到对应的后端,实现路由配置。
2025-09-16 20:05:48
248
原创 Linux、Windows、PowerShell换行符\ ^ `
只在 Shell 环境中有效(如 Linux 终端、macOS Terminal、WSL、Git Bash)\ 的作用是让 Shell 知道“命令还没完,下一行接着”,用于把长命令分成多行写,方便阅读和修改。如你是在写脚本或经常调试 API,掌握 \ 的使用会让你的命令更整洁、专业、易维护。你可以在终端里直接粘贴带 \ 的多行命令,它会自动拼接成一行执行,完全等效!\ 后面不能有任何字符(包括空格),必须紧跟换行。🎯 作用:让长命令“换行写”,提高可读性。“这一行还没结束,下一行是它的延续”
2025-09-15 16:03:23
500
原创 Spring Boot配置
在这些文件中,查找与日志文件大小、保留天数、最大文件数相关的配置项。保留30天的历史日志,或总大小不超过 3GB。每天或文件达到100MB时轮转。
2025-09-15 15:57:24
214
原创 为什么需要 @JsonValue和@JsonCreator
如果你将来想改枚举名,但不想破坏 API(比如把 SOURCE_IP → SRC_IP),你仍可保持 sessionPersistence = “SOURCE_IP”,对外接口不变。告诉 Jackson:序列化这个枚举时,不要用枚举的 name(如 SOURCE_IP),而是用我指定的字段值(如 “SOURCE_IP” 字符串)。传入 “source_ip”、“Source_IP”、“SOURCE_IP” 都能正确识别 → 提升前端/用户友好性。
2025-09-11 15:38:50
979
原创 JVM调优简单易懂的实例
最近用户量增长,系统频繁出现 GC 停顿长(卡顿)、甚至 OOM(OutOfMemoryError),影响用户体验。这是最原始的启动方式,JVM 会使用默认参数(不同版本默认值不同,通常堆很小,GC 策略也不适合生产)。对于 8G 以内堆 + 追求低延迟,推荐 G1 GC(JDK8u40+ 支持,JDK9+ 默认)✅ 通过这个实例,你已经掌握了 JVM 调优的核心思路:设内存、选GC、定目标、看日志、持续调。✅ 好处:对象在新生代多“活几轮”,减少进入老年代的速度,从而减少 Full GC。
2025-09-10 16:09:39
385
原创 Java的Lambda 表达式
在 Java 中,Lambda 表达式 是 Java 8 引入的核心新特性之一,主要用于简化 函数式接口(Functional Interface) 的实现。Lambda 表达式是 Java 函数式编程的基石,掌握它能让你写出更现代、更简洁、更优雅的 Java 代码!集合排序 list.sort((a,b) -> a.compareTo(b))逻辑复杂时建议使用普通方法。.map(n -> n * n) // 平方。
2025-09-09 10:36:41
654
原创 一个非常简单易懂的spring异步编程的小例子
用 @Async 标记异步方法,返回 CompletableFuture,用 allOf().thenApply() 合并结果 —— 简单、高效、不阻塞!避免卡死 Controller 里不要直接 .get() 或 .join(),而是返回 CompletableFuture 给 Spring 处理。✅ 异步并行:查用户(1秒)+ 查订单(2秒)同时开始 → 总共 2 秒。获取结果 用 .join()(在 .thenApply 里用是安全的)❌ 串行:查用户(1秒)→ 查订单(2秒)→ 总共 3 秒。
2025-09-08 19:45:17
268
原创 CompletableFuture的各类方法
CompletableFuture cf2 = CompletableFuture.runAsync(() -> System.out.println(“无返回值”));CompletableFuture f2 = CompletableFuture.supplyAsync(() -> “订单123”);CompletableFuture f1 = CompletableFuture.supplyAsync(() -> “张三”);
2025-09-08 19:43:35
300
原创 APISIX在K8s中的使用,主要是修改路由
kubectl get apisixroutes -n kubectl get apisixroute my-route -n -o yamlkubectl edit apisixroute my-route -n kubectl edit apisixroute my-route -n kubectl get apisixroute my-route -n -o yaml > my-route.yamlkubectl apply -f my-route.yaml
2025-09-05 14:54:22
213
原创 调用接口504 GATEWAY TIMEOUT
修改Haproxy或者APISIX的服务端和客户端的超时时间可以解决。可以看下调用neutron,解绑IP或绑定IP的时间是否过长。一般是API server的超时时间设置太短造成的。
2025-09-05 14:19:33
113
原创 数据库不允许NULL和mybatis处理
✅ 显式设置 maxAllocatePercent 默认值 该字段总是有业务默认值 ⭐⭐⭐⭐⭐。✅ 动态 SQL 控制插入 字段可选,有时需要覆盖默认值 ⭐⭐⭐⭐☆。✅ 从 SQL 中移除该字段 你希望始终用数据库默认值 ⭐⭐⭐⭐☆。修改字段允许 NULL 不推荐,除非业务需要。方案 适用场景 推荐度。
2025-09-04 15:14:47
93
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅