自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分布式系统弹性设计之限流策略

限流策略是保障分布式系统高可用性的重要手段之一。通过合理运用固定窗口限流、滑动窗口限流、令牌桶限流和漏桶限流等策略,系统能够在面对突发流量、恶意攻击等压力时,有效保护关键资源,避免服务过载,确保大部分用户请求得到及时响应。结合业务特性和系统架构选择并适时调整限流策略,是提升分布式系统整体稳定性和用户体验的关键步骤。在设计和运维分布式系统时,充分理解和灵活运用这些限流技术,将有助于构建健壮、可靠且高度可用的大型分布式应用程序。

2024-04-01 23:29:09 711

原创 决胜分布式:揭秘Spring框架@Retry注解的智慧重试艺术

基本概念@Retryable注解是Spring Retry模块提供的关键特性,它允许开发者标记某个方法,指示当该方法在执行过程中抛出特定类型的异常时,应当自动进行重试。这种基于注解的重试机制简化了代码编写,使重试逻辑与业务逻辑解耦,提高了代码的可读性和可维护性。基本用法要在Spring应用中启用@Retryable注解,首先需要添加Spring Retry依赖,并在配置类上启用Retry功能。@Bean@Service// 实现业务逻辑,可能会抛出MyCustomException。

2024-03-31 15:38:07 933

原创 终于有人把Autowired注解讲清楚了,赞!!!

前面文章,提到使用@Autowired进行依赖注入,那么你知道 @Autowired怎么工作的吗?

2024-03-30 23:12:41 1035

原创 Spring官方真的不建议使用属性进行依赖注入吗?

使用Spring进行依赖注入时,很多大佬都推荐使用构造方法注入,而非使用在属性上添加@Autowired注入,而且还说这是Spring官方说的,真的是这样吗?使用Spring进行依赖主要的方式有很多,主流的使用方式有两种:1.在属性或者setter方法上使用@Autowired进行注入2.在构造方法上使用@Autowired进行注入那么哪种方式更好一点呢?很巧,在看Spring文档的时候看到了这样一段描述:上面描述主要表达三个信息:1.两者可以混合使用,对于必须的依赖项,使用构造函数;

2024-03-30 21:41:39 591

原创 你还在用Mybatis?试试这款神器,纵享丝滑

在这个示例中,我们首先根据 ID 查询到需要更新的用户。在 Java 项目中,我们经常需要与数据库进行交互,而 Mybatis 是一个流行的持久层框架,它可以将 Java 对象映射到 SQL 语句,从而简化数据库操作。Fluent Mybatis 是一个基于 Mybatis 的扩展库,它提供了更加简洁、易读的 API,使得我们能够更加高效地进行数据库操作。使用Mybatis实现复杂的业务查询逻辑,是一个很头痛的事情,下面介绍一个神器,完全使用DSL编程风格,无需写sql就可以轻松实现。

2024-03-24 13:26:23 500

原创 如何动态修改spring中定时任务的调度策略(2)

上一篇文章中我们一下走读了一下spring中实现@Scheduled的源码,想必你对spring中实现定时调度的原理更加了解吧,文末我们两个问题,1.spring在进行定时调度时,使用的线程池是默认,那么这个默认的线程池的配置是怎样的呢?2.如何动态调整调度策略。接下来我们详细分析一下这两个问题。spring在执行调度任务前,会按照好一定的策略,寻找一个可用的线程池来执行调度任务,寻找这个线程池的过程如下:在上面的代码中,有三处可以完成对 线程池的设置:1.通过自定义的 SchedulingConfig

2024-03-19 23:56:17 904

原创 如何动态修改spring中定时任务的调度策略(1)

在我们日常开发中经常会调度工具来处理一下需要定时执行的任务,比如定时导出报表数据给业务方发送邮件。你在工作中是如何这种定时调度?

2024-03-19 23:40:50 942

原创 http中的长连接和短连接你真的了解吗?

做web开发的老铁应该都知道http协议,它是前后端通信中非常常用的一种通信协议,HTTP(HyperText Transfer Protocol)即超文本传输协议,是互联网上应用最为广泛的一种网络协议。HTTP协议是一个基于请求-响应模型的协议,客户端(浏览器、移动客户端等)发起请求,服务端接收请求后进行处理并返回响应。在HTTP协议中,有两种连接方式:长连接和短连接,它们主要区别在于连接的持续时间和资源利用率。

2024-03-16 18:27:34 775

原创 如何在mac下使用homebrew安装 mysql?

首次安装 MySQL 后,需要设置 root 用户的密码。

