自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2024-07-16 19:31:45 429

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

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

2024-07-16 15:28:12 570

原创 Git命令merge和rebase的区别

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

2024-07-16 10:04:17 518

原创 【无标题】

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

2024-07-15 13:36:33 895

原创 浅谈线程池设计机制

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

2024-07-15 11:45:21 831

原创 MySQL关于日志15个讲解

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

2024-07-04 10:01:00 986

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

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

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

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

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

2024-06-21 14:27:08 795

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

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

2024-06-21 10:43:44 1317

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

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

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

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

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

2024-06-20 10:36:59 914

原创 浅谈 Mybatis 动态 SQL

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

2024-06-20 10:22:31 24

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

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

2024-06-20 10:12:30 328

原创 Spring Cloud Gateway深挖

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

2024-06-20 09:53:11 22

原创 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 716

原创 Zadig vs. Jenkins 详细比较

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

2024-06-15 16:37:10 718

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

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

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

转载 Spring事件(Application Event)

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

2024-05-10 11:45:29 76

原创 金额用Long还是BigDecimal?

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

2024-05-06 14:03:31 571

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

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

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

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

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

2024-04-30 16:47:25 122

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

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

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

原创 数据脱敏方案

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

2024-04-29 11:22:09 706

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

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

2024-04-29 11:17:22 922

原创 常见消息队列详解

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

2024-04-29 10:19:47 704

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

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

2024-04-29 10:15:31 343

原创 redis工作使用总结

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

2024-04-23 17:07:38 545

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

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

2024-04-02 11:31:38 720

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

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

2024-04-02 11:21:52 1117

原创 MySQL表设计军规18条

另外,还有有个好处是,如果哪天有非订单的业务,比如:金融业务,也需要建一个名字叫做pay的表,可以取名:finance_pay,就能非常轻松的区分。举个例子,比如:做异步excel导出功能时,需要在异步任务表中加一个字段,保存用户通过前端页面选择的查询条件,每个用户的查询条件可能都不一样。数据库中,特别是做了分库分表的业务库中,主键最好由外部算法(比如:雪花算法)生成,它能够保证生成的id是全局唯一的。其实还有很多公共字段,在不同的表之间,可以使用全局统一的命名规则,定义成相同的名称,以便于大家好理解。

2024-04-02 11:15:39 180

原创 List操作add,clear,addall报错UnsupportedOperationException的解决办法

对于转化后的集合list,所以使用集合修改方法add(),remove(),clear()会抛异常,因为其底层还是数组,为Arrays的一个内部类,1其并没有实现集合对应的修改类方法会报UnsupportedOperationException。当传入一个原生的数据类型的数组的时候,Arrays.asList()真正得到的参数就不是数组中的元素,而是数组对象本身!Arrays.asList()是泛型方法吗,传入的对象必须是对象数组。这个方法的使用时候,传递的数组必须是对象数组,而不是基本数据类型。

2024-03-29 17:06:12 392

转载 分布式任务调度框架(PowerJob与xxl-job对比)

PowerJob 是新一代分布式任务调度与计算框架,支持 CRON、API、固定频率、固定延迟等调度策略,提供工作流来编排任务解决依赖关系,能让您轻松完成作业的调度与繁杂任务的分布式计算。

2024-03-12 10:19:17 979 1

原创 聊聊@Async注解遇到的问题

看到BeanCurrentlyInCreationException这个异常,我的第一反应是出现了循环依赖的问题。但是仔细一想,Spring不是已经解决了循环依赖的问题么,怎么还报这个错。于是,我就询问小姐姐改了什么东西,她说在方法上加了@Async注解。这里我模拟一下当时的代码,AService 和 BService 相互引用,AService的 save() 方法加了 @Async 注解。

2024-03-05 11:00:55 79

原创 SpringCloud远程调用为啥要采用HTTP

