自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 探究Spring中所有的扩展点

Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。Springboot更是封装了Spring,遵循约定大于配置,加上自动装配的机制。很多时候我们只要引用了一个依赖,几乎是零配置就能完成一个功能的装配。由spring提供的、在容器或bean生命周期各个阶段、供spring框架回调使用的函数方法,即为扩展点。扩展点体现了Spring框架的灵活性、业务亲和性。

2024-10-29 16:50:41 116

原创 Linux 命令总结大全

反之,若系统中并没有指定软件包的较旧版本,rpm 命令并不会安装此软件包。find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制所有以 '.txt' 结尾的文件到另一个目录。mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 创建一个目录的iso镜像文件。

2024-10-16 10:23:25 464

原创 浅谈合理设置线程池参数

提交一个任务,线程池会判断当前线程数是否小于核心线程数,如果是则会立即创建一个工作线程执行任务,即使当前线程池中有空闲线程(ps:之前提交任务所创建的线程执行完任务之后就空闲下来了)可以用来执行当前提交的任务,也会创建一个新的线程去执行,概括来说就是如果没有达到核心线程数,不管当前线程池中有没有空闲线程,都会立即新建一个工作线程去执行当前任务。,即有非核心线程(线程池中核心线程以外的线程)时,这些非核心线程空闲后不会立即销毁,而是会等待,直到等待的时间超过了。如果非要回收空闲的核心线程,可以将线程池的。

2024-10-12 15:41:26 590

原创 IaaS,PaaS和SaaS的区别讲解

IaaS、PaaS和SaaS有什么区别吗?这三个概念只不过在说它们仨的区别前,有个常识需要知道一下:我们传统开发一个软件,需要9个东西:作为使用软件的人,左边的【应用】和【数据】,是最右边的【虚拟化】、【服务器】、【存储】、【网络】是制作一个软件的基础条件,除了虚拟化技术其他都是硬件,所以在云计算领域中,这块被称为基础设施。而中间的这些,就是的基础设施搭建出的平台,从而的【应用】和【数据】。

2024-10-12 11:23:10 694

原创 十大编程算法

动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是 在表格中简单地查看一下结果,从而获得较高的效率。BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分 析,BFPRT可以保证在最坏情况下仍为线性时间复杂度。深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。

2024-09-24 11:44:10 576

原创 7种限流算法打开新方式

最近几年,随着微服务的流行,服务和服务之间的依赖越来越强,调用关系越来越复杂,服务和服务之间的稳定性越来越重要。在遇到突发的请求量激增,恶意的用户访问,亦或请求频率过高给下游服务带来较大压力时,我们常常需要通过缓存、限流、熔断降级、负载均衡等多种方式保证服务的稳定性。其中限流是不可或缺的一环,这篇文章介绍限流相关知识。这篇文章介绍实现限流的几种方式,主要是窗口算法和桶算法,两者各有优势。

2024-09-23 10:20:21 1374

原创 RocketMQ消费者消费的时候,宕机了,消息会丢失吗?

一个消息从,主要经过这3个过程:因此,本文将从以下这几个维度来回答:生产者如何保证不丢消息存储端如何保证不丢消息消费者如何保证不丢消息最后消费者消费的时候,宕机,消息会不会丢呢?

2024-09-23 10:07:44 935

原创 遇到的分布式设计10大坑

RabbitMQ 丢失消息的处理方案。

2024-09-02 16:54:17 1432 1

原创 浅谈分库分表的“读扩散”问题

mysql在单表数据过大时,查询性能会变差,因此当数据量变得巨大时,需要考虑水平分表。水平分表需要选定一个分片键,一般选择主键,然后根据id进行取模,或者根据id的范围进行分表。mysql水平分表后,对于非分片键字段的查询会有读扩散的问题,可以用普通索引列作分片键建一个新表,先查新表拿到id后再回到原表再查一次原表。这本质上是借鉴了倒排索引的思路。如果想要支持更多维度的查询,可以监听mysql的binlog,将数据写入到es,提供近实时的查询能力。当然,用tidb替换mysql也是个思路。

2024-09-02 16:46:21 228

原创 RBAC权限系统方案实现

