自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 为什么 request(如 Axios)会因跨域失败,而 fetch 却“正常”?——深入理解凭据(Credentials)与 CORS 的关系

本文深入分析了Axios和fetch在跨域请求时的不同表现,核心差异在于凭据(Credentials)的处理方式。Axios默认会自动携带cookies和认证头,触发严格的CORS检查,要求服务器返回Access-Control-Allow-Credentials: true和具体源域名;而fetch默认不携带凭据,只需Access-Control-Allow-Origin: *即可通过。文章详细解释了CORS对带凭据请求的特殊要求,并提供了Nginx和Spring Boot的正确配置示例。最后建议开发者根

2025-12-17 16:40:54 950

原创 Builder 设计模式

特性说明模式类型创建型核心目的分离复杂对象的构建与表示关键特征链式调用、不可变对象、build() 方法适用场景对象构造参数多、部分参数可选、希望对象不可变Java 典型应用对比维度自定义 Builder(手动编写)实现方式手动编写所有代码编译时通过注解处理器自动生成代码代码量非常多(样板代码)极少(一个注解)维护成本高(增删改字段需同步修改 Builder 代码)极低(只需修改字段,Builder 自动更新)灵活性完全可控,可实现复杂逻辑。

2025-10-20 17:14:15 1213

原创 java17中,使用原生url connection的方式去创建的http链接,使用的是http1.1还是2.0?

Java 17 中,通过 URLConnection 创建的 HTTP 连接默认使用 HTTP/1.1,不支持 HTTP/2。虽然 Java 9+引入了 HTTP/2 支持,但仅适用于新的 HttpClient API(Java 11+)。HttpURLConnection 由于设计陈旧,无法适配 HTTP/2 特性。推荐在新项目中使用 java.net.http.HttpClient,它支持 HTTP/2 自动协商、异步请求等现代功能。验证方法包括抓包工具检查或使用新版 API 直接输出协议版本。

2025-10-17 14:58:12 757 1

原创 AQS 为什么采用抽象类(abstract class)而不是接口(interface)实现?

AQS 为什么采用抽象类(abstract class)而不是接口(interface)实现?

2025-10-14 22:46:59 764

原创 CAS 浅析

Compare And Swap 的缩写,中文翻译成比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数-----内存位置、预期原值、更新值执行 CAS 操作的时候,将内存位置的值与预期原值做比较,如果相同则处理器会自动将该位置值更新为新值,如果不匹配,处理器不做任何操作,多个线程同时执行 CAS 操作只有一个会成功。

2025-08-27 21:50:34 564

原创 JMM 浅析

JMM 小结

2025-08-26 19:12:54 770

原创 为什么会有公平非公平锁的设计?为什么 ReentrantLock 及 synchronized 默认是非公平锁?

为什么 Java 中的锁默认为非公平?

2025-08-25 11:42:25 461

原创 状态机浅析

状态机是一种强大的设计模式,特别适合处理具有明确状态划分的系统。提高代码可读性:状态和转移关系清晰明确增强系统可维护性:状态逻辑集中管理,便于修改和扩展改善用户体验:状态机可以更好地管理复杂的用户交互流程便于测试和调试:状态机的确定性特性使得测试更加容易在选择使用状态机时,需要权衡其复杂性和收益。对于简单的条件判断,传统的if-else可能更合适;但对于复杂的业务流程和状态管理,状态机是一个很好的选择。

2025-06-24 12:25:40 2747

原创 Redis AOF文件重写后文件一直过大怎么办?

Redis 之 AOF 重写

2025-06-19 15:49:46 930

原创 浅析服务注册与发现

如果服务无法响应,或者响应错误,那么服务注册中心会认为服务不健康,将其从服务列表中移除,防止其他服务调用到不可用的服务。在大型的分布式系统中,服务注册中心可能需要处理大量的服务注册和查找请求,如果所有的请求都由一个服务注册中心处理,可能会成为系统的瓶颈。而且服务集群的跨度很大、数量很多(数以百计甚至更多),为保障系统的正常运行,必然需要有一个中心化的组件完成对各个服务的整合,即将分散于各处的服务进行汇总,汇总的信息可以是服务器的名称、地址、数量等,并且这些服务器组件还拥有被监听功能等(服务发现)。

2025-06-16 22:33:55 897

原创 Tomcat Jetty 和 UnderTow 的粗略对比

​,实现了完整的 Java EE 规范(Servlet、JSP、JSTL 等)最新版本为 11.0.0(支持 Servlet 5.0、JSP 3.0)高并发微服务(Spring Boot 默认嵌入)、云原生应用、实时通信(WebSocket)、资源受限环境。​:通过链式 Handler 灵活构建功能,可嵌入应用或独立运行(核心 JAR <1MB)​。​,支持 Servlet 3.1、HTTP/2、WebSocket 及低级非阻塞 API。​:内存占用最低(<4MB 堆内存),CPU 利用率优化显。

