- 博客(36)
- 资源 (4)
- 收藏
- 关注

原创 RabbitMQ heartbeat原理
RabbitMQ的heartbeat是用于客户端与RabbitMQ之间连接的存活状态检测,类似于tcp keepalives功能。本文将介绍RabbitMQ的heartbeat功能何时被创建以及如何检测连接存活状态。1. RabbitMQ连接建立的协议流程对于本文的研究主要聚焦到connection.tune和connection.tune-ok流程进行说明。2.channel_...
2019-09-15 09:37:02
2372

原创 neutron-server的启动流程(二)
1.2 extension resource#/neutron/api/v2/router.py:APIRouterext_mgr = extensions.PluginAwareExtensionManager.get_instance()ext_mgr.extend_resources("2.0", attributes.RESOURCE_ATTRIBUTE_MAP)1.2.1
2016-05-08 15:00:13
6481

原创 neutron-server的启动流程(一)
neutron-server的启动包括RPC-server的创建,RPC-client的创建,WSGI server的创建,因此neutron-server不单单起到与其他组件中的api的功能。本文将RPC相关创建和WSGI server的创建两方面进行代码流程的分析。查看setup.cfg文件找到neutron-server的代码入口。neutron-server =
2016-05-06 19:23:00
21899
2
原创 KubeAPIServer create resource的Decode流程
kubernetes在create resource时,首先通过kube-apiserver的authenticate和authorization等chain进行过滤,通过所有filter后,再由kube-apiserver dispatch到Handler进行处理。这里我们举例create namespace scoped resource进行分析。1. decoder对象追溯概括来讲,decoder对象时通过handlers.RequestScope.Serializer构造而来,handl
2020-11-04 22:17:52
265
原创 python属性的代理访问
# -*- coding:utf-8 -*-#由于方法二存在弊端,建议使用方法一#方法一class A: def __init__(self): print("A class initialization") def f1(self): print("A class -> f1 function") def f2(sel...
2019-10-20 16:53:46
317
原创 python实例属性管理
在python中,需要对某个实例attribute增加除访问与修改之外的其他处理逻辑,比如类型检查或合法性验证。下面通过两种方法进行实现。(具体参考《python cookbook》)# -*- coding:utf-8 -*-#getter和setter主要用于实例属性的检测#以下是通过类的方式实现的实例属性的检测,#但是如果有很多属性需要检测,则将实现很多冗余的代码。#因此可...
2019-10-20 16:05:50
271
原创 shell处理json字符串
对于shell一般字符串的解析可以使用grep/sed/cut/awk等命令,对于json字符串的解析一般使用jq命令,但是有时需要在shell中构建json字符串,对于这种情况下使用python处理非常方便,下面便在shell中调用python构建json字符串。#!/bin/bashstr='{ "orig": { "a1": "1", "a2": "2", ...
2019-10-16 21:31:24
6290
原创 python装饰器实现周期性函数调用
python的装饰器可用于权限校验,周期性函数调用等功能,下面通过两种方式实现周期性函数的调用。# -*- coding:utf-8 -*-from functools import wrapsimport timeimport datetime_ts = lambda: time.time()# 通过__call__实现装饰器类class PeriodLoopingCall...
2019-10-14 21:36:26
332
原创 迭代器实现的固定数据获取
有时会遇到这种场景,在数据量特别大的情况下,不能一次性将数据读到内存中,此时迭代器便派上用场。即一次性只读有限的数据量,在下一次函数或者对象调用时,在上一次的index下继续读取下一个有限长度的数据,即可以通过python的yield实现。下面通过两种方式进行实现:可迭代对象的方式和生成器函数的方式。#可迭代对象class IterObject: def __init__(self...
2019-10-14 21:01:54
285
原创 基于py-amqp编写生产者和消费者代码
在介绍erlang的dbg调试RabbitMQ源码之前,首先介绍基于py-amqp编写RabbitMQ的生产者和消费者代码,其中py-amqp的安装包可在以下链接下载:https://pypi.org/project/amqp/1 公共模块生产者和消费者一些公共代码编写在utils.py文件中,代码如下:import loggingimport jsonimport oscl...
2019-10-06 22:45:33
830
原创 RabbitMQ exchange route queue原理
根据前一篇文档介绍的《RabbitMQ exchange binding queue原理》后,这篇文章将介绍exchange如何route消息到正确的queue中,其代码流程如下:在RabbitMQ的客户端发送消息时,将指定exchange和routing_key,在exchange收到消息后,将根据routing_key将消息发送到正确的queue中。1 exchange route...
2019-10-06 10:49:46
692
原创 RabbitMQ exchange binding queue原理
RabbitMQ根据exchange的类型规则将消息路由到相应的queue,其中exchange的类型包括direct,topic,fanout以及headers,我们这里主要介绍topic exchange类型的消息路由原理,其他exchange的路由原理相对简单。Topic exchange的示意图如下:*(星号):可以(只能)匹配一个单词。 #(井号):可以匹配多个单词(或者0个)...
2019-10-05 14:31:26
1393
原创 RabbitMQ节点关闭后启动原理
RabbitMQ节点关闭后启动流程图如下:1 mnesia:wait_for_tables解释如果Mnesia推断另一个节点(远程)的拷贝比本地节点的拷贝更新时,初始化时在节点上复制表可能会导致问题,初始化进程无法处理。在这种情况下,对mnesia:wait_for_tables/2的调用将暂停调用进程,直到远程节点从其本地磁盘初始化表后通过网络将表复制到本地节点上。2 rabb...
2019-09-26 21:41:44
631
原创 RabbitMQ源码编译
RabbitMQ支持多种安装方式,如果需要分析和调试RabbitMQ源码,则需要使用RabbitMQ源码编译安装方式。RabbitMQ是基于erlang语言编写的,其源码托管到github上的。Github上的二进制包可以直接用于安装使用,而源码压缩包则需要经过编译才能使用。如3.7.17版本的RabbitMQ安装包链接为:https://github.com/rabbitmq/rabbitm...
2019-09-18 23:13:18
2418
原创 nova boot代码流程分析(五):VM启动从neutron-dhcp-agent获取IP与MAC
1. network和subnet创建代码流程[root@jun ~(keystone_user1)]# neutron net-create demo-net[root@jun ~(keystone_user1)]# neutron subnet-create demo-net 1.1.1.0/24 --name demo-subnet --gateway 1.
2016-06-01 20:16:04
11334
原创 neutron-dhcp-agent服务启动流程
在分析nova boot创建VM的代码流程与neutron-dhcp-agent之前,首先分析neutron-dhcp-agent服务启动流程。与其他服务的启动入口一样。查看setup.cfg文件。[entry_points]console_scripts = neutron-db-manage = neutron.db.migration.cli:main
2016-05-25 20:02:46
19128
原创 处理Windows文件格式为Linux文件格式的方法
本文将介绍处理Windows文件格式为Linux文件格式的3种方法。1 判断Windows文件格式在Linux系统中,当我们执行shell脚本时,有时会出现以下错误:[root@master test]# sh t.sht.sh: line 2: $'\r': command not foundhello world该错误的原因就是脚本文件为Windows文件格式,我们可以通...
2016-05-15 15:49:19
10309
1
原创 nova boot代码流程分析(四):nova与neutron的l2 agent(neutron-linuxbridge-agent)交互
继续《nova boot代码流程分析(三):nova与neutron的交互(1)》的分析。#/nova/virt/libvirt/driver.py:LibvirtDriver # NOTE(ilyaalekseyev): Implementation like in multinics # for xenapi(tr3buchet) def spawn(self, c
2016-05-14 16:08:16
14261
3
原创 nova boot代码流程分析(三):nova与neutron的plugin交互
在执行nova boot命令创建VM时,neutron将会为VM分配MAC和IP,用于创建VM所需的port。网上有些许相关讲述nova与neutron交互的文章,不过都是从架构层面进行分析和讲解,很少涉及到代码层面。本文将从代码层面进行分析nova与neutron的交互。本文主要分析如何从neutron为VM分配MAC和IP,tap设备的创建和相关bridge的创建。注意:这里的分析是基于采用L
2016-04-29 21:23:43
14835
2
原创 OpenStack修改IP/MAC对VM通信影响
本文介绍在OpenStack中修改VM的IP/MAC对VM网络通信的影响。这里主要分析VM与外部网络之间的通信。在VM之间的通信遇到问题时,也可参考本文进行分析和定位。1. 准备阶段1.1 开启OpenStack的网络服务[root@jun2 ~]# systemctl enable neutron-l3-agent[root@jun2 ~]# systemctl
2016-04-22 20:47:13
3550
原创 nova boot代码流程分析(二):nova-scheduler主机选择
本篇文章将分析nova-scheduler服务在创建VM时如何进行主机的选择。完整来说,nova-scheduler主机选择的过程主要分为以下几个阶段:1. nova.scheduler.rpcapi.SchedulerAPI发出RPC请求到nova.scheduler.manager.SchedulerManager。2. 从SchedulerManager到调度器(类Scheduler
2016-04-10 21:35:09
6967
原创 nova boot代码流程分析(一):Claim机制
nova boot创建VM的流程大致为:1. novaclient发送HTTP请求到nova-api(这里内部细节包括keystone对用户的验证及用户从keystone获取token和endpoints等信息,具体参考《keystone WSGI流程》)。2. nova-api通过rpc调用到nova-conductor。3. nova-conductor调用rpc进入nova-sc
2016-04-09 20:07:03
11192
原创 shell进行子网掩码(mask)和子网前缀(prefix)之间的转换
由于最近在利用shell编写一套自动化安装OpenStack的脚本,需要进行利用网络前缀计算子网掩码,因此在此记录一下它们之间的转换代码。1. prefix---->maskprefix_to_mask() { rpm -q --whatprovides bc >/dev/null 2>&1 [ $? -ne 0 ] && yum install bc -y >/dev/n
2016-04-03 11:03:02
9839
原创 keystone WSGI流程
作为OpenStack两种主要的通信方式(RESTful API与消息总线)之一,理解RESTful API的设计思路和执行过程,有助于我们对OpenStack有更好的理解。RESTful只是设计风格而不是标准,Web服务中通常使用基于HTTP的符合RESTful风格的API。而WSGI(Web ServerGateway Interface)则是python语言中所定义的Web服务器和Web应用
2016-03-26 11:15:40
8765
原创 nova list命令的代码流程分析
1. 概要这篇文章我们主要分析novalist命令的代码流程,其代码流程大致为:1.从keystone获得token。2. 根据获得的token去调用nova-api接口查询VM的列表。其中获得token之前需要查询keystone的版本信息,且所有的这些查询操作都是通过WSGI通信方式进行处理的。2. 公共代码流程nova命令的代码入口如下,[root@jun ~]# c
2016-03-20 14:25:29
12169
原创 nova-compute Periodic tasks 机制
我们本文将讲述nova-compute组件的resource tracker和report state的periodic task机制的代码流程。 在前面关于nova-scheduler组件的启动主要分析了关于RPC-server的创建流程,同样地,nova-compute组件的resource tracker和report state的periodic task也是在其服务启动
2016-01-25 22:25:37
5440
原创 OpenStack-RPC-client的构建
本文截取创建VM中的select_destinations的RPC call的代码流程讲述OpenStack-RPC-client的构建。下面是VM的创建过程。 我们这里主要分析红圈中的select_destinations的RPC call的代码流程。这里我们也简要描述一下VM创建的代码流程。#/nova/compute/api.py @hooks.ad
2016-01-07 21:00:02
2755
原创 OpenStack-RPC-server的构建(五)
本篇文章将分析start方法中还剩下的两条语句的代码流程,代码如下:# usr/lib/python2.7/site-packages/oslo_messaging/server.pydef start(self): """Start handling incoming messages. This method causes the server to b
2016-01-03 10:49:44
2580
原创 OpenStack-RPC-server的构建(四)
本章我们分析通过oslo_messaging层向下创建consumer的代码流程,在创建consumer之前,首先利用上篇文章所说的创建的connection作为参数创建一个AMQPListener对象,将该对象赋给创建consumer的callback参数,所以当有消息到达时,调用AMQPListener类的__call__方法。这里需要注意的是conn =self._get_connectio
2015-12-27 19:48:16
1605
原创 OpenStack-RPC-server的构建(三)
继续上篇文章的分析,我们知道self.rpcserver是一个MessageHandlingServer对象。然后我们将重点分析/usr/lib/python2.7/site-packages/nova/service.py的start方法中的self.rpcserver.start()这条语句。# usr/lib/python2.7/site-packages/oslo_messaging/
2015-12-26 17:27:26
3821
原创 OpenStack-RPC-server的构建(二)
2.1 server = service.Service.create(…)中的create方法是/usr/lib/python2.7/site-packages/nova/service.py文件中Service类的类方法,用于创建且返回一个Service对象。 #/usr/lib/python2.7/site-packages/nova/service.py@classmeth
2015-12-26 11:09:01
2859
原创 OpenStack-RPC-server的构建(一)
我们主要分析Transport为rabbit方式的RPC-server构建,当我们执行如下命令时:[root@junmulti-user.target.wants(keystone_admin)]# rabbitmqctl list_consumersListingconsumers ...alarm_notifier 1 true 0 []
2015-12-14 20:33:31
3186
原创 OpenStack的oslo_messaging组件使用
首先给出OpenStack的RPC通信的代码调用架构。OpenStack消息通信架构图 OpenStack层封装call和cast接口用于远程调用RPC的server上的方法,这些方法都是构造RPC的server的endpoints内的方法。远程调用时,需要提供一个字典对象来指明调用的上下文,调用方法的名字和传递给调用方法的参数(用字典表示)。如:cctxt
2015-12-12 22:29:18
6876
10
转载 函数重入问题
主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意
2013-06-03 22:30:53
3169
转载 关于static和可重入函数
1、概述 static 声明的变量在C语言中有两方面的特征: 1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 2、问题:Static的理解 关于st
2013-06-03 21:59:53
7305
转载 C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别
1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。从作用域看:1>全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。2>静态局部变量具有局部作用域,它只被初始化一
2013-06-03 21:57:51
982
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人