Spring Boot

搜索结果

在博客中搜索相关文章

79 篇文章 7

SpringBoot中ThreadLocal的妙用:原理、实战与避坑指南

文章介绍了 ThreadLocal 在 SpringBoot 中的原理与实战。ThreadLocal 通过 ThreadLocalMap 为每条线程提供私有存储,键采用弱引用避免泄漏,但若不在 finally 中调用 remove(),值仍会残留导致内存泄漏。示例展示在 Filter/Interceptor 中设置用户信息或 TraceID,业务层可直接通过封装的 Holder 获取,省去层层传参。随后列出四大常见坑:①忘记 remove 导致内存增长;②子线程无法继承导致上下文缺失;③初始化时空指针;④事务/异步场景上下文丢失。对应解决方案包括:在 finally 中强制 remove、使用 InheritableThreadLocal 或阿里 TransmittableThreadLocal、懒加载或显式传参。最后强调使用原则——及时清理、限定作用域、在复杂并发场景选用合适工具,才能安全高效地利用 ThreadLocal。

面试篇【二】

本文系统梳理了面试常见的网络、操作系统、Java 并发、JVM、微服务等知识点。包括 TCP 与 UDP 的区别、四次挥手原理、计算机加电流程、Linux 设备文件、同步方式(synchronized、volatile、Lock 等)及可重入锁概念;线程创建、返回值获取、线程池的四种实现、核心参数与拒绝策略;Java8 新特性(Lambda、Stream、Optional 等)及其优缺点;多线程使用场景、并发问题、MyBatis SQL 绑定、虚拟内存工作原理、栈/方法区溢出、类加载五阶段;ThreadLocal 实现原理与典型应用;微服务的定义与特征;以及 MySQL 事务的 ACID 特性。全文突出概念解释与实际应用场景。

一次OOM排查实录

线上博客进程日志突止,经排查发现是 Linux OOM Killer 在内存耗尽时强制 kill‑9。根因是 2 GB 机器上跑 3 个未限制堆的 Spring Boot、MySQL 8.0 等,JVM 默认占近 3 GB,MySQL 参数占用大量内存且无 Swap。通过为每个 JVM 设置 -Xms/-Xmx、调小 MySQL 缓冲池、连接数等并新增 2 GB swap,内存使用恢复正常,服务不再被 OOM 杀死。经验:小内存务必限制 JVM、精调 MySQL、配置 swap,必要时迁移数据库或升级机器。

实现异步天气数据获取与Spring缓存集成

本文介绍在 Spring Boot 中通过 @Async 实现天气数据的异步获取,并使用 @Cacheable 将结果缓存,降低对高德天气 API 的重复调用。示例代码演示了获取客户端 IP、解析地区、调用高德地理编码和天气接口、处理返回数据并把天气信息写入模型。文中说明了自定义 IP 解析工具、API Key 替换、RestTemplate/ WebClient 选择以及项目需引入 Spring Cache 与 Spring Web 的前置条件。结合异步与缓存后,可提升响应速度、减轻服务器负载、改善用户体验。

操作系统(一)

文章列举了Linux常用运维命令及用法,包括ps/grep查看进程和日志、grep的参数与正则表达式用法、hostname 与 hostnamectl 修改主机名、@reboot 或 rc.local 实现开机自启、free 与 top 查看内存、free 的常用选项,以及 tar、gzip、bzip2、compress、zip 等压缩/解压命令的基本语法和常用参数。

JVM(一)

JVM由类加载器、运行时数据区、执行引擎和本地接口四部分构成。运行时数据区包括程序计数器、虚拟机栈(及本地方法栈)、堆、方法区和运行时常量池。JVM启动先装载JRE、装入JVM动态库、初始化并创建JNIEnv,随后加载并解释class或jar文件,执行引擎将字节码翻译为机器指令。程序计数器负责指令流控制,栈用于方法调用和本地方法。内存划分决定对象、类元数据及常量的存放位置,内存不足时抛出相应异常。类加载经历加载、验证、准备、解析、初始化等阶段。

使用Java代码制作二维码(超级简单)