2024-03-12 23:50:53 492

原创 一次奇怪的事故:机器网络连接打满,导致服务不可用

机器网络连接被占满后,slb再将请求转发到该机器上时,网络连接的建立就会被阻塞,直至超时,而超时后,slb又会进行重试,导致出现的大量链接建立行为,也就出现了slb连接创建过多的告警,这个时候slb与该实例的健康检查请求也会出现问题,导致该实例从slb上被摘除。但slb到该实例的请求转发还是正常,因为后端服务请求处理的比较慢,所以slb需要和后端服务建立新的网络连接来进行新的请求的发送,新建连接发送的请求,被处理的速度依旧很慢,所以需要不断的建立新的连接,很快导致该实例所在的机器的网络连接被占满。

2024-02-26 23:02:46 1007

原创 ConcurrentSkipListMap 深度解析

每一层都是一个有序的链表,最底层包含所有的元素。上层的链表包含的元素是下层链表元素的子集。插入操作通过随机函数决定新节点是否提升到更高的层级,实现了O(log N)时间的插入操作。提供了高效的并发控制,但在并发操作中,仍需要注意可能的竞态条件。接口,基于跳表(Skip List)实现,并提供了高效的并发控制。中的元素是有序的,支持按照键的范围进行查找,这使得它在范围查找的场景中非常有用。的底层实现原理、适用场景、使用过程中可能遇到的问题,以及并发控制。适用于动态数据集合,即数据的插入和删除频繁的场景。

2024-01-16 00:09:50 467 1

原创 TreeMap 深度解析:底层实现、使用场景和并发控制

默认情况下,TreeMap使用元素的自然顺序进行排序。如果元素不实现。

2024-01-16 00:03:40 678

原创 Java集合框架深度解析:HashMap

在元素数量不断增加的过程中,避免不必要的扩容是提高性能的一种手段。时,如果能够估计元素的数量,最好指定初始容量,以减少扩容操作的次数。在存储元素的过程中,当元素数量达到一定比例(加载因子)时,会触发哈希表的扩容操作,重新分配存储空间。是非线程安全的,如果在多线程环境中使用,可能需要通过额外的同步手段来确保线程安全。由于哈希函数的值域远远小于键的集合,不同的键可能映射到相同的位置,产生冲突。适用于需要快速查找的场景,例如,缓存系统中通过缓存键快速定位对应的值。使用分段锁的机制,可以支持更高的并发度。

2024-01-07 18:14:07 449

原创 Java集合框架深度解析:HashSet

HashSet作为Java集合框架中的重要一员,在无序、要求唯一性的场景下表现出色。深入理解其实现原理、使用场景和性能优化建议,有助于在实际应用中更加高效地利用它的优势。

2024-01-07 18:10:18 866

原创 Java集合框架深度解析-ArrayList

作为集合框架的第一篇文章,在本篇文章会重点介绍一下日常开发中使用最频繁的集合之一 —ArrayList,文章内容会涉及ArrayList的实现原理,使用场景和一些踩坑点,希望对你能有帮助。基于动态数组实现,其内部维护了一个 Object 类型的数组,可以动态扩展和收缩。当元素数量超过当前数组容量时,会自动创建一个新的数组,并将元素复制到新数组中。基于数组实现,插入和删除操作可能导致元素的移动,因此不适合频繁执行这类操作。提供了常数时间的随机访问,这是通过直接访问数组元素实现的。在使用 ArrayList。

2024-01-05 23:11:49 945

原创 Java中的异常如何处理?

在本文中,我们深入了解了Java异常处理的基础知识,包括异常的分类、异常处理语句以及自定义异常的使用。异常处理是编写稳健程序的重要组成部分,在编写代码时务必考虑处理可能发生的异常情况。在Java中,异常分为两类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。非受检异常是在运行时期才能被检测到的异常,通常是由程序错误引起的。受检异常通常是在编译时期能够被检测到的异常,程序必须显式地处理或声明它们。除了Java提供的异常类型,我们还可以创建自定义异常。

2024-01-03 22:19:48 374

原创 深入Java语言基础

