- 博客(58)
- 收藏
- 关注
原创 如何通过 Magic Number 验证文件类型
Magic Number 是文件格式的独特标识符,位于文件开头2-4个字节,用于准确判断文件真实类型。相比易伪造的文件扩展名,Magic Number 更安全可靠,可防止恶意文件上传。常见格式如JPEG(FF D8 FF)、PNG(89 50 4E 47)等都有特定Magic Number。通过读取文件头字节并与已知值比对即可实现检测,Java/Python等语言均可实现此功能。Magic Number验证是文件上传安全的关键措施,建议与扩展名检查结合使用,提供双重保护。
2025-09-15 17:55:50
993
原创 从 Linux 到 Kubernetes:操作系统的演变与云原生未来
本文对比了传统单机操作系统Linux和云操作系统Kubernetes的核心差异。Linux专注于管理单台机器的硬件资源,包括CPU、内存和文件系统等,适合单机应用场景。而Kubernetes作为云操作系统,管理的是分布式集群资源,具备容器编排、自动扩展和故障恢复等能力,特别适合云原生应用。两者的主要区别在于管理范围(单机vs集群)、资源管理方式、应用管理能力以及对容器和网络的支持程度。随着云计算的普及,Kubernetes已成为现代云架构的核心操作系统,而Linux仍保持其在传统单机环境中的重要地位。
2025-09-15 13:09:34
971
原创 Kubernetes 架构详解:彻底搞懂 K8s 的核心组件与工作机制
Kubernetes是一个开源的容器编排系统,采用主从架构,由控制节点和工作节点组成。控制节点包含API Server、etcd、调度器和控制器等核心组件,负责集群管理;工作节点运行kubelet、kube-proxy和容器运行时,执行具体任务。Pod是K8s最小调度单元,包含多个共享资源的容器。K8s具备自动调度、自愈、扩缩容等能力,通过对比期望状态和实际状态来自动调整集群。建议通过实践加深理解,如使用minikube或kind进行本地部署练习。
2025-09-15 10:59:49
744
原创 Kubernetes 弹性伸缩:深入讲解 HPA 和 VPA
Kubernetes弹性伸缩机制:HPA与VPA详解 Kubernetes通过HPA(水平Pod自动伸缩)和VPA(垂直Pod自动伸缩)实现弹性资源管理。HPA根据CPU/内存等指标动态调整Pod副本数,适用于负载波动场景;VPA则优化单个Pod的资源配额,自动调整CPU/内存请求。两者可协同工作:HPA处理横向扩展,VPA优化纵向资源分配。配置时需注意HPA的响应延迟和VPA可能导致Pod重启的特点。结合使用能有效提升资源利用率,适应不同负载需求,是构建弹性云原生应用的关键技术。
2025-09-12 17:50:21
669
原创 Kubernetes Ingress:使用 Apache APISIX 进行外部流量路由
本文介绍了如何在Kubernetes中使用Apache APISIX作为Ingress控制器管理外部流量。Ingress提供了灵活的外部HTTP/HTTPS流量路由功能,支持域名、路径规则、负载均衡和SSL/TLS终止。APISIX作为高性能Ingress控制器,具有动态配置、丰富插件生态等优势。文章详细说明了APISIX的部署步骤、Ingress资源配置方法、域名设置、SSL/TLS配置以及插件使用,帮助用户实现高效的微服务流量管理,相比传统NodePort/LoadBalancer方式更具灵活性和可扩展
2025-09-12 17:23:44
927
原创 深入解析 Kubernetes 中的 Service 资源:为应用提供稳定的网络访问
Kubernetes中的Service是用于为一组Pod提供稳定访问入口的资源,主要功能包括提供稳定IP/DNS、负载均衡和服务发现。Service有四种类型:ClusterIP(集群内部访问)、NodePort(通过节点端口外部访问)、LoadBalancer(云环境外部访问)和ExternalName(映射外部服务)。通过标签选择器匹配Pod,并指定端口建立连接。Service解决了Pod动态变化带来的访问不稳定问题,确保客户端始终通过统一接口访问服务,同时自动进行流量分配和服务发现,是Kubernet
2025-09-12 17:02:46
1220
原创 Kubernetes 中的 ConfigMap:灵活的配置管理方式
摘要:ConfigMap是Kubernetes中用于管理非机密配置数据的资源对象,通过键值对存储配置信息(如数据库连接、API密钥等)。它支持通过文件挂载、环境变量或命令行参数方式传递给容器,实现配置与容器镜像的解耦。ConfigMap支持动态更新,便于多环境部署和集中化管理,避免硬编码配置,提高应用灵活性。主要优势包括动态配置管理、简化多环境部署和集中化配置审计。
2025-09-12 16:50:28
924
原创 深入理解 Kubernetes Pod:容器管理的核心
Pod是Kubernetes中最小的调度单元,由一个或多个容器组成,共享网络和存储资源。Pod分为单容器Pod和多容器Pod(如Sidecar模式),容器间可通过localhost直接通信。Kubernetes全面管理Pod的生命周期(Pending/Running/Succeeded/Failed状态)和调度,并与其他资源(如Deployment、Service、ConfigMap)协同工作,为容器化应用提供弹性调度、高可用和配置管理能力。作为Kubernetes的核心资源,Pod为云原生应用提供了基础运
2025-09-12 13:46:10
990
原创 Kubernetes 资源分类与解析:全面理解 Kubernetes 核心资源
本文介绍了Kubernetes(K8s)的核心资源类型及其常用配置,包括Workloads、Services & Networking以及Config & Storage三大类。Workloads部分详细讲解了Pod、Deployment、ReplicaSet、StatefulSet、Job和CronJob等资源,Services & Networking部分涵盖了Service和Ingress,Config & Storage部分则介绍了ConfigMap和Secret。每
2025-09-12 13:30:32
1314
原创 如何在 Spring Boot 中指定不同的配置文件?
Spring Boot 配置文件指定方式摘要 Spring Boot 提供了多种灵活的配置文件管理方式: 默认配置:自动加载application.properties或application.yml文件 自定义路径:通过spring.config.location指定外部配置文件位置 多环境配置:使用spring.profiles.active激活不同环境的配置文件(如application-dev.yml) 动态指定:支持通过命令行参数、环境变量、@PropertySource注解等方式加载配置 这些方
2025-09-11 18:05:25
799
原创 深入理解 MDC(Mapped Diagnostic Context):日志记录的利器
MDC(映射诊断上下文)是一种在多线程或分布式系统中传递日志上下文信息的技术,通过线程局部存储实现请求链路的追踪。它允许将上下文信息(如trackingId)自动附加到日志记录中,提高日志可追溯性。文章介绍了MDC的工作原理、在Log4j2和SLF4J中的使用方式,以及在微服务架构中的应用场景(结合traceId和spanId)。同时指出需注意线程池中的上下文清理问题。MDC能有效提升日志分析效率,是复杂系统日志管理的实用工具。
2025-09-08 16:39:26
1151
原创 JDK 动态代理 vs CGLIB 动态代理:一文搞懂两种动态代理技术
摘要 本文介绍了Java中两种动态代理技术:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,通过反射机制生成代理对象,适用于有接口的类;CGLIB则通过继承目标类并重写方法实现代理,不依赖接口。JDK动态代理使用简单但性能较低,而CGLIB性能更高但对final类/方法无效。两种技术各有优劣,开发者可根据项目需求选择合适的代理方式。动态代理广泛应用于AOP编程、框架设计等领域,是Java开发中的重要技术。
2025-09-05 14:15:28
960
原创 Java反射:如何在运行时搞定一切
Java反射机制允许程序在运行时动态获取类信息并操作对象。核心是通过Class类获取类的元数据,包括字段、方法等。有三种获取Class实例的方式:类名.class、对象.getClass()和Class.forName()。反射可用于动态加载类、创建对象、获取字段信息等操作,如getField()获取公共字段,getDeclaredField()获取当前类字段(包括私有字段)。反射增强了程序的灵活性,常用于框架开发,但只能访问public无参构造方法创建对象。
2025-09-05 14:02:40
1003
原创 ThreadPoolTaskExecutor 和 ThreadPoolExecutor 对比
Java 线程池对比:ThreadPoolExecutor 与 ThreadPoolTaskExecutor ThreadPoolExecutor 是 Java 标准库提供的线程池实现,具有高度可配置性但使用复杂,适合需要精细控制线程池行为的场景。它允许开发者手动设置核心线程数、最大线程数、任务队列等参数。 ThreadPoolTaskExecutor 是 Spring 提供的线程池实现,简化了配置过程,特别适合 Spring 应用。它与 Spring 框架深度集成,支持通过配置文件或注解进行配置,并自动管
2025-09-04 17:07:58
841
原创 Java中的异步编程:Future 与 CompletableFuture
Java异步编程:Future与CompletableFuture对比 摘要: 本文介绍了Java中两种异步编程工具:Future和CompletableFuture。Future是Java5引入的接口,提供基本的异步任务处理能力,包括获取结果、取消任务和检查状态等功能,但存在阻塞和缺乏任务链式控制的缺点。Java8引入的CompletableFuture则提供了更强大的功能,支持非阻塞执行、任务链式调用、异常处理和组合多个任务等特性,适合复杂异步场景。文章通过图像处理和视频处理两个示例展示了它们的不同应用
2025-09-04 16:16:51
830
原创 定时任务调度 @Scheduled
@Scheduled是Spring框架提供的定时任务注解,通过@EnableScheduling启用后,可标注方法为定时任务。主要用法包括:fixedRate固定间隔执行、fixedDelay任务结束后延迟执行、initialDelay延迟启动任务,以及使用Cron表达式实现复杂调度。需注意默认单线程执行可能导致任务延迟,可通过配置ThreadPoolTaskScheduler线程池解决并发问题。该注解为Spring Boot应用提供了简单高效的定时任务实现方案。
2025-09-03 14:03:22
545
原创 Spring 中的 @Async 注解
@Async 是 Spring 提供的异步执行注解,允许方法在独立线程中运行以提高系统性能。使用时需先通过@EnableAsync启用异步支持,并可自定义线程池参数(核心/最大线程数、队列容量等)。异步方法可返回void或Future类型,调用线程不会阻塞。异常处理需通过CompletableFuture或方法内捕获实现。结合线程池优化,能有效提升并发处理能力,适用于耗时IO操作等场景。
2025-09-03 11:18:38
778
原创 Event-Driven Spring:让你的应用更智能
Spring 框架提供了强大的事件机制,支持同步和异步的事件发布与监听。开发者可以自定义事件(继承 ApplicationEvent 或直接使用对象),通过 ApplicationEventPublisher 发布,并通过实现 ApplicationListener 或使用 @EventListener 注解来监听处理。Spring 4.2+ 支持泛型事件和异步处理(通过 @Async 或配置 ApplicationEventMulticaster)。内置事件如 ContextRefreshedEvent
2025-09-03 11:08:35
1014
原创 深入浅出线程池ThreadPoolExecutor
Override// 你可以选择记录日志或将任务保存到数据库中假设我们希望为每个线程设置一个特定的名称,并且设置为守护线程。@Override// 设置线程为守护线程我们使用来确保线程名称是唯一的。我们设置了每个线程为守护线程,这意味着如果程序中没有其他非守护线程在运行,守护线程会被 JVM 回收。
2025-08-08 16:44:15
883
原创 浅析线程池工具类Executors
Java Executors工具类线程池方法摘要 Executors是Java并发包中提供的线程池工具类,主要包含13种创建线程池的方法: 固定大小线程池(2种):newFixedThreadPool()创建固定数量线程,使用无限队列 工作窃取线程池(2种):newWorkStealingPool()基于ForkJoinPool,适合并行任务 单线程池(2种):newSingleThreadExecutor()保证任务顺序执行 缓存线程池(2种):newCachedThreadPool()自动扩展线程数量
2025-08-08 15:28:31
835
原创 定时任务调度利器ScheduledThreadPoolExecutor
Java 的 ScheduledExecutorService 提供了灵活的定时任务调度功能。核心构造方法允许自定义线程池大小、线程工厂和拒绝策略,适用于不同场景。四种核心调度方法包括:schedule(延迟单次执行)、scheduleAtFixedRate(固定间隔周期执行)、scheduleWithFixedDelay(任务完成后固定延迟执行)和 schedule(Callable)(支持返回值的延迟任务)。这些方法支持多线程环境下的高效任务调度,适用于定时任务、周期性任务等需求。
2025-08-08 14:40:02
962
原创 Lombok全面解析
Lombok 是一个 Java 库,通过使用注解的方式,自动生成常见的样板代码,如 getter、setter、toString()、equals()、hashCode() 方法以及构造函数等,减少了开发者的重复工作。常见的 Lombok 注解包括 @Getter、@Setter、@ToString、@EqualsAndHashCode、@Builder、@Value 等,Lombok 使得 Java 开发者能够专注于业务逻辑的实现,而不必处理冗长的样板代码。
2025-07-28 17:59:07
1127
原创 参数校验:spring-boot-starter-validation 使用指南
摘要:spring-boot-starter-validation是Spring Boot提供的验证工具,通过自动配置Java Bean Validation和Hibernate Validator实现数据校验。核心功能包括:1)提供常用验证注解如@NotNull、@Size等;2)支持实体类字段验证和方法参数验证;3)提供异常处理机制捕获验证错误;4)支持分组验证(@Validated)功能。使用时可添加Maven依赖,在实体类字段上添加验证注解,并在控制器方法使用@Valid/@Validated触发验
2025-07-23 18:04:05
445
原创 Http请求中的特殊字符
摘要:SpringBoot应用中GET请求传递包含特殊字符(如+)的参数时,+会被自动转换为空格。原因是URL编码规范将+视为空格替代符。解决方法包括:1)使用URLEncoder对参数预编码,服务端需解码两次;2)改用POST请求,通过请求体(application/json或x-www-form-urlencoded)传递参数可避免编码问题。POST方式能完整保留特殊字符,是更可靠的解决方案。
2025-07-18 17:52:26
709
原创 Java线程池
摘要:本文介绍了Java线程池的核心接口与实现。Executor是线程池基类,ExecutorService扩展了Executor,提供任务提交、关闭管理等功能。ThreadPoolExecutor是关键实现类,通过七大参数(核心/最大线程数、空闲时间、队列、拒绝策略等)精细控制线程池行为。文章详细解析了shutdown()、awaitTermination()和shutdownNow()等关键方法的使用场景及区别,并提供了线程池参数配置的常见示例和任务提交方式对比。
2025-07-18 14:26:48
771
原创 轻松驾驭Maven,打造高效Java项目
Maven是一个基于POM的Java项目管理工具,通过标准化项目结构和生命周期实现自动化构建和依赖管理。其核心包含三个生命周期:clean(清理)、site(文档生成)和默认生命周期(构建打包)。每个生命周期包含多个阶段,通过绑定插件目标实现具体功能。Maven通过pom.xml文件管理项目,关键元素包括坐标信息(groupId/artifactId/version)、依赖管理、构建配置等。支持继承机制,子项目可复用父POM配置,简化多模块项目管理。Maven还提供直接运行插件目标的能力,便于执行特定任务如
2025-07-17 11:27:50
1202
原创 Jackson:从入门到熟手,Java 处理 JSON 的终极指南
使用 Jackson 需要引入以下依赖jackson-annotations(Jackson 注解)jackson-core(Jackson 核心)建议始终使用 Maven 中央仓库中最新版本的 jackson-databind。this(null);super(t);@Override或者使用 @JsonSerialize 来注册自定义序列化器...this(null);@Override。
2025-07-15 13:41:29
1448
原创 Python模块与包
当你退出 Python 解释器并重新进入时,之前定义的函数和变量会丢失。因此,如果你要编写较长的程序,最好使用文本编辑器准备代码,并通过脚本方式将其传递给 Python 解释器来执行,这样你可以避免每次重新定义的麻烦。随着程序变得更加复杂,可能需要将代码拆分为多个文件,这样不仅有助于维护,还能提高代码的可重用性。比如,如果你有一些常用的函数,可以把它们独立封装,在多个程序中导入使用,而无需重复编写相同的代码。为了支持这种编程方式,Python 提供了模块。
2025-07-11 15:24:43
967
原创 Python中的下划线
单个下划线 _ 前缀用于表示,即这些成员是类的内部实现,通常不应直接访问。这是一个 约定俗成的规则,并不具备实际的访问限制。
2025-07-11 13:45:39
894
原创 Python 闭包和装饰器
嵌套函数嵌套函数嵌套函数是指在一个函数内部定义另一个函数。Python 支持这种函数嵌套的特性,能够增强函数的灵活性、封装性和模块化,尤其在实现等功能时经常用到。嵌套函数的定义一个嵌套函数就是在另一个函数内部定义的函数。内部函数通常只能在外部函数的作用域内访问,但外部函数可以调用并返回内部函数。嵌套函数的作用域嵌套函数有其自己的作用域,也能够访问外部函数的作用域中的变量。:内部函数可以直接访问外部函数定义的变量。:外部函数通常不能访问内部函数的局部变量,除非通过返回或参数传递。
2025-07-11 11:18:10
741
原创 从函数开始探索Python编程
本文介绍了Python函数的核心概念,包括函数定义、参数传递、作用域、参数类型、返回值、默认参数、可变参数、特殊参数(仅位置/仅关键字参数)以及lambda表达式。重点讲解了参数传递机制(对象引用传递)、默认参数的注意事项、如何使用*args和**kwargs处理不定长参数,以及如何通过函数注解提供元数据。文章还强调了文档字符串的重要性,并提供了函数定义和调用的实用示例。这些内容涵盖了Python函数编程的关键知识点,适合开发者系统学习函数的使用技巧和最佳实践。
2025-07-09 16:03:57
981
原创 HTTP Content-Type
MIME类型是互联网上标识文件格式的标准方法,由主类型和子类型组成(如text/plain)。常见类型包括:text类(纯文本、HTML等)、application类(JSON、XML、二进制数据等)、multipart类(表单数据分段传输)以及媒体类(图片、音频、视频)。其中multipart/form-data用于文件上传,通过boundary分隔不同数据块。MIME类型通过Content-Type标头告知接收方如何处理数据,是网络通信中的重要标识标准。
2025-07-08 14:21:29
782
原创 HTTP 重定向
重定向循环是指一个页面不断地被重定向到另一个页面,而新的页面又重定向回原来的页面,形成一个无法结束的循环,导致无法访问任何页面。是服务器向客户端(通常是浏览器)发出的指令,告诉客户端某个请求的资源已被移到新的位置。所代表的重定向类型,用于告知客户端和搜索引擎,某个资源已永久迁移到新位置。这些重定向的关键在于。用于告诉客户端某个资源当前无法从原位置访问,但可以通过临时的另一个 URL 来访问。用于缓存验证,告诉客户端缓存的资源未被修改,可以继续使用本地缓存。,也不应将新的 URL 视为资源的永久位置。
2025-07-07 16:22:06
463
原创 HTTP Cookie
Cookie是Web服务器发送到浏览器的小数据片段,用于在HTTP请求间保持状态(如登录信息、用户偏好)。它解决了HTTP无状态的问题,通过会话ID实现身份验证。Cookie可设置过期时间(expires/max-age),未设置则浏览器关闭时删除。相比LocalStorage(5MB,仅客户端)和SessionStorage(会话级),Cookie(约4KB)会自动随请求发送到服务器。安全性方面,建议启用HttpOnly(防XSS)、Secure(HTTPS传输)和SameSite(防CSRF)属性。现代
2025-07-07 15:54:03
816
原创 如何用 Mockito 玩转单元测试
当我们需要测试某个类的功能时,但又不希望依赖其外部组件或复杂的对象时,可以使用 Mockito 来创建模拟对象,这些模拟对象可以控制方法返回值、抛出异常或执行特定的逻辑。stubbing 是模拟(mock)对象行为的过程,指的是为模拟对象的方法调用提供预定义的返回值或行为。Mockito 是一个广泛使用的 Java 测试框架,它提供了简洁而强大的功能,用于模拟(mock)和验证对象的行为,尤其是在单元测试中。Stubbing 是指通过明确的指令为模拟对象的方法调用提供预定义的返回值或行为。
2025-07-07 11:22:53
1396
原创 RestTemplate实战
摘要:Spring的RestTemplate是一个同步HTTP客户端工具,简化了RESTful API调用过程。它提供了getForObject、postForEntity等常用方法,支持JSON/XML等多种数据格式处理。文章介绍了GET/POST等HTTP操作示例,对比了RequestEntity和ResponseEntity的区别,并展示了如何配置超时时间和添加JWT认证拦截器。RestTemplate适合轻量级应用,开发者只需掌握核心方法即可满足日常开发需求。
2025-07-05 09:57:35
1115
原创 HTTP 缓存
通常,响应是基于请求的 URL 来区分的,但在很多情况下,相同的 URL 可能会根据不同的请求头(如 Accept、Accept-Language、Accept-Encoding、User-Agent 等)返回不同的内容。也就是说,客户端会检查缓存中的响应是否已过时,如果响应已被更新,服务器将返回最新的内容。虽然启发式缓存在很多情况下都能够提高性能,但在可能的情况下,建议开发者通过适当的缓存头(如 Cache-Control、Expires 和 ETag)来明确指定缓存策略,以确保缓存的准确性和一致性。
2025-07-04 11:49:07
1072
原创 HTTP 压缩
浏览器会发送一个 Accept-Encoding 头,标明其支持的算法及优先级顺序,服务器根据该信息选择一种算法,用于压缩响应体,并通过 Content-Encoding 头部告诉浏览器选用的压缩算法。随着时间的推移,压缩算法不断得到优化,新的高效算法也逐渐被客户端和服务器所支持。端到端压缩指的是由服务器完成的消息正文压缩,这一过程在数据从服务器到达客户端的整个传输过程中保持不变。目前,最常用的两种压缩算法是。对于有损压缩,通常可以根据需要调整压缩的程度,压缩越多,质量可能越差,反之则质量更高。
2025-07-04 10:24:33
413
原创 HTTP 请求方法
HTTP方法定义了客户端与服务器的交互方式,常见方法包括GET(获取数据)、POST(创建数据)、PUT(全量更新)、PATCH(部分更新)、DELETE(删除数据)、HEAD(获取元数据)、OPTIONS(预检请求)、CONNECT(建立隧道)和TRACE(调试)。每种方法对应不同操作,具有不同的幂等性和请求体要求。HTTP消息由起始行(方法/状态码)、标头(元数据)、空行和正文(数据)组成。OPTIONS用于跨域预检,CONNECT建立加密隧道,TRACE用于诊断请求路径。理解这些方法的差异对于开发RE
2025-07-03 17:19:26
1386
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人