
java
文章平均质量分 90
运维开发故事
这个作者很懒,什么都没留下…
展开
-
高并发下 MySQL Statement Cancellation Timer 的线程数暴涨
微信公众号:运维开发故事作者:老郑。原创 2024-01-06 10:52:34 · 1363 阅读 · 0 评论 -
Redis 浮点数累计实现
Redis 浮点数累计操作 INCRBYFLOAT 不适合精度要求比较高的金额计算。Redis 浮点数累计操作 INCRBYFLOAT 也不能平替 BigDecimal 计算,如果一定需要存储可以考虑通过 lua 脚本实现 CAS 进行修改,最终存储为 String 类型的一个结果。Redis 的浮点数虽然做了比较好的优化,但是没有从根本解决计算精度问题。原创 2023-07-26 10:34:32 · 456 阅读 · 0 评论 -
KeyAffinityExecutor 线程池
微信公众号:运维开发故事,作者:老郑线上案例有一批量的数据,可以按照一个固定的 key 分组并发,但是要保证组内并行的处理。比如:商城中,不同的用户可以并发下单,但是一个用户只能进行顺序的下单。在全局并发的场景下保证局部有序,保证最小事务单元操作的原子性。针对上面的场景我们可以通过 KeyAffinityExecutor (KeyAffinityExecutor 是一个可以按照指定的Key亲和顺序消费的执行器) 来解决这个问题,我们下面一起来了解下 KeyAffinityExecutor。原创 2023-05-31 11:14:48 · 313 阅读 · 0 评论 -
HashMap 计算 Hash 值的扰动函数
微信公众号:运维开发故事,作者:老郑。原创 2023-03-14 11:52:10 · 812 阅读 · 0 评论 -
JVM 三色标记法
微信公众号:运维开发故事,作者:老郑三色标记(Tri-Color-Marking)垃圾收集器在并发标记的过程中,执行标记期间应用线程还在并行运行,对象间的引用关系时刻发生变化,垃圾收集器在标记过程中就容易发生。针对这一问题我们通过 “三色标记 (Tri-Color-Marking)” 作为理论工具来辅助推导,将垃圾收集器遍历对象引用的过程中,“按照是否访问过” 这个条件标记成三种颜色。黑色:表示对象已经被垃圾收集器访问过,并且这个对象的所有引用都被扫描过。原创 2023-03-14 11:25:06 · 198 阅读 · 0 评论 -
Spring 核心概念
BeanDefinition 表示 Bean 的定义, BeanDefinition 中存在很多属性来描述 Bean 的特征。比如:class, 表示 bean 的类型scope, 表示 bean 的作用域,单例(_singleton_)或者原型(_prototype_)lazyInit, 表示 bean 是否懒加载initMethodName, 表示 bean 的初始化需要执行的方法destoryMethodName, 表示 bean 销毁时需要执行 bean 的方法and more …原创 2023-03-14 11:02:55 · 195 阅读 · 0 评论 -
Spring 框架介绍和使用
Spring 作为一个基础的框架,是在 Java EE 开发历史中,是成千上万公司选择。单独使用 Spring 的非常少了,很多都是用 Spring-Boot/Spring-Cloud 来开发,但是 Spring 基础依然是我们使用的基石。我们将一起来聊一聊 Spring 的基本使用。首先我们一起来了解一下 Spring 框架整体架构图如下:数据访问/集成,包括 JDBC 、ORM、OXM、JMS 和 Transaction 模块;WEB 模块,包括 WebSocket、Servlet、Web、Porlet原创 2022-12-05 10:15:04 · 1072 阅读 · 0 评论 -
Dubbo 高性能 RPC 框架实践
微信公众号:运维开发故事,作者:老郑Dubbo 介绍。原创 2022-08-16 14:08:18 · 148 阅读 · 0 评论 -
JVM 从入门到放弃之 ZGC 垃圾收集器
ZGC 概述Z Garbage Collector,也称为ZGC,在 jdk 11 中引入的一种可扩展的低延迟垃圾收集器,在 jdk 15 中发布稳定版。在旨在满足以下目标:< 1ms 最大暂停时间(jdk < 16 是 10ms,jdk >=16 是 <1ms )暂停时间不会随着堆、live-set 或 root-set 的大小而增加适用内存大小从 8MB 到16TB 的堆ZGC 具有以下特征:并发基于 region压缩NUMA 感知使用彩色指针使用负载屏障ZG原创 2022-05-09 16:00:13 · 269 阅读 · 0 评论 -
JVM 垃圾回收算法和 CMS 垃圾回收器
本文核心主要是讲述:JVM 中的几种垃圾回收算法理论,以及多种垃圾收集器,并且详细参数 CMS 垃圾收集器的实现、优缺点等,最后也会解释一下三色标记法与读写屏障。垃圾收集算法垃圾收集算法.png分代收集理论 (Generational Collection)当前商业虚拟机的垃圾收集都是采用 "分代收集" (Generational Collecting)算法,根据对象不同的存活周期将内存划分为多块一般是把 Java 堆分作新生代和老年代, 这样就可以根据各个年代的特点采用最适当的收集算法,譬如新生代每次GC原创 2022-01-21 14:32:58 · 625 阅读 · 0 评论 -
JVM 类加载过程解析
类加载过程类加载的时机一个类型被加载到虚拟机内存中开始,到卸载出内存为止、它的整个生命周期将会经历加载、验证、准备、解析、初始化、使用、卸载七个阶段。其中验证、准备、解析为连接类被主动加载的 7 种情况创建类的实例, 比如:new Object();访问某个类或接口的静态变量,或者对该静态变量赋值;调用类的静态方法;反射(如 Class.forName("com.test.Test");初始化一个类的子类;Java虚拟机启动时被标记为启动类的类, 就是包含 main 方法的类(Java Test);JDK1原创 2022-01-20 10:15:09 · 315 阅读 · 0 评论 -
Java 随机数与 ThreadLocalRandom
简介在 JDK7 中,java.util.concurrent 包含了一个相当便利的类随机数生成类 ThreadLocalRandom,当应用程序期望在多个线程或 ForkJoinTasks 中使用随机数时。对于并发访问,使用 TheadLocalRandom 代替 Math.random() 可以减少竞争,从而获得更好的性能。使用中只需调用 ThreadLocalRandom.current(), 然后调用它的其中一原创 2022-01-19 00:32:14 · 413 阅读 · 0 评论 -
设计模式之责任链模式
简介定义:给多个对象处理请求的机会,减少请求的发送者与接受者之间的耦合。将接受对象链接起来,在链中传递请求,直到有一个对象处理这个请求。 速记:责任传递 案例:财务报销、击鼓传花、Sentinel(CtSph.java)、Zookeeper、Nacos我考虑对创建订单的流程通过责任链模式的方式进行重构,先来看看我创建订单的流程。创建订单 -> 消耗优惠券 -> 发货 -> 返利环境介绍:jdk 1.8 , spring 5.2.x代码实现代码实现如下图所示,通过&nbs原创 2022-01-19 00:33:05 · 332 阅读 · 0 评论 -
JVM 类加载过程解析
类加载过程类加载的时机一个类型被加载到虚拟机内存中开始,到卸载出内存为止、它的整个生命周期将会经历加载、验证、准备、解析、初始化、使用、卸载七个阶段。其中验证、准备、解析为连接类被主动加载的 7 种情况创建类的实例, 比如:new Object();访问某个类或接口的静态变量,或者对该静态变量赋值;调用类的静态方法;反射(如 Class.forName("com.test.Test");初始化一个类的子类;Java虚拟机启动时被标记为启动类的类, 就是包含 main 方法的类(Java Test);JDK1原创 2022-01-19 00:34:03 · 220 阅读 · 0 评论 -
JVM 字节码解析过程
概述概述本文主要是基于 .class 文件,进行分析 .class 文件的内容。这部分个人觉得主要是属于设计机构拓展的内容,大家可以一起来学习一下 Java 字节码的设计结构以及感受一下设计者的设计。class 类文件结构Java 提供 javap 命令可以分析字节码文件,我们可以使用 javap -verbose 命令分析一个字节码文件时, 将会分析该字节码文件的魔数、版本号、常量池、类信息、类的构造方法、类中的方法信息、类变量与成员变量等信息。一个简单的 Java 代码public class原创 2022-01-20 10:15:42 · 401 阅读 · 0 评论 -
根据不同的业务场景,选择合适的锁?
前言:刚开始我看到这个标题的时候我感觉“很熟悉,但是又很陌生”,因为锁是有效的解决并发情况下保证临界资源操作原子性的有效手段之一。下面我就从我们几个开发使用的角度来说我们常用的锁。锁可以解决什么问题?锁可以解决并行执行任务执行过程中对,共享数据顺序访问、修改的场景。比如对同一个账户进行并行扣款或者转账。下面我们展开讨论下 synchronized 、ReetranLock 以及他们的使用。synchronizedsynchronized 是 JDK 提供的内置锁, 由 JVM 虚拟机内部实现,是基于 mon原创 2022-01-20 10:15:51 · 252 阅读 · 0 评论 -
从 Hotspot 虚拟机角度来分析 Java 线程启动
基本概念Java 线程其实是映射到操作系统的内核线程上的,所以 Java 线程基本上也就是操作系统在进行管理。在 Linux系统中,线程和进程用的是同一个结构体进行描述的,只不过进程拥有自己独立的地址空间,而同一个进程的多个线程之间是共享资源的。简单说明:本文基于 openjdk 1.8 进行线程状态每种线程状态的切换条件, 以及调用方法如下图所示 :线程具有以下几种状态 Java 的线程状态在 Thread.State 枚举中定义代码如下public enum State {原创 2022-01-20 10:16:00 · 127 阅读 · 0 评论 -
CountDownLatch 闭锁源码分析
功能简介闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态【CPJ 3.4.2】。闭锁的作用相当于一扇门∶ 在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当到达结束状态时,这扇门会打开并允许所有的线程通过。当闭锁到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开状态。闭锁可以用来确保某些活动直到其他活动都完成后才继续执行,例如∶确保某个计算在其需要的所有资源都被初始化之后才继续执行。二元闭锁(包括两个状态)可以用来表示"资源R已经被初始化",而所有需要 R 的操作都必须原创 2022-01-20 10:23:45 · 124 阅读 · 0 评论 -
Semaphore 信号量源码分析
概述Semaphore 信号量, 信号量维护了一组许可。如果有必要每个采集模块都会阻塞,直到有许可可用。然后获取许可证。每次发布都会添加一个许可证,可能会释放一个阻塞资源。但是,没有使用实际的许可对象;信号量可用数量的计数,并且进行操作。 信号量通常可以用于限制访问某些(物理或者逻辑)资源的线程数。例如下面是一个使用信号量控制对线程池访问。 class Pool { private static final in原创 2022-01-20 10:23:53 · 496 阅读 · 0 评论 -
JVM 三色标记法与读写屏障
三色标记法GC 垃圾回收器其主要的目的是为了实现内存的回收,在这个过程中主要的两个步骤就是:内存标记,内存回收。三色标记法简介三色标记法,主要是为了高效的标记可被回收的内存块。三色标记(Tri-color Marking)作为工具来辅助推导,把遍历对象图过程中遇到的对象,按照“是否访问过”这个条件标记成以下三种颜色:白色:表示对象尚未被垃圾收集器访问过。显然在可达性分析刚刚开始的阶段,所有的对象都是白色的,若在分析结束的阶段,仍然是白色的对象,即代表不可达。黑色:表示对象已经被垃圾收集器访问过,且这个对象的原创 2022-01-20 10:24:02 · 738 阅读 · 0 评论 -
Nacos 配置中心源码分析
本文主要和大家一起以源码的角度来分析 Nacos 配置中心的配置信息获取,以及配置信息动态同步的过程和原理。环境介绍和使用 环境介绍:Jdk 1.8nacos-server-1.4.2spring-boot-2.3.5.RELEASEspring-cloud-Hoxton.SR8spring-cloiud-alibab-2.2.5.RELEASE如果我们需要使用 Nacos 作为配置中心,我们首先需要导入 Nacos Config 的依赖信息,如下所示:<dependency> &n原创 2022-01-17 12:02:27 · 337 阅读 · 0 评论 -
通过 Ribbon 查询 Nacos 服务实例
Nacos 服务列表管理Nacos 提供了开放 API 可通过 /nacos/v1/ns/instance/list 获取服务列表。如果我们采用 spring-cloud 方式去获取服务,最终会通过 Nacos Client + loadbalancer 的方式进行客户端负载均衡。Ribbon 源码解析Ribbon 简介Spring Cloud Ribbon 是 Netflix Ribbon 实现的一套客户端负载均衡工具 简单的说,Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的复杂原创 2022-01-17 11:59:48 · 1618 阅读 · 1 评论 -
Nacos 服务注册源码分析
本文我们一起以源码的维度来分析 Nacos 做为服务注册中心的服务注册过程,我会以服务端、客户端两个角度来进行分析,Nacos 客户端我主要是采用 spring-cloud-alibaba 作为核心的客户端组件。对于 Nacos 服务端我会讲解到, Nacos 如何实现 AP/CP 两种模式共存的,以及如何区分的。最后还会分享我在源码调试过程中如何定位核心类的一点经验。下面我先对我的环境做一个简单的介绍:Jdk 1.8nacos-server-1.4.2spring-boot-2.3.5.RELEASEsp原创 2022-01-17 10:04:23 · 932 阅读 · 0 评论 -
Sentinel 和常用流控算法
本文主要讲述常见的几种限流算法:计数器算法、漏桶算法、令牌桶算法。然后结合我对 Sentinel 1.8.0 的理解,给大家分享 Sentinel 在源码中如何使用这些算法进行流控判断。由于本人理解有限,如果有不正确的地方,希望大家能够留言讨论????????????。计数器限流算法我们可以直接通过一个计数器,限制每一秒钟能够接收的请求数。比如说 qps定为 1000,那么实现思路就是从第一个请求进来开始计时,在接下去的 1s 内,每来一个请求,就把计数加 1,如果累加的数字达到了 1000,那么后续的请求原创 2022-01-16 22:49:08 · 288 阅读 · 0 评论 -
Sentinel 流控原理
我们在项目中添加 Spring Cloud Sentinel 依赖添加后 spring-cloud-starter-alibaba-sentinel 在 Spring-Boot 启动的过程中回去初始化 spring.factories 中的配置信息,如:SentinelWebAutoConfiguration 、SentinelAutoConfiguration 等配置文件来初始化再讲代码之前我先声明一下我的版本号sentinel 1.8.0 。后续的所有内容均基于该版本进行@Res原创 2022-01-16 22:58:32 · 438 阅读 · 0 评论 -
Sentinel 结合 GateWay 限流
Sentinel 不仅仅可以可以作用于服务之间,还可以完美的和服务网关 GateWay 或者 Zuul 一起使用来对网关实现流控。从 1.6.0 版本开始,Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流:route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId。自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组。引入依赖使用时需引入以下模块(以 Maven 为例):原创 2022-01-16 22:48:55 · 1294 阅读 · 0 评论 -
使用 Nacos 存储 Sentinel 规则信息
Sentinel 规则配置,一旦我们重启服务过后,所有的规则都会消失。我们可以通过 Zookeeper , Applo , Nacos 等配置中心将这些规则配置存储起来,让服务重启或者启动多节点的时候可以共享配置数据。之前的项目我们通过 Nacos 来作为服务注册中心和服务配置中心,我们也可以将 Nacos 作为 Sentinel 的配置数据存储仓库,来为我们提供Sentinel 配置数据的持久化。 如下图所示增加 Nacos 存储依赖需要独立引入如下依赖,来申明 sentinel 的规则数据存储原创 2022-01-16 22:48:45 · 379 阅读 · 0 评论 -
Sentinel 流控规则详解
在前面两篇文章给大家介绍了 Sentinel 的功能和基本使用。现在我们继续来学习 Sentinel 控制台的基本使用,以及一些规则配置的说明。让大家能够在工作中使用 Sentinel 得心应手 (大部分理论和描述来源于官方文档和网络)。在正文开始之前,我先说一下我的基本环境信息jdk 1.8sentinel 1.8.0spring-boot 2.3.5.RELEASEspring-cloud Hoxton.SR8spring-cloud-alibaba 2.2.5.RELEASE控制台简介Sentinel原创 2022-01-14 13:58:38 · 1201 阅读 · 0 评论 -
使用 Sentinel 实现接口限流
在前面一篇文章我已经对 Sentinel 做了一个简单的介绍,相信大家对 Sentinel 有一个简单的了解,本次主要是讲 Sentinel 的使用。在 sentinel-dashboard 配置流控规则,以及使用 Sentinel 整合 RestTemplate、OpenFeign 进行流控使用(建议网页版阅读)。安装 sentinel dashboard我使用的 sentinel 版本是: sentinel-dashboard-1.8.0启动控制台命令:java 原创 2022-01-14 13:57:10 · 2642 阅读 · 0 评论 -
Sentinel 快速入门
Sentinel 简介随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。Sentinel 具有以下特征:丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至原创 2022-01-14 11:32:54 · 320 阅读 · 0 评论 -
今天,我要干掉 if ... else ...
业务背景近日在公司领到一个小需求,需要对之前已有的试用用户申请规则进行拓展。我们的场景大概如下所示:if (是否海外用户) { return false;}if (刷单用户) { return false;}if (未付费用户 && 不再服务时段) { return false;}if (转介绍用户 || 付费用户 || 内推用户) { return true;} else { return false;}按照上述的条件我们可以得出的结论原创 2022-01-13 23:23:39 · 239 阅读 · 0 评论 -
秒杀场景分布式锁的方案
分布式锁的场景秒杀场景案例对于商品秒杀的场景,我们需要防止库存超卖或者重复扣款等并发问题,我们通常需要使用分布式锁,来解决共享资源竞争导致数据不一致的问题。以手机秒杀的场景为例子,在抢购的过程中通常我们有三个步骤:扣掉对应商品的库存;2. 创建商品的订单;3. 用户支付。对于这样的场景我们就可以采用分布式锁的来解决,比如我们在用户进入秒杀 “下单“ 链接的过程中,我们可以对商品库存进行加锁,然后完成扣库存和其他操作,操作完成后。释放锁,让下一个用户继续进入保证库存的安全性;也可以减少因为秒杀失败,导致 DB原创 2022-01-13 23:05:32 · 2927 阅读 · 0 评论 -
面试官上来就问 ZAB 协议,瑟瑟发抖…
Zookeeper 是通过 ZAB 一致性协议来实现分布式事务的最终一致性。ZAB 协议介绍ZAB 全称为 Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)ZAB 协议是为分布式协调服务ZooKeeper专门设计的一种支持崩溃恢复的一致性协议。基于该协议,ZooKeeper 实现了一种主从模式的系统架构来保持集群中各个副本之间的数据一致性。ZAB的消息广播过程使用的是原子广播协议,类似于二阶段提交。针对客户端的请求,Leader服务器生成对应的事务提议,并原创 2022-01-13 22:53:26 · 927 阅读 · 0 评论 -
面试官问我zookeeper选举过程,我当场给他讲了源码
集群概述zookeper 在生产环境中通常都是通过集群方式来部署的,以保证高可用, 下面是 zookeeper 官网给出的一个集群部署结构图:从上图可以得出, zookeeper server 的每个节点都和主节点保持通讯的,每个节点上面都存储有数据和日志的备份,只有当大多数节点可用集群才是可用的。本文主要是基于 zookeeper 3.8.0 讲解, 主要是通过源码的维度来分析 zookeeper 选举过程 对于 zookeeper 的源码编译大家可以原创 2022-01-13 22:50:55 · 140 阅读 · 0 评论 -
JVM 实战 | OutOfMemoryError 异常
微信公众号:运维开发故事,作者:老郑在《Java虚拟机规范》的规定里,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下文称OOM)异常的可能。(本文主要是基于 jdk1.8 展开探讨)Java 堆溢出Java堆用于储存对象实例,我们只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么随着对象数量的增加,总容量触及最大堆的容量限制后就会产生内存溢出异常。模拟代码下面是简单的模拟堆内存溢出的代码:/**.原创 2021-09-09 22:58:25 · 224 阅读 · 0 评论 -
JVM 系列 _ 运行时堆内存分代
微信公众号:运维开发故事,作者:老郑对于Java应用程序来说,Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,所有的对象实例都在这里分配内存。Java堆是垃圾收集器管理的内存区域。从回收内存的角度看,由于大部分垃圾收集器大部分都是基于分代收集理论设计的,所以 Java 堆中经常会出现“新生代”“老年代”“永久代”“Eden空间”“From Survivor空 间”“To Surviv.原创 2021-08-24 23:44:07 · 178 阅读 · 0 评论 -
Zookeeper Leader选举过程
微信公众号:运维开发故事,作者:老郑集群概述zookeper 在生产环境中通常都是通过集群方式来部署的,以保证高可用, 下面是 zookeeper 官网给出的一个集群部署结构图:![zk 集群架构图.jpg](https://img-blog.csdnimg.cn/img_convert/ad8a26eee4ed283670746e7fd714856a.png#align=left&display=inline&height=185&margin=[object Obj.原创 2021-07-15 11:33:18 · 323 阅读 · 0 评论