首先SpringCloud开启Web服务依赖于内部封装的Tomcat容器,而今信息飞速发展,适应大流量的微服务,采用Tomcat处理HTTP请求,开发者编写Json作为资源传输,服务器做出相应的响应,可以更加的灵活处理业务数据,而HTTP协议是跨平台的,符合微服务B/C数据交互的方式,可以的一套服务器对应移动H5、App、小程序提供服务。注意:无论是何种类型的数据,最终都需要序列化转换成二进制流在网络上进行传输,数据的发送方需要将对象序列化转换为二进制流,而数据的接收方则需要把二进制流反序列化为对象。

2024-03-04 09:50:39 711

原创 OpenFeign核心原理

这一节主要是介绍了7个Feign的核心组件以及Spring对应的扩展实现为了方便你查看,我整理了如下表格接口作用Feign默认实现Spring实现Contract解析方法注解和参数,将Http请求参数和方法参数对应Encoder将请求体对应的方法参数序列化成字节数组Decoder将响应体的字节流反序列化成方法返回值类型对象Client发送Http请求InvocationHandler工厂,动态代理核心逻辑无在发送Http请求之前,再对Http请求的内容进行拦截修改无无。

2024-02-29 18:09:22 104

原创 四种经典限流算法讲解

固定窗口限流算法()是一种最简单的限流算法,其原理是在固定时间窗口单位时间)内限制请求的数量。该算法将时间分成固定的窗口,并在每个窗口内限制请求的数量。具体来说,算法将请求按照时间顺序放入时间窗口中,并计算该时间窗口内的请求数量,如果请求数量超出了限制,则拒绝该请求。假设单位时间(固定时间窗口)是1秒,限流阀值为3。在单位时间1秒内,每来一个请求,计数器就加1,如果计数器累加的次数超过限流阀值3,后续的请求全部拒绝。等到1s结束后,计数器清0,重新开始计数。

2024-02-28 13:30:19 987

原创 SpringBoot Redis 分布式锁的正确实现方式

使用上面的脚本,每个锁都用一个随机值作为唯一标识,当删除锁的客户端的“唯一标识”与锁的 value 匹配的时候,才能执行删除操作。加锁的代码应该写在 try {} 代码中,放在 try 外面的话,如果执行加锁异常(客户端网络连接超时),但是实际指令已经发送到服务端并执行,就会导致没有机会执行解锁的代码。此外,为了让程序更加健壮,码哥实现了阻塞等待获取分布式锁,让你用的更加开心,面试不慌加薪不难。一个分布式锁方案出来了,一气呵成,组员不明觉厉,纷纷竖起大拇指,伪代码如下。然而,这是一个错误的分布式锁。

2024-02-27 13:47:50 235

原创 MySQL的21个SQL经验

NOT NULL列更节省空间」,NULL列需要一个额外字节作为判断是否为 NULL 的标志位。「NULL列需要注意空指针问题」,NULL列在计算和比较的时候,需要注意空指针问题。

2024-02-26 16:30:25 2007 1

原创 SpringBoot 动态加载jar包,动态配置

URLClassLoader 是一种特殊的类加载器,可以从指定的 URL 中加载类和资源。它的主要作用是动态加载外部的 JAR 包或者类文件,从而实现动态扩展应用程序的功。为了便于管理动态加载的jar包,自定义类加载器继承URLClassloader。/*** 自定义类加载器*/@Override// 从已加载的类集合中获取指定名称的类Class<?if (clazz!= null) {try {// 调用父类的findClass方法加载指定名称的类。

2024-02-26 14:47:36 99

原创 Spring Boot 的参数校验方案

在平时的开发工作中,我们通常需要对接口进行参数格式验证。当参数个数较少(个数小于3)时,可以使用手动进行参数验证。当参数个数大于3个时,使用进行参数验证就会让代码显得臃肿,这个时候推荐使用注解来进行参数验证。​​我们在全局异常处理类中使用捕获异常,获取参数验证异常信息,最后返回统一的异常结果格式。除了框架自带的注解,平时的工作中可能需要我们自定义验证注解处理特定的业务需求。这里汪小成将上面User类中的手机号格式验证改成使用自定义注解的验证方式。4.2.1 定义注解​。

2024-02-23 11:42:35 655

空空如也

空空如也

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

TA关注的人

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