本文深入剖析了Java语言基础的三个关键方面:操作符,访问权限控制,以及控制执行流程。在这篇文章中,我们将深度剖析Java语言基础的三个关键方面:操作符,访问权限控制,以及控制执行流程。=),大于(>),小于(=),小于等于(

2024-01-02 23:38:39 388

原创 探索Java的魅力

从本篇文章开始,小编准备写一个关于java基础学习的系列文章,文章涉及到java语言中的基础组件、实现原理、使用场景、代码案例。本篇文章作为本系列的第一篇文章,主要介绍一些java语言的特点,相对于其他编程语言java的有哪些优势,以及在进行java语言开发前的环境配置。Java是一门面向对象的语言,这意味着你可以使用面向对象的思维方式构建应用程序。在这个系列的第一篇中,我们将迈出入门的第一步,了解为什么Java如此受欢迎以及它有哪些独特之处。多线程是Java的一项强大功能,允许开发者编写高效的并发程序。

2024-01-02 23:00:58 455

原创 多次触发FastJson漏洞的AutoType机制,你了解吗?

解决问题的方法也很简单,既然@type指定的类型不存在,那么可以在系统中把需要的类型定义出来,不过@type指定的类型,是三方接口系统中定义的,如果把该类型引入到调用方系统中,那么对于调用方的侵入性很大,而且定义这个类型,仅仅为了解决这个问题,有很大解释成本在里面。从内容上看,比较特殊的地方在于多了一个特殊的字段“@type”,经过测试,反序列化报错,的确是因为这个特殊的字段造成的(把@type字段去掉,反序列化可以正常进行)。) fastjson。导致的,那么在序列化时,把类型信息给添加上可以了。

2023-12-24 18:32:09 1250

原创 分享一款程序员摸鱼神器,自己要偷偷的用哦

使用下来,感觉十分方便,确实可以提高工作效率,但是使用前还是要先确认清楚,公司是否允许使用,毕竟代码也是公司的资产,有些公司对公司数据管理特别严格,会对第三方的一些工具的使用有限制,别自己用的正嗨着呢,转头收到公司安全的警告和处罚,就不太好了。

2023-12-09 20:43:04 1300

原创 你在地铁上修过bug吗?

作为技术人员,有没有遇到下班路上收到老板电话,系统故障,然后地铁上掏出电脑,修bug的场景。自己负责的业务线上出现问题,负责人心里是很慌的,在这种心理状态下做事很容易二次犯错,造成更大的问题。但是线上业务在高速迭代的过程中,出现问题,又总是难免的。这个时候,对业务系统建立完备的监控体系是十分有必要的。

2023-12-09 10:09:07 946

原创 FastJson竟然会导致内存泄露?你遇到过吗?

FastJson是一款性能优异的java序列化和反序列框架,广泛应用于日常开发工作中,也许正是因为作者在设计这款框架时,比较注重性能方面的考量,在框架安全性,空间占用等方面做了一些牺牲。很不幸小编前两天就遇到了一个使用FastJson导致内容泄漏的问题。下面是小编从发现内存泄漏问题,到问题排查,再到问题修复的整个过程的记录,当各位读者遇到类似问题后,能有所启发。

2023-11-19 18:35:55 841

原创 你真的会使用 MySQL中EXPLAIN吗

通过EXPLAIN,你可以查看MySQL查询的执行计划,了解MySQL是如何执行你的查询语句的。通过分析查询执行计划,你可以找出查询中的性能问题,并采取相应的措施来改进性能。优化查询是数据库管理和应用开发中的关键任务,希望本文中的信息能够帮助你更好地理解并优化MySQL查询。EXPLAIN的主要作用是帮助你分析查询语句的执行计划,找出可能导致性能问题的地方,从而优化查询。通过分析EXPLAIN的输出,你可以识别查询中的性能瓶颈,并采取措施进行优化。这将返回一个表,其中包含有关查询的信息。

2023-11-13 23:33:42 382

原创 迭代器模式:遍历容器内元素

这种模式提供了一种统一的方式来访问不同类型的集合,使得客户端代码可以遍历集合,而不需要关心集合的具体实现细节。迭代器模式将遍历集合的责任委托给一个独立的迭代器对象,这样可以在不影响集合的情况下添加新的遍历方式。这种模式提供了一种统一的方式来访问不同类型的集合,使得客户端代码可以遍历集合,而不需要关心集合的具体实现细节。迭代器模式解决了这些问题,它将遍历集合的责任委托给一个独立的迭代器对象,客户端代码可以通过不同的迭代器实现来遍历集合,而不需要了解集合的具体实现。让我们通过一个示例来演示迭代器模式的用法。

2023-10-11 15:15:00 116

原创 备忘录模式:对象状态的保存与恢复

备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在之后恢复该状态。备忘录模式是一种强大的设计模式,用于保存和恢复对象的状态。让我们通过一个简单的示例来演示备忘录模式的实现。备忘录模式的核心思想是将对象的状态保存在一个备忘录中,然后将备忘录存储在负责人对象中。这使得我们可以在需要时恢复对象的状态,从而实现撤销或重做操作,或者在某些情况下用于恢复对象的崩溃状态。备忘录模式,有时也称为快照模式,是一种允许我们保存对象内部状态并在之后恢复它的设计模式。