举个栗子,对于部门来说,一个部门拥有一万多个员工,这些员工都拥有相同的角色,如果没有用户组,可能需要一个个的授予相关的角色,在拥有了用户组以后,只需要,把这些用户全部划分为一组,然后对该组设置授予角色,就等同于对这些用户授予角色。对于通常的系统而言,存在多个用户具有相同的权限,在分配的时候,要为指定的用户分配相关的权限,修改的时候也要依次的对这几个用户的权限进行修改,有了角色这个权限,在修改权限的时候,只需要对角色进行修改,就可以实现相关的权限的修改。优点:减少工作量,便于理解,增加多级管理,等。

2024-09-02 16:36:08 1092

原创 链路追踪神器:SkyWalking

上一篇文章介绍了分布式链路追踪的一种方式:Spring Cloud Sleuth+ZipKin,这种方案目前也是有很多企业在用,但是作为程序员要的追逐一些新奇的技术,Skywalking作为后起之秀也是值得大家去学习的。skywalking是一个优秀的国产开源框架,2015年由个人吴晟(华为开发者)开源 , 2017年加入Apache孵化器。短短两年就被Apache收入麾下,实力可见一斑。

2024-09-02 16:23:43 2840

原创 Mybatis-Plus官方发布分库分表神器

MyBatis - Plus 官方发布的神器:mybatis-mate 为 mp 企业级模块,支持分库分表,数据审计、数据敏感词过滤(AC算法),字段加密,字典回写(数据绑定),数据权限,表结构自动生成 SQL 维护等,旨在更敏捷优雅处理数据。

2024-07-16 19:31:45 794

原创 Java SPI、Spring SPI 和 Dubbo SPI:扩展机制

SPI全称为Service Provider Interface,是一种动态替换发现的机制,一种解耦非常优秀的思想,SPI可以很灵活的让接口和实现分离,让api提供者只提供接口,第三方来实现,然后可以使用配置文件的方式来实现替换或者扩展,在框架中比较常见,提高框架的可扩展性。简单来说SPI是一种非常优秀的设计思想,它的核心就是解耦、方便扩展。

2024-07-16 15:28:12 639

原创 Git命令merge和rebase的区别

因为重新应用的提交已经修改了提交历史记录,如果要撤销 rebase 操作,就需要使用 git reset 命令,这会删除重新应用的提交,同时也会删除后续的提交。rebase 命令的作用是将当前分支的提交移动到另一个分支的最新提交之后,相当于重新应用一遍当前分支的所有提交。使用 rebase 命令合并分支则会将当前分支的提交“移动”到目标分支的最新提交之后,并创建一个新的提交历史记录。使用 merge 命令合并分支会创建一个新的合并提交,该提交拥有两个父提交,即源分支和目标分支的最新提交。

2024-07-16 10:04:17 590

原创 【无标题】

所谓 “设计模式”,就是一套反复被人使用或验证过的方法论。从抽象或者更宏观的角度上看,只要符合使用场景并且能解决实际问题,模式应该既可以应用在DDD中,也可以应用在设计模式中。设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

2024-07-15 13:36:33 944

原创 浅谈线程池设计机制

虽然 Java 对线程的创建、中断、等待、通知、销毁、同步等功能提供了很多的支持,但是从操作系统角度来说,频繁的创建线程和销毁线程,其实是需要大量的时间和资源的。例如,当有多个任务同时需要处理的时候,一个任务对应一个线程来执行,以此来提升任务的执行效率,模型图如下:如果任务数非常少,这种模式倒问题不大,但是如果任务数非常的多,可能就会存在很大的问题:1.线程数不可控:随着任务数的增多,线程数也会增多,这些线程都没办法进行统一管理。

2024-07-15 11:45:21 877

原创 MySQL关于日志15个讲解

WAL,中文全称是Write-Ahead Logging,它的关键点就是日志先写内存,再写磁盘。MySQL执行更新操作后,在真正把数据写入到磁盘前,先记录日志。好处是不用每一次操作都实时把数据写盘,就算crash后也可以通过redo log恢复,所以能够实现快速响应SQL语句。其实所谓的两阶段就是把一个事务分成两个阶段来提交。两阶段提交两阶段提交主要有三步曲:redo log在写入后,进入prepare状态执行器写入bin log进入commit状态,事务可以提交。为什么需要两阶段提交呢?

