- 博客(46)
- 收藏
- 关注
原创 状态机浅析
状态机是一种强大的设计模式,特别适合处理具有明确状态划分的系统。提高代码可读性:状态和转移关系清晰明确增强系统可维护性:状态逻辑集中管理,便于修改和扩展改善用户体验:状态机可以更好地管理复杂的用户交互流程便于测试和调试:状态机的确定性特性使得测试更加容易在选择使用状态机时,需要权衡其复杂性和收益。对于简单的条件判断,传统的if-else可能更合适;但对于复杂的业务流程和状态管理,状态机是一个很好的选择。
2025-06-24 12:25:40
1157
原创 浅析服务注册与发现
如果服务无法响应,或者响应错误,那么服务注册中心会认为服务不健康,将其从服务列表中移除,防止其他服务调用到不可用的服务。在大型的分布式系统中,服务注册中心可能需要处理大量的服务注册和查找请求,如果所有的请求都由一个服务注册中心处理,可能会成为系统的瓶颈。而且服务集群的跨度很大、数量很多(数以百计甚至更多),为保障系统的正常运行,必然需要有一个中心化的组件完成对各个服务的整合,即将分散于各处的服务进行汇总,汇总的信息可以是服务器的名称、地址、数量等,并且这些服务器组件还拥有被监听功能等(服务发现)。
2025-06-16 22:33:55
810
原创 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
842
原创 什么是多租户系统
在选择具体的多租户实现方式时,开发团队需要根据业务需求、租户规模和预算权衡不同的数据存储模式,并结合缓存、限流、负载均衡等技术手段优化系统性能。在本文中,我们将深入探讨多租户架构的设计原则、数据管理策略、安全性考虑以及性能优化方案,以帮助 SaaS 开发者和架构师更好地构建高效、可靠的多租户系统。对于高计算量的任务,如数据处理、批量导入等,可以使用消息队列(RabbitMQ、Kafka)进行任务拆分,将计算密集型任务异步执行,提高系统响应速度。数据隔离是多租户架构的核心,确保不同租户的数据不会相互干扰。
2025-05-03 23:03:44
835
原创 如何实现一个生产者消费者模型?
注意,这里必须使用 while 而不是 if 防止虚假唤醒,同时必须使用 notifyAll() 而不是 notify() 避免死锁。死锁预防:避免嵌套锁,尽量使用超时机制(如poll(long timeout, TimeUnit unit)):线程安全队列自动处理阻塞,代码简洁高效,无需手动同步,没有死锁风险。性能监控:生产/消费速度差异较大时,需调整等待时间或使用背压策略。:更灵活的锁控制,可指定唤醒对象减少锁竞争,并且支持多个等待队列。:基础同步机制,需手动控制阻塞和唤醒。
2025-04-16 16:26:21
393
原创 如果想在 bean 创建出来之前和销毁之前做一些自定义操作可以怎么来实现呢?
在销毁前拦截可以通过实现 DestructionAwareBean 接口的 postProcessBeforeDestruction 方法,在Bean销毁前执行逻辑。通过 @PostConstruct 注解标记方法,在 Bean 属性注入完成后执行逻辑,通过 @PreDestroy 注解标记方法,在容器关闭时触发。小总结,使用第二种方法可以实现解耦,并且代码简洁,使用第三种方法可以实现对原有项目的兼容,具体使用哪种方法大家可以根据实际需求去选择。然后对使用 @Bean 注解的属性指定方法。
2025-04-13 14:23:55
333
原创 如何通过 Spring 层面进行事务回滚?
Spring 中事务可以分为声明式事务和编程式事务,那么解下来就从这两方面说一说在 Spring 层面个怎么进行回滚。
2025-04-13 14:23:03
351
原创 说一说 Spring 中的事务
事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元。
2025-04-12 12:40:28
1089
原创 策略模式实现 Bean 注入时怎么知道具体注入的是哪个 Bean?
依赖注入的功能,是通过先在 Spring IoC 容器中查找对象,再将对象注入引入到当前类中。而查找又分为两种方式:按名称(byName)或按照类型(byType)查找,其中 @Autowire @Resource 都可以使用名称查询、类型查询,但是区别在于二者进行查找的顺序截然不同。
2025-04-12 11:02:19
1149
原创 基于 Redis Stream 实现消息队列功能
好长时间没更新了。。。。。。背景:举个例子在某个接口执行完成后只需要前半段返回结果,后半段可能是日志记录、下游系统调用等功能的情况下,将耗时的消息进行异步发送就显得很有必要,这时就有很多种选择,单体项目甚至可以选择自定义线程池+DelayQueue 这种操作去进行异步操作,而大多数人会在第一时间想到消息丢列,但是消息引入消息队列这件事对于一个并发量不大、后半段消息允许失败的情况单独引入一个中间件对系统的开发维护难度都会提升一个等级,所以我就想到应用 Redis Stream 这种方式来实现异步任务的执行。
2025-03-14 10:48:12
689
原创 从输入网址到网页显示期间发生了什么?
当你在浏览器的导航栏输入网址后,浏览器会对输入的 url 进行解析,从而发送给 web 服务器的请求信息。DNS 解析流程:(以www.baidu.com为例)
2025-02-10 21:49:54
516
原创 浅谈 HashMap 的扩容过程和 put 过程
在 JDK 8 中,HashMap 由 “数组 + 链表 + 红黑树” 组成。当链表长度超过 8 且数据总量超过 64 时会转红黑树。将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树,以减少搜索时间。
2025-02-08 22:37:29
598
原创 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
681
原创 CompletableFuture使用
在实际项目中,一个接口可能需要同时获取多种不同的数据,然后再汇总返回,这种场景还是挺常见的。举个例子:用户请求获取订单信息,可能需要同时获取用户信息、商品详情、物流信息、商品推荐等数据。如果是串行(按顺序依次执行每个任务)执行的话,接口的响应速度会非常慢。考虑到这些任务之间有大部分都是 无前后顺序关联 的,可以 并行执行 ,就比如说调用获取商品详情的时候,可以同时调用获取物流信息。通过并行执行多个任务的方式,接口的响应速度会得到大幅优化。这个时候 CompletableFuture 就闪亮登场了。
2025-02-03 21:37:03
515
原创 怎么在 Java 程序中使用阿里云 oss 存储图片?
创建之后一定要复制下来,最好也点击保存为.csv文件,因为每个assessKey只有在创建的时候才会出现一次,以后是看不了的。进行完以上步骤,这个时候你已经有一个自己的Bucket啦,接下来就让我们在代码中使用它。然后找到创建Bucket列表,点击它然后就是根据步骤进行选择购买,此处省略…endpoint所在位置,进入你的bucket后,点击概览,然后翻到最底下。创建之后点击控制台进入阿里控制台界面,然后点击右上角三个点,出现如下界面。点击坐左侧一列的对象存储进入。
2025-01-18 17:14:07
676
原创 代码中动态获取配置文件中内容的方法
Data:注意,经过以上注解获取之后并不能正常获取到配置,因为它是要依靠属性的setter方法注入的,所以我们要加上Lombok的注解来简化setter方法生成,至此才能够从配置文件中获取到具体的配置内容。@Configuration这个注解相信大家都知道,就是将这类标识为配置类,可以作为组件注入。使用这个注解来表示要获取的具体配置的前缀。这个注解就是用来表示配置类所在的路径的。
2025-01-18 15:52:17
232
原创 书说 MySQL 的悲观锁和乐观锁
悲观锁是一种基于悲观态度的控制机制(最坏的程度想,每次并发一定会造成阻塞),用于防止数据冲突。它采取预防性措施,在修改数据之前将其锁定,并在操作完成后释放锁,以此来确保数据的一致性和完整性。悲观锁通常用于并发环境下的数据库操作,是数据库本身实现锁的一种方式。在悲观锁机制下,当一个使用者要访问并修改数据时,首先会获取该数据的锁,如果锁已经被其他使用者所拥有,那么就会阻塞当前使用者,知道对应的锁被释放,这种悲观的态度认为数据冲突是不可避免的,因此在修改数据之前先锁定数据,以防止冲突的发生。适用场景。
2025-01-12 22:05:42
859
原创 JVM 的内存结构之堆栈
每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(stack Frame) ,对应着一次次的Java方法调用。并且 JVM 规范规定允许虚拟机栈的大小是动态的或是固定不变的。如果采用固定的虚拟机栈,那么每个线程的 Java 虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过 Java 虚拟机栈允许的最大容量,JVM 就会抛出一个 StackOverFlow 异常。
2024-10-17 11:22:55
1272
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人