
源码分析
文章平均质量分 78
nuaazhaofeng
爱生活,爱coding
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【源码分析】Guava源码解析之EventBus
最近看Elastic-Job源码,看到它里面实现的任务运行轨迹的持久化,使用的是Guava的AsyncEventBus,一个内存级别的异步事件总线服务,实现了简单的生产-消费者模式,从而在不影响任务执行效率的基础上,将任务执行和任务轨迹记录解耦,大大提高了EJ的性能。EventBus在Elastic-Job中的使用EventBus的使用方法不难,具体可以参考EJ里面几个相关的类:JobEventLi原创 2017-05-23 16:34:10 · 494 阅读 · 0 评论 -
【源码】otter工程结构
最近在搞数据同步相关的内容,需要对otter的代码进行扩展,所以需要先熟悉一下otter的源码。首先我们整体来看下otter的工程结构。otter的工程结构比较复杂,需要花费一定的时间来理解各个部分的内容,仅仅通过官方文档无法准确的理解各个模块的内容,现分析如下:otter整体的工程结构如下:otter|--manager |--biz |--deployer原创 2018-01-22 14:51:58 · 965 阅读 · 0 评论 -
【Otter】otter代码在IDEA远程DEBUG方法
众所周知,Otter的代码打包后,是通过Jetty启动的,Otter代码的启动脚本中自带了开启Jetty远程DEBUG的脚本,所以我们只需要在启动Otter Manager和Otter Node的时候,带上如下参数:sh start.sh debug 8888其中8888就是我们远程debug的端口号。然后在IDEA中开启远程调试,具体的步骤为:Debug->Remote-原创 2018-02-01 14:05:29 · 430 阅读 · 0 评论 -
【Canal源码分析】Sink及Store工作过程
一、序列图二、源码分析2.1 SinkSink阶段所做的事情,就是根据一定的规则,对binlog数据进行一定的过滤。我们之前跟踪过parser过程的代码,发现在parser完成后,会把数据放到一个环形队列TransactionBuffer中,也就是这个方法:transactionBuffer.add(entry);我们具体看下add这个方法。public...原创 2018-05-25 15:01:13 · 586 阅读 · 0 评论 -
【Canal源码分析】Binlog的寻找过程
binlog的寻找过程可能的场景如下:instance第一次启动发生数据库主备切换canal server HA情况下的切换所以这个过程是能够保证binlog不丢失的关键点。本文从源码的角度来分析下启动过程中的binlog寻找过程。一、流程图下图是根据源码画出的流程图,需要结合源码分析来一起看。 二、源码分析入口在AbstractEventParser的s...原创 2018-05-23 22:15:53 · 1274 阅读 · 0 评论 -
【Canal源码分析】parser工作过程
本文主要分析的部分是instance启动时,parser的一个启动和工作过程。主要关注的是AbstractEventParser的start()方法中的parseThread。一、序列图二、源码分析parseThread中包含的内容比较清晰,代码不是很长,我们逐步分析下。2.1 构造数据库连接erosaConnection = buildErosaConnect...原创 2018-05-24 10:58:48 · 1165 阅读 · 0 评论 -
【Canal源码分析】Canal Server的启动和停止过程
本文主要解析下canal server的启动过程,希望能有所收获。一、序列图1.1 启动1.2 停止二、源码分析整个server启动的过程比较复杂,看图难以理解,需要辅以文字说明。首先程序的入口在CanalLauncher的main方法中。2.1 加载配置文件String conf = System.getProperty("cana...原创 2018-05-24 15:27:52 · 1721 阅读 · 0 评论 -
【Canal源码分析】client工作过程
client的工作过程,需要我们自己去编写对应的逻辑,我们目前只能从example写的例子来看。目前examle中提供了两个例子,一个是单机的,一个是集群的cluster,我们后续如果需要进行开发的话,其实也是开发我们自己的client,以及client的一些逻辑。我们主要看下集群的client是如何实现和消费的,又是怎么和server进行数据交互的。我们来看看具体的代码:protec...原创 2018-05-29 16:43:46 · 1905 阅读 · 0 评论 -
【Canal源码分析】Canal Instance启动和停止
一、序列图1.1 启动1.2 停止二、源码分析2.1 启动这部分代码其实在ServerRunningMonitor的start()方法中。针对不同的destination,启动不同的CanalInstance。主要的方法在于initRunning()。private void initRunning() { if (!isStart())...原创 2018-05-24 17:52:42 · 1519 阅读 · 2 评论 -
【Canal源码分析】数据传输协议
Canal的数据传输有两块,一块是进行binlog订阅时,binlog转换为我们所定义的Message,第二块是client与server进行TCP交互时,传输的TCP协议。一、EntryProtocal这块是binlog的一个存储。主要的格式如下:Entry Header version [协议的版本号,default = 1] ...原创 2018-05-30 14:07:56 · 647 阅读 · 0 评论 -
【Canal源码分析】配置项
本文讲解canal中的一些配置含义。一、配置加载图二、配置文件canal.properties2.1 common参数定义比如可以将instance.properties的公用参数,抽取放置到这里,这样每个instance启动的时候就可以共享. 【instance.properties配置定义优先级高于canal.properties】 参数名 含义...原创 2018-05-30 16:32:37 · 818 阅读 · 0 评论 -
【Canal源码分析】整体架构
本文详解canal的整体架构。一、整体架构说明:server代表一个canal运行实例,对应于一个jvminstance对应于一个数据队列 (1个server对应1..n个instance)instance模块:eventParser (数据源接入,模拟slave协议和master进行交互,协议解析)eventSink (Parser和Store链接器,进...原创 2018-05-30 17:24:36 · 1917 阅读 · 0 评论 -
【Canal源码分析】重要类图
从Canal的整体架构中,我们可以看出,在Canal中,比较重要的一些领域有Parser、Sink、Store、MetaManager、CanalServer、CanalInstance、CanalClient、Connection等等。下面我们仔细分析下Canal的领域模型。一、Parser核心是AbstractEventParser,主要干活的是MysqlEventParser。...原创 2018-05-31 10:52:29 · 473 阅读 · 0 评论 -
【Canal源码分析】TableMetaTSDB
这是Canal在新版本引入的一个内容,主要是为了解决由于历史的DDL导致表结构与现有表结构不一致,导致的同步失败的问题。采用的是Druid和Fastsql,来记录表结构到DB中,如果需要进行回滚时,得从DB中根据时间点去查到对应的库表结构,然后进行业务的处理。也就是,如果我们想要这样的效果,需要开启TSDB的功能,同时要新增库表来记录表结构的变更。这个基本上是在parser启动时,寻找位点时需...原创 2018-05-31 13:49:21 · 1677 阅读 · 0 评论 -
【Kafka源码】KafkaConsumer
一偏移量和消费者位置Offsets And Consumer position1 TopicPartition2 committed position提交偏移量二消费分组和主题订阅Consumer Groups and Topic Subscriptions三检测消费者失败Detecting Consumer Failures三举例1 自动提交Automatic Offset Commi原创 2017-11-16 13:31:22 · 615 阅读 · 0 评论 -
【源码解析】Sharding-Jdbc模块分析
最新的2.0版本的Sharding-Jdbc版本,由于需要支持动态配置加载,所以最新的模块信息如下:|-sharding-jdbc |-sharding-jdbc-core |-api |-constant |-exception |-executor |-hint |-jdbc原创 2017-11-20 16:34:34 · 820 阅读 · 0 评论 -
【源码分析】Elastic-Job源码分析之AbstractElasticJobExecutor分析
还记得我们在JobScheduler中,在创建任务详情时,会调用一个建造器JobBuilder来创建一个Job,类型是LiteJob。LiteJob.java/** * Lite调度作业. * * @author zhangliang */public final class LiteJob implements Job { @Setter private ElasticJo原创 2017-05-19 18:23:00 · 1135 阅读 · 0 评论 -
【源码分析】Elastic-Job源码分析之JobScheduler类分析
JobScheduler这个类是EJ中比较核心的一个类,我们现在开始解析这个类。一、构造器首先我们看一下JobScheduler的几个构造器。 private JobScheduler(final CoordinatorRegistryCenter regCenter, final LiteJobConfiguration liteJobConfig, final JobEventBus jo原创 2017-05-10 20:24:23 · 840 阅读 · 0 评论 -
高性能队列Disruptor的使用
一、什么是 Disruptor从功能上来看,Disruptor 是实现了“队列”的功能,而且是一个有界队列。那么它的应用场景自然就是“生产者-消费者”模型的应用场合了。可以拿 JDK 的 BlockingQueue 做一个简单对比,以便更好地认识 Disruptor 是什么。我们知道 BlockingQueue 是一个 FIFO 队列,生产者(Producer)往队列里发布(publish)一项事件原创 2017-06-08 15:03:00 · 3619 阅读 · 0 评论 -
【Guava】Optional接口来避免空指针错误
null会带来很多问题,从开始有null开始有无数程序栽在null的手里,null的含义是不清晰的,检查null在大多数情况下是不得不做的,而我们又在很多时候忘记了对null做检查,在我们的产品真正投入使用的时候,空指针异常出现了,这是一种讨厌的情况。鉴于此google的guava库中提供了Optional接口来使null快速失败,即在可能为null的对象上做了一层封装,在使用Optional静态方转载 2017-08-22 09:10:19 · 621 阅读 · 0 评论 -
【Guava】PreConditions来校验参数
前置条件:让方法调用的前置条件判断更简单。在我们的日常开发中,经常要对入参进行一定的参数校验,比如是否为空,参数的取值范围是否符合要求等等。这种参数校验如果我们单独进行校验的话,代码的重复率比较高,也不是很优雅。Guava提供了一个类PreConditions来统一校验我们的参数,同时可以抛出对应的异常信息,将参数校验的工作进行了统一。下面是它提供的几种校验方法: 方法声明(不包含额外参数)转载 2017-08-22 09:13:21 · 598 阅读 · 0 评论 -
【Kafka源码】日志处理
目前来说,kafka的日志中记录的内容比较多,具体的存储内容见这篇博客,写的比较好。可以看到,存储的内容还是比较多的,当存储文件比较大的时候,我们应该如何处理这些日志?下面我们通过kafka启动过程的源码,分析下kafka的日志处理过程。一、入口方法在kafkaServer.scala中的start方法中,有一个这样的调用:/* start log manager */logManager = c原创 2017-11-06 21:12:10 · 1286 阅读 · 0 评论 -
【Kafka源码】SocketServer启动过程
SocketServer主要用于接收外部的网络请求,并把请求添加到请求队列中。一、入口在KafkaServer.scala中的start方法中,有这样的入口:socketServer = new SocketServer(config, metrics, kafkaMetricsTime)socketServer.startup()这块就是启动了一个SocketServer,我们具体看一下。二、构原创 2017-11-07 14:16:38 · 608 阅读 · 0 评论 -
【Kafka源码】ReplicaManager启动过程
一入口二ReplicaManager实例化三启动ReplicaManager1 maybeShrinkIsr2 maybePropagateIsrChanges在KafkaServer启动过程的入口中,会启动Replica Manager,众所周知,这是一个副本管理器。replica在Kafka中扮演的角色很重要,是保证消息不丢失的一个重要概念。replica的个人理解概念如下:produ原创 2017-11-08 11:26:25 · 518 阅读 · 0 评论 -
【Kafka源码】Kafka代码模块
Kafka源码依赖于Scala环境,首先需要安装scala,这块请自行百度进行安装。传送门当然,我们要分析源码,需要下载源码,请自行从github上面下载。 说明:本文使用的kafka版本为0.10.0.1,这是目前公司使用的版本。下面说明下kafka源码的工程结构: 下面主要对core目录模块进行说明,这块是kafka的核心。admin:管理员模块,操作和管理topic,parition原创 2017-10-23 11:18:11 · 500 阅读 · 0 评论 -
【Kafka源码】KafkaController启动过程
一入口二实例化Controller三Controller启动1 registerSessionExpirationListener11 onControllerResignation12 controllerElectorelect2 controllerElectorstartup21 leaderChangeListener22 elect之前聊过了很多Kafka启动过程中的一原创 2017-11-08 17:31:23 · 655 阅读 · 0 评论 -
【Kafka源码】Kafka启动过程
一般来说,我们是通过命令来启动kafka,但是命令的本质还是调用代码中的main方法,所以,我们重点看下启动类Kafka。源码下下来之后,我们也可以通过直接运行Kafka.scala中的main方法(需要指定启动参数,也就是server.properties的位置)来启动Kafka。因为kafka依赖zookeeper,所以我们需要提前启动zookeeper,然后在server.properties原创 2017-10-23 17:22:49 · 977 阅读 · 0 评论 -
【Kafka源码】broker被选为controller之后的连锁反应
一controller epoch二注册监听器1 registerReassignedPartitionsListener11 initiateReassignReplicasForTopicPartition12 onPartitionReassignment2 registerIsrChangeNotificationListener3 registerPreferredReplic原创 2017-11-13 16:42:35 · 2667 阅读 · 0 评论 -
【Kafka源码】处理请求
一KafkaRequestHandlerPool二KafkaApishandle1 ApiKeys枚举类三Request数据结构1 requestId2 header3 body在KafkaServer中的入口在:apis = new KafkaApis(socketServer.requestChannel, replicaManager, groupCoordinator,原创 2017-11-15 10:42:59 · 1029 阅读 · 0 评论 -
【源码分析】HashMap源码再读-基于Java8
最近工作不是太忙,准备再读读一些源码,想来想去,还是先从JDK的源码读起吧,毕竟很久不去读了,很多东西都生疏了。当然,还是先从炙手可热的HashMap,每次读都会有一些收获。当然,JDK8对HashMap有一次优化一、一些参数我们首先看到的,应该是它的一些基本参数,这对于我们了解HashMap有一定的作用。他们分别是:参数说明capacity容量,默认为16,最大为2^...原创 2019-01-30 13:53:06 · 268 阅读 · 0 评论