2024-07-04 10:01:00 1034

原创 工作实践:11种API性能优化方法

上面这个例子中,发站内通知和用户操作日志功能,对实时性要求不高,即使晚点写库,用户无非是晚点收到站内通知,或者运营晚点看到用户操作日志,对业务影响不大,所以完全可以异步处理。但是,如果一次性查询的用户数量太多,例如一次查询2000个用户的数据,传入2000个用户的ID进行远程调用时,用户查询接口经常会出现超时的情况。这种情况下,接口的一次请求会涉及到非常长的调用链路。当系统发展到一定阶段,用户并发量增加,会有大量的数据库请求,这不仅需要占用大量的数据库连接,还会带来磁盘IO的性能瓶颈问题。

2024-06-21 15:12:56 1287 1

原创 ShardingSphere框架:分片策略和分片算法

算法的数据分布规则,那么这个算法也很容易明白,分片健值在界值范围内 [datetime-lower,datetime-upper) 遵循每满足 sharding-seconds 时间段的数据放入对应分片表,超出界值的数据上下顺延到其他分片中。Hint 算法可以很好的解决此场景。在分片策略中,分片键确定了数据的拆分依据,分片算法则决定了如何对分片键值运算,将数据路由到哪个物理分片中。基于分片边界的范围分片算法,和分片容量算法不同,这个算法根据数据的取值范围进行分片,特别适合按数值范围频繁查询的场景。

2024-06-21 14:27:08 1257

原创 运维:k8s常用命令大全

Kubernetes是一个强大的容器编排平台,不管是运维、开发还是测试或多或少都会接触到,熟练的掌握k8s可大大提高工作效率和强化自身技能。

2024-06-21 10:43:44 2137

原创 如何实现流程编排能力的方案解决

流程编排能力和并行冲突的解决是大型企业级应用中非常重要的部分。通过采用成熟的工作流引擎、定义清晰的任务和节点、实现任务的调度与执行、以及实现监控与日志等功能,可以有效地实现流程编排能力。同时,通过资源锁定、任务优先级、队列化处理、重试机制、分布式事务和异常处理与回滚等方式,可以有效地解决并行冲突问题,确保系统的稳定性和可靠性。

2024-06-21 10:35:32 301 1

原创 Spring Boot + URule 集成实现可视化规则引擎

当然,还有其他的概念和功能,这里也不一一介绍了,因为上面说的已经是最常用的了,想了解的可以自行去了解。当然,类似于变量库,常量库也可以实现和系统中的枚举相互映射,这样做的好处可以避免我们手动输入,防止输入错误。上面说过,规则都是可视化配置的。在配置规则的过程中,就需要引入各种已经定义好的库文件,再结合业务需求,从而配置出符合业务场景的业务规则,所以哪里都有库文件的身影。再聊下决策表,其实它就是规则集的另一种展示形式,比较相对规则集,我更喜欢用决策表去配置规则,应为它呈现的更加直观,更便于理解。

2024-06-20 10:36:59 1108

原创 浅谈 Mybatis 动态 SQL

如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。Mybatis 借助功能强大 OGNL 表达式,可以根据参数条件,动态生成执行 SQL。使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分。这条语句提供了可选的查询博客文章列表 ,如果不传入 “title”,那么所有处于 “ACTIVE” 状态的 博客都会返回。

2024-06-20 10:22:31 109

原创 工作技巧优化if-else代码的八种方案

以下的demo,把map抽象成表,在map中查找信息,而省去不必要的逻辑语句。如果if-else代码块包含return语句,可以考虑通过提前return,把多余else干掉,使代码更加优雅。有时候if-else比较多,是因为非空判断导致的,这时候你可以使用java8的Optional进行优化。在某些时候,使用枚举也可以优化if-else逻辑分支,按个人理解,它也可以看作一种。有了枚举之后,以上if-else逻辑分支,可以优化为一行代码。​​​​​​​策略+工厂模式:优化可定义注解,把。

2024-06-20 10:12:30 379

原创 Spring Cloud Gateway深挖

Predicate来自于java8的接口。Predicate接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)。关注公z号:码猿技术专栏,回复关键词:1111 获取阿里内部性能调优手册!可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。Spring Cloud Gateway内置了许多Predict,这些Predict的源码在包中,有兴趣可以阅读一下。

