- 博客(39)
- 收藏
- 关注
原创 为什么系统性能瓶颈无法靠扩配置解决?从三条黄金定律谈起
分布式系统性能优化不应简单依赖资源扩容。三大定律揭示了性能瓶颈的结构性本质:利特尔定律指出延迟微小增加会引发排队剧增;阿姆达尔定律表明串行处理环节构成性能天花板;通用可扩展性定律说明高并发下资源竞争和一致性开销会导致扩容效果递减甚至负增长。有效解决方案应从重构系统结构入手:减少串行点、降低延迟、优化竞争策略、采用最终一致性等。理解这些底层规律,才能在高并发场景下实现真正的弹性扩展。
2025-11-19 12:02:49
472
原创 Server-Sent Events 详解
SSE 是最轻量的实时推送基于 HTTP 长连接,无需升级协议浏览器自动重连,不用写复杂 JSWebFlux 返回 Flux 就能天然变成 SSE实际应用要注意心跳、速率控制、多客户端广播分布式环境要处理负载均衡和事件一致性状态流(AI token、日志、构建进度)非常适合 SSE。
2025-11-17 19:00:00
697
原创 设计模式之观察者模式
观察者模式是一种行为型设计模式,用于建立对象间一对多的依赖关系,当被观察者状态变化时自动通知所有观察者。其核心思想是解耦数据变化与响应行为,通过注册机制实现动态绑定。Spring框架中的事件机制是对观察者模式的典型实现,包含事件发布、监听和广播三个核心组件,支持同步/异步处理。该模式适用于用户注册、订单支付等需要业务解耦的场景,常与工厂模式、策略模式等配合使用,是事件驱动架构的基础。相比责任链、中介者等模式,观察者模式更侧重广播通知的特性。
2025-11-12 09:14:07
1039
原创 Colima 入门
摘要:Colima是一款轻量开源的容器工具,专为macOS设计,替代资源占用高的Docker Desktop。它基于Lima虚拟机运行Linux容器,支持Docker CLI和containerd,性能优于传统方案。通过VirtioFS实现高效文件共享,支持私有仓库证书配置、Kubernetes集成(k3s)和灵活的资源分配。核心优势包括:自由开源、低资源消耗、CLI优先设计,适合开发者构建本地测试环境。
2025-10-23 11:23:06
799
原创 maven-jlink-plugin入门
JDK9模块化系统(JPMS)将JDK拆分为模块,支持定制化JRE。maven-jlink-plugin作为Maven对jlink的封装,自动化完成模块依赖分析、镜像生成和依赖管理。它能生成精简的独立运行时镜像(可小至30MB),支持与jpackage集成打包为安装包或Docker镜像。该插件需基于模块化项目(需module-info.java),通过配置可优化镜像体积,适合云原生场景。
2025-10-09 16:44:52
452
原创 模块化模式
模块化设计通过划分高内聚、低耦合的单元来管理复杂系统,核心价值在于控制复杂度、支持并行开发和提升复用性。设计遵循单一职责、显式依赖等原则,合理划分边界。实现时可选择模块化单体或微服务,需注意接口契约、依赖管理和可观测性。从单体迁移需渐进式推进,避免常见反模式。模块化虽增加短期成本,但能显著提升系统的长期可维护性和演化能力,是应对软件复杂性的有效策略。
2025-10-09 10:17:53
949
原创 docker 跨架构兼容
探讨了Docker跨架构兼容性问题及解决方案。在ARM架构设备上构建的容器无法直接在x86架构Linux运行,可通过两种方式解决:1)使用docker buildx构建多架构镜像(支持amd64/arm64),需推送到远程仓库;2)指定平台构建单架构镜像(如amd64)。文中详细介绍了构建命令、注意事项(基础镜像选择、本地测试、缓存处理等)及不同方案的优缺点。多架构镜像是官方推荐方案但构建复杂,单架构方案简单直接但功能有限。开发者可根据实际需求选择合适方法实现跨平台部署。
2025-09-29 09:21:14
949
原创 JAVA 25新功能介绍
Java 25是2025年9月发布的LTS版本,相比Java 21在多方面进行了优化升级。主要改进包括:语言层面新增原始类型模式匹配、灵活构造函数体等语法特性;性能方面引入AOT方法剖析和对象头压缩优化,提升启动速度和内存效率;可观察性增强JFR的CPU时间剖析能力;新增ScopedValues替代ThreadLocal,更适合虚拟线程场景;安全方面标准化了KDF API和PEM编码支持。但这些优化中部分特性仍处于预览或实验阶段,升级需谨慎评估兼容性和性能影响。建议生产环境先仅启用稳定特性,并做好全面测试验
2025-09-28 09:55:48
1294
原创 java 轻量级对象审计工具-JaVers
Javers是一个Java对象审计和差异比较框架,能高效比较对象状态变化并生成变更记录。它支持递归比较对象图、集合差异分析,提供快照存储和审计历史查询功能。通过Maven引入依赖后,可快速实现对象比对(如javers.compare())和变更记录(如diff.prettyPrint())。高级特性包括字段忽略、自定义比较器和SpringBoot集成,适用于配置比对、审计日志等场景。相比同类工具,Javers更专注于对象关系与审计能力,适合需要版本管理和变更追踪的系统。
2025-09-15 11:50:40
849
原创 响应式客户端 WebClient详解
摘要: WebClient是Spring5提供的非阻塞响应式HTTP客户端,基于Reactor实现异步I/O,支持Mono/Flux响应流,适用于微服务、API网关等高并发场景。相比RestTemplate,它具有非阻塞、自动编解码、背压机制等优势。文章详解了WebClient的创建、请求构建(GET/POST/文件上传)、响应处理(Mono/Flux转换)、错误处理机制,以及连接池配置、拦截器、SSE流式处理等高级功能。最佳实践包括单例复用、资源
2025-09-10 14:44:22
1246
原创 Reactor 入门及实践
Reactor是一个完全非阻塞的JVM响应式编程基础,有着高效的需求管理(背压的形式)。它直接整合Java8的函数式API,尤其是Stream,还有Duration。提供了可组合的异步化序列API —Flux(对于 0...N个元素) andMono(对于 0或1元素) — 并广泛实现响应式Stream规范。非阻塞:不用线程等待 I/O,提升资源利用率。声明式:数据流和操作通过链式调用拼装。背压:下游可以控制上游生产速率,避免“洪水”。等就是基于 Reactor 的。
2025-09-01 17:45:52
854
原创 Java响应式编程
本文介绍了Java响应式编程的核心概念与实现。响应式编程采用函数式+事件驱动机制,通过Publisher/Subscriber模型实现非阻塞数据流处理,核心特性包括背压机制、丰富操作符和异步调度。主流实现有Reactor、RxJava等,其中Reactor的Mono/Flux成为Spring生态标准。相比传统命令式编程,响应式在IO密集型场景下能用更少线程支撑更高并发,但存在学习曲线陡峭、调试困难等问题。
2025-08-27 11:40:04
1038
原创 springboot源码解析之配置管理
SpringBoot配置管理体系解析:通过Environment聚合多种配置源(命令行、环境变量、配置文件等),由ConfigFileApplicationListener加载application.yml/properties并按优先级排序存储。关键注解处理包括:@Configuration由ConfigurationClassPostProcessor解析,@Value通过AutowiredAnnotationBeanPostProcessor注入,@ConfigurationProperties利用B
2025-08-25 19:28:11
670
原创 spring async 入门到精通
本文介绍了Java中异步线程池的应用及Spring框架下的实现方式。异步线程池适用于IO请求、消息消费等场景,能减少主线程阻塞、提升吞吐量。Spring通过@EnableAsync开启异步支持,推荐使用ThreadPoolTaskExecutor配置线程池,并支持CompletableFuture等返回值类型。文章分析了Spring异步处理的源码实现,包括代理生成和任务拦截机制,并提供了最佳实践建议:合理配置线程池参数、使用CompletableFuture、处理异常和上下文传递、实现优雅停机和线程池隔离等
2025-08-22 17:09:38
717
原创 设计模式之装饰模式
摘要:装饰模式是一种结构型设计模式,通过动态包装对象来扩展功能,避免类爆炸问题。Java I/O库中的BufferedInputStream和DataInputStream就是典型应用,通过组合方式增强原始流功能。该模式遵循开闭原则,但多层装饰可能影响性能。与代理模式的区别在于:装饰模式侧重功能增强,代理模式侧重访问控制。
2025-08-22 11:35:25
1008
原创 Spring Cloud LoadBalancer 最佳实践
摘要: Spring Cloud LoadBalancer(SCLB)是Spring官方推出的新一代客户端负载均衡器,用于替代Netflix Ribbon。相较于Ribbon,SCLB采用轻量化、响应式设计,深度集成Spring生态(如WebClient、Reactor),支持非阻塞调用和灵活的策略扩展。核心差异包括:SCLB基于函数式编程(如ServiceInstanceListSupplier和ReactorServiceInstanceLoadBalancer),与Feign、DiscoveryCli
2025-08-18 17:16:14
1254
原创 ThreadPoolExecutor 最佳实践
高 3 位表示线程池状态(RUNNING/SHUTDOWN/STOP/TIDYING/TERMINATED)(LinkedBlockingQueue 默认无界 → maximumPoolSize 失效)线程池被 Spring 代理关闭 → 任务丢失(需显式。(不同任务用不同线程池,避免互相阻塞)任务执行时间过长 → 队列堆积,延迟高。(控制并发度、任务队列、拒绝策略)核心业务与非核心业务用不同线程池。→ 直接创建新线程执行任务(→ 尝试创建非核心线程(,封装了线程对象和首个任务。
2025-08-14 14:51:09
638
原创 JDK 9~17 新特性及升级建议
Java模块化演进与性能优化 摘要:JDK9引入的模块化系统(JPMS)彻底改变了Java的依赖管理方式,通过module-info.java声明模块依赖和导出,实现更好的封装性和隔离性。JDK10-17持续优化性能特性,如AppCDS通过类元数据共享显著提升启动速度,支持动态归档生成。新一代GC(ZGC/Shenandoah)提供低延迟选择,而Records、文本块等新语法简化开发。迁移时需注意内部API封装加强带来的兼容性问题,建议新项目直接采用模块化架构,旧项目可逐步迁移。
2025-08-12 16:39:40
835
原创 PreparedStatement vs Statement 深度对比 (postgresql)
JDBC接口中Statement与PreparedStatement在PostgreSQL实现中存在显著差异:Statement每次执行需拼接完整SQL字符串,导致重复解析开销且存在SQL注入风险;PreparedStatement通过参数绑定提高安全性,并利用缓存机制优化性能。PostgreSQL JDBC驱动通过prepareThreshold参数控制服务端预编译时机,当执行次数达到阈值后切换为ExtendedQueryProtocol,复用执行计划提升效率。
2025-08-10 12:05:42
989
原创 多JDK版本管理方案-SDKMAN
SDKMAN! 是一款用于管理多版本开发工具的命令行工具,支持Java、Groovy、Maven等开发环境。它提供便捷的版本切换功能,能快速安装/卸载指定版本,设置默认或临时使用版本。通过软链接方式管理各工具版本,支持自定义添加本地JDK。适用于CI/CD环境统一、多项目并行开发和版本兼容性测试等场景。相比jEnv、asdf等工具,SDKMAN! 专注于Java生态,提供一站式的版本管理方案。
2025-07-29 16:44:33
1127
原创 云原生可观测-日志观测(Loki)最佳实践
本文介绍了云原生日志系统Loki的核心架构与最佳实践。Loki作为可观测性三大支柱之一,专注于低成本日志存储与查询,其优势在于类似Prometheus的标签模型和与Grafana的深度集成。文章详细解析了Loki的组件架构(包括Promtail、Loki、Grafana)、日志采集与标签管理策略、LogQL查询语法(基础查询、聚合分析、结构化日志解析)以及告警配置方法。同时提供了Grafana可视化联动、性能优化建议和典型场景查询示例,帮助构建完整的日志观测体系。
2025-07-25 09:25:07
1069
原创 如何避免redis分布式锁失效
摘要:分布式锁的核心目标是保证共享资源在任意时间只被一个客户端操作。Redis锁实现需关注TTL过期、内存淘汰、主从不一致等风险。系统性对策包括:1)租约续约机制(如Redisson WatchDog);2)锁key隔离存储;3)原子校验释放(Lua脚本);4)应对主从延迟(RedLock算法);5)补偿机制(幂等设计+状态持久化)。设计原则强调隔离性、可观测性和高可用,建议采用独立Redis DB、监控锁状态并确保业务完成前锁不释放。关键是在保证互斥的同时,通过架构设计预防锁失效导致的数据不一致问题。
2025-07-21 16:33:07
836
原创 HTTPie: 开发者友好的http客户端工具
摘要: HTTPie 是一个专为开发者设计的命令行 HTTP 客户端,相比 curl 更简洁优雅,适合调试和测试 RESTful API。核心特性包括自然语言语法、自动 JSON 处理、高亮输出、文件上传、会话管理和插件扩展。基本命令示例展示了 GET/POST 请求、添加 Header 和文件上传操作。与 curl/wget 对比,HTTPie 在 API 调试场景更友好,是开发者日常调试 API 的高效工具。
2025-07-18 18:39:55
1029
原创 Spring Boot 源码解析之 Logging
摘要:本文深入剖析了SpringBoot 2.x日志系统的核心设计与实现。系统采用LoggingSystem抽象层,支持Logback/Log4j2/JUL三种实现,通过硬编码Map+classpath探测机制自动选择。关键流程包括:LoggingApplicationListener在启动初期初始化日志系统;Log4J2LoggingSystem实现配置加载逻辑,支持多格式配置文件;提供Actuator端点实现动态日志级别调整。系统设计强调极早期可用性、自动探测和统一配置,通过log4j2-spring.
2025-07-16 17:39:31
1327
原创 Java 避免空指针的方法及Optional最佳实践
本文总结了避免空指针的通用方法和Optional的最佳实践。在空指针防范方面,建议从设计源头避免nullable属性,使用@Nonnull注解,运行时保护,以及NullObject模式。Java14+的增强NPE信息有助于调试。对于Optional的使用,推荐用于方法返回值表示可能缺失的情况,但不建议用于参数、类字段和集合包装。创建Optional时应区分of()和ofNullable(),消费值时优先使用orElse、orElseThrow等安全方法,避免直接get()。链式操作如map/flatMap/
2025-07-15 17:07:21
332
原创 springboot 单元测试
摘要:Spring Boot测试分为单元测试、切片测试、集成测试和端到端测试四个层级。其中单元测试是最基础且价值最大的测试方式,它完全隔离Spring环境,通过Mockito模拟外部依赖,仅测试Java业务逻辑,具有执行速度快、隔离性好等特点。推荐采用分层测试策略:80%逻辑使用纯单元测试,15%使用Spring切片测试,5%使用全局集成测试。单元测试应避免滥用@SpringBootTest,重点关注业务逻辑覆盖,适合在CI/CD流程中频繁运行。
2025-07-13 17:30:59
2142
原创 多模块项目的编译提效
摘要:优化Maven多模块构建的关键策略包括:1) 避免全量clean,利用增量编译;2) 使用mvnd守护进程减少JVM启动开销;3) 启用并行构建(-T参数);4) 精准编译(-pl -am参数);5) 利用构建缓存(Takari/Artifactory)。架构层面建议合理拆分模块,开发时可结合IDE增量编译。对于CI/CD,建议分阶段构建、启用并行和缓存。终极方案可考虑迁移到Gradle/Bazel等现代构建工具。这些方法组合使用可显著提升构建效率,在大型项目中效果尤为明显。
2025-07-13 10:32:49
682
原创 JAR及其操作详解
JAR是Java的归档文件,本质为ZIP格式,用于打包.class文件、配置和资源。主要用途包括共享库、可执行应用分发等。Java自带的jar工具提供创建(c)、查看(t)、解压(x)、更新(u)等功能,常用命令如jarcf创建、jarxf解压、jarcfe指定主类。MANIFEST.MF文件可定义主类和依赖路径。实际应用中,可结合Maven/Gradle插件或unzip工具进行操作,适用于查看、修改、合并JAR包等场景。关键点在于掌握基本jar命令和清单文件配置,这是Java开发中打包分发的核心技能。
2025-07-11 11:34:50
1080
原创 基于actuator自定义指标扩展(2)
Spring Boot Actuator与Micrometer集成实现自定义指标监控 Spring Boot Actuator通过/metrics端点暴露服务指标,底层依赖Micrometer库实现指标收集和聚合。开发者可通过注入MeterRegistry自定义五种核心指标:Counter(计数)、Gauge(瞬时值)、Timer(耗时)、DistributionSummary(分布统计)和LongTaskTimer(长任务)。示例展示了自定义业务调用计数器、队列长度监控和方法耗时统计的实现
2025-07-10 09:27:38
1048
原创 微服务无感知启停
微服务架构中的无感知启停是指在服务重启、扩缩容或维护过程中,确保不影响客户端和其他微服务的正常使用。关键挑战包括请求处理、连接管理、数据一致性和自动恢复。主要解决方案包括:优雅停机(通过SIGTERM信号逐步完成请求)、服务发现与负载均衡动态调整、健康检查机制、蓝绿部署/滚动更新发布策略、分布式事务与补偿机制,以及消息队列和事件驱动架构。这些策略共同保障了微服务在生命周期变化时的平滑过渡,避免服务中断和数据不一致问题。
2025-07-10 08:46:51
1018
原创 spring boot actuator 入门(1)
Spring Boot Actuator是一款生产级监控管理工具,通过端点暴露应用健康、指标、日志等关键信息。核心功能包括健康检查、JVM指标、日志级别动态调整、环境变量查看等,常用端点如/health、/metrics、/prometheus。安全实践建议:最小化端点暴露、启用认证、分离管理端口。与Prometheus集成时,通过Micrometer生成标准化指标。云原生场景下,可配置K8s健康探针,实现动态日志调试和自定义健康检查。最佳实践强调安全防护、指标标准化和关键运维功能的灵活配置。
2025-07-09 09:55:44
934
原创 Metric 指标类型及实践
Prometheus提供了四种核心指标类型:Counter(计数器)用于累计事件计数,适合请求量统计;Gauge(仪表盘值)记录瞬时状态,适用于资源监控;Histogram(直方图)通过分桶实现分布统计,用于延迟分析;Summary(摘要)在客户端计算分位数。在Java生态中,Micrometer库可便捷对接Prometheus,自动转换Timer为Histogram类型。实际应用中需根据场景选择类型:Counter适合速率分析,Gauge用于资源监控,Histogram适合SLO评估,Summary适用于
2025-07-07 17:50:39
884
原创 G1 GC最佳实践
G1GC是Java 9+默认的服务器端垃圾回收器,采用分Region管理堆内存,每个Region可动态标记为Eden、Survivor、Old或Humongous。其核心设计目标是实现大堆内存下的低且可预测的停顿时间,通过并发标记、混合回收(MixedGC)和并发压缩机制优化性能。关键参数包括MaxGCPauseMillis(优化目标,默认200ms)、InitiatingHeapOccupancyPercent(并发标记触发阈值)等。生产环境建议固定堆大小,开启AlwaysPreTouch和Paralle
2025-07-07 15:03:31
1209
1
原创 SpringBoot MVC配置:WebMvcConfigurer、WebMvcConfigurationSupport、WebMvcConfigurerAdapter
Spring MVC配置策略解析:WebMvcConfigurer、WebMvcConfigurationSupport与WebMvcConfigurerAdapter对比分析 摘要: 本文系统梳理了Spring MVC三种配置方式的特性与适用场景。WebMvcConfigurer作为接口允许增量扩展配置,与SpringBoot自动配置兼容,适用于90%的定制需求;WebMvcConfigurationSupport作为抽象类会完全接管MVC配置,适合深度定制场景;WebMvcConfigurerAdapt
2025-07-04 14:36:30
866
原创 zookeeper 版本选型
Apache ZooKeeper版本演进与选型建议 摘要:ZooKeeper目前同时维护3.8.x(稳定版)和3.9.x(当前版)两个分支。主要功能演进包括:从3.4版本的单一线程模型发展到3.9版本的多线程优化;从手动快照管理到自动清理机制;从无加密支持到全链路TLS;从基础监控到完整的Prometheus集成。生产环境建议优先选择3.8.x稳定版本,其具备完善的安全机制、性能优化和云原生支持。每个稳定版本发布后约半年即进入停服期,期间仅提供关键修复。所有历史版本均可通过Apache官方档案库获取。
2025-07-01 14:34:14
1236
原创 url-pattern中的 /* 和 /**
本文对比了Servlet Filter和Spring Interceptor在URL模式匹配上的差异。Servlet规范严格定义了四种URL匹配模式(精确匹配、路径前缀、扩展名和根路径),其中路径前缀只能使用"/*"表示单层路径,不支持"/"多层匹配,这是由Servlet容器的简单字符串匹配机制决定的。而Spring MVC在DispatcherServlet层实现了更灵活的Ant-style路径匹配,支持"/"表示任意深度路径,以满足复杂API路
2025-06-30 16:51:56
697
原创 gradle 入门实战
Gradle 可在所有主流操作系统上运行,需要JDK版本大于等于8即可运行;Gradle 自带 Groovy 库,因此不需要安装 Groovy。Gradle 会忽略任何现有的 Groovy 安装。
2023-05-22 16:29:32
390
1
翻译 技术债务:终极指南
但这种忽略某些部分的选择被理解为如果不这样做将阻碍未来的开发和交付——如果团队不回头解决平庸的代码或解决已知的错误,结果就是累积的兴趣。重构是作为开发过程的一部分对现有代码进行重组,而不改变代码的外部行为(例如,重构一段写得不好的代码,它采用任何数字并将其乘以二仍然会输出 2 x 2 = 4,即使在底层代码已被重写)。不可避免的债务是由于业务的变化和随着时间的推移提供更好的解决方案的技术进步而产生的。例如,您的产品的性能评级可能正在下降,或者您的开发人员可能需要更长的时间进行迭代。
2023-04-26 10:36:28
452
1
原创 什么是云原生
网上提到最多的是云原生(Cloud Native)是由“Pivotal 公司的Matt Stine于2013年首次提出”,我查阅了一些资料发现,在2010年5月28日,WSO2的CTO和联合创始人PaulFremantle在他的博客中就写过一篇题目为CloudNative的文章( Paul Fremantle's Blog: Cloud Native) ,在Matt Stine的文章中也提到了Cloud Native 是在2010年左右开始被关注,是由包括Paul在内的行业大佬普及的....
2022-06-13 13:18:37
162
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