专栏汇总:Tomcat 源码分析 2020-10-19 十、Tomcat8源码分析系列-关于tomcat热加载的一些思考 2020-10-18 九、Tomcat源码分析-类加载器 2020-10-17 八、Tomcat源码分析-Session源码解析 2020-10-16 七、Tomcat源码分析-spring boot集成tomcat 2020-10-15 五、Tomcat源码分析-启动分析(三) Catalina启动 2020-10-14 五、Tomcat源码分析-启动分析(三) Catalina启动 2020-10-13 四、Tomcat源码分析-启动分析(二) Catalina初始化 2020-10-12 三、Tomcat源码分析-启动分析(一) Lifecycle 2020-10-11 二、Tomcat源码分析-tomcat框架设计 2020-10-10 一、Tomcat源码分析-环境搭建
Tomcat8源码分析系列-环境搭建前言 为什么要学习tomcat源码? tomcat是目前非常流行的web容器,其性能和稳定性也是非常出色的,学习其框架设计和底层的实现,不管是使用、性能调优,还是应用框架设计方面,肯定会有很大的帮助 tomcat版本 该系列博客的tomcat版本是8.5.24 下载源码从apache官网下载tomcat源码包,本人以8.5.24版本为例,http://tomcat.apache.org/download-80.cgi maven本人习惯使用maven,因此将源码转成maven工程。新建pom.xml,加入相关依赖,如附录所示 导入开发工具导入maven项目,因为有些测试类依赖了examples目录的类,因此把apache-tomcat-8.5.24-src\webapps\examples\WEB-INF\classes目录在开发工具上面设置为java源文件,编译的class输出目录设为classes,如下图所示 上传源码在看源码过程中经常需要对源码进行注释,建议大家把源码上传至自己的git,方便后续查漏补缺。tips:在.gitignore ...
在[八]RabbitMQ-客户端源码之ChannelN中讲述basicConsume的方法时设计到Consumer这个回调函数,Consumer其实是一个接口,真正实现它的是QueueingConsumer和DefaultConsumer,且DefaultConsumer是QueueingConsumer的父类,里面都是空方法。在用户使用时可以简单的采用QueueingConsumer或者采用DefaultConsumer来重写某些方法。 这里先来看下消费者客户端的关键代码: 12345678910 QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicQos(32);channel.basicConsume(QUEUE_NAME, false, "consumer_zzh",consumer) while (true) { QueueingConsumer.Delivery delivery = consumer.ne ...
ChannelN是整个RabbitMQ客户端最核心的一个类了,其包含的功能点甚多,这里需要分类阐述。首先来看看ChannelN的成员变量: 1234567891011121314private final Map<String, Consumer> _consumers = Collections.synchronizedMap(new HashMap<String, Consumer>());private volatile Consumer defaultConsumer = null;private final ConsumerDispatcher dispatcher;private final Collection<ReturnListener> returnListeners = new CopyOnWriteArrayList<ReturnListener>();private final Collection<FlowListener> flowListeners = new CopyOnWriteArrayL ...
[七]RabbitMQ-客户端源码之AMQPImpl+MethodAMQPImpl类包括AMQP接口(public class AMQImpl implements AMQP)主要囊括了AMQP协议中的通信帧的类别。 这里以Connection.Start帧做一个例子。 123456789101112131415public static class Connection { public static final int INDEX = 10; public static class Start extends Method implements com.rabbitmq.client.AMQP.Connection.Start { public static final int INDEX = 10; private final int versionMajor; private final int versionMinor; private final Map ...
AMQCommand是用来处理AMQ命令的,其包含了Method, Content Heaeder和Content Body.下面是通过wireshark抓包的AMQP协议 上图中的Basic.Publish命令就包含Method, Content header以及Content body。 AMQCommand不是直接包含Method等成员变量的,而是通过CommandAssembler又做了一次封装。接下来先看下CommandAssembler类。此类中有这些成员变量: 12345678910111213141516171819/** Current state, used to decide how to handle each incoming frame. */private enum CAState { EXPECTING_METHOD, EXPECTING_CONTENT_HEADER, EXPECTING_CONTENT_BODY, COMPLETE}private CAState state;/** The method for this ...
AMQChannel是一个抽象类,是ChannelN的父类。其中包含唯一的抽象方法: 12345678/** * Protected API - called by nextCommand to check possibly handle an incoming Command before it is returned to the caller of nextCommand. If this method * returns true, the command is considered handled and is not passed back to nextCommand's caller; if it returns false, nextCommand returns the command as * usual. This is used in subclasses to implement handling of Basic.Return and Basic.Deliver messages, as well as Channel.Close and Con ...
关于ChannelManager,官方注解:Manages a set of channels, indexed by channel number (1… _channelMax)。 ChannelManager类的代码量不是很多,主要用来管理Channel的,channelNumber=0的除外,应为channelNumber=0是留给Connection的特殊的channelNumber。 下面是ChannelManager的成员变量: 12345678910111213/** Monitor for <code>_channelMap</code> and <code>channelNumberAllocator</code> */private final Object monitor = new Object(); /** Mapping from <code><b>1.._channelMax</b></code> to {@link Cha ...
[四]RabbitMQ-客户端源码之FrameFrame是指AMQP协议层面的通信帧(一个正式定义的连接数据包)。我们来看下Frame类中的成员变量有哪些: 1234567891011/** Frame type code */public final int type;/** Frame channel number, 0-65535 */public final int channel;/** Frame payload bytes (for inbound frames) */private final byte[] payload;/** Frame payload (for outbound frames) */private final ByteArrayOutputStream accumulator; Frame里的三个成员变量:type, channel, payload是真正和报文有关的。accumulator是为了方便内部编程的一个变量。Frame类就是对这个玩意儿捯饬捯饬,没有什么难度,好奇的同学可以自己翻看下,本文主要来阐述下AMQP中的Frame的一些信息 ...
上一篇文章([一]RabbitMQ-客户端源码之ConnectionFactory)中阐述了conn.start()方法完成之后客户端就已经和broker建立了正常的连接,而这个Connection的关键就在于这个start()方法之内,下面我们来慢慢分析。 首先来看看start()方法的源码,这个方法有点长,这里拆开来一一分析,首先是注释: 12345678910111213141516/** * Start up the connection, including the MainLoop thread. * Sends the protocol * version negotiation header, and runs through * Connection.Start/.StartOk, Connection.Tune/.TuneOk, and then * calls Connection.Open and waits for the OpenOk. Sets heart-beat * and frame max values after tuning has taken ...
专栏汇总:RabbitMQ 源码解析此系列文章主要是来阐述客户端与broker交互需要经历那些具体步骤,需要涉及那些重要的类以及方法,整体的轮廓又是如何。 注:如无特殊说明,本系列的文章采用的amqp-client版本均为3.5.3 2020-10-09 九、RabbitMQ-客户端源码之Consumer 2020-10-08 八、RabbitMQ-客户端源码之ChannelN 2020-10-07 五、RabbitMQ-客户端源码之AMQChannel 2020-10-06 五、RabbitMQ-客户端源码之AMQChannel 2020-10-05 五、RabbitMQ-客户端源码之AMQChannel 2020-10-02 二、RabbitMQ-客户端源码之AMQConnection 2020-10-02 三、RabbitMQ-客户端源码之ChannelManager 2020-10-02 三、RabbitMQ-客户端源码之ChannelManager 2020-10-01 一、RabbitMQ-客户端源码之ConnectionFactory
一、RabbitMQ-客户端源码之ConnectionFactory 首先看一段amqp-client发送端的示例代码(展示出主要部分): 1234567891011ConnectionFactory factory = new ConnectionFactory();factory.setHost(ip);factory.setPort(5672);factory.setUsername("root");factory.setPassword("root");Connection connection = factory.newConnection();Channel channel = connection.createChannel();String message = "RabbitMQ Demo Test:" + System.currentTimeMillis();channel.basicPublish(EXCHANGE_NAME, routingKey, MessageProperties.PERSISTENT ...
九、Dubbo 源码分析 – 服务调用过程1. 简介在前面的文章中,我们分析了 Dubbo SPI、服务导出与引入、以及集群容错方面的代码。经过前文的铺垫,本篇文章我们终于可以分析服务调用过程了。Dubbo 服务调用过程比较复杂,包含众多步骤。比如发送请求、编解码、服务降级、过滤器链处理、序列化、线程派发以及响应请求等步骤。限于篇幅原因,本篇文章无法对所有的步骤一一进行分析。本篇文章将会重点分析请求的发送与接收、编解码、线程派发以及响应的发送与接收等过程,至于服务降级、过滤器链和序列化大家自行进行分析,也可以将其当成一个黑盒,暂时忽略也没关系。介绍完本篇文章要分析的内容,接下来我们进入正题吧。 2. 源码分析在进行源码分析之前,我们先来了解 Dubbo 服务调用过程。 首先服务消费者通过代理对象 Proxy 发起远程调用,接着通过网络客户端 Client 将编码后的请求发送给服务提供方的网络层上,也就是 Server。Server 在收到请求后,首先要做的事情是对数据包进行解码。然后将解码后的请求发送至分发器 Dispatcher,再由分发器将请求派发到指定的线程池上,最后由线程池调用 ...
八、Dubbo 源码分析 – 集群容错之 LoadBalance1.简介LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载。在为高负载的服务器分流的同时,还可以避免资源浪费,一举两得。负载均衡可分为软件负载均衡和硬件负载均衡。在我们日常开发中,一般很难接触到硬件负载均衡。但软件负载均衡还是能够接触到一些的,比如 Nginx。在 Dubbo 中,也有负载均衡的概念和相应的实现。Dubbo 需要对服务消费者的调用请求进行分配,避免少数服务提供者负载过大。服务提供者负载过大,会导致部分服务调用超时。因此将负载均衡到每个服务提供者上,是非常必要的。Dubbo 提供了4种负载均衡实现,分别是基于权重随机算法的 RandomLoadBalance、基于最少活跃调用数算法的 LeastActiveLoadBalance、基于 hash 一致性的 ConsistentHashLoadBalance,以及基于加权轮询算法的 Rou ...