- 博客(549)
- 收藏
- 关注
原创 最常用的6种API网关介绍
end-- API Key验证end-- 验证API Key格式end-- 请求体验证endend-- 业务规则验证endend-- 添加验证通过标记-- 记录审计日志end通过本文的介绍,我们对6种主流API网关有了全面的认识。技术栈匹配:选择与团队技术栈最匹配的方案性能要求:根据业务并发量选择性能合适的网关功能需求:评估需要的功能特性,如限流、认证、监控等运维成本:考虑部署、监控、维护的复杂度团队能力:评估团队对网关技术的掌握程度。
2025-11-18 10:38:36
833
原创 系统激增消息积压了100万解决实施方案
在工作中可能遇到过这种场景:某天系统监控告警响了——MQ队列里突然积压了100万条消息,整个系统卡顿如蜗牛。你第一反应是不是“赶紧加机器,扩容消费端”?没错,这招能临时救火,但成本高、见效慢,如果根源问题没解决,积压只会卷土重来。我曾在一次餐饮大促中就处理过类似灾难:我们用的是RocketMQ,每秒生产百万级订单消息,但由于消费逻辑bug,消息堆积到200万条。当时,团队想加服务器扩容,但预算有限、时间紧迫,我们只能另辟蹊径。结果通过优化代码和策略,问题解决了!为什么MQ会积压100万数据?
2025-11-17 11:05:01
971
原创 Redis百万并发大解密
有些小伙伴可能会疑惑:Redis是单线程的,为什么还能支持这么高的并发?这里需要澄清一个概念,Redis的"单线程"指的是网络IO和键值对读写是由一个线程来完成的,但Redis的整个系统并不是只有一个线程。为什么单线程反而更快?避免了线程切换的开销:多线程环境下,CPU需要在不同线程间切换,这个过程需要保存和恢复线程上下文,开销很大。避免了锁竞争:单线程模型下,不需要考虑线程安全问题,避免了各种锁的开销。CPU缓存友好:单线程执行时,CPU缓存命中率更高,减少了内存访问延迟。让我们看一个简单的对比:1
2025-09-12 13:53:46
59
原创 代码重构的实践技巧
当需要添加新的运输方式时,只需创建一个新的策略类,并将其添加到策略映射中,而不需要修改现有的代码。通过使用方法引用,我们将简单的Lambda表达式替换为更简洁的方法引用,使得代码更加简洁和可读。通过使用多态,我们将不同类型的支付处理逻辑分散到各自的类中,使得代码更加模块化,也更容易扩展。通过使用策略模式,我们将不同的运费计算逻辑分散到各自的类中,使得代码更加模块化,也更容易扩展。通过使用Stream API,我们将命令式的代码转换为声明式的代码,使得代码更加简洁和可读。
2025-09-12 13:49:09
1096
原创 MQ的工作中的实现方案
在深入具体场景之前,我们先来思考一个基本问题:为什么要使用消息队列?系统间的直接调用:引入消息队列后:接下来我们将通过10个具体场景,带大家来深入理解MQ的价值。在我早期参与的一个电商项目中,订单创建后需要通知多个系统:这种架构存在严重问题:紧耦合:订单服务需要知道所有下游服务单点故障:任何一个下游服务挂掉都会导致订单创建失败性能瓶颈:同步调用导致响应时间慢引入MQ后,架构变为:代码实现:技术要点 消息协议选择:根据业务需求选择RabbitMQ、Kafka或RocketMQ消息格式:使
2025-09-04 11:22:45
988
原创 Spring 状态机实现方案
先来解释什么是“状态”( State )。现实事物是有不同状态的,例如一个自动门,就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机,也就是被描述的事物的状态的数量是有限个,例如自动门的状态就是两个 open 和 closed。状态机,也就是 State Machine ,不是指一台实际机器,而是指一个数学模型。说白了,一般就是指一张状态转换图。例如,根据自动门的运行规则,我们可以抽象出下面这么一个图。
2025-09-03 15:10:00
891
原创 Binlog Server守护MySQL数据0丢失
其中绿色线表示Binlog Server控制流,主要是从Admin管理员发送的管控SQL,在SQL解析器处理后,在Manage模块进行处理,可以对MasterSession(和主库的连接),SlaveSession(和下游从库的连接),Binlog(本地存储文件)进行管理。这里无法采用MySQL解析器,因为MySQL的词法解析部分全部自行编写,而不是采用FLEX(全局变量,不支持多线程并发),以提升SQL解析性能,从而支持每秒几十万次的SQL解析速度,缺点就是代码非常复杂,难以将所需功能进行剥离。
2025-08-21 13:45:13
93
转载 Easy-cache:统一缓存解决方案
Easy-cache通过统一的设计解决了开发人员在缓存使用中的痛点,实现了以下核心价值:重复代码问题:通过注解驱动,让开发者告别重复的缓存处理代码缓存穿透问题:通过空值缓存和智能防护机制,有效防止恶意请求穿透到数据库缓存击穿问题:通过分布式锁机制和标记删除方式,防止热点数据失效导致的数据库崩溃数据不一致问题:通过Redis-Hash结构+Lua脚本实现分布式锁,确保缓存与数据库的数据同步Redis宕机问题:通过自动降级和探活机制,保证服务的高可用性。
2025-08-19 16:47:51
157
原创 深挖SPI 机制
1SPI 全称为,是一种服务发现机制。SPI 的本质是将的中,并由。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。
2025-03-19 13:21:46
747
1
原创 SpringBoot 集成logback日志链路追踪
用途:每一次链路,线程维度,添加最终的链路 ID traceId.MDC(Mapped Diagnostic Context) 诊断上下文映射,是@Slf4j提供的一个支持动态打印日志信息的工具。/*** 日志拦截器*/@Override//可以考虑让客户端传入链路ID,但需保证一定的复杂度唯一性;如果没使用默认UUID自动生成if (!returntrue;@Override// 请求处理完成后,清除MDC中的traceId,以免造成内存泄漏/**
2025-03-14 09:38:21
1018
原创 CompletableFuture工作常遇到的6个天坑
CompletableFuture 的回调地狱指的是在异步编程中,过度依赖回调方法(如 thenApply、thenAccept 等)导致代码嵌套过深、难以维护的现象。当多个异步任务需要顺序执行或依赖前一个任务的结果时,如果直接嵌套回调,代码会变得臃肿且难以阅读。如果任务阻塞或执行时间过长,可能会导致线程池耗尽,影响其他任务的执行。假设我们有两个任务服务,一个查询用户基本信息,一个是查询用户勋章信息。任务编排时,如果任务之间有依赖关系,可能会导致任务无法按预期顺序执行。时,手动传递上下文。
2025-03-14 09:32:48
606
原创 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
402
原创 java中String的传参和不可变问题
通常我们使用以为String为引用类型,所以在传递的时候传递的是地址,因此在函数modifyStr中改变了str的值。但是经过测试实际情况并不是这样,输。出的仍然是original,可见str的值并没有因为modifyStr而改变。其实本质的原因在于String是一个封装类。方法创建了一个新的字符串,而不是修改原始的。
2025-03-10 14:48:54
205
原创 地图如何找出方圆一千米内的人、物、地址
首先我想先介绍一下GeoHash这种算法「基本原理」,再讨论如何进行应用。对于每一个坐标都有它的经纬度(lng,lat),而GeoHash的原理就是将经纬度先通过一个二分的思路拿到一个二进制数组的字符串,然后再通过base32编码去进行压缩存储。举一个例子,比如经纬度为(116.3111126,40.085003),对其进行二分步骤如下:bitleftmidright1-18001801090180090135180190112.51350112.5。
2025-03-06 11:38:53
826
原创 炸裂!Spring 宣布接入 DeepSeek
首先,您需要获取 DeepSeek API 密钥,配置基本 URL,并选择其中一个受支持的模型。DeepSeek 是深度求索公司发布的大模型,是国产之光。大家应该学会如何使用 DeepSeek 大模型,下面我们将看下如何开发基于 DeepSeek 大模型的智能应用。现阶段 DeepSeek 服务受资源限制可能无法提供在线服务,那么可以本地部署一个DeepSeek 大模型进行学习和使用。DeepSeek AI提供开源的 DeepSeek V3 模型,该模型以其尖端的推理和解决问题的能力而闻名。
2025-02-21 09:51:28
230
原创 Redis的15种常用场景
它通过位图(bit array)存储和操作数据,可以高效地处理大量的签到操作,特别适合于需要频繁更新并查询某个用户是否已签到的场景。Redis适合实现用户消息时间线(Timeline)功能.用户消息时间线通常用于展示用户动态、朋友圈、微博等场景,核心需求是按时间顺序存储和展示用户的相关消息或动态。利用 Sorted Set 的 有序性 和 范围查询 特性,将任务的执行时间作为分数(score),任务数据作为成员(member),定时轮询获取到期的任务。每次请求时,移除时间窗口外的旧记录,并添加新记录。
2025-02-20 09:59:41
1193
原创 canal实现Mysql数据同步
阿里巴巴MySQL数据库binlog增量订阅与消费组件,基于数据库增量日志解析,提供增量数据订阅与消费,目前主要支持了MySQL。Canal开源地址:https://github.com/alibaba/canal。
2025-02-10 09:56:26
236
原创 CompletableFuture使用中的生产事故
此时,尽管异步线程还在进行数据处理和外部 API 调用,但由于主线程的退出,所有异步操作都被中断,导致了未完成的任务丢失,数据处理中断,API 请求未能完成。这种行为在某些情况下会导致异步任务的中断或丢失,尤其是在异步线程需要较长时间执行的情况下,主线程退出后,异步线程的生命周期会受到影响,从而导致任务没有被正确完成。在没有线程池管理的情况下,当主线程退出时,如果没有其他活跃的用户线程,JVM 会检测到这是最后一个活跃的用户线程,因此会自动终止所有其他用户线程,包括异步线程。而引发线上事故的故事。
2025-01-22 15:46:47
896
原创 SpringBoot + LiteFlow:实现复杂业务逻辑流程编排
LiteFlow是什么?LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑。通过支持热加载规则配置,开发者能够即时调整流程步骤,将复杂的业务如价格计算、下单流程等拆分为独立且可复用的组件,从而实现系统的高度灵活性与扩展性,避免了牵一发而动全身的问题。旨在优化开发流程,减少冗余工作,让团队能够更聚焦于核心业务逻辑,而将流程控制层面的重任托付给该框架进行自动化处理。LiteFlow整合了流程编排与规则引擎的核心特性,提供XML
2024-11-29 11:12:21
2432
1
原创 微服务架构技术栈选型
该篇文章主要是介绍当前比较流行的一些微服务技术栈以及常用的应用服务,仅仅是个人的一些看法,目前你公司常用的微服务架构有哪些呢?
2024-11-14 20:25:06
1320
原创 规则引擎之LiteFlow流程编排
在日常的开发过程中,经常会遇到一些串行或者并行的业务流程问题,而业务之间不必存在相关性。在这样的场景下,使用策略和模板模式的结合可以很好的解决这个问题,但是使用编码的方式会使得文件太多,在业务的部分环节可以这样操作,在项目角度就无法一眼洞穿其中的环节和逻辑。
2024-11-11 10:55:08
3221
原创 微服务的注册中心Nacos
Nacos是阿里巴巴开源的服务注册中心以及配置中心,致力于给开发者提供一款便捷、简单上手的开源框架。Nacos究竟有什么惊人的地方呢?看下图:从上图不难看出阿里巴巴的野心,一个Nacos干掉了Spring Cloud的三大组件,分别是注册中心Eureka服务配置Config服务总线Bus。Nacos的服务注册发现很简单,比Eureka简单多了,无需自己构建个注册中心。Nacos实现配置管理和动态配置刷新很简单,总结如下步骤:添加对应依赖使用原生注解@Value()导入配置使用原生注解刷新配置。
2024-11-05 10:10:11
1030
原创 Spring Boot 的配置动态刷新
对于微服务而言配置本地化是个很大的鸡肋,不可能每次需要改个配置都要重新把服务重新启动一遍,因此最终的解决方案都是将配置外部化,托管在一个平台上达到不用重启服务即可一次修改多处生效的目的。但是对于单体应用的Spring Boot项目而言,动态刷新显然是有点多余,反正就一个服务,改下重启不就行了?添加数据源:对接某个第三方平台的时候,你不可能每次添加一个数据源都要重启下服务固化的对接:大量的固定对接方式,只是其中的某个固定的代码段不同,比如提供视图中的字段不同,接口服务中字段不同等情况。
2024-11-05 10:05:35
1703
原创 深度解析阿里的Sentinel
这是《Spring Cloud 进阶》专栏的第五篇文章,这篇文章介绍一下阿里开源的流量防卫兵Sentinel,一款非常优秀的开源项目,经过近10年的双十一的考验,非常成熟的一款产品。sentinel顾名思义:卫兵;在Redis中叫做哨兵,用于监控主从切换,但是在微服务中叫做流量防卫兵。Sentinel 以流量为切入点,从流量控制熔断降级系统负载保护等多个维度保护服务的稳定性。丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一。
2024-11-05 09:50:42
3161
原创 探究Spring中所有的扩展点
Spring的核心思想就是容器,当容器refresh的时候,外部看上去风平浪静,其实内部则是一片惊涛骇浪,汪洋一片。Springboot更是封装了Spring,遵循约定大于配置,加上自动装配的机制。很多时候我们只要引用了一个依赖,几乎是零配置就能完成一个功能的装配。由spring提供的、在容器或bean生命周期各个阶段、供spring框架回调使用的函数方法,即为扩展点。扩展点体现了Spring框架的灵活性、业务亲和性。
2024-10-29 16:50:41
245
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
569
1
原创 浅谈合理设置线程池参数
提交一个任务,线程池会判断当前线程数是否小于核心线程数,如果是则会立即创建一个工作线程执行任务,即使当前线程池中有空闲线程(ps:之前提交任务所创建的线程执行完任务之后就空闲下来了)可以用来执行当前提交的任务,也会创建一个新的线程去执行,概括来说就是如果没有达到核心线程数,不管当前线程池中有没有空闲线程,都会立即新建一个工作线程去执行当前任务。,即有非核心线程(线程池中核心线程以外的线程)时,这些非核心线程空闲后不会立即销毁,而是会等待,直到等待的时间超过了。如果非要回收空闲的核心线程,可以将线程池的。
2024-10-12 15:41:26
886
原创 IaaS,PaaS和SaaS的区别讲解
IaaS、PaaS和SaaS有什么区别吗?这三个概念只不过在说它们仨的区别前,有个常识需要知道一下:我们传统开发一个软件,需要9个东西:作为使用软件的人,左边的【应用】和【数据】,是最右边的【虚拟化】、【服务器】、【存储】、【网络】是制作一个软件的基础条件,除了虚拟化技术其他都是硬件,所以在云计算领域中,这块被称为基础设施。而中间的这些,就是的基础设施搭建出的平台,从而的【应用】和【数据】。
2024-10-12 11:23:10
1116
原创 十大编程算法
动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是 在表格中简单地查看一下结果,从而获得较高的效率。BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分 析,BFPRT可以保证在最坏情况下仍为线性时间复杂度。深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。
2024-09-24 11:44:10
956
1
原创 7种限流算法打开新方式
最近几年,随着微服务的流行,服务和服务之间的依赖越来越强,调用关系越来越复杂,服务和服务之间的稳定性越来越重要。在遇到突发的请求量激增,恶意的用户访问,亦或请求频率过高给下游服务带来较大压力时,我们常常需要通过缓存、限流、熔断降级、负载均衡等多种方式保证服务的稳定性。其中限流是不可或缺的一环,这篇文章介绍限流相关知识。这篇文章介绍实现限流的几种方式,主要是窗口算法和桶算法,两者各有优势。
2024-09-23 10:20:21
1573
原创 RocketMQ消费者消费的时候,宕机了,消息会丢失吗?
一个消息从,主要经过这3个过程:因此,本文将从以下这几个维度来回答:生产者如何保证不丢消息存储端如何保证不丢消息消费者如何保证不丢消息最后消费者消费的时候,宕机,消息会不会丢呢?
2024-09-23 10:07:44
1266
原创 浅谈分库分表的“读扩散”问题
mysql在单表数据过大时,查询性能会变差,因此当数据量变得巨大时,需要考虑水平分表。水平分表需要选定一个分片键,一般选择主键,然后根据id进行取模,或者根据id的范围进行分表。mysql水平分表后,对于非分片键字段的查询会有读扩散的问题,可以用普通索引列作分片键建一个新表,先查新表拿到id后再回到原表再查一次原表。这本质上是借鉴了倒排索引的思路。如果想要支持更多维度的查询,可以监听mysql的binlog,将数据写入到es,提供近实时的查询能力。当然,用tidb替换mysql也是个思路。
2024-09-02 16:46:21
381
原创 RBAC权限系统方案实现
举个栗子,对于部门来说,一个部门拥有一万多个员工,这些员工都拥有相同的角色,如果没有用户组,可能需要一个个的授予相关的角色,在拥有了用户组以后,只需要,把这些用户全部划分为一组,然后对该组设置授予角色,就等同于对这些用户授予角色。对于通常的系统而言,存在多个用户具有相同的权限,在分配的时候,要为指定的用户分配相关的权限,修改的时候也要依次的对这几个用户的权限进行修改,有了角色这个权限,在修改权限的时候,只需要对角色进行修改,就可以实现相关的权限的修改。优点:减少工作量,便于理解,增加多级管理,等。
2024-09-02 16:36:08
1734
原创 链路追踪神器:SkyWalking
上一篇文章介绍了分布式链路追踪的一种方式:Spring Cloud Sleuth+ZipKin,这种方案目前也是有很多企业在用,但是作为程序员要的追逐一些新奇的技术,Skywalking作为后起之秀也是值得大家去学习的。skywalking是一个优秀的国产开源框架,2015年由个人吴晟(华为开发者)开源 , 2017年加入Apache孵化器。短短两年就被Apache收入麾下,实力可见一斑。
2024-09-02 16:23:43
7733
原创 Mybatis-Plus官方发布分库分表神器
MyBatis - Plus 官方发布的神器:mybatis-mate 为 mp 企业级模块,支持分库分表,数据审计、数据敏感词过滤(AC算法),字段加密,字典回写(数据绑定),数据权限,表结构自动生成 SQL 维护等,旨在更敏捷优雅处理数据。
2024-07-16 19:31:45
1062
1
原创 Java SPI、Spring SPI 和 Dubbo SPI:扩展机制
SPI全称为Service Provider Interface,是一种动态替换发现的机制,一种解耦非常优秀的思想,SPI可以很灵活的让接口和实现分离,让api提供者只提供接口,第三方来实现,然后可以使用配置文件的方式来实现替换或者扩展,在框架中比较常见,提高框架的可扩展性。简单来说SPI是一种非常优秀的设计思想,它的核心就是解耦、方便扩展。
2024-07-16 15:28:12
754
原创 Git命令merge和rebase的区别
因为重新应用的提交已经修改了提交历史记录,如果要撤销 rebase 操作,就需要使用 git reset 命令,这会删除重新应用的提交,同时也会删除后续的提交。rebase 命令的作用是将当前分支的提交移动到另一个分支的最新提交之后,相当于重新应用一遍当前分支的所有提交。使用 rebase 命令合并分支则会将当前分支的提交“移动”到目标分支的最新提交之后,并创建一个新的提交历史记录。使用 merge 命令合并分支会创建一个新的合并提交,该提交拥有两个父提交,即源分支和目标分支的最新提交。
2024-07-16 10:04:17
681
原创 【无标题】
所谓 “设计模式”,就是一套反复被人使用或验证过的方法论。从抽象或者更宏观的角度上看,只要符合使用场景并且能解决实际问题,模式应该既可以应用在DDD中,也可以应用在设计模式中。设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
2024-07-15 13:36:33
994
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