OpenStack-RPC-server的构建(一)

我们主要分析Transport为rabbit方式的RPC-server构建,当我们执行如下命令时:

[root@junmulti-user.target.wants(keystone_admin)]# rabbitmqctl list_consumers

Listingconsumers ...

alarm_notifier  <rabbit@jun.1.594.0>    1      true    0       []

alarm_notifier.jun      <rabbit@jun.1.594.0>    2      true    0       []

alarm_notifier_fanout_bcc5514c42a24c78928bf08dc4bc844e  <rabbit@jun.1.594.0>    3      true    0       []

cert    <rabbit@jun.1.882.0>    1      true    0       []

cert.jun        <rabbit@jun.1.882.0>    2      true    0       []

cert_fanout_8c23d4a227af4488a5ee22249422a5e8    <rabbit@jun.1.882.0>    3      true    0       []

……….

reply_32583cb2867d476db776e2d4d2093606  <rabbit@jun.1.2635.0>   1      true    0       []

reply_9b28643406614d8280db511872854dbb  <rabbit@jun.1.2907.0>   1      true    0       []

reply_eb5af11fd3aa42dda88eea22446d3fc1  <rabbit@jun.1.2769.0>   1       true   0       []

scheduler       <rabbit@jun.1.899.0>    1      true    0       []

scheduler.jun   <rabbit@jun.1.899.0>    2      true    0       []

scheduler_fanout_eb88ae2d696c40538615fb8e7af84f2f       <rabbit@jun.1.899.0>    3      true    0       []

我们可以利用linux的systemd技术,在linux系统启动时,加载OpenStack组件服务,从而形成RPC的consumer。所以我们可以从systemd的相关文件找到OpenStack组件服务的启动入口,在这里我们主要关注OpenStack组件服务中RPC-server的构建过程,且以Nova-scheduler组件为例进行分析。

[root@jun~(keystone_admin)]# cat/etc/systemd/system/multi-user.target.wants/openstack-nova-scheduler.service

[Unit]

Description=OpenStackNova Scheduler Server

After=syslog.targetnetwork.target

 

[Service]

Type=notify

NotifyAccess=all

TimeoutStartSec=0

Restart=always

User=nova

ExecStart=/usr/bin/nova-scheduler

 

[Install]

WantedBy=multi-user.target

Systemd通过执行/usr/bin/nova-scheduler命令来启动Nova-scheduler组件,那么/usr/bin/nova-scheduler做了什么呢?我们继续往下分析。

[root@jun~(keystone_admin)]# cat /usr/bin/nova-scheduler

#!/usr/bin/python

#PBR Generated from u'console_scripts'

 

importsys

fromnova.cmd.scheduler import main

 

if__name__ == "__main__":

    sys.exit(main())

原来这个文件执行/usr/lib/python2.7/site-packages/nova/cmd/scheduler.py中的main函数。如下所示:

[root@jun~(keystone_admin)]# cat /usr/bin/nova-scheduler

#!/usr/bin/python

#PBR Generated from u'console_scripts'

 

importsys

fromnova.cmd.scheduler import main

 

if__name__ == "__main__":

    sys.exit(main())

原来这个文件执行/usr/lib/python2.7/site-packages/nova/cmd/scheduler.py中的main函数。如下所示:

"""Starterscript for Nova Scheduler."""

…….

CONF= cfg.CONF

CONF.import_opt('scheduler_topic','nova.scheduler.rpcapi')

 

defmain():

    config.parse_args(sys.argv)

    logging.setup(CONF, "nova")

    utils.monkey_patch()

    objects.register_all()

 

    gmr.TextGuruMeditation.setup_autorun(version)

 

    server =service.Service.create(binary='nova-scheduler',

                                   topic=CONF.scheduler_topic)

    service.serve(server)

    service.wait()

其中,红色标记中的内容与RPC-server的创建有关,所以我们重点关注红色部分的函数调用内容。

  1. config.parse_args(sys.argv)
defparse_args(argv, default_config_files=None):

   log.set_defaults(_DEFAULT_LOGGING_CONTEXT_FORMAT, _DEFAULT_LOG_LEVELS)

    log.register_options(CONF)

    options.set_defaults(CONF,connection=_DEFAULT_SQL_CONNECTION,

                        sqlite_db='nova.sqlite')

    rpc.set_defaults(control_exchange='nova')

    debugger.register_cli_opts()

    CONF(argv[1:],

         project='nova',

         version=version.version_string(),

         default_config_files=default_config_files)

    rpc.init(CONF)

由于control_exchange的默认值为:’openstack’,所以通过set_defaults函数修改为:’nova’。因此随后的get_transport函数中获得的control_exchange的值为:’nova’。

rpc.init(CONF)代码如下:

definit(conf):

    global TRANSPORT, NOTIFIER

    exmods = get_allowed_exmods()

    TRANSPORT = messaging.get_transport(conf,

                                       allowed_remote_exmods=exmods,

                                       aliases=TRANSPORT_ALIASES)

    serializer =RequestContextSerializer(JsonPayloadSerializer())

    NOTIFIER = messaging.Notifier(TRANSPORT,serializer=serializer)

总结:本篇文章从linux的systemd入手,找到Nova-scheduler的启动流程,然后主要分析/usr/lib/python2.7/site-packages/nova/cmd/scheduler.py中的main函数的config.parse_args(sys.argv)初始化过程。即创建一个Notify对象,该对象通过某种transport(这里是rabbit)发送通知消息。

原文链接:https://blog.csdn.net/gj19890923/article/details/50300125

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值