2024-06-20 09:53:11 66

原创 10种MyBatis开发实践技巧

如果传递的是一个List,则mybatis会封装为一个list为key,list值为object的map,如果是array,则封装成一个array为key,array的值为object的map,如果自己封装呢,则colloection里放的是自己封装的map里的key值。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。使用时比较灵活, new一个这样的实体类,我们需要限制那个条件,只需要附上相应的值就会where这个条件,相反不去赋值就可以不在where中判断。

2024-06-18 15:55:13 786

原创 Zadig vs. Jenkins 详细比较

在上述比对中,我详细对比了 Zadig 和 Jenkins 的设计理念、功能差异以及 Zadig 的特有亮点。它们都旨在为开发人员提供轻松构建和自动化工具,以提高工作效率并释放创造力。然而,随着时代的发展,技术不断进步,新工具不断涌现,Jenkins 曾经是一个很好的选择,但现在可能需要更适应时代的工具。在选择工具时,企业需要综合考虑需求和团队情况,包括组织规模、业务复杂度和开发者体验等因素,以选择最适合的工具来支持团队的发展和项目的成功。

2024-06-15 16:37:10 859

原创 Spring手动开启事务提交事务

但是,有时候我们需要手动开启事务,以便更细粒度地控制事务的边界。需要注意的是,TransactionCallbackWithoutResult是一个抽象类,其中的doInTransactionWithoutResult方法是一个抽象方法,你需要在其中实现你的业务逻辑代码。通过以上的方式,你就能手动开启事务并进行事务的操作了。在Spring中,事务是通过TransactionTemplate或者注解的方式来管理的。以上两种方法都可以实现手动开启事务的功能,具体选择哪种方法取决于项目的需求和开发团队的偏好。

2024-05-22 17:33:30 2668 2

转载 Spring事件(Application Event)

因为它是@EventListener,且MyListener这个Bean是交给SpringBoot容器管理的,而feign子容器创建的时候,其实还处于Boot容器流程的内部,所以此时@EventListener肯定是没有注册上的,因此此方法代表的监听器就不会生效了。这就是我们getApplicationListeners的具体内容,我们发现:它只会拿注册到本容器的监听器(注册在谁身上就是谁的~~~),并不会去父类的拿的,所以这点一定要注意,你自己写监听器的时候也是需要注意这一点的,避免一些重复执行吧~~~

2024-05-10 11:45:29 139

原创 金额用Long还是BigDecimal?

解读:架构师的好苗子。程序不是能跑起来、不出错就行了,要考虑设计能不能自然体现业务需求,好不好理解、扩展和维护。

2024-05-06 14:03:31 615

原创 订单超时自动取消的实践方案

定时任务和延迟消息。1、定时任务定时任务实现策略,我们可以简单划分为单机版和集群版。笔者并不认可单机版,背八股文当然可以,订单自动取消这个业务场景,生产环境还是要慎重。每种方式各有优缺点,笔者更倾向于任务调度平台 XXL-JOB 这种方式。2、延迟消息延时消息是一种非常优雅的模式。消息队列 RocketMQ自研延迟服务Redis 延迟队列。假如技术团队基础架构能力很强,笔者推荐使用 RocketMQ 或者自研延迟服务。

2024-05-06 11:35:34 977 2

原创 数据库加密数据的如何模糊查询?

举个例子:banshan123使用4个字符为一组的加密方式,第一组bans ,第二组ansh ,第三组nsha ,第四组shan …对密文数据进行分词组合,将分词组合的结果集分别进行加密,然后存储到扩展列,查询时通过ext_key like '%partial%'。先对字符进行固定长度的分组,将一个字段拆分为多个,如根据4位英文字符,2个中文字符为一个检索条件。• 返回的结果列表中有可能有多余的结果,需要增加筛选的逻辑:对记录先解密,再筛选;• 支持模糊查询加密方式,产出的密文比较长;

2024-04-30 16:47:25 158

原创 从分布式系统CAP限制的角度,说说分布式锁的实现