本文介绍使用 Java 生成二维码的流程,推荐开源 ZXing 并给出 Maven 依赖。四步完成:配置字符集、容错、边距等 EncodeHintType;使用 QRCodeWriter 编码为 BitMatrix;用 MatrixToImageWriter 输出 PNG;可通过 Graphics2D 添加 Logo、定制颜色。提供 QRCodeService 封装及 Spring Boot 控制器实时返回图片示例,并列出乱码、识别率、性能等注意事项和典型应用场景。掌握后即可快速生成、定制并部署二维码。

SpringBoot绕过Nginx代理获取客户端真实IP的解决方案

本文介绍在 SpringBoot 项目中通过 Nginx 代理获取客户端真实 IP 并解析其归属地的实现方案。首先在 Nginx 配置 `X-Real-IP` 与 `X-Forwarded-For` 头部,将真实 IP 传递给后端;随后编写 `IpUtil` 工具类,从请求头或 `request.getRemoteAddr()` 读取 IP;引入 `ip2region` 库并在资源目录放置 `ip2region.db`,使用 B‑tree 算法查询 IP 对应的省、市或国家信息;最后在控制层调用 `IpUtil.getIpAddr` 与 `IpUtil.getIpPossession`,将解析结果显示在评论区,实现博客评论的 IP 属地展示。

设计模式

本文围绕面向对象的设计原则与常用设计模式展开。概述了六大原则:单一职责、里氏替换、依赖倒置、接口隔离、迪米特(最少知识)和开闭原则,阐明其含义及对高内聚、低耦合、可复用、可维护和可扩展性的促进作用。随后给出单例模式的实现示例,包括饿汉式、懒汉式及其线程安全写法。最后介绍工厂模式的概念及实现,分别展示了简单工厂、工厂方法的代码结构,说明了工厂模式在把对象创建职责抽象化、解耦客户端与具体实现方面的价值。

Redis实战常见问题与解决方案

Redis在Java项目中常见的穿透、击穿、雪崩等缓存问题,可通过布隆过滤、互斥锁或逻辑过期、随机TTL等手段防御;为保证缓存与库的一致性,采用延迟双删或基于消息队列的最终一致方案;大key导致内存压力时,可拆分分片或使用合适的数据结构;通过配置allkeys‑lru、合理的maxmemory‑policy 以及 Jedis 连接池的 maxTotal、maxIdle、testOnBorrow 等参数,提升内存管理和连接稳定性。整体提供了代码示例和实践要点,帮助开发者在实际使用 Redis 时避免性能瓶颈和数据错误。

面试现场【MQ篇】

本文梳理了十个常见的消息队列面试题及要点:阐述了 MQ 的概念和 RabbitMQ、RocketMQ、Kafka 等主流中间件;列举了应用解耦、流量削峰、异步处理、消息通信、远程调用等典型场景;重点说明了生产者、存储端和消费者三阶段如何防止消息丢失、实现同步刷盘和复制、确保消费成功;介绍了保证顺序消费的分区/单线程策略及局部有序实现方式;讨论了重复消费的可能性及基于唯一标识或 Redis 的幂等方案;提供了排查与扩容、分批消费等应对消息积压的思路;对 Kafka、RocketMQ、RabbitMQ 在吞吐、语言、持久化、顺序、集群等方面进行对比选型;解析了基于副本选举的高可用机制;说明了事务消息的两段提交流程以保证数据一致性;最后给出设计自研 MQ 时应考虑的整体流程、RPC、持久化、消费模型、高可用、事务与伸缩等关键要素。

面试篇【三】

文章讨论Java面试常见知识点,包括GC根对象及不可达对象的回收机制、字符编码体系与UTF‑8中文字节数、静态代理与动态代理的区别、异常体系及Checked/Unchecked划分、方法解析与分派(静态/动态)、equals/hashCode的使用规则、实现多态的必要条件、对象序列化方式、反射的原理与用法、注解的定义与元注解、泛型的擦除实现、String不可变的原因与内部实现、Redis六大数据结构及适用场景、缓存穿透/击穿/雪崩的防护方案,以及Kafka、RabbitMQ、RocketMQ在性能、可靠性和可用性方面的对比。