- 博客(194)
- 资源 (1)
- 收藏
- 关注
原创 Guava RateLimiter客户端限流的演进和最佳实践,含springboot实现代码
本文介绍了基于Guava RateLimiter的客户端限流实现方案。主要内容包括:客户端限流背景与适用场景(保护下游服务、防止雪崩),Guava令牌桶算法原理,以及从单实例限流到可复用组件的演进路径。重点阐述了Spring Boot中通过自定义注解+AOP方式实现的多维度限流方案,支持SpEL表达式动态key和配置化管理。文章还提供了可扩展性建议(动态配置、fallback、监控等),并总结了客户端限流的核心优势(轻量级、易部署)和Guava实现特点。该方案适用于调用第三方接口等需要保护下游服务的场景。
2025-07-09 22:49:48
237
原创 分布式接口幂等性的演进和最佳实践,含springBoot 实现(Java版本)
本文探讨了分布式系统中接口幂等性的重要性及实现方案。在网络不稳定和重试机制下,缺乏幂等性可能导致重复扣费、订单等问题。文章梳理了幂等性演进历程,从简单前端控制到数据库约束、分布式锁等方案,并推荐Redis+Token的最佳实践。通过Spring Boot示例详细展示了Token生成、校验切面和注解化实现流程,提供了可扩展建议。核心思路是利用Redis原子操作实现请求唯一性校验,确保业务逻辑只执行一次。该方案兼顾可靠性和性能,适合微服务架构下的防重场景。
2025-07-08 22:43:41
434
原创 分布式生成 ID 策略的演进和最佳实践,含springBoot 实现(Java版本)
分布式ID生成方案演进与实践摘要 随着系统架构从单体向微服务、分布式演进,传统ID生成方式面临性能瓶颈、重复冲突等问题。本文梳理了分布式ID生成技术的演进历程,从单机自增ID到专业分布式ID服务系统,对比分析了MySQL自增、UUID、雪花算法等基础策略的优缺点。重点探讨了Zookeeper、Redis、雪花算法等分布式环境下的ID生成方案,并详细介绍了美团Leaf、百度UidGenerator等专业解决方案的实现架构与Spring Boot集成示例。针对不同规模企业,提供了从小厂简单方案到大厂混合架构的落
2025-07-07 23:07:21
939
原创 单点登录SSO的演进和最佳实践,含springBoot 实现(Java版本)
单点登录(SSO)技术演进与实践指南 摘要: 本文系统梳理了单点登录技术的发展历程,从早期基于Session的登录共享、CAS认证中心,到现代主流的Token-Based SSO和OAuth2/OpenID Connect协议。重点分析了JWT无状态令牌在现代微服务架构中的应用,以及结合API网关、Redis的典型实现方案。文章提供了SSO最佳实践指南,包括身份令牌设计、安全防护、统一认证、登出机制和权限控制等关键环节,并给出基于Spring生态的技术实现方案。最后总结了网关+Auth服务+Redis+JW
2025-07-07 22:49:55
620
原创 分布式会话的演进和最佳实践,含springBoot 实现(Java版本)
分布式会话在微服务和集群环境中至关重要,经历了从单节点内存存储、会话绑定(Sticky Session)、会话复制,到集中式存储(Redis等),再到无状态的Token(JWT)模式的演进。最佳实践是采用混合方案:利用JWT实现无状态认证,结合Redis(或Redisson)存储会话状态,实现高性能、高可用且安全的分布式会话管理。文中详细介绍了基于Spring Boot、Spring Security、JWT和Redisson的完整分布式会话实现方案,包括:* JWT生成与校验;* 利用Redis
2025-07-06 22:31:26
1022
原创 分布式锁的演进和最佳实践,含springBoot 实现(Java版本)
分布式锁演进与最佳实践摘要 分布式锁是解决分布式系统并发问题的关键技术,其演进经历了多个阶段: 早期基于数据库实现,简单但性能差 Redis成为主流方案,高性能但需处理容错问题 ZooKeeper提供强一致性,适合顺序场景 etcd/Consul更适合云原生环境 最佳实践建议: 根据场景选择方案:Redis适合高性能,ZooKeeper适合强一致性 设计要点:唯一标识、超时机制、续租、粒度控制 生产经验:Redisson自动续约、监控锁状态、避免常见错误 推荐工具:Redisson(Redis)、Curat
2025-07-06 00:11:07
1154
原创 redis开发规范-实战篇
文章目录1 key的设计1.1 按照业务统一管理1.2 key限制大小2 value设计2.1 数据结构应用的场景3 避免bigkey3.1 避免4 合理的使用数据结构和生命周期把控5 优化6 技巧 jedis redisson如何选择7 总结1 key的设计1.1 按照业务统一管理1.2 key限制大小2 value设计2.1 数据结构应用的场景3 避免bigkey3.1 避免4 合理的使用数据结构和生命周期把控5 优化6 技巧 jedis redisson如何选择7 总结...
2022-05-29 22:41:28
966
原创 java easyExcel动态导出字段
java easyExcel动态导出字段 java easyExcel动态导出字段需求根据实体+动态字段导出数据思路代码实现java easyExcel动态导出字段需求根据实体+动态字段导出数据思路1 把实体转成JSON作为接收数据的值2 把查询的数据转成jsonobject 通过上面的值对应放入List代码实现引入包 <dependency> <groupId>com.alibaba</groupId> <artifactId&
2022-04-20 15:33:24
6566
原创 mybatis获取不到自增id解决
文章目录问题分析添加过相应配置,返回的值是插入成功的条数,真正的ID是在parameterType的ID里面具体实现问题分析添加过相应配置,返回的值是插入成功的条数,真正的ID是在parameterType的ID里面具体实现<insert id="主键" parameterType=" 实体(要包含keyProperty指定的属性)" useGeneratedKeys="true" keyProperty="字段" keyColumn="字段"> </insert>
2022-03-16 18:18:23
1975
原创 手把手教你腾讯云搭建RUOYI系统
手把手教你腾讯云搭建RUOYI系统前置准备新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入前置准备1 腾讯云服务器2 连接liunx工具(mobexterm 地址. change free version)3 my
2022-01-02 17:23:25
2633
原创 js根据某些字,生成指定个数字符
文章目录把代码复制到文本后缀改成html代码把代码复制到文本后缀改成html代码<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,
2021-11-13 15:16:29
1202
原创 解决 python安装pip问题
文章目录我使用的版本python :3.5pip :pip-21.2.4遇到问题问题1问题分析解决方案问题2问题分析解决方案我使用的版本python :3.5https://www.python.org/ftp/python/3.5.2/python-3.5.2-amd64.exe 下载地址pip :pip-21.2.4https://files.pythonhosted.org/packages/52/e1/06c018197d8151383f66ebf6979d951995cf495
2021-08-18 11:38:35
3596
原创 springboot 引入外部Jar service 到bean管理
文章目录解决(required a bean of type ' class')Spring外部jar包交给spring容器1 在main添加3注意 添加scanBasePackages 不会走默认,所有要注入的必须配置到scanBasePackages里面解决(required a bean of type ’ class’)Spring外部jar包交给spring容器1 在main添加@SpringBootApplication(scanBasePackages = {"要扫描的本地包位置","
2021-07-14 11:38:12
1524
原创 springBoot Aop添加统一打印日志管理
文章目录解决调试中每个方法都要打日志问题1 添加pom2 Aop main code解决调试中每个方法都要打日志问题1 添加pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>2 Aop main code
2021-06-30 09:27:25
163
原创 通用型枚举常量类
解决多if else 取值问题import lombok.Getter;import java.util.EnumSet;import java.util.HashMap;import java.util.Map;/** * CommonEnum端枚举 */public interface CommonEnum { /** * 模板类型 0话术 1短信 */ @Getter enum TeamTypeEnum { TALK
2021-06-26 18:50:17
165
原创 程序员window bat一键启动所需应用
start E:\path\idea64.exestart C:\path\redis-server.exestart C:\path\zkServer.cmdstart E:\path\uedit32.exeexit
2021-06-18 08:54:44
251
原创 java利用工具生成雪花算法订单号
文章目录pom引入生成订单代码pom引入<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.6.3</version></dependency>生成订单代码import cn.hutool.core.lang.Snowflake;import cn
2021-04-12 11:27:34
1052
1
原创 讲明白ES6,VUE解结构表达式
定义:以更简单的方式获取到对象的内容,使代码更易读。数组:let arr = [1,2,3]const [a,b,c] = arr;//a,b,c将与arr中的每个位置对应来取值 // 然后打印 console.log(a, b, c);对象解构const person = { name:"张三", age:22, subjects: ['java','js','css'] }// 解构表达式获取值 const {name,age,subjects} = person; // 打印
2021-03-22 17:48:34
408
原创 Windows 安装elastic search及管理工具和基本使用
文章目录环境要求elasticsearch-6.8.6配置1 下载2 安装3 文件配置启动访问地址elasticsearch-head-master (es操作)1 下载2 安装 运行基本操作添加查询参考环境要求Jdk1.8elasticsearch-6.8.6elasticsearch-head-masterelasticsearch-6.8.6配置1 下载1 华为云提供好用的国内镜像Elasticsearch,选择elasticsearch-6.8.6下载https://mirro
2021-03-19 17:09:29
1012
原创 Dubbo 支持哪些协议,每种协议的应用场景,优缺点
dubbo: 单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步,Hessian 序列化; rmi: 采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。多个短连接,TCP 协议传输,同步传输,适用常规的远程服务调用和 rmi 互操作。在依赖低版本的 Commo
2021-03-15 21:24:33
413
原创 jenkins Linux脚本启动成功jar包没有启动
在脚本头添加如下,export BUILD_ID=dontkillme添加表示不杀新起的子进程
2021-03-13 14:25:27
1032
原创 什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。JDK7 提供了 7 个阻塞队列。分别是:ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。LinkedBlockingQueue :一个
2021-03-12 22:49:01
321
原创 ribbon和feign的区别
文章目录一 区别二 调用配置区别一 区别feign是ribbon的升级版都是用来调用远程服务,属于微服务远程调用的解决方式,二 调用配置区别1.启动类使用的注解不同,Ribbon 用的是@RibbonClient,Feign 用的是@EnableFeignClients。2.服务的指定位置不同,Ribbon 是在@RibbonClient 注解上声明,Feign 则是在定义抽象方法的接口中使用@FeignClient 声明。3.调用方式不同,Ribbon 需要自己构建 http 请求,模拟 ht
2021-03-08 21:41:39
5272
原创 Dubbo 的整体架构分层概述
接口服务层(Service):该层与业务逻辑相关,根据 provider 和 consumer 的业务设计对应的接口和 实现配置层(Config):对外配置接口,以 ServiceConfig 和 ReferenceConfig 为中心服务代理层(Proxy):服务接口透明代理,生成服务的客户端 Stub 和 服务端的 Skeleton,以 ServiceProxy 为中心,扩展接口为 ProxyFactory服务注册层(Registry):封装服务地址的注册和发现,以服务 URL 为中心,扩展接口为 Re
2021-03-07 23:04:25
344
1
原创 集合的概念和分类之一
文章目录符合概念解释(符号打不出来直接点链接)参考符合概念解释(符号打不出来直接点链接)空集属于包含参考链接:自然数链接:整数集链接:有理数集链接:实数集
2021-03-05 22:10:01
245
原创 redis的缓存雪崩,缓存穿透,缓存预热,缓存更新,缓存降级等问题理解和如何解决
文章目录缓存雪崩解决办法:二、缓存穿透解决办法;三、缓存预热解决思路:四、缓存更新解决思路:五、缓存降级缓存雪崩由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。解决办法:大多数系统设计者考虑用加锁( 最多的解决方案)或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免
2021-03-04 22:28:53
309
1
原创 eventbus threadmode 场景多种模式解释 之三
文章目录POSTING (默认值默认方式)MAINMAIN_ORDEREDBACKGROUNDASYNCPOSTING (默认值默认方式) 订阅者将在发布事件的同一线程中直接调用。这是默认值。活动交付 意味着开销最少,因为它避免了线程的完全换。 因此,这是推荐的模式 可以在很短的时间内完成而无需主线程的简单任务。事件处理程序使用此模式必须快速返回以避免阻塞发布线程,该线程可能是主线程。MAIN 在Android上,订阅者将在Android的主线程(UI线程)中被调用。如果发布线程是主
2021-03-03 20:49:37
527
1
原创 android 事件监听简单eventbus+实例 之二
文章目录前言目标关键字一、是什么为什么要用二、eventbus工作原理模型三、使用场景实例参考前言欲求生富贵,须下死工夫。目标掌握简单eventbus监听事件使用关键字eventbus一、是什么为什么要用监听用户操作做出对应变化二、eventbus工作原理模型发布和订阅解耦代码实现模型三、使用场景弹窗|组件跟据用户点击做出对应响应实例git地址 :https://github.com/xiusan/MyApplication Internet分支主类EventBu
2021-03-01 23:21:25
288
原创 android 事件监听+实例 之一
文章目录前言目标关键字一、是什么为什么要用二、工作原理模型简单监听事件本地消息触发事件三、使用场景实例参考前言欲求生富贵,须下死工夫。目标掌握简单监听事件,和本地消息触发事件关键字event,Fragment,,,,一、是什么为什么要用监听用户操作做出对应变化二、工作原理模型简单监听事件本地消息触发事件三、使用场景弹窗|组件跟据用户点击做出对应响应实例git地址 :https://github.com/xiusan/MyApplication Internet分支参
2021-02-28 17:17:28
189
原创 android debug打包写入签名包
android studio —> Settings —> Project Structure —> Modulesfile : 签名文件.jkspassword: 密码alias: 别名aliaspassword: 别名密码
2021-02-27 17:38:41
204
原创 解决Error inflating class android.support.design.widget.FloatingActionButton
文章目录问题描述解决思路具体代码问题描述浮动框样式异常 Caused by: android.view.InflateException: Binary XML file line #10 in com.example.administrator.myapplication:layout/activity_event_simple: Binary XML file line #10 in com.example.administrator.myapplication:layout/activity_e
2021-02-26 22:07:55
585
原创 android简单开发流程
代码异步:git地址 :https://github.com/xiusan/MyApplication io分支
2021-02-26 11:49:32
174
原创 解决 android FATAL EXCEPTION: main 问题
1 在AndroidManifest.xml 没有添加activity例如 :D/AndroidRuntime: Shutting down VME/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.administrator.myapplication, PID: 8146 android.content.ActivityNotFoundException: Unable to find explicit acti
2021-02-25 20:48:46
8323
3
原创 linux grep模糊匹配及查询前后6行
模糊匹配// */ 转义*//查询 包含关键字less 日志.txt | grep -n "关键字*/"//查询 前缀关键字 * 后缀关键字less 日志.txt | grep -n "关键字*/关键字"查询显示多行信息//显示file文件中匹配foo字串那行以及上下6行less 日志.txt | grep -C 6 foo file //显示foo及前6行less 日志.txt | grep -B 6 foo file // 显示foo及后6行less 日志.txt
2021-02-24 22:09:58
1702
原创 Android Application介绍应用
介绍当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册应用1 用于维护全局应用程序状态的基类。 您可以提供自己的通过创建子类并指定全限定名称来实现2 感知应用变化做出对应反应,如 横屏...
2021-02-23 21:19:47
173
原创 Android常用数据存储之ExternalStorage(外部存储)
文章目录前言目标关键字一、实例1 获取权限2 存放 文件3 提取文件信息三、使用及场景总结参考前言黑发不知勤学早,看看又是白头翁。目标存储文件到私用目录。有利于用户管理目录关键字super.getExternalCacheDir();//私有目录类型// {@link #DIRECTORY_MUSIC}, {@link #DIRECTORY_PODCASTS},// {@link #DIRECTORY_RINGTONES}, {@link #DIRECTORY_ALARMS}
2021-02-22 14:25:00
2597
原创 Android常用数据存储之SharedPreferences,保存密码
文章目录前言目标关键字一、数据1 存放2 提取使用三、使用及场景总结参考前言宁可正而不足,不可邪而有余。目标掌握账号密码的存储实例关键字SharedPreferences四种模式Context.MODE_PRIVATE = 0Context.MODE_APPEND = 32768Context.MODE_WORLD_READABLE = 1Context.MODE_WORLD_WRITEABLE = 2一、数据1 存放 SharedPreferences s
2021-02-21 21:14:29
307
原创 npm install nrm -g指令 ERR_INVALID_ARG_TYPE 解决方法
这一行是关键 at Object. (C:\Users\liyin\AppData\Roaming\npm\node_modules\nrm\cli.js:17:20)打开 :C:\Users\liyin\AppData\Roaming\npm\node_modules\nrm\cli.js这行const NRMRC = path.join(process.env.HOME, '.nrmrc'); (删除)修改为const NRMRC = path.join(process.env[(proce
2021-02-20 18:08:32
1467
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人