RabbitMQ客户端源码分析(一)之Connection与ConnectionFactory

文章目录版本声明Connection连接过程分析连接过程抓包分析源码分析ConnectionFactoryAMQConnection分析AutorecoveringConnection 分析版本声明com.rabbitmq:amqp-client:4.3.0RabbitMQ版本声明: 3.6.15Connection这里的连接其实就表示的是TCP/IP socket连接,一个Co...
摘要由CSDN通过智能技术生成

版本声明

  1. com.rabbitmq:amqp-client:4.3.0
  2. RabbitMQ版本声明: 3.6.15

Connection

  1. 这里的连接其实就表示的是TCP/IP socket连接,一个Connection有多个Channel,意味Connection会被设计为长连接,并且每个Channel一定有一个唯一标识,客户端请求和服务端响应都会携带这个标识,以区分是哪个通道。

连接过程分析

  1. client打开与服务器的TCP/IP连接并发送一个协议头(protocol header).这只是client发送的数据,而不是作为方法格式的数据.
  2. server使用其协议版本和其它属性,包括它支持安全机制列表(Start方法)进行响应.
  3. client选择一种安全机制(Start-Ok).
  4. server开始认证过程, 它使用SASL的质询-响应模型(challenge-response model). 它向客户端发送一个质询(Secure).
  5. client向server发送一个认证响应(Secure-Ok). 例如,对于使用"plain"机制,响应会包含登录用户名和密码.
    server 重复质询(Secure) 或转到协商,发送一系列参数,如最大帧大小(Tune).
  6. client接受或降低这些参数(Tune-Ok).
  7. client 正式打开连接并选择一个虚拟主机(Open).
  8. 服务器确认虚拟主机是一个有效的选择 (Open-Ok).
  9. 客户端现在使用希望的连接.
  10. 一个节点(client 或 server) 结束连接(Close).
  11. 另一个节点对连接结束握手(Close-Ok).
  12. server 和 client关闭它们的套接字连接.
  13. 连接流转图

连接过程抓包分析

  1. 整个连接过程,我们从抓包结果来分析,只关注AMQP协议即可

  2. 第一步客户端发送Protocol-Hearder

  3. 服务端响应Connection.start

  4. 客户端发送Connection.Start-Ok

  5. 服务端发送Connection.Tune

  6. 客户端发送Connection.Tune-Ok

  7. 客户端发送Connection.Open

  8. 服务端发送Connection.Open-Ok

源码分析

  1. uml图
  2. 创建连接时序图

ConnectionFactory

  1. 创建连接的工厂ConnectionFactory,包含创建连接的一些必备参数。

  2. 核心方法newConnection()

    
        public Connection newConnection(ExecutorService executor, AddressResolver addressResolver, String clientProvidedName)
                throws IOException, TimeoutException {
         
                if(this.metricsCollector == null) {
         
                    //这是一个空的收集,没有任何操作
                    this.metricsCollector = new NoOpMetricsCollector();
                }
                // make sure we respect the provided thread factory
                //根据参数创建FrameHandlerFactory,BIO和NIO
                FrameHandlerFactory fhFactory = createFrameHandlerFactory();
                //此executor是用于消费者消费使用的(consumerWorkServiceExecutor)
                ConnectionParams params = params(executor);
                // set client-provided via a client property
                if (clientProvidedName != null) {
         
                    Map<String, Object> properties = new HashMap<String, Object>(params.getClientProperties());
                    properties.put("connection_name", clientProvidedName);
                    params.setClientProperties(properties);
                }
                //默认自动恢复连接
                if (isAutomaticRecoveryEnabled()) {
         
                    // see com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory#newConnection
                    AutorecoveringConnection conn = new AutorecoveringConnection(params, fhFactory, addressResolver, metricsCollector);
        
                    conn.init();
                    return conn;
                } else {
         
                    List<Address> addrs = addressResolver.getAddresses();
                    Exception lastException = null;
                    for (Address addr : addrs) {
         
                        try {
         
                            FrameHandler handler = fhFactory.create(addr);
                            AMQConnection conn = createConnection(param
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值