2023-10-10 19:45:00 309

原创 访问者模式:对象结构的元素处理

在访问者模式中,我们定义了一个访问者(Visitor)类,该类包含一组访问方法,每个方法用于处理不同类型的元素。然后,我们可以为不同类型的元素定义一个元素类,并将这些元素传递给访问者进行处理。访问者模式的核心思想是在不修改元素类的情况下,通过访问者来实现对元素的操作。访问者模式是一种行为型设计模式,它用于处理对象结构中不同类型的元素,而不需要修改这些元素的类。访问者模式的主要目的是将数据结构与数据操作分离,使得可以在不修改元素类的情况下,通过访问者来添加新的操作。方法,用于遍历元素并调用访问者的方法。

2023-10-10 13:10:00 323

原创 状态模式:对象状态的变化

状态模式的高级用法包括动态状态切换和实际应用,使其成为解决一系列状态相关问题的有力工具。状态模式允许状态切换的灵活性,这意味着在运行时可以动态地改变对象的状态。但状态模式关注对象在不同状态下的行为,而策略模式关注算法的选择和替换。使用状态模式,可以轻松管理邮件的状态,并根据不同状态显示不同的界面和行为。不同的状态下,电梯有不同的行为。它将对象的状态封装为不同的状态类,并允许对象在运行时切换状态,从而改变其行为。在本文中,我们将深入探讨状态模式,这是一种行为型设计模式,用于管理对象的状态以及状态之间的变化。

2023-10-09 23:41:04 663

原创 解释器模式:语言解释与处理

解释器模式是一种用于处理语言解释和处理的设计模式。它允许我们为特定语言创建解释器,并将语言中的表达式解释和执行。解释器模式是一种设计模式,用于定义语言的文法规则,以及用于解释语言中的表达式。这允许我们为语言创建解释器,以便能够解释和执行语言中的表达式。让我们通过一个简单的示例来理解解释器模式。在本文中,我们将深入研究解释器模式,这是一种行为型设计模式,用于处理语言解释和处理。解释器模式通常用于实现编程语言解释器、正则表达式引擎、配置文件解析器等应用,其中需要解释和处理特定语言或规则。

2023-10-08 10:15:00 117

原创 命令模式:将请求封装为对象

命令模式是一种行为型设计模式,它允许您将请求封装成对象,从而允许您根据不同的请求、队列或者日志来参数化其他对象,并支持可撤销的操作。宏命令是一种命令模式的扩展,它允许您将多个命令组合成一个更大的命令。命令模式是一种行为型设计模式,它将请求和操作解耦,允许将操作封装成独立的命令对象。这个示例中,我们将不同的操作(打开电视、切换频道、调整音量)封装成了命令对象,通过遥控器执行这些命令,而不需要直接调用接收者的方法。通过上述代码,我们实现了撤销和重做操作,可以在执行操作后撤销到之前的状态,然后再重做。

2023-09-14 14:15:00 77

原创 责任链模式:职责的传递与处理

它将请求发送者与接收者解耦,允许多个对象都有机会处理请求,直到找到一个合适的处理者。责任链模式是一种行为型设计模式,旨在构建一个处理请求的对象链。每个对象都有机会处理请求,但如果它无法处理,请求将继续传递到链上的下一个对象,直到找到一个能够处理请求的对象。责任链模式用于将请求沿着处理者链传递,直到找到能够处理请求的对象为止。它允许您动态地建立处理者链,根据需要修改链的顺序或添加新的处理者,而无需更改客户端代码。处理,如果无法处理,则传递给下一个处理者,直到找到能够处理的处理者或到达链的末尾。

2023-09-13 12:15:00 156

原创 观察者模式:对象之间的订阅机制

在之前的文章中,我们学习了许多常用的设计模式,今天我们将介绍观察者模式,它是一种行为型设计模式,用于定义对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。通过定义一对多的依赖关系,主题状态变化时通知多个观察者,实现了对象之间的订阅机制。如果没有观察者模式,我们可能会采用硬编码的方式来实现这些通知,但这样会导致高耦合和不易维护的问题。现在,让我们通过一个示例来演示观察者模式的实现。观察者模式的核心思想是降低主题和观察者之间的耦合度,使得它们可以独立地变化。

2023-09-12 12:00:00 121

原创 策略模式:切换算法的灵活性