2025-06-09 19:32:06 1035

原创 JUC 串讲

JUC 知识串讲

2025-06-07 20:58:30 825

原创 多租户系统的实现方式

多租户系统的实现方式

2025-06-02 15:45:27 1275

原创 常见的分布式事务实现方案

常见的分布式事务实现方案

2025-06-02 15:18:25 1411

原创 什么是多租户系统

在选择具体的多租户实现方式时,开发团队需要根据业务需求、租户规模和预算权衡不同的数据存储模式,并结合缓存、限流、负载均衡等技术手段优化系统性能。在本文中,我们将深入探讨多租户架构的设计原则、数据管理策略、安全性考虑以及性能优化方案,以帮助 SaaS 开发者和架构师更好地构建高效、可靠的多租户系统。对于高计算量的任务,如数据处理、批量导入等,可以使用消息队列(RabbitMQ、Kafka)进行任务拆分,将计算密集型任务异步执行,提高系统响应速度。数据隔离是多租户架构的核心,确保不同租户的数据不会相互干扰。

2025-05-03 23:03:44 917

原创 布隆过滤器的动态扩容

布隆过滤器动态扩容

2025-04-20 10:30:26 464

原创 如何实现一个生产者消费者模型?

注意,这里必须使用 while 而不是 if 防止虚假唤醒,同时必须使用 notifyAll() 而不是 notify() 避免死锁。​死锁预防:避免嵌套锁,尽量使用超时机制(如poll(long timeout, TimeUnit unit)):线程安全队列自动处理阻塞,代码简洁高效,无需手动同步,没有死锁风险。​性能监控:生产/消费速度差异较大时,需调整等待时间或使用背压策略。:更灵活的锁控制,可指定唤醒对象减少锁竞争,并且支持多个等待队列。:基础同步机制,需手动控制阻塞和唤醒。

2025-04-16 16:26:21 416

原创 如果想在 bean 创建出来之前和销毁之前做一些自定义操作可以怎么来实现呢?

在销毁前拦截可以通过实现 DestructionAwareBean 接口的 postProcessBeforeDestruction 方法,在Bean销毁前执行逻辑。通过 @PostConstruct 注解标记方法,在 Bean 属性注入完成后执行逻辑,通过 @PreDestroy 注解标记方法,在容器关闭时触发。小总结,使用第二种方法可以实现解耦,并且代码简洁,使用第三种方法可以实现对原有项目的兼容,具体使用哪种方法大家可以根据实际需求去选择。然后对使用 @Bean 注解的属性指定方法。

2025-04-13 14:23:55 378

原创 如何通过 Spring 层面进行事务回滚?

Spring 中事务可以分为声明式事务和编程式事务,那么解下来就从这两方面说一说在 Spring 层面个怎么进行回滚。

2025-04-13 14:23:03 426

原创 说一说 Spring 中的事务

事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元。

2025-04-12 12:40:28 1126

原创 策略模式实现 Bean 注入时怎么知道具体注入的是哪个 Bean?

依赖注入的功能,是通过先在 Spring IoC 容器中查找对象,再将对象注入引入到当前类中。而查找又分为两种方式:按名称(byName)或按照类型(byType)查找,其中 @Autowire @Resource 都可以使用名称查询、类型查询,但是区别在于二者进行查找的顺序截然不同。

2025-04-12 11:02:19 1201

原创 Spring 三级缓存能不能解决循环依赖?

最近也是面试的时候遭到了面试官对 Spring 一些方面狠狠的拷打,现在整理如下,供大家参考。

2025-03-21 22:24:56 1170

原创 基于 Redis Stream 实现消息队列功能

好长时间没更新了。。。。。。背景:举个例子在某个接口执行完成后只需要前半段返回结果,后半段可能是日志记录、下游系统调用等功能的情况下,将耗时的消息进行异步发送就显得很有必要,这时就有很多种选择,单体项目甚至可以选择自定义线程池+DelayQueue 这种操作去进行异步操作,而大多数人会在第一时间想到消息丢列,但是消息引入消息队列这件事对于一个并发量不大、后半段消息允许失败的情况单独引入一个中间件对系统的开发维护难度都会提升一个等级,所以我就想到应用 Redis Stream 这种方式来实现异步任务的执行。

2025-03-14 10:48:12 839

原创 在不使用 Spring Security 的情况下获取用户登录参数

不使用 Spring Security 来实现用户登录信息的拦截

2025-02-16 18:22:21 525

原创 从输入网址到网页显示期间发生了什么?

当你在浏览器的导航栏输入网址后,浏览器会对输入的 url 进行解析,从而发送给 web 服务器的请求信息。DNS 解析流程:(以www.baidu.com为例)

