自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深挖SPI 机制

1SPI 全称为,是一种服务发现机制。SPI 的本质是将的中,并由。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。

2025-03-19 13:21:46 656

原创 SpringBoot 集成logback日志链路追踪

用途:每一次链路,线程维度,添加最终的链路 ID traceId.MDC(Mapped Diagnostic Context) 诊断上下文映射,是@Slf4j提供的一个支持动态打印日志信息的工具。/*** 日志拦截器*/@Override//可以考虑让客户端传入链路ID,但需保证一定的复杂度唯一性;如果没使用默认UUID自动生成if (!returntrue;@Override// 请求处理完成后,清除MDC中的traceId,以免造成内存泄漏/**

2025-03-14 09:38:21 613

原创 CompletableFuture工作常遇到的6个天坑

CompletableFuture 的回调地狱指的是在异步编程中,过度依赖回调方法(如 thenApply、thenAccept 等)导致代码嵌套过深、难以维护的现象。当多个异步任务需要顺序执行或依赖前一个任务的结果时,如果直接嵌套回调,代码会变得臃肿且难以阅读。如果任务阻塞或执行时间过长,可能会导致线程池耗尽,影响其他任务的执行。假设我们有两个任务服务,一个查询用户基本信息,一个是查询用户勋章信息。任务编排时,如果任务之间有依赖关系,可能会导致任务无法按预期顺序执行。时,手动传递上下文。

2025-03-14 09:32:48 469

原创 import javax.annotation.Resource; 和import jakarta.annotation.Resource;使用区别

在Java EE 8之前,javax.annotation.Resource用于注入资源,例如数据源、JMS连接工厂等。因此,javax.annotation.Resource被移动到了jakarta.annotation.Resource。所以,如果您的项目是基于Java EE 8及之后的版本,您应该使用import jakarta.annotation.Resource;而如果您的项目是基于Java EE 8之前的版本,您应该使用import javax.annotation.Resource;

2025-03-12 17:46:52 291

原创 java中String的传参和不可变问题

通常我们使用以为String为引用类型,所以在传递的时候传递的是地址,因此在函数modifyStr中改变了str的值。但是经过测试实际情况并不是这样,输。出的仍然是original,可见str的值并没有因为modifyStr而改变。其实本质的原因在于String是一个封装类。方法创建了一个新的字符串,而不是修改原始的。

2025-03-10 14:48:54 132

原创 地图如何找出方圆一千米内的人、物、地址

首先我想先介绍一下GeoHash这种算法「基本原理」,再讨论如何进行应用。对于每一个坐标都有它的经纬度(lng,lat),而GeoHash的原理就是将经纬度先通过一个二分的思路拿到一个二进制数组的字符串,然后再通过base32编码去进行压缩存储。举一个例子,比如经纬度为(116.3111126,40.085003),对其进行二分步骤如下:bitleftmidright1-18001801090180090135180190112.51350112.5。

2025-03-06 11:38:53 702

原创 炸裂!Spring 宣布接入 DeepSeek

首先,您需要获取 DeepSeek API 密钥,配置基本 URL,并选择其中一个受支持的模型。DeepSeek 是深度求索公司发布的大模型,是国产之光。大家应该学会如何使用 DeepSeek 大模型,下面我们将看下如何开发基于 DeepSeek 大模型的智能应用。现阶段 DeepSeek 服务受资源限制可能无法提供在线服务,那么可以本地部署一个DeepSeek 大模型进行学习和使用。DeepSeek AI提供开源的 DeepSeek V3 模型,该模型以其尖端的推理和解决问题的能力而闻名。

2025-02-21 09:51:28 175

原创 Redis的15种常用场景

它通过位图(bit array)存储和操作数据,可以高效地处理大量的签到操作,特别适合于需要频繁更新并查询某个用户是否已签到的场景。Redis适合实现用户消息时间线(Timeline)功能.用户消息时间线通常用于展示用户动态、朋友圈、微博等场景,核心需求是按时间顺序存储和展示用户的相关消息或动态。利用 Sorted Set 的 有序性 和 范围查询 特性,将任务的执行时间作为分数(score),任务数据作为成员(member),定时轮询获取到期的任务。每次请求时,移除时间窗口外的旧记录,并添加新记录。

2025-02-20 09:59:41 1023

原创 canal实现Mysql数据同步

阿里巴巴MySQL数据库binlog增量订阅与消费组件,基于数据库增量日志解析,提供增量数据订阅与消费,目前主要支持了MySQL。Canal开源地址:https://github.com/alibaba/canal。

2025-02-10 09:56:26 102

原创 CompletableFuture使用中的生产事故

此时,尽管异步线程还在进行数据处理和外部 API 调用,但由于主线程的退出,所有异步操作都被中断,导致了未完成的任务丢失,数据处理中断,API 请求未能完成。这种行为在某些情况下会导致异步任务的中断或丢失,尤其是在异步线程需要较长时间执行的情况下,主线程退出后,异步线程的生命周期会受到影响,从而导致任务没有被正确完成。在没有线程池管理的情况下,当主线程退出时,如果没有其他活跃的用户线程,JVM 会检测到这是最后一个活跃的用户线程,因此会自动终止所有其他用户线程,包括异步线程。而引发线上事故的故事。

