JAVA
文章平均质量分 84
Lidisam
一路有TA同行
展开
-
RocketMQ存储层原理
1.1 topic、订阅组group、消费进度consumerOffset1.2 多个配置文件config,故障恢复的存储Checkpoint和Filelock1.3 记录主备备份Epoch/SNtopic对应多个逻辑分区(Partition),称为队列(MessageQueue)其中ConsumeOffset用于管理订阅组消费进度(如Map)RocketMQ采...原创 2022-07-02 19:42:16 · 702 阅读 · 1 评论 -
FastThreadLocal源码解析
Netty为什么要用自己的FastThreadLocal?threadLocal Hash冲突,检索时间长。Netty自己定义的fastThreadLocal用的是数组,直接数组下标检索快。下面以ftl作为FastThreadLocal的简称例子ftl只有在FastThreadLocalThread线程中运行才生效,不然会走SlowGet模式(jdk threadLocal方式)public class Demo { public static void main(String[] args原创 2022-05-28 16:47:01 · 337 阅读 · 0 评论 -
Tomcat长轮训原理解析
长轮询长轮询基于HTTP,用于数据更新的实时通知广泛用于中间件配置实时同步通知如Apollo、Nacos什么是长轮询客户端向服务器请求,服务器接到请求后hold住连接,并等待数据返回(Java可以用AsyncContext来实现,spring中可以用DeferredResult来hold住请求),直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。缺点:客户端需要一直保持着这个链接,相当于这个资源一直在占用着。Spring实现异步请求客户端发起请求到To原创 2022-05-14 19:59:25 · 624 阅读 · 0 评论 -
Apollo Server服务端解析
如需参考源码解析,请访问:https://gitee.com/lidishan/apollo-code-analysis阅读前声明:本文不做相关用法说明,只解析Apollo源码Apollo整体架构图Apollo服务端的核心作用在于什么?配置变更和发现配置变更与发现配置的变更与发现基于一张表处理ReleaseMessage实现步骤Admin Service发布配置后,插入数据到ReleaseMessage表数据格式:AppId+Cluster(集群名称)+NameSpace(命名空间)原创 2022-02-26 23:40:25 · 1020 阅读 · 0 评论 -
Retry注解源码解析
@Retry注解是Spring提供的一个重试注解,使用简单(这里是为了分析其原理,其实个人认为guava的重试好用多了)。使用例子引入pom.xml依赖<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.3.1</version>&原创 2022-01-28 21:39:33 · 2260 阅读 · 2 评论 -
Transactional注解原理解析
什么是@Transactional? @Transactional是Spring这种用于处理事务的注解,基于拦截器进行commit或rollback使用例子下面举一个加了@Transactional注解的方法addUser(),并且调用了另一个隔离级别为NESTED的addUser2()方法@Servicepublic class UserService { // .. 省略其他 @Transactional public void addUser() {原创 2022-01-02 21:10:37 · 4109 阅读 · 1 评论 -
RocketMQ NameServer启动流程解析
具体分析可参考Gitee项目NameServer解析部分 =》代码地址什么是NameServer简易Topic路由注册中心,用于支持Broker的服务注册与发现。类似Dubbo的zookeeper主要能力Broker集群管理:管理Broker集群注册信息,心跳检测broker存活路由信息管理:保存Broker集群路由信息,然后producer、consumer通过nameserver获取路由信息进行投递、消费NameServer启动流程步骤创建controller解析命令及配置文原创 2021-11-30 22:52:14 · 1559 阅读 · 0 评论 -
RocketMQ调试环境搭建
参考资料:rocketmq那些事儿之本地调试环境搭建编译代码下载下载地址:Github地址单点部署执行步骤:先将三个xml文件拷贝到本地对应目录文件夹下。我这里放到D:\code\opensource\rocketmq\conf目录下,启动时会指定这个配置文件将broker.conf修改为如下(具体路径根据自己文件来)brokerClusterName = DefaultClusterbrokerName = broker-abrokerId = 0deleteWhen =原创 2021-10-05 20:34:57 · 253 阅读 · 0 评论 -
Hystrix执行目标与断路执行分析
依赖如下<dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-core</artifactId> <version>1.5.18</version></dependency>什么是Hystrix2018.11发布了最后一个版本,目前处理维护阶段,不再升级版本用途:停止级联故障。原创 2021-10-05 10:49:22 · 283 阅读 · 0 评论 -
Hystrix数据收集及滑动窗口机制解析
依赖如下<dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-core</artifactId> <version>1.5.18</version></dependency>什么是Hystrix2018.11发布了最后一个版本,目前处理维护阶段,不再升级版本用途:停止级联故障。原创 2021-09-27 21:46:29 · 1436 阅读 · 0 评论 -
Hystrix配置插件化源码解析
依赖如下<dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-core</artifactId> <version>1.5.18</version></dependency>什么是Hystrix2018.11发布了最后一个版本,目前处理维护阶段,不再升级版本用途:停止级联故障。原创 2021-09-04 17:38:24 · 3613 阅读 · 0 评论 -
Hystrix Plugins插件机制解析
Hystrix Plugins插件机制Hystrix通过SPI提供了插件扩展机制,有如下几种插件:HystrixConcurrencyStrategy:并发HystrixEventNotifier:通知HystrixMetricsPublisher:度量HystrixPropertiesStrategy:Properties配置HystrixCommandExecutionHook:回调函数HystrixDynamicProperties:配置以上插件都由HystrixPlugins统一原创 2021-08-22 22:57:39 · 4094 阅读 · 0 评论 -
TransmittableThreadLocal原理解析
theme: channing-cyanhighlight: a11y-dark参考文章:https://github.com.cnpmjs.org//alibaba/transmittable-thread-local/issues/123TransmittableThreadLocal是什么?TransmittableThreadLocal(简称TTL)是alibaba提供的一个工具包中的类,主要作用就是解决线程池场景下的变量传递问题。继承自InheritableThreadLocal主要用.原创 2021-08-21 00:42:55 · 4230 阅读 · 1 评论 -
TransmittableThreadLocal使用JavaAgent动态代理机制分析
本文不提及TTL的作用,仅从源码层面分析TTL是怎么使用JavaAgent来动态代理的依赖如下:<dependency> <groupId>com.alibaba</groupId> <artifactId>transmittable-thread-local</artifactId> <version>2.11.4</version></dependency>JavaAge.原创 2021-08-13 18:58:22 · 1592 阅读 · 1 评论 -
Apollo-client加载数据解析
如需参考源码解析,请访问:https://gitee.com/lidishan/apollo-code-analysis阅读前声明:本文不做相关用法说明,只解析Apollo-client源码阅读本文前请参考《Apollo-client 初始化入口流程解析》上面解析到了initialize()初始化,其是通过ConfigService.getConfig()来加载数据,那这个调用方式是怎么加载的?见下面实时获取apollo配置解析ConfigService.getConfig()如何使用?例子如下原创 2021-07-24 22:54:55 · 737 阅读 · 1 评论 -
Apollo-client 初始化入口流程解析
如需参考源码解析,请访问:https://gitee.com/lidishan/apollo-code-analysis阅读前声明:本文不做相关用法说明,只解析Apollo-client源码apollo中有一个注解,接下来先看一下这个启动注解@EnableApolloConfig 为什么要使用这个注解?系统启动时,会检索对应xml配置信息,并拉取apollo数据在postProcessAfterInitialization阶段进行覆盖配置注解初始化流程如下:第一步:在启动类上添加注解@原创 2021-07-24 22:51:49 · 1549 阅读 · 6 评论 -
Java插件扩展机制 - SPI
什么是SPISPI ,全称为 Service Provider Interface,是一种服务发现机制。其为框架提供了一个对外可扩展的能力。与 接口类-实现类 提供的RPC 方式有什么区别?传统的接口类实现形式为如下public interface AdOpFromApolloService {}public class AdOpFromDbServiceImpl implements AdOpFromDbService {}假设我们需要实现RPC,是怎么做的?RPC会在对应的接口原创 2021-07-24 17:05:21 · 740 阅读 · 2 评论 -
mybatis查询过程源码解析
本文只讲解mybatis的源码 ,不涉及过多的用法讲解,用法请百度。mybatis查询执行步骤(举SELECT分析)第一步:获取mapperProxy第二步:获取mapperMethod第三步:找到对应的执行类型(SELECT\UPDATE\INSERT\DELETE)第四步:查询前的缓存处理,判断是否需要从二级、一级缓存中取数据(先二级再一级)第五步:真正调用用jdbc调数据库,先预编译、再注入参数第六步:进行结果集解析填充...原创 2021-07-04 11:04:55 · 3784 阅读 · 0 评论 -
Guava cache源码解析
下面源码地址为:https://gitee.com/lidishan/guava-code-analysis/blob/master/guava/src/com/google/common/cache/LocalCache.java涉及依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId>原创 2021-07-02 23:57:29 · 473 阅读 · 1 评论 -
三色标记法及跨代引用
参考链接:https://www.jianshu.com/p/12544c0ad5c1、https://juejin.cn/post/6859931488352370702前言垃圾回收算法有标记整理、标记清除、复制等。但是垃圾怎么标记处理?这就涉及到标记算法,下面会仔细讲解三色标记算法三色标记法什么是三色标记法?垃圾回收过程大致如下:- 第一步:根据标记算法找到对应的待回收对象- 第二步:根据对应的回收算法如标记整理、标记清楚等来进行回收已标记好的待回...原创 2021-06-26 17:41:44 · 782 阅读 · 0 评论 -
ByteBuddy基本用法
ByteBuddy是一种字节码技术框架,其广泛用于中间件原创 2021-06-20 22:01:56 · 2282 阅读 · 0 评论 -
ThreadLocal原理解析
什么是ThreadLocal?ThreadLocal是线程本地副本,就是每个线程都会有自己私有的副本值,互不干扰。典型的一种空间换时间的做法。基本流程如下:第一步:首先通过threadLocal.set("xxxx")获取当前线程副本值-- 大体流程:获取当前线程->拿到当前线程的threadLocals变量->根据map是否有来设置值还是创建值第二步:通过threadLocal.get()直接获取当前线程的本地副本值-- 大体流程:获取当前...原创 2021-06-13 16:15:12 · 262 阅读 · 0 评论 -
线程池源码简析
本文不讲解线程池执行过程过状态的判断,如要阅读可留言索要源码分析代码基本流程:用一个AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0))的原子类来保存线程数量和线程池状态,共32位,高3位保存运行状态,低29位保存线程数量。其中根据运行状态和线程数量来判断是否需要添加工作线程池。然后调用addWork()创建工作线程Work,每个Work包含thread、firstTask、completedTasks。工作线程创建会调用r...原创 2021-06-05 01:01:42 · 495 阅读 · 0 评论 -
Xxl-Job调度器原理解析
项目解析源码地址:https://gitee.com/lidishan/xxl-job-code-analysisxxl-job版本:2.3.0Xxl-Job分为执行器、调度器。而我们平时的客户端就属于一个执行器,执行器启动的时候会自动注册到调度器上,然后调度器进行远程调度。调度器初始化过程步骤如下1 国际化相关配置参数: xxl.job.i18n=zh_CN,这里设置为中文简体2 初始化快线程fastTriggerPool、慢线程池slowTr...原创 2021-06-01 22:48:43 · 3769 阅读 · 1 评论 -
Xxl-Job执行器原理解析
xxl-job版本:2.3.0Xxl-Job分为执行器、调度器。而我们平时的客户端就属于一个执行器,执行器启动的时候会自动注册到调度器上,然后调度器进行远程调度。执行器初始化过程步骤如下1通过加了@Conguration注解的XxlJobConfig初始化,并生成beanName=xxlJobExecutor的Bean2注册的BeanName=XxlJobConfig,会进行初始化,步骤如下:-扫描所有bean,加载加了@XxlJob注解类,并记录在job...原创 2021-05-31 22:49:40 · 7827 阅读 · 0 评论 -
Spring @Configuration如何注入
业务代码一般用拦截器拦截注解,并作相应定义。但Spring的注解如@Conguration是通过XxxxPostProcessor来进行注入。@Configuration有独属的postProcessor处理器 -ConfigurationClassPostProcessor@Configuration作用及使用案例作用:类型以前的XML配置注入对应的Bean,将比如application.properties的属性注入到对应的Bean实体类使用案例(比如下面...原创 2021-05-29 21:48:22 · 2329 阅读 · 0 评论 -
Skywalking启动加载过程
搭建文档:https://www.jianshu.com/p/ec8ef2b91e92本次讲解版本:apache-skywalking-apm-8.5.01 Skywalking整体架构主要组成:UI(数据显示)、Storage(存储层)、Agent(客户端数据收集)、OAP(服务端数据接受处理)2源码解析如下首先skywalking用的是javaagent技术,入口为:org.apache.skywalking.apm.agent.SkyWalkingAge...原创 2021-04-24 15:36:59 · 2296 阅读 · 0 评论 -
Mybatis执行流程
1 mapper接口和映射文件如何绑定解析mapper配置信息,比如package配置、全限定名xml映射等方式,解析xml并将其与对应的mapper接口映射起来,用一个hashmap(knownMappers)映射起来。然后遍历Mapper接口中所有方法,将每个方法的全限定名作为key存在mapperStatements中。注意点:同一个value会存储2次,一个全限定名作为key,另一个就是只用方法名(sql语句的id)来作为key。 所以如果全局只存在一个方法名,就可以直接...原创 2021-02-12 13:38:45 · 240 阅读 · 0 评论 -
Spring解决循环依赖问题
1 Spring解决循环依赖问题(可以用@Lazy解决)?A依赖于B,B依赖于C,C依赖于A。仅能解决单例非构造方法注入的循环依赖,通过三级缓存singletonObjects、earlySingletonObjects、singletonFactories来提前曝光获取(即对应bean实例被创建出来但其属性没有被设置好的情况下就去提前获取)来解决循环依赖。什么是循环依赖?A、B类直接或间接相互引用什么情况下循环依赖可被解决?1 必须都是单例2 依赖注入的方式不能全是构..原创 2021-02-09 23:16:21 · 190 阅读 · 0 评论 -
ScheduledExecutorService原理解析
ScheduledExecutorService是基于DelayQueue,所以要先对DelayQueue做讲解DelayQueue 内部实现参考链接:https://www.zybuluo.com/mikumikulch/note/712598延迟阻塞队列 = 阻塞队列 + 延迟获取任务功能举个例子,DelayQueue可通过重写compareTo来处理排序private static DelayQueue<DelayTask> delayQueue = ne...原创 2020-09-26 14:52:30 · 2595 阅读 · 1 评论 -
Mybatis打印完整日志插件
配置日志打印其实挺烦的,而且很多打印的SQL是待占位符,比如:SELECT * FROM xxx WHERE id = ?这样子看起来比较麻烦还有一个问题就是如果要打印这个,那就需要每次都在自己本地改下代码,可能还需要根据不同项目做不同配置,具体的通用配置链接可参考如下:https://blog.csdn.net/fangzefeng_911/article/details/79697724综合如上不如用IDEA的插件,优点如下:1 无须更改代码配置2 可打印完..原创 2020-09-26 09:29:44 · 1074 阅读 · 0 评论 -
微信朋友圈设计方案简述
1 手机发送朋友圈,然后把数据先暂存到本地,本线线程异步把图片、视频资源上传到CDN,并且把发送的朋友圈相关数据(还有上传返回的链接)发送到后台服务器。2 然后本机刷自己朋友圈的时候直接从本地拉取图片、视频资源即可--如果发送的过程中,手机没电或者进程被关闭了怎么办?---- 删除是不可能删除的,只能后面重启朋友圈的时候重发(后台服务器根据当前朋友圈的发送时间戳和用户唯一标识做幂等性就行了)3 后台服务器接受到发送的朋友圈后,先把数据插入 朋友圈发布表、相册表(用户自己的相册...原创 2020-08-09 21:37:28 · 3504 阅读 · 0 评论 -
JVM编译优化
参考文章: 方法内联: https://www.toutiao.com/a6530421233337500164/?tt_from=weixin&utm_campaign=client_share×tamp=1520505006&app=news_article&utm_source=weixin&iid=27056549301&utm_medium=toutiao_ios&wxshare_count=1 整体描述: htt.原创 2020-06-13 13:40:41 · 382 阅读 · 0 评论 -
jdk版本问题导致的error: reference to query is ambiguous
1用的是开源项目Davinci,在其之上进行改造情况是这样的,在test的jenkins环境中是可以正常构建的当前项目的,但是准备上预发布的时候发现jenkins报错如下:[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-...原创 2020-04-10 19:48:42 · 1729 阅读 · 0 评论 -
正则表达式一些场景的应用(含SQL解析)
实际场景1 -WITH临时表的拆分因为公司发展需要,要对sql进行改造拼装,借此需要一些比较奇葩的正则表达式来处理。由于公司采用的是基于Presto的阿里收费平台ADB,所以一下以ADB语法作为讲解。假设有一个sql如下:WITHtmp1 AS ( select xxx ),tmp2 AS ( select xxxx ),tmp3 AS ( select xx...原创 2020-04-02 16:20:31 · 590 阅读 · 0 评论 -
简述一次线上dubbo超时重复赠送问题
产生问题业务方反馈用户赠送次数异常,经排查后发现存在重复的赠送记录。排查过程然后进行排查,排查SQL为:# 查出所有赠送有问题的的数据select user_id,count(*) AS total from `xxxx`.`record`WHERE change_num=10 AND `source`=100 AND gmt_create >...原创 2020-03-18 20:03:43 · 361 阅读 · 0 评论 -
View List与Sub View List设计规范
因公司业务发展,需要改造一个BI平台Davinci。考虑到davinci的View List中的View只是作为一个宽表来进行设计的,无法将两个View进行关联。所以需要修改源码。可修改源码,并将View划分为View和Sub View,其逻辑上分别对应维表、事实表。然后定义好View与Sub View之间的关联主键,就可进行数据的复用。举个真实的metabas...原创 2020-03-12 14:42:25 · 291 阅读 · 0 评论 -
JVM调优参数杂谈
配置为:- jdk1.8- 服务器:4核8G开篇:本篇仅以博主观念来讲解JVM一般会用到的参数,不做线上实例的讲解(因为展开太多了(╬▔皿▔)凸)。首先上来就是一套稍微全一点的jvm参数配置(建议一般3G的堆大小即可,可根据实际情况调整(考虑到系统还有其他会用到内存、系统自己也会用内存)):-Xms3072M -Xmx3072M -Xmn2048M-X...原创 2020-03-02 19:58:05 · 498 阅读 · 0 评论 -
Tomcat版本与依赖冲突抛错问题
某一天线上突然出现如下报错(不影响引用启动,但就是报错了!!):28-Feb-2020 23:44:45.149 SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.startup.ContextConfig.processAnnotationsJar Unable to process Jar entry [modul...原创 2020-02-29 16:48:58 · 928 阅读 · 0 评论 -
线上nginx访问日志匹配处理及nginx限流简单处理
今天部门开会提到了个问题,恶意刷接口怎么处理?就当做是一个作业,去学会如何简单的分析nginx日志。1先看nginx日志# whereis nginx //找到nginx目录位置2进入访问日志目录,这里可以看到是access.log文件# cd /etc/nginx/logs3对当前访问日志进行ip访问次数分析(分...原创 2020-01-06 22:32:00 · 761 阅读 · 0 评论