2025-02-10 21:49:54 562

原创 MyBatis Plus 效率提升神器

MyBatis Plus 效率提升神器

2025-02-09 14:26:05 161

原创 浅谈 HashMap 的扩容过程和 put 过程

在 JDK 8 中,HashMap 由 “数组 + 链表 + 红黑树” 组成。当链表长度超过 8 且数据总量超过 64 时会转红黑树。将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树,以减少搜索时间。

2025-02-08 22:37:29 643

原创 Spinrg Security 浅谈

最近也是学习了 Spring Security ,顺便放出来一波自己整理的知识点 希望大家少走弯路贴一下官网的定义:Spring Security is a framework that provides authentication, authorization, and protection against common attacks. With first class support for securing both imperative and reactive applications,

2025-02-08 22:09:55 705

原创 CompletableFuture使用

在实际项目中,一个接口可能需要同时获取多种不同的数据,然后再汇总返回,这种场景还是挺常见的。举个例子:用户请求获取订单信息,可能需要同时获取用户信息、商品详情、物流信息、商品推荐等数据。如果是串行(按顺序依次执行每个任务)执行的话,接口的响应速度会非常慢。考虑到这些任务之间有大部分都是 无前后顺序关联 的,可以 并行执行 ,就比如说调用获取商品详情的时候,可以同时调用获取物流信息。通过并行执行多个任务的方式,接口的响应速度会得到大幅优化。这个时候 CompletableFuture 就闪亮登场了。

2025-02-03 21:37:03 587

原创 xxl-job 在 Java 项目的使用 以一个代驾项目中的订单模块举例

xxl-job 在 具体 Java 项目中的使用

2025-02-03 21:16:54 616

原创 根据经纬度计算距离工具类

输入第一个地点的经纬度,接着输入第二个地点的经纬度来计算两点直接的距离。

2025-02-02 18:19:59 151

原创 怎么在 Java 程序中使用阿里云 oss 存储图片?

创建之后一定要复制下来,最好也点击保存为.csv文件,因为每个assessKey只有在创建的时候才会出现一次,以后是看不了的。进行完以上步骤,这个时候你已经有一个自己的Bucket啦,接下来就让我们在代码中使用它。然后找到创建Bucket列表,点击它然后就是根据步骤进行选择购买,此处省略…endpoint所在位置,进入你的bucket后,点击概览,然后翻到最底下。创建之后点击控制台进入阿里控制台界面,然后点击右上角三个点,出现如下界面。点击坐左侧一列的对象存储进入。

2025-01-18 17:14:07 776

原创 代码中动态获取配置文件中内容的方法

Data:注意,经过以上注解获取之后并不能正常获取到配置,因为它是要依靠属性的setter方法注入的,所以我们要加上Lombok的注解来简化setter方法生成,至此才能够从配置文件中获取到具体的配置内容。@Configuration这个注解相信大家都知道,就是将这类标识为配置类,可以作为组件注入。使用这个注解来表示要获取的具体配置的前缀。这个注解就是用来表示配置类所在的路径的。

2025-01-18 15:52:17 253

原创 记一次数据库连接 bug

MySQL连接错误

2025-01-17 17:11:34 1376

原创 书说 MySQL 的悲观锁和乐观锁

悲观锁是一种基于悲观态度的控制机制(最坏的程度想,每次并发一定会造成阻塞),用于防止数据冲突。它采取预防性措施,在修改数据之前将其锁定,并在操作完成后释放锁,以此来确保数据的一致性和完整性。悲观锁通常用于并发环境下的数据库操作,是数据库本身实现锁的一种方式。在悲观锁机制下,当一个使用者要访问并修改数据时,首先会获取该数据的锁,如果锁已经被其他使用者所拥有,那么就会阻塞当前使用者,知道对应的锁被释放,这种悲观的态度认为数据冲突是不可避免的,因此在修改数据之前先锁定数据,以防止冲突的发生。适用场景。

2025-01-12 22:05:42 887

原创 MySQL 中联合索引相比单索引性能提升在哪?

MySQL 联合索引与主键自增的一些说明

2025-01-12 18:05:26 475

原创 补充之前的一篇 MySQL 的索引为什么能加快查询速度

索引加快查询速度的原理

2025-01-11 16:12:19 639

原创 关于 node-sass 库在windows下编译错误

node-sass 报错排查及改正

2024-12-22 23:09:18 725

原创 高性能 Java 实战

关于字符串和 HashMap 的性能优化

2024-12-20 09:55:36 455

原创 JVM 之垃圾回收器

JVM 中的几种垃圾回收器详解

2024-12-03 14:58:42 1259

空空如也

空空如也

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

TA关注的人

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