自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 TransmittableThreadLocal 原理分析

注:在看此篇文章前,你需要了解的原理。这里先总体的介绍(下文以ttl作为简称)的原理再去分析一些核心的源码,旨在先有个整体的认识,再去详细了解源码。由于是新建线程时复制父线程的本地变量到子线程,在线程池中由于线程只创建一次,因此无法复制新增的本地变量。ttl照着这个思路去找替代方案,在新建线程任务(Runnable)时将这些本地变量放到另一个类的属性字段中保存,这个类就是。下图的 holder 是一个,存的是当前线程的一个。

2023-07-18 12:58:33 312

原创 Java线程状态与状态转换

在Java中,线程是多任务处理的基本单位,它可以并行执行多个任务。线程的状态描述了线程在其生命周期中的不同阶段。

2023-07-14 19:17:45 344

原创 ReentrantLock 源码解析

注:本文的源码来自 JDK11是 Java 中的一个重入锁,它可以用于替代传统的关键字来进行线程同步。下面是与名称实现重入性中断性公平性是否支持超时释放锁Java API级别,基于AQS实现可重入可中断支持非公平与公平可以超时手动是否锁JVM 级别,基于对象的 monitor 对象实现可重入不可中断非公平无法设置超时自动是否锁可以看出提供了更多的灵活性和可扩展性,不知你是否开始对它的原理产生兴趣?

2023-03-22 05:46:16 211 1

原创 Redis 常见数据类型的使用场景以及底层结构

Redis 是一种基于内存的高性能的键值存储系统,支持多种数据类型、持久化、高可用集群等。在 Redis 中,每种数据类型都有自己独特的底层实现方式,这些实现方式直接影响着 Redis 的性能。本文将介绍 Redis 各种数据类型的使用场景以及底层结构实现方式。在介绍类型之前,不妨先了解下 Redis 在 C 语言中的结构长什么样?大概的结构如上图所示(并未列出所有字段,在文末会将具体的 C 语言结构列出),其实 Redis 的所有数据类型都是用同一张外层哈希表。

2023-03-18 04:04:03 455

原创 JDK 8 JVM内存结构详解

本文所介绍的是 JDK 1.8 版本,其他版本的 JDK 在这里并不一定正确;内容主要摘自周志明的《深入理解Java虚拟机》一书的关键点,并根据自身的理解进行记录。感兴趣的同学可以去阅读原著。本文基于 JDK 8,介绍了虚拟机的自动内存管理,介绍了每个区域是数据线程私有还是共享,会发生哪些异常。如有不对欢迎指正。

2023-02-11 00:17:15 1119

原创 基于 Hutool 的抽奖实现与原理

先大概描述下 hutool 工具是如何根据权重进行抽取,后面再结合源码进行讲解。奖品名称权重0.710积分0.45IPhone 140.050.01需要注意也算是一种奖品,因为它也能被抽中。hutool 的工具会根据总权重 * 随机数得到一个随机的权重,然后取第一个大于等于该随机权重的奖品作为抽中的结果。说白了就是将奖品按如下分割出自己的区域,然后随机生成一个在范围内的数,看这个数落在哪一个区间上面。

2023-01-14 11:23:51 1206

原创 elasticsearch-head chrome 插件安装

由于没有梯子不能直接访问谷歌商店下载插件,但可以直接在 Github 下载,地址:https://github.com/mobz/elasticsearch-head/raw/master/crx/es-head.crxchrome 选择 在扩展程序界面,直接将下载的 拖到浏览器即可完成添加。但因为与 chrome 商店的版本对不上,可能会报以下错误解决方法现将刚才安装的插件卸载,将 的后缀改成 然后解压得到 打开 chrome 扩展程序界面,选择加载已解压的扩展程序选择刚才解压的

2022-12-26 23:57:45 1987 1

原创 xsync 集群同步工具

在配置集群时,往往需要将文件拷贝到各个机器,一来二去就很麻烦;我们可以使用xsync工具同时进行多台机器同步数据。

2022-12-25 23:36:40 2865 3

原创 InfluxDB 1.8 性能测试

InfluxDB 1.8 性能测试测试环境Intel® Core™ i5-10400CPU @ 2.90GHz2 核 4 GB带宽 100Mbit/s前言本次基准测试将使用 InfluxData 提供的两款工具进行,写入使用 influx-stress,而读取则使用 influxdb-comparisons。本次测试准备了两台服务器,一台(192.168.1.2 下面称为客户端)负责生成数据并发送写入请求,另一台(192.168.1.3 下面称为服务机)装有 InfluxDB 1.8 数据