策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法封装到一个独立的类中,并使它们可以相互替换。策略模式允许客户端在运行时从多个算法中选择一个合适的算法,而不必修改代码。策略模式是一种用于实现算法家族的设计模式,它将每个算法封装到独立的策略类中,使得这些算法可以相互替换。通过策略模式,我们可以实现算法与客户端代码的解耦,提高了代码的灵活性和可维护性。在本篇文章中,我们介绍了策略模式的基本概念、优点以及为什么需要使用它。我们还通过一个电商促销的例子演示了策略模式的实际应用。

2023-09-11 14:15:00 126

原创 外观模式:简化复杂系统

外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式通过创建一个外观类,将客户端与子系统解耦,从而简化了客户端与复杂子系统之间的交互。外观模式是一种非常实用的设计模式,它可以帮助我们简化复杂系统的使用,并将客户端与子系统解耦。通过提供一个统一的接口,外观模式使得客户端更容易理解和使用系统的功能。在本篇文章中,我们介绍了外观模式的概念、优点以及为什么需要使用它。通过一个家庭影院系统的例子,我们演示了如何使用外观模式来简化客户端与多个子系统的交互。

2023-09-10 16:55:53 362

原创 装饰器模式:动态地添加功能

装饰器模式是一种结构型设计模式,它允许你在不改变现有对象结构的情况下,动态地向对象添加功能。装饰器模式通过创建一个装饰器类,该类包装了原始对象,并在不影响原始对象的情况下,为其添加新的功能。在这篇文章中,我们学习了装饰器模式,它是一种动态地为对象添加功能的设计模式。我们了解了装饰器模式的优点以及为什么在实际应用中需要使用它。通过一个咖啡店系统的例子,我们展示了如何使用装饰器模式来动态地为咖啡添加配料,从而创建出多种不同的咖啡类型。

2023-09-10 16:49:41 377

原创 组合模式:树状结构与整体-部分关系

组合模式是一种结构型设计模式,它将对象组合成树状结构以表示“整体-部分”关系。组合模式使得客户端可以以一致的方式处理单个对象和对象组合,从而使得系统更加灵活。组合模式是一种非常实用的设计模式,它可以帮助我们构建树状结构的对象,并以一种统一的方式处理单个对象和对象组合。通过一个图形绘制应用的例子,我们学习了如何使用组合模式来实现整体-部分关系。

2023-09-06 11:45:00 83

原创 桥接模式:连接抽象与实现

桥接模式是一种结构型设计模式,它主要用于将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式通过组合的方式,将不同维度的变化分离开来,从而实现更灵活的系统设计。桥接模式是一种非常实用的设计模式,它可以帮助我们将抽象部分和实现部分分离,从而使得系统更加灵活。通过一个实际的图形绘制应用例子,我们学习了如何使用桥接模式来分离不同维度的变化!

2023-09-05 09:45:00 427

原创 适配器模式:接口的平滑过渡

适配器模式是一种结构型设计模式,它主要用于将一个类的接口转换成另一个类的接口,从而使得不兼容的接口能够协同工作。适配器模式在现实生活中常常用于电源适配器,将不同国家的电源插头适配到统一的插座上。适配器模式是一种非常实用的设计模式,它可以帮助我们解决不同接口之间的兼容性问题。通过一个实际的音频播放器应用例子,我们学习了如何使用适配器模式来适配不同格式的音频文件。适配器模式在项目中的应用非常广泛,能够提高代码的重用性和扩展性。在下一篇文章中,我们将继续学习其他设计模式,敬请期待!

2023-09-03 17:29:41 740

原创 原型模式:复制对象的技巧

原型模式是一种创建型设计模式,它主要用于复制对象。原型模式通过复制现有的对象来创建新的对象,从而避免了使用构造函数创建对象时的复杂初始化过程。这种方式在某些情况下可以提高性能,减少对象创建的开销。

2023-09-03 17:24:26 967

原创 建造者模式:构建复杂对象

建造者模式是一种创建型设计模式,它主要用于构建复杂对象。通过将一个复杂对象的构建过程与其表示分离,可以使构建过程更加灵活,同时还可以隐藏对象的内部结构。

2023-08-31 23:02:44 272

原创 抽象工厂模式:创建相关对象族

抽象工厂模式是一种创建型设计模式,它提供了一种方法来创建一族相关或相互依赖的对象,而无需指定其具体的类。抽象工厂模式通过引入抽象工厂和具体工厂来实现,从而实现了对象的创建与使用的分离。

2023-08-28 23:42:49 480

空空如也

空空如也

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

TA关注的人

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