当前,redis集群实现分布式锁的讨论非常多,也提出了很多方案,总结了很多很多坑,从CAP的角度上来说,没有坑是不可能的,可能压根从方向上就错了,redis实现分布式锁只适合单机的,接受单机的redis分布式锁吧,在适合它的场景使用就行。那么对于分布式锁系统来说,如果将自己设计成分布式的,那只有一种选择,就是CP模式,这样的话,适用zookeeper实现分布式锁是最好的选择,但是,zookeeper分布式锁有个问题,就是性能不高。1、zookeeper分布式锁,特点:性能较低,高可用。

2024-04-29 16:49:51 382 3

原创 数据脱敏方案

注意:在抹去数据中的敏感内容同时,也需要保持原有的数据特征、业务规则和数据关联性,保证我们在开发、测试以及数据分析类业务不会受到脱敏的影响,使脱敏前后的数据一致性和有效性。数据脱敏也叫数据的去隐私化,在我们给定脱敏规则和策略的情况下,对敏感数据比如 手机号、银行卡号 等信息,进行转换或者修改的一种技术手段,防止敏感数据直接在不可靠的环境下使用。数据脱敏的应用在生活中是比较常见的,比如我们在淘宝买东西订单详情中,商家账户信息会被用 * 遮挡,保障了商户隐私不泄露,这就是一种数据脱敏方式。

2024-04-29 11:22:09 750

原创 Controller层代码统一参数校验

有些时候 JSR303 标准中提供的校验规则不满足复杂的业务需求,也可以自定义校验规则。自定义校验规则需要做两件事情:自定义注解类,定义错误信息和一些其他需要的内容注解校验器,定义判定规则//自定义注解类/*** 是否允许为空*//*** 校验不通过返回的提示信息*/String message() default "不是一个手机号码格式";/*** Constraint要求的属性,用于分组校验和扩展,留空就好*/Class<?Class<?//注解校验器。

2024-04-29 11:17:22 1197

原创 常见消息队列详解

消息队列是在消息的传输过程中保存消息的容器,用于接收消息并以文件的方式存储,一个消息队列可以被一个也可以被多个消费者消费,包含以下 3 元素:Producer:消息生产者,负责产生和发送消息到 Broker;Broker:消息处理中心,负责消息存储、确认、重试等,一般其中会包含多个 Queue;Consumer:消息消费者,负责从 Broker 中获取消息,并进行相应处理。

2024-04-29 10:19:47 743

原创 Spring外部接口的三种方案

SpringBoot不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。在Spring-Boot项目开发中,存在着本模块的代码需要访问外面模块接口,或外部url链接的需求, 比如在apaas开发过程中需要封装接口在接口中调用apaas提供的接口(像发起流程接口submit等等)下面也是提供了三种方式(不使用dubbo的方式)供我们选择。

2024-04-29 10:15:31 418

原创 redis工作使用总结

Redis作为一种优秀的基于key/value的缓存,有非常不错的性能和稳定性,无论是在工作中,还是面试中,都经常会出现。

2024-04-23 17:07:38 582

原创 接口优化技巧从3s到25ms

关于锁粒度:就是你要锁的范围有多大,不管是 synchronized 还是 redis 分布式锁,只需要在临界资源处加锁即可,不涉及共享资源的,不必要加锁,就好比你要上卫生间,只需要把卫生间的门锁上就可以,不需要把客厅的门也锁上。我们都用过数据库连接池,线程池等,这就是池思想的体现,它们解决的问题就是避免重复创建对象或创建连接,可以重复利用,避免不必要的损耗,毕竟创建销毁也会占用时间。也就是预取思想,就是提前要把查询的数据,提前计算好,放入缓存或者表中的某个字段,用的时候会大幅提高接口性能。

2024-04-02 11:31:38 778

原创 Nginx从安装到高可用实用教程!

最终结果,会把这个请求交给得出运算结果最小的服务器。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多服务器进行分发。和TUN模式一样,LVS只是分发请求,应答包通过单独的路由返回给客户端,与TUN相比这种方式不需要隧道结构,可以兼容大多数的操作系统,同时统一路由可以隐藏真实的物理服务器。客户端将请求发往LVS,LVS会选择一台服务器响应请求,在客户端与服务器之间建立隧道,返回结果的时候直接由服务器返回响应,不在经过LVS。

2024-04-02 11:21:52 1150

空空如也

空空如也

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

TA关注的人

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