2025-01-22 15:46:47 773

原创 Function 接口使用新技巧

在。

2025-01-21 11:01:15 554

原创 SpringBoot + LiteFlow:实现复杂业务逻辑流程编排

LiteFlow是什么?LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑。通过支持热加载规则配置,开发者能够即时调整流程步骤,将复杂的业务如价格计算、下单流程等拆分为独立且可复用的组件,从而实现系统的高度灵活性与扩展性,避免了牵一发而动全身的问题。旨在优化开发流程,减少冗余工作,让团队能够更聚焦于核心业务逻辑,而将流程控制层面的重任托付给该框架进行自动化处理。LiteFlow整合了流程编排与规则引擎的核心特性,提供XML

2024-11-29 11:12:21 1712 1

原创 微服务架构技术栈选型

该篇文章主要是介绍当前比较流行的一些微服务技术栈以及常用的应用服务,仅仅是个人的一些看法,目前你公司常用的微服务架构有哪些呢?

2024-11-14 20:25:06 1194

原创 规则引擎之LiteFlow流程编排

在日常的开发过程中,经常会遇到一些串行或者并行的业务流程问题,而业务之间不必存在相关性。在这样的场景下,使用策略和模板模式的结合可以很好的解决这个问题,但是使用编码的方式会使得文件太多,在业务的部分环节可以这样操作,在项目角度就无法一眼洞穿其中的环节和逻辑。

2024-11-11 10:55:08 2729

原创 微服务的注册中心Nacos

Nacos是阿里巴巴开源的服务注册中心以及配置中心,致力于给开发者提供一款便捷、简单上手的开源框架。Nacos究竟有什么惊人的地方呢?看下图:从上图不难看出阿里巴巴的野心,一个Nacos干掉了Spring Cloud的三大组件,分别是注册中心Eureka服务配置Config服务总线Bus。Nacos的服务注册发现很简单,比Eureka简单多了,无需自己构建个注册中心。Nacos实现配置管理和动态配置刷新很简单,总结如下步骤:添加对应依赖使用原生注解@Value()导入配置使用原生注解刷新配置。

2024-11-05 10:10:11 930

原创 Spring Boot 的配置动态刷新

对于微服务而言配置本地化是个很大的鸡肋,不可能每次需要改个配置都要重新把服务重新启动一遍,因此最终的解决方案都是将配置外部化,托管在一个平台上达到不用重启服务即可一次修改多处生效的目的。但是对于单体应用的Spring Boot项目而言,动态刷新显然是有点多余,反正就一个服务,改下重启不就行了?添加数据源:对接某个第三方平台的时候,你不可能每次添加一个数据源都要重启下服务固化的对接:大量的固定对接方式,只是其中的某个固定的代码段不同,比如提供视图中的字段不同,接口服务中字段不同等情况。

2024-11-05 10:05:35 1589

原创 深度解析阿里的Sentinel

这是《Spring Cloud 进阶》专栏的第五篇文章,这篇文章介绍一下阿里开源的流量防卫兵Sentinel,一款非常优秀的开源项目,经过近10年的双十一的考验,非常成熟的一款产品。sentinel顾名思义:卫兵;在Redis中叫做哨兵,用于监控主从切换,但是在微服务中叫做流量防卫兵。Sentinel 以流量为切入点,从流量控制熔断降级系统负载保护等多个维度保护服务的稳定性。丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一。

2024-11-05 09:50:42 2891

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

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

2024-10-29 16:50:41 198 1

原创 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 545 1

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

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

2024-10-12 15:41:26 740

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

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

2024-10-12 11:23:10 1020

原创 十大编程算法

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

2024-09-24 11:44:10 846 1

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

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

2024-09-23 10:20:21 1463

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

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

2024-09-23 10:07:44 1126

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

RabbitMQ 丢失消息的处理方案。

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

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

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

2024-09-02 16:46:21 312

原创 RBAC权限系统方案实现

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

2024-09-02 16:36:08 1631

原创 链路追踪神器:SkyWalking

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

2024-09-02 16:23:43 7249

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

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

2024-07-16 19:31:45 987 1

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

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

2024-07-16 15:28:12 676

原创 Git命令merge和rebase的区别

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

2024-07-16 10:04:17 642

原创 【无标题】

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

2024-07-15 13:36:33 969

原创 浅谈线程池设计机制

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

2024-07-15 11:45:21 917

原创 MySQL关于日志15个讲解

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

2024-07-04 10:01:00 1076

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

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

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

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

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

2024-06-21 14:27:08 1921

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

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

2024-06-21 10:43:44 2530

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

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

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

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

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

2024-06-20 10:36:59 1238

原创 浅谈 Mybatis 动态 SQL

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

2024-06-20 10:22:31 151

空空如也

空空如也

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

TA关注的人

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