2022-11-01 12:17:05 2726

原创 PowerDesigner 16 导入表结构与生成 Html

的安装目录下新建一个 startup.bat 并添加以下参数,然后打开 bat 通过这种方式启动。连接成功后出现数据库的所有表,我们需要取消勾选,不然全部导入,只需选择我们需要的表即可。有两种方式,一种是直接用 JDBC 连接,另一种是使用表结构的 DDL 导入。点击确定后即可生成 Html ,打开 Html 可以看到模板的效果。配置好你的连接信息,最后一项 JDBC 驱动如果没有,可以。首先提前将表的 DDL SQL 语句导出,然后选择。选择需要的表后点击 OK,即可导入我们所需要的表了。

2022-10-27 22:23:49 2165

原创 Spring Cloud Stream 实现消息顺序消费(RabbitMQ)

消息的顺序消费场景虽然用的不多,但在面试过程中还是会经常被问到的。打个比方,在用户购买商品的场景中,正常的流程是先发送 【创建订单消息 —> 支付 —> 发货】,如果还没支付成功就先发货了,那只好准备收拾东西走人了~那在 Spring Cloud Stream 中该怎么保证消息的顺序性呢?我们能够使用基于键值的方式做分区,让一个队列只存在一个消费者去做消费即可。Spring Cloud Stream 为我们提供了自定义策略,分别为分区键策略与 分区选择策略;

2022-10-20 23:58:07 1655

原创 Spring Cloud Stream 分区键表达式(partitionKeyExpression)不能使用 payload.field

由于使用的方式配置需要改生成者与消费者代码,RabbitMQ Binder 使用 Java 的序列化方式性能低下、发送与接收端使用的类需要一样(最起码保证 serialVersionUID 一致)否则强转失败,加上官方不建议使用 payload 的内容作为分区键表达式取值等等问题,导致使用起来非常的不便利,因此直接使用 headers 的方式会更加的简单明了,虽然从payload复制多了一份数据到headers但如果对象不大可以忽略不计。

2022-10-20 23:38:14 831

原创 InfluxDB 的 InfluxQL 基本介绍与使用

本文主要介绍 InfluxDB 的 InfluxQL 的基本概念与用法并且包含了一些需要注意的点,由于 InfluxDB 2.x 不使用 InfluxQL 进行查询,如您的版本大于 2.x 请查找其他资料。SELECT 查询WHERE 条件GROUP BY 子句LIMIT 与 SLIMIT 区别OFFSET 与 SOFFSET 子句时区问题。

2022-09-07 00:35:32 2563

原创 SpringBoot 中 Mybatis 一级缓存使用与分析

Mybatis 的一级缓存默认是开启不能关闭的,它的作用范围为SqlSession,即在同一个SqlSession中共享。在 SpringBoot 中需要添加注解才能生效。下面的代码展示一级缓存如何使用:先不添加}查看控制台是否会执行两次数据库查询(通过查看控制台打印 SQL 的次数得知是够查询两次)可以看到在没加注解的时候确实执行了两次数据库的查询,证明没有使用到缓存。加上再次执行查看结果}

2022-09-04 00:43:10 2030

原创 Spring Cloud 请求优先转发至本地服务方案

开发阶段,使请求调用有限调用到本地,基于负载均衡实现

2022-08-24 00:11:06 1858

原创 RedisTemplate Pipeline 管道使用

当需要执行大批量的写入或者查询时,使用redis一条条命令的执行性能肯定没有一次性执行完要好;假设执行完一条redis命令的网络耗时为20ms,有1万条命令需要执行,算一下光发送这些命令的网络耗时就达到200,000ms(200s),这是不能接受的,我们可以使用提供的管道进行批量执行。Redis提供了对pipelining的支持,在向服务器发送多个命令时,无需等待每一条命令响应,然后在一个步骤中读取所有的响应。经过打包命令发送与返回,在一定程度上节省了网络io耗时。来执行管道操作,与。......

2022-07-22 00:31:15 3887

原创 升级 Spring Cloud Stream 到3.1+,函数式定义 biding 无法生效问题解决

项目升级了 Spring Cloud 的架构,顺带把 Spring Cloud Stream 的版本升级到了 3.2.x,然后发现以前使用注解的从3.1版本开始过时了,如 、 等注解。于是在定义新的 binding 时使用函数式,但是却无法生效。新建一个 biding ,按照官网的教程,写好配置文件与代码启动应用后,发现配置并不生效,最后发现原来是新的写法与旧的是不兼容的,源码在启动时会校验 bean 上下文是否有标注 的类,如果有则函数式的定义不会生效。 的源码如下:三、解决方案目前本人的

