源码分析
文章平均质量分 77
六道木_
菜鸟一名~~
展开
-
Sentinel源码分析----降级熔断规则与DegradeSlot
上篇文章讲了流控规则,而除了流控规则之后还有降级、热点、系统、授权等规则,这篇文件主要讲降级规则。降级规则主要处理节点是DegradeSlot,其中具体逻辑由DegradeRuleManager.checkDegrade实现 public static void checkDegrade(ResourceWrapper resource, Context context, Default...原创 2019-03-04 17:24:06 · 2352 阅读 · 0 评论 -
Dubbo源码分析----扩展机制
(复习了一下,且补充和修改了一些内容,之前那篇不是MD的,所以重新发布了) Dubbo提供了一种类似JavaSPI的一种机制,ExtensionLoader是扩展机制的核心,类似于JavaSPI的ServiceLoader和JavaSPI类似,Dubbo规定在META-INF/services/、META-INF/dubbo/、internal/下定好配置文件,Dubbo会按照一定的规则去加...原创 2018-07-15 16:13:23 · 250 阅读 · 0 评论 -
Dubbo源码分析----过滤器之ExecuteLimitFilter
ExecuteLimitFilter主要用来做并发控制例子1:限制服务 的每个方法,服务器端并发执行(或占用线程池线程数)不能超过 10个,具体配置如下<dubbo:service interface="com.foo.BarService" executes="10" />例子2:限制 com.foo.BarService 的 sayHello 方法,服务器端并发执行...原创 2018-07-17 02:02:38 · 755 阅读 · 0 评论 -
Dubbo源码分析----过滤器之AccessLogFilter
dubbo的accessLog可以记录请求信息,配置如下:<dubbo:protocol accesslog="true" />然后配置一下日志文件就OK了,具体百度一下,这里只分析一下其中的原理。accessLog的处理是在filter中,具体为AccessLogFilter,看下类的定义@Activate(group = Constants.PROVIDER...原创 2018-07-17 00:57:43 · 1689 阅读 · 0 评论 -
Netty源码分析----writeAndFlush
(*文章基于Netty4.1.22版本) ctx.writeAndFlush相当于先调用ctx.write然后再调用ctx.flush,所以下面分析write和flushwritewrite和flush会经过pipeline的每个outbound的Handler,之前文章分析过流程,这里不再分析。write方法最终到达HeadContext的write方法,然后什么都没做,将请求...原创 2018-07-04 00:33:12 · 3700 阅读 · 0 评论 -
Netty源码分析----NioEventLoop之处理请求
(*文章基于Netty4.1.22版本) 之前已经讲了NioEventLoop的初始化以及核心的队列了,最后还涉及到的就是非常核心的一部分,就是NioEventLoop如何去处理请求。其核心逻辑是run方法,记得之前说过,NioEventLoop的线程初始化的时候,会调用一下run方法开始处理请求 private void doStartThread() { a...原创 2018-06-27 00:18:41 · 332 阅读 · 0 评论 -
Netty源码分析----NioEventLoop之任务队列
(*文章基于Netty4.1.22版本) 这篇文章主要分析一下NioEventLoop中任务队列相关的代码源码分析taskQueueexecute方法调用的时候或者执行完startThread方法,会调用addTask添加任务 protected void addTask(Runnable task) { if (!offerTask(task)...原创 2018-06-27 00:17:21 · 1909 阅读 · 2 评论 -
Netty源码分析----NioEventLoop之初始化过程及线程模型
Netty的线程模式网上很多文章都有介绍了,很多文章写得也好,加上我的表达能力不太好,这块线程模型的就不分析了,这篇文章主要讲一下Netty线程模型底层实现的细节。线程线程,肯定就是有线程去处理的,但是Netty的线程不是简简单单用一个Thread或者ThreadPool是去实现那样的一个线程模型,其核心是一个叫做EventLoop的东西,这个可以看成是一个Thread的封装、抽象,以NIO为...原创 2018-06-11 00:20:21 · 335 阅读 · 0 评论 -
Netty源码分析----注册监听事件
(*文章基于Netty4.1.22版本) 上篇服务启动的文章讲了3个步骤 1. 创建Channel并设置非阻塞 2. Channel绑定地址 3. Channel注册Selector但是其实,NIO还有一步是注册感兴趣的事件,在上一篇文章中,只是将感兴趣的事件存放到一个变量中,而没有进行注册,这里,我们看下注册的流程。 一开始我也没找到到底哪里进行注册的,后来先通过AbstractN...原创 2018-06-05 23:35:50 · 1212 阅读 · 0 评论 -
Netty源码分析----服务启动之开始接收请求及其他细节
(*文章基于Netty4.1.22版本) 在上一篇文章Netty源码分析—-服务启动之Channel初始化中,一开始给出了一个NIO的demo,然后从构造方法开始分析Netty对应的封装操作流程,而这篇文章,而这篇文章会开始分析,当初始化完成之后,Netty是如何开始接收请求的。 先看下上一篇文章NIO的demo中,是如何接收请求的(只保留run方法,其他忽略)public class N...原创 2018-05-28 00:04:46 · 1104 阅读 · 0 评论 -
Netty源码分析----pipeline
(*文章基于Netty4.1.22版本)介绍Netty中随着一个Channel的创建,会连带创建一个ChannelPipeline,这个ChannelPipeline就像一个处理各种事件的管道,负责去处理Channel上发生的事件,例如连接事件,读事件,写事件等。 更深入的说,处理的并不是ChannelPipeline,而是ChannelPipeline中一个个的ChannelHandl...原创 2018-05-27 23:45:14 · 2410 阅读 · 0 评论 -
Netty源码分析----服务启动之Channel初始化
Netty底层也是基于NIO,所以在分析服务启动的流程之前,我们先回顾一下NIO的启动Server的代码,写的一个Server例子如下,只保留和Netty启动相关的代码public class NioServer implements Runnable { public static void main(String[] args) { new Thread(new...原创 2018-05-20 13:59:15 · 3636 阅读 · 0 评论 -
Dubbo源码分析----Dispatcher和ThreadPool
DispatcherDispatcher是决定事件如何派发的策略,即将哪些事件派发线程池,还是说直接在当前线程中执行。先看下接口的定义@SPI(AllDispatcher.NAME)public interface Dispatcher { @Adaptive({Constants.DISPATCHER_KEY, "dispather", "channel.handle...原创 2018-07-15 19:30:05 · 962 阅读 · 0 评论 -
Dubbo源码分析----多版本
在开发的时候,可能多个项目会修改同一个服务,那么不能直接暴露出来,否则会被其他人给调用到,导致数据不正常,那么这种情况下可以使用dubbo的多版本来解决这个问题,配置如下:// 稳定环境下的provider和consumer<dubbo:service interface="com.foo.BarService" version="1.0.0" /><dubbo:re...原创 2018-07-16 01:58:53 · 733 阅读 · 0 评论 -
Dubbo源码分析----过滤器之FutureFilter
FutureFilter主要是用来处理事件通知的过滤器,这么讲可能不太清楚,先看下下面的demo 先定一个是事件通知的类:public class Notify { public void oninvoke(String msg){ System.out.println("oninvoke:" + msg); } public void onret...原创 2018-07-21 14:34:16 · 1263 阅读 · 0 评论 -
Sentinel源码分析----滑动窗口
之前说过Sentinel内部统计使用Node来进行处理,而Node底层是使用滑动窗口实现的,这篇文章主要分析一下滑动窗口的实现。以StatisticNode#addPassRequest方法为入口,先看看内部实现: private transient volatile Metric rollingCounterInSecond = new ArrayMetric(SampleCountP...原创 2019-03-05 00:23:30 · 2658 阅读 · 2 评论 -
Spring源码解析----@Import
本文章很多知识点基于Spring源码解析----@Configuration、@SpringBootApplication、@Bean@Import标签可以动态的引入一些Configuration类,SpringBoot自动配置也基于这个注解动态引入了很多Conguration类,下面看下使用1 Demo将之前文章demo里的MyConfiguration类上的@Configuration注...原创 2019-02-11 20:04:09 · 1513 阅读 · 1 评论 -
Spring源码解析----@Configuration、@SpringBootApplication、@Bean
这篇文章主要分析一下这几个注解的原理。SpringBoot中这几个注解关系比较紧密,少了@SpringBootApplication注解,SpringBoot很多功能都没法使用,所以文章分析的内容涉及了该注解另外还有个问题也与@SpringBootApplication有关:SpringBoot为什么不需要配置包扫描,Spring是如何知道要扫描哪些路径下的类?1 Demo在上一篇文...原创 2019-02-11 20:03:33 · 762 阅读 · 0 评论 -
Spring源码解析----SpringBoot启动流程
一个简单的SB程序如下,点击main方法左边的原谅色的三角形就能把程序启动起来,虽然什么功能都没有,但是启动做了很多处理,加载了很多支持多种功能的组件(类似使用new ClassPathXmlApplicationContext()启动一个Spring程序,其中加载了很多东西)@SpringBootApplicationpublic class SpringBootDemoApplicatio...原创 2019-02-11 20:02:38 · 3579 阅读 · 1 评论 -
RocketMQ源码分析----ProcessQueue
RockerMQ里有个非常重要的数据结构叫ProcessQueue,很多功能,例如消费进度,消费等等功能的底层核心数据保存都是有ProcessQueue提供,下面介绍一下ProcessQueue提供的功能,而整个涉及的流程不会在这展开,在另外的功能分析文章如果涉及才会深入分析看下代码上的注释:Queue consumption snapshot即消息快照的意思,为什么要这样形容呢?主要是...原创 2018-12-18 01:58:56 · 2448 阅读 · 0 评论 -
Java源码分析----Future
一般使用多线程操作的时候会使用Thread+Runnable进行处理,但是这种方式中,Runnable是没有返回值的,假设我们需要获取Runnable的返回值,可能需要如下特殊处理,伪代码如下String returnValue1 = "";String returnValue2 = "";CountDownLatch cdl = ....new Thread(()->{ /...原创 2018-12-28 16:53:29 · 235 阅读 · 0 评论 -
RocketMQ源码分析----Consumer消费进度相关
在Consumer消费的时候总有几个疑问:消费完成后,这个消费进度存在哪里消费完成后,还没保存消费进度就挂了,会不会导致重复消费Consumer消费进度保存消费完成后,会返回一个ConsumeConcurrentlyStatus.CONSUME_SUCCESS告诉MQ消费成功,以MessageListener的consumeMessage为入口分析。消费的时候,是以ConsumeR...原创 2018-12-28 16:52:38 · 1408 阅读 · 0 评论 -
RocketMQ源码分析----Producer队列选择与容错策略
队列选择在HA的文章里大概讲了一下Producer如何为高可用贡献出一份力量的,当时只是说了遍历列表选择队列,然后选择一个,没有深入分析,这篇文章深入分析一下其源码,首先从发送消息选择队列的代码开始: String lastBrokerName = null == mq ? null : mq.getBrokerName(); MessageQueue tmpmq = this....原创 2018-12-12 01:34:15 · 1228 阅读 · 2 评论 -
Dubbo源码分析----DefaultFuture
前面两篇文章已经分析了provider和consumer之间的通信过程,那么还有几个问题:由于请求是异步的,provider返回结果到客户端之后,consumer怎么知道该结果是哪个请求的?由于请求是异步的,为何Dubbo能同步等待结果? 由于请求是异步的,provider返回结果到客户端之后,consumer怎么知道该结果是哪个请求的?先看下第一个问题,因为provide...原创 2018-07-22 15:43:51 · 3123 阅读 · 3 评论 -
Dubbo源码分析----处理请求
Dubbo默认是使用Netty进行通信的,那么Netty会配置一个Handler,来处理一些事件,所以这个Handler是核心,主要找一下Dubbo初始化Netty的时候设置的Handler回顾一下网络通信相关,在DubboProtocol中,会调用createServer方法返回一个Server对象,这是一个切入点 private ExchangeServer createSe...原创 2018-07-22 14:58:43 · 351 阅读 · 0 评论 -
Dubbo源码分析----发起请求
从如下代码中还是分析String sayHello = demoService.sayHello("123123");我们知道demoService实际上是一个代理对象,那么假设使用的是JDK的代码,看看获取代理的地方public class JdkProxyFactory extends AbstractProxyFactory { @SuppressWarning...原创 2018-07-21 17:54:29 · 418 阅读 · 0 评论 -
Netty源码分析----PoolThreadCache
整体介绍在讲PoolArena分配的时候,有说到会先从线程缓存里分配,这个线程缓存其实就是PoolThreadCache(好了,从这里开始,要开始出现几个名字差不多的东西….别弄混淆了….(T▽T)),Netty从几个方面去减少线程之间的竞争,一个是在PooledByteBufAllocator持有多个PoolArena,使用线程相关的cache,通过这两种方法去减少竞争,当然其中会带来复杂度...原创 2018-05-13 15:43:54 · 396 阅读 · 0 评论 -
Netty源码分析----PoolArena
整体介绍前面介绍了PoolSubpage,PoolChunk,PoolChunkList,这在这之上还有个PoolArena,在这里面管理了前面3个结构,结构图如下: 包含了前面说的6个PoolChunkList,还有两个PoolSubpage数组,数组中的每个元素都是一个链表的头节点,在讲PoolSubpage的时候涉及的Head就是从PoolSubpage数组里取的在代码中,Po...原创 2018-05-13 15:36:48 · 289 阅读 · 0 评论 -
RocketMQ源码分析----HA相关(1)
简单介绍RocketMQ搭建集群无非就是搭建Master和Slave,而根据Master和Slave的数量不同又分为几种方式: 1. 单Master无Slave:这种就是普通的单机模式了,Master一挂,消息服务就不可用了 2. 多Master无Slave:这种如果有其中一个Master挂了,集群还能使用,但是由于没有Slave,如果挂的那台Master还有未被消费的消息,那么将会暂时无...原创 2018-05-13 15:20:42 · 537 阅读 · 1 评论 -
Dubbo源码分析----暴露服务
暴露服务的过程中,会涉及到两个Protocol 1. DubboProtocol主要是做网络通信相关初始化 2. RegistryProtocol主要是做zk的注册和订阅相关在提供一个服务的时候,需要在配置文件里声明如下xml<dubbo:service.... 然后Spring会根据对应关系执行对应的BeanDefinitionParser,然后实例化对应的类,提...原创 2018-02-19 16:13:47 · 1966 阅读 · 0 评论 -
RocketMQ源码分析----Broker处理消费请求
Consumer启动后会请求broker,broker的PullMessageProcessor的processRequest会对请求进行处理主要步骤1.判断确保订阅组是否存在2.判断订阅组是否可以消费消息3.检查topic是否存在4.检查topic权限5.检查队列有效性6.判断消费者组是否存在7.广播模式下判断是否允许广播方式消费8.判断Subsc原创 2017-04-03 21:00:02 · 1552 阅读 · 0 评论 -
RocketMQ源码分析----Broker处理发送请求
Producer发送消息后,会由SendMessageProcessor类的processRequest方法进行处理,其中会调用sendMesaage方法主要步骤1.创建响应对象Response,用来返回给Producer消息的处理结果2.设置消息相关信息:请求id,消息体,请求队列,topic等3.将信息封装到MessageExtBrokerInner对象中4.消息t原创 2017-04-03 19:51:30 · 901 阅读 · 0 评论 -
RocketMQ源码分析----刷盘的实现
Broker启动的时候,会调用CommitLog的start方法,然后再启动flushCommitLogService线程在CommitLog的构造方法中,会判断刷盘的类型 public CommitLog(final DefaultMessageStore defaultMessageStore) { this.mapedFileQueue = new Ma原创 2017-04-03 16:12:46 · 2612 阅读 · 0 评论 -
RocketMQ源码分析----发送消息
主要步骤发送消息的主要流程总结如下步骤:1.获取Topic信息TopicPublishInfo:tryToFindTopicPublishInfoa) 从缓存map topicPublishInfoTable中获取b) 空则新建c) 更新topic信息:updateTopicRouteInfoFromNameServer原创 2017-03-30 20:02:48 · 2983 阅读 · 0 评论 -
RocketMQ源码分析----消费消息
发送拉取消息请求Consumer在拉取消息的时候,主要分为3个线程,分别做3件事情:1.遍历MessageQueue集合,组装成PullRequest对象,放到map processQueueTable中2.从processQueueTable中获取数据,向broker请求,返回结果放到map responseTable中3.扫描responseTable,根据原创 2017-03-07 11:28:51 · 1665 阅读 · 0 评论 -
RocketMQ源码分析----消息存储
文件目录相关文件commitlog:消息存储的地方,文件夹下有多个文件,每个文件的大小默认为1G消息的组成:字段名(长度)备注TOTALSIZE(4) MAGICCODE(4) BODYCRC(4) QUEUEID(4)原创 2017-03-02 18:36:33 · 1887 阅读 · 0 评论 -
集合源码分析----ArrayList
分析基于JDK1.7ArrayList是基于数组实现的,但是底层涉及了很多细节,先看下ArrayList的主要成员private transient Object[] elementData;//ArrayLis内部存储元素的数组private int size;//数组中包含的元素的大小构造方法: public ArrayList(int initialCapa原创 2016-11-20 13:07:02 · 284 阅读 · 0 评论 -
源码分析----ReentrantLock实现和AbstractQueuedSynchronizer
ReentrantLock有公平锁和非公平锁,默认是非公平锁,而其加锁的解锁的操作其实都是依赖于某个内部对象public class ReentrantLock implements Lock, java.io.Serializable { private final Sync sync; abstract static class Sync extends AbstractQueuedSy...原创 2016-10-23 13:18:04 · 352 阅读 · 0 评论 -
集合源码分析----ConcurrentHashMap
本文基于JDK1.7分析先大概讲下ConcurrentHashMap的原理:1.ConcurrentHashMap内部分成了很多段,每段叫一个Segment,每个Segment里都是一个类似HashMap的结构2.每次写操作都只对其中一个Segment进行加锁操作,所以线程安全且性能高ConcurrentHashMap内部主要结构final Segment[]原创 2016-10-22 16:21:15 · 338 阅读 · 0 评论 -
Dubbo源码分析----网络通信相关
在暴露服务,执行到DubboProtocol的export方法的时候,会调用openServer方法,从这里开始,就是Dubbo开启请求监听的地方 private void openServer(URL url) { // find server. String key = url.getAddress(); //client 也可以暴...原创 2018-02-20 14:27:50 · 552 阅读 · 0 评论