OpenStack Trove组件WSGI和RPC调用流程

本文详细分析了OpenStack Trove组件的WSGI和RPC调用流程,从trove-api服务的WSGI调用过程,包括配置文件、处理请求的类与方法,到trove-taskmanager服务的RPC调用流程,涉及oslo-messaging依赖包、RabbitMQ以及具体的消息处理机制。理解Trove的这些调用流程有助于深入理解OpenStack组件的工作原理。
摘要由CSDN通过智能技术生成

        本文是基于OpenStack Mitaka版本的Trove组件对WSGI和RPC调用流程进行分析。而OpenStack其他组件的处理流程也都大同小异,因此了解了trove的WSGI和RPC调用流程,学习OpenStack其他组件就可以举一反三了。

1. trove-api服务WSGI调用过程分析

1.1 WSGI配置文件各配置项含义

        Trove组件中的wsgi配置文件默认为/etc/trove目录下的api-paste.ini文件,在启动trove-api服务时,将加载该文件进行初始化。在该文件中,主要的配置项如下:

        composite:定义Trove服务的入口,M版本中主要包含获取版本信息服务入口与troveapi v1.0服务入口。use则指定了根据请求路径获取不同版本app的规则。

        filter:定义了Trove API中使用的过滤器。如authorization过滤器主要用来验证tenant_id等。

        app:定义了Trove API应用程序。Trove应用程序主要是versions和troveapp,url为/的请求将映射到该应用程序,而troveapp则会作为管道troveapi的应用程序。

        pipeline:定义了Trove API应用程序管道,M版本主要是troveapi,包含了多个filter和一个app。url为/v1.0的请求将映射到该管道进行处理。

        另外,在OpenStack中有三种wsgi配置方法(config/egg/call),trove-api初始化时加载api-paste.ini文件使用的是config模式,而composite中匹配版本则使用的call模式。

1.2 trove-api中处理WSGI请求的主要类与方法

        在trove-api处理请求的整个流程中,相关的类与方法主要由以下几个:

        1) versioned_urlmap()方法:该方法位于trove/common/wsgi.py中,主要用于将请求的url路径与composite中定义的版本进行匹配,而该方法中则主要返回了用于实现匹配算法的VersionedURLMap类的可调用对象。当trove接收到请求后,会调用该对象的__call__()方法匹配路径从而确定使用哪个app或pipeline。

        2) API类:该类的主要作用是添加URL映射,当接收请求时解析路径,路径匹配成功之后,调用相关方法执行相关操作并响应,API继承了wsgi.py中的Router类。

        3) Router类:初始化成员变量_router,该成员变量是routes.middleware.RoutesMiddleware类的实例化对象。该对象为可调用对象,在接收到请求时,首先通过mapper对象进行解析,然后将解析结果传递给Router中实现的_dispatch()方法对请求进行分发。

        4) Resource类:在API中添加URL映射时,传入的controller参数一般都为Resource类的实例。该类的主要作用主要有两点:首先,实现了对象的序列化与反序列化;然后,在Router对象分发之后,会进一步通过Resource类中的dispatch()方法得到具体的操作方法。

        5) Controller类:在API通过mapper解析到对应路径之后,则会调用具体的Controller对象中具体方法处理请求,并返回响应信息。

        6) Result类:主要封装了对请求的响应结果,包括状态码、状态信息以及响应消息体等。

1.3 trove WSGI具体调用流程

1.3.1 启动trove-api服务

        启动trove-api服务时,会调用trove/cmd/api.py中的main()方法对trove-api服务进行初始化。在该方法中,首先会通过CONF获取WSGI的配置文件,并获取服务限制的线程数。


  
  
  
conf_file = CONF.find_file(CONF.api_paste_config)
workers = CONF.trove_api_workers or processutils.get_worker_count()

        获取到配置文件以后,则会调用wsgi.py中的launch()方法通过配置文件初始化WSGI配置。
launcher = wsgi.launch('trove', CONF.bind_port, conf_file,
                       host=CONF.bind_host,
                       workers=workers)
        launch()方法参数的主要含义如下:app_name为应用程序名称,在读取WSGI配置文件时,首先会找到与该参数对应的composite或app,Trove中为'trove';port为服务的端口号,Trove默认端口号为8779;conf_file为WSGI的配置文件,Trove默认为'api-paste.ini';host为WSGI服务端主机,默认为'0.0.0.0';workers为服务的线程数。
        该方法最终会调用paste插件中的loadapp()方法通过读取配置文件中的配置项初始化trove-api服务。
return deploy.loadapp("config:%s" % paste_config_file, name=app_name)
        在调用loadapp()方法时,paste插件会根据composite->pipeline->app->fileter的顺序调用配置文件中各插件对应的factory()方法。
def app_factory(global_conf, **local_conf):
    return API()
        这些factory()方法则主要是初始化一些可调用对象。如trove-api中的API类的对象。
class API(wsgi.Router):
    """Defines the API routes."""
    def __init__(self):
        mapper = routes
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值