2022-06-22 00:32:13 1310

原创 Spring 实现动态定时任务

平时我们使用 Spring 去实现一个单体项目的定时任务,用得比较多的是 注解,但是该注解的局限性是不能动态的更改定时任务的时间;这时就需要使用其他方式去实现动态的定时任务了,Spring 给我们提供了 接口,使用它就能够实现动态的定时任务。直接实现 接口即能做到动态的修改定时任务的时间,下面先写一个配置类 。注:别忘了添加 注解需要重写 方法,该方法会在应用启动完成后自动调用,其中参数为 类型,从下图看来添加任务有几种类型,分别是固定 corn 表达式的任务(与 一样)、固定延时与固定速率任

2022-06-12 23:52:09 3735 1

原创 InfluxDB2.x 基准测试工具 - influxdb-comparisons

一、前言influxdb-comparisons 是 influxdata 官方提供的基准测试工具,支持 influxDB v1 与 v2 版本,支持以下数据库的基准测试:InfluxDBElasticsearch (announcement blog here)Cassandra (InfluxDB Tops Cassandra in Time-Series Data & Metrics Benchmark)MongoDB (InfluxDB is 27x Faster vs Mong

2022-05-26 01:27:50 2075 1

原创 时序数据库 - InfluxDB2 docker 安装

一、介绍InfluxDB 是一个由 InfluxData 开发的开源时序型数据。它由 Go 写成,着力于高性能地查询与存储时序型数据。InfluxDB 被广泛应用于存储系统的监控数据,IoT 行业的实时数据等场景。2022 年 5 月份 DB-engines 对时序数据库的排名InfluxDB 其在 DB-engines 上的时序数据库排行榜稳居第一;InfluxData 对于物联网的数据采集、存储、分析、可视化等提供了一整套开源组件,简称为 TICK(Telegraf、 InfluxDB、Chro

2022-05-26 01:21:35 2196

原创 MySQL 分区表介绍与测试

一、基本介绍:分区表是一个独立的逻辑表,底层由多个物理的文件组成,分区对于 SQL 层来说是透明的;下图可以看出,表 em_elec_meter_data 的多个分区是使用了 # 进行标识。分区表的使用场景:表非常大以至于无法全部都放在内存中,或者热点数据只有在表的最后部分,其他都是历史数据。分区表的数据作用在不同的设备上,高效地利用多个硬件设备;例如有 1TB 的数据,服务器的硬盘容量只有 500 GB,那么可以使用其他设备平摊未能放下的数据。需要独立备份和恢复分区,这在非常大数据集的场景

2022-05-26 00:31:10 579

原创 Gateway 报错org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes..

Spring Boot 版本:2.6.6Spring Cloud Gateway 版本:3.1.1由于在 Gateway 的自定义过滤器中重写了请求 ServerRequest,后面因为升级了架构,原本旧版本未对请求参数的大小进行限制(默认取-1),后面升级了新版修改为 256KB 的限制。解决方案如下:一、设置配置文件(失败)spring: codec: max-in-memory-size: 50MB二、添加配置 Bean(失败)@Configuration@EnableW

2022-04-30 17:15:29 3682

原创 Gateway 报错 java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is

引起错误的原因,在负载均衡调用时 BlockingLoadBalancerClient 会有一个 block 的操作 @Override public <T> ServiceInstance choose(String serviceId, Request<T> request) { // 略... // block Response<ServiceInstance> loadBalancerResponse = Mono.from

2022-04-29 17:37:16 5892

原创 Ribbon 的替代品 Spring Cloud Loadbalancer 使用与原理分析

目录一、 使用方法二、 @LoadBalancerClients 与 @LoadBalancerClient三、 自定义负载均衡四、 重试机制五、 原理分析六、 执行流程分析系列文章:Spring Cloud LoadBalancer之负载均衡简介Spring Cloud NamedContextFactory 原理分析Ribbon 的替代品 Spring Cloud Loadbalancer 使用与原理分析本文所有的 spring-cloud-loadbalancer version:3.1

2022-04-22 23:22:32 6799 4

原创 Spring Cloud LoadBalancer之负载均衡简介

概念负载均衡,英文名称为 Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如 FTP 服务器、Web 服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。来源于百度百科说白一点就是通过一个协调者,将工作尽量均匀地分配出去,不让某一个提供者承受太多的工作,或者某个提供者能力更大,协调者可以将更多的工作分配给它。1.1 负载均衡分类硬件负载均衡,不依赖于底层的软件,通过专门的硬件去实现软件负载均衡,例如 nginx、ribb

2022-04-22 10:14:48 2029

原创 Spring Cloud NamedContextFactory 原理分析

本次完整代码地址1.1 NamedContextFactory 作用ribbon 与 loadbalancer 都能做到对不同的调用服务使用不同的负载均衡配置。例如:数据服务需要查询的时间较长,用户中心服务查询用户信息的时间较短,二者可以采用不同的负载策略。要实现上述要求,可以使用 Spring Cloud 提供的 NamedContextFactory 实现;他的作用就是根据名称去存储不同的 ApplicationContext,这样就能实现不同的名称的 Bean 隔离了。由于NamedCont

2022-04-21 11:09:34 973

原创 MySQL 使用 explain 分析SQL

Version: 8.0.28简介:explain 是 MySQL 提供的可以用来查看 SQL 的执行计划的命令, explain 可以与 select、delete、insert、replace、update 等一起使用,不过常用的还是用在 select 比较多,常常用它对 SQL 进行分析,看是否有优化的余地。通过 explain 命令可以知道以下信息:表的读取顺序数据读取操作的类型(全表扫描还是索引)哪些索引可以使用哪些索引实际使用了表之间的引用每张表有多少行被优化器查询等基本

2022-04-15 01:21:00 1088

原创 升级 IDEA 2021 lombok 报错 You aren‘t using a compiler supported by lombok

场景:由于 IDEA 版本过旧,导致有些插件使用不了,于是索性直接升到最新版本 IDEA 2021.3.1,升级后编译代码,发现编译不过,详细的报错信息如下:java: You aren't using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy27 Lombok supports: sun/apple

2022-04-13 23:40:26 2944 1

原创 尝尝鲜:IDEA 使用 GitHub Copilot 插件

简介:GitHub Copilot 是由微软与OpenAI在2021年6月29日共同推出了一款AI编程工具,基于 GitHub 及其他网站的源代码,可根据上文提示为程序员自动编写下文代码。甚至能够根据你的注释将其转化为代码,注释也支持中文输入。以上介绍来源与百度百科申请:由于目前还处于测试阶段,插件并为公开使用,因此需要去申请测试,申请地址:Join the GitHub Copilot waitlist打开后显示这个页面,直接登录你的 github 账号提交申请即可,申请时间快的话几小时,慢的

2022-04-10 01:31:22 17706 11

原创 IDEA 下载依赖包源码报错 Cannot download sources Sources not found for:XXX

场景:IDEA 在使用某些类方法想看下源码具体是啥时,由于只有 class 反编译的类文件,没有原始 Java 文件,因此想要将源码下载下来,却报了一个错误 Cannot download sources Sources not found for:XXX解决方法:可以在 terminal 运行 mvn dependency:resolve -Dclassifier=sources 命令解决运行完毕后,等待下载完成,再次点击源码的类就能看到文档了建议:如果想以后下载依赖包时都将 Docu

2022-04-10 00:30:00 7619 2

原创 扩展 validate 实现自定义文件校验注解

简介:SpringBoot 提供了优雅的参数校验方式,即使用 validation-api,关于 validation-api 内置的注解这里不作详细的解释,主要为以下几种:注解说明@Null限制只能为null@NotNull限制必须不为null@AssertFalse限制必须为false@AssertTrue限制必须为true@DecimalMax(value)限制必须为一个不大于指定值的数字@DecimalMin(value)限制必须为一

2022-04-09 02:03:11 1744

原创 Spring Cloud Gateway 响应出现中文乱码?

前言:记一次 Gateway 读取响应内容时导致中文乱码。问题还是比较严重的,因为这个问题导致系统全局中文出现偶发性乱码,经过 debug 追踪,最终确认了是在 gateway 获取响应内容重写时出现了问题。场景复现:先看代码,方法的功能是读取响应结果,并记录响应结果。 /** * 记录响应日志 * * @param exchange * @return */ private ServerHttpResponseDecorator logR

2022-03-29 23:54:19 4499 3

原创 代码规范及IDEA统一配置

这里写自定义目录标题一、阿里巴巴规范插件安装二、插件的使用三、代码风格选择四、规范扫描插件的个性化配置五、编码规范六、总结本示例使用的 IDEA 版本为 2021.1一、阿里巴巴规范插件安装通过 idea 安装打开 Settings >> Plugins >> Marketplace…在搜索框输入 alibaba 即可看到 Alibaba Java Code Guidelines 插件,点击 Install 进行安装,然后重启 IDEA 生效同过离线包安装

2022-03-24 00:47:16 2877

原创 Spring Cloud Gateway 本地内存 IP 限流

​ 限流对保障系统的可用性有着至关重要的作用,通常限流已经有成熟的框架可以做到,如 Hystrix、Sentinel 等;这里介绍如何使用 Spring Cloud Gateway 实现对 IP 的限流。​ 常见的限流算法有 滑动窗口、漏桶算法、令牌桶算法,以下简单介绍下漏桶与令牌桶算法:漏桶算法:​ 以固定的速率处理流量,桶里的水溢出了,则不管丢弃,对突发的流量无特殊处理。令牌桶算法:​ 令牌桶算法则是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。桶中存放的令牌数有最大上限,超出之后就

2022-03-19 18:03:54 2102

原创 Spring Cloud Gateway 执行流程解读

gateway 是在 Spring WebFlux 的基础上构建的,目标是提供一个简单高效的方式去统一管理 API 路由。Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标和限流。一、整体流程请求处理流程 UML 图从 UML 图可以看得出来 gateway 使用了与 Spring Mvc 类似的处理逻辑,即适配器模式;先从 Mapping 中匹配到适配器,然后使用适配器调用 handler。

2022-03-17 21:28:27 3183

原创 Hystrix 熔断降级配置

1. 基础知识1.1 服务隔离​ 说明:把每个依赖或调用的服务都隔离开来,防止级联失败引起整体服务不可用​ 博客:https://zhuanlan.zhihu.com/p/59109781​ Hystrix 隔离策略的区别如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wmUzwQOa-1646387001228)(.\img\270324-20181228163336619-55270777.png)]1.2 熔断说明:为了防止服务雪崩,类似家用电

2022-03-09 22:55:43 2892

原创 IDEA 插件开发 - 创建自定义私有仓库

前言由于某些情况下,公司开发的插件并不想上传到公有插件市场 IDEA 插件市场,因此需要自定义插件存储库,有更新则将插件发布到私有仓库即可。关于如何创建插件请参考上一篇 IDEA插件开发快速入门-项目创建主要步骤在 Web 上提供一个获取 updatePlugins.xml 文件的 URL,文件内容需要指定插件 id,插件版本等信息。<?xml version="1.0" encoding="UTF-8"?><plugins> <!-- 插件的描述信息

2021-08-19 00:22:51 3301 5

原创 IDEA插件开发快速入门-项目创建

IDEA 插件快速入门-项目创建(一)插件项目创建方式主要步骤在主菜单添加 Hello World 入口插件项目创建方式IDEA 插件项目的穿件有以下三种方式:使用 GitHub 模板使用 Gradle使用 Devkit官方推荐使用 Gradle 方式,相比使用 Devkit,免去了手动去下载 idea 源码然后导入项目中的步骤,而且 Devkit 要添加 jar 包还得手动导入。因此本篇主要介绍如何使用 Gradle 快速创建项目。官网传送门主要步骤我这里使用的 IDEA 版本为 2

2021-06-27 22:44:25 1088

原创 解决 openFeign 接口不支持多继承或多层继承,报 Only single-level inheritance supported 问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结背景由于业务需要,需要在 feign 的接口上实现多层继承,开开心心撸完代码,却踩了个坑,原来 open-feign 是不支持接口的多层继承与多继承。查看几个解决方案无果,最终在源码的 issues 下找到解决方法。Issues 传送门一、pandas是什么?示例:pandas 是基于NumPy 的一种工具..

2021-04-13 00:15:59 3933 4

原创 nacos 配置中心介绍与使用

前言 一、nacos配置文件规则介绍 二、使用步骤 1.添加依赖 2.nacos上新建配置文件 3.配置bootstrap.properties 4.测试 三、多配置文件读取 参考链接前言 动态配置管理是 Nacos 的三大功能之一,通过动态配置服务,我们可以在所有环境中以集中和动态的方式管理所有应用程序或服务的配置信息,动态配置中心可以实现配置更新时无需重新部署应用程序和服务即可使相应的配置信息生效,这极大了增加了系统的运维能力。一、nacos...

2021-01-30 18:28:58 672

空空如也

空空如也

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

TA关注的人

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