OpenStack设计与实现5——RESTful API和WSGI

简介:

转https://segmentfault.com/a/1190000004361778

Tips:文章为拜读@xingjiarong 后有感而做的分享,先对作者表示感谢,附原文地址:http://blog.csdn.net/xingjiarong

0. 引言

  • 在上一篇博客中我们提到过,OpenStack每个项目内部的服务进程之间是通过消息总线来通讯的,而在各个项目之间则是通过RESTful API来进行通讯的,在这一篇博客中,我们就来详细的讨论一下OpenStack各个项目之间的通讯。

1. 什么是RESTful

  • RESTful是目前最流行的一种互联网软件架构。REST(Representational State Transfer,表述性状态转移),如果一个架构符合REST原则,就称它为RESTful架构。

  • RESTful架构的核心概念就是“资源”,在RESTful的世界里,网络上的所有东西都是资源,比如一段文本,一张图片都可以看作是资源。每一个资源都对应着一个特定的URI(统一资源定位符)并用它进行标记。

  • 每一个资源都有多种表现形式,我们上网的过程,就是调用资源的URI,获取它不同表现形式的过程。也就是说,服务器保存了资源的各种表现形式,客户端可以使用HTTP的几个基本操作,包括GET、POST、PUT等使服务端上的资源发生“状态转化”,这就是为什么叫做“表述性状态转移”。

  • OpenStack各个项目都提供了RESTful架构的API作为对外提供的接口,也就是说,OpenStack定义了很多的资源,并实现了针对这些资源的各种操作函数。OpenStack的API服务进程接收到客户端的HTTP请求时,一个所谓的”路由“模块就会将请求的URL转化成相应的资源,并路由到合适的操作函数上。

  • 我们以nova list命令为例来看一下具体的流程。

    1. 首先客户端使用http发送请求,说明要调用nova list命令了。

    2. Rails是OpenStack所使用的路由模块,收到HTTP请求后,将这个请求指派到对应的Controller,并且绑定一个action。

    3. 每个Controller都对应了一个RESTful资源,代表了对该资源的操作集合,其中包含了很多Action。因为Rails指定了要执行index的action,所以该Controller就调用index函数。

2. 什么是WSGI

  • RESTful只是设计风格而不是标准,而WSGI(Web Server Gateway Interface,Web 服务器网关接口)则是python语言中所定义的Web服务器和Web应用程序之间或框架之间的通用接口标准。

  • WSGI就是一座桥梁,桥梁的一端称为服务端或网关端,另一端称为应用端或者框架端,WSGI的作用就是在协议之间进行转化。

  • WSGI将Web组件分成了三类:Web 服务器(WSGI Server)、Web中间件(WSGI Middleware)与Web应用程序(WSGI Application)。

  • Web Server接收HTTP请求,封装一系列环境变量,按照WSGI接口标准调用注册的WSGI Application,最后将响应返回给客户端。

  • WSGI Application是一个可被调用的Python对象,它接受两个参数,通常为environ和start_response。比如:

    def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    yield 'Hello World\n'

  • 参数environ指向一个python字典,要求里面至少包含了一些在CGI中定义的环境变量已经WSGI所定义的环境变量,WSGI应用可以从environ中获取相对应的请求及其执行上下文的所有信息。

  • 参数start_response指向一个回调函数,回调函数负责执行客户端的请求并且返回结果。当有请求到来时,WSGI Server会准备好environ和start_response参数,然后调用WSGI Application获得对应请求的响应。

  • WSGI中间件同时实现了服务端和应用端的API,因此可以在两端之间起协调作用。从服务器看起来,中间件就是一个WSGI应用;从应用端看起来,中间件则是一个WSGI服务器。WSGI中间件可以将客户端的HTTP请求路由给不同的应用对象,然后将应用处理后的结果返回给客户端。我们可以将WSGI中间件理解为服务端和应用端交互的一层包装,经过不同中间件的包装,便具有不同的功能。

3. Paste和Webob

  • Paste和Webob是与OpenStack密切相关的两个组件。

3.1 Paste

  • OpenStack使用Paste的Deploy组件来完成WSGI服务器和应用的构建,每个项目源码etc目录下都有一个Paste配置文件,例如nova中的,如下图所示。

  • Paste配置文件分为过个section,每个section以type:name的格式命名,具体的可以参考官网源码。使用Paste Deploy的主要目的就是从配置文件中生成一个WSGI Application,有了配置文件之后,只需要使用下面的调用方式:

    wsgi_app = loadapp('config:/path/to/config.ini')

3.2 Webob

    • Webob通过对WSGI的请求与响应进行封装来简化WSGI应用的编写。Webob中两个最重要的对象,一是webob.Request,对WSGI请求的environ参数进行封装,一是webob.Response,包含了标准WSGI响应的所有要素。来看一个例子:

    • 原始的WSGI格式:
      app_iter = myfunc(environ, start_response)

    • 使用webob封装之后:
      def myfunc(req):
      return webob.Response('hey there')
      resp = myfunc(req)

本文转自茄子_2008博客园博客,原文链接:http://www.cnblogs.com/xd502djj/p/7570786.html,如需转载请自行联系原作者。

目录
相关文章
|
10天前
|
JSON API 数据处理
【Swift开发专栏】Swift中的RESTful API集成实战
【4月更文挑战第30天】本文探讨了在Swift中集成RESTful API的方法,涉及RESTful API的基础概念,如HTTP方法和设计原则,以及Swift的网络请求技术,如`URLSession`、`Alamofire`和`SwiftyJSON`。此外,还强调了数据处理、错误管理和异步操作的重要性。通过合理利用这些工具和策略,开发者能实现高效、稳定的API集成,提升应用性能和用户体验。
|
3天前
|
存储 缓存 JavaScript
深入理解RESTful API设计原则与实践
【5月更文挑战第7天】在现代Web服务开发中,表述性状态传递(REST)是一种广泛采用的架构风格,用于构建可扩展的网络应用程序接口(APIs)。本文将探讨RESTful API的核心设计原则,并通过具体实例展示如何实现一个符合REST约束的后端服务。我们将讨论资源的识别、客户端-服务器通信模式、无状态性、以及统一接口的重要性,并探索如何使用当前的流行技术栈来实现这些概念。
|
10天前
|
缓存 监控 JavaScript
Node.js中构建RESTful API的最佳实践
【4月更文挑战第30天】本文介绍了在Node.js中构建RESTful API的最佳实践:选择合适的框架(如Express、Koa)、设计清晰的API接口(遵循HTTP动词和资源路径)、实现认证授权(JWT、OAuth 2.0)、错误处理、限流缓存、编写文档和测试,以及监控性能优化。这些实践有助于创建健壮、可维护和易用的API。
|
10天前
|
存储 关系型数据库 Go
【Go语言专栏】基于Go语言的RESTful API开发
【4月更文挑战第30天】本文介绍了使用Go语言开发RESTful API的方法,涵盖了路由、请求处理、数据存储和测试关键点。RESTful API基于HTTP协议,无状态且使用标准方法表示操作。在Go中,通过第三方库如`gorilla/mux`进行路由映射,使用`net/http`处理请求,与数据库交互可选ORM库`gorm`,测试则依赖于Go内置的`testing`框架。Go的简洁性和并发性使得它成为构建高效API的理想选择。
|
10天前
|
机器学习/深度学习 算法 安全
深度学习在图像识别中的应用与挑战构建高效可扩展的RESTful API:后端开发的实战指南
【4月更文挑战第30天】 随着计算机视觉技术的飞速发展,深度学习在图像识别领域取得了显著的成果。本文将探讨深度学习技术在图像识别中的应用及其所面临的挑战。首先,我们将介绍深度学习的基本原理和关键技术,然后分析其在图像识别中的优势和应用案例。最后,我们将讨论当前深度学习在图像识别领域所面临的主要挑战和未来的发展趋势。
|
14天前
|
缓存 监控 API
构建高效可扩展的RESTful API:后端开发的实践指南
【4月更文挑战第26天】在现代Web开发中,构建一个高效、可扩展且易于维护的RESTful API是后端工程师必须面对的挑战。本文将深入探讨如何利用最佳实践和流行技术,设计出符合REST架构原则的服务端接口。我们将重点讨论API版本控制、资源路由、数据库优化、缓存策略以及安全性考虑等方面,旨在为开发者提供一套综合性解决方案,帮助其提升API的性能与可靠性。
|
11天前
|
XML JSON API
【PHP开发专栏】PHP RESTful API设计与开发
【4月更文挑战第29天】本文探讨了在Web开发中流行的前后端分离模式,重点介绍了RESTful API的设计与实现。REST是一种基于HTTP协议的架构风格,核心概念包括资源、表述和状态转换。RESTful API设计遵循无状态、统一接口等原则,使用GET、POST、PUT、DELETE等HTTP方法执行操作,并通过状态码和JSON/XML传输数据。在PHP中实现RESTful API,可通过定义路由、创建控制器、处理请求和响应,同时注意安全性措施,如使用HTTPS。文中还提供了一个用户管理API的实战示例,以帮助读者更好地理解和应用RESTful API。
|
11天前
|
缓存 监控 API
|
15天前
|
缓存 安全 API
构建高效可扩展的RESTful API:后端架构的艺术
【4月更文挑战第25天】 在数字化时代的浪潮中,一个稳定、高效且易于扩展的后端系统是企业成功的关键。本文将探讨如何构建一个满足现代业务需求的RESTful API。我们将深入分析关键设计原则,如模块化、服务分层、缓存策略以及数据库优化,并讨论这些原则如何融入实际开发流程中。通过具体案例和最佳实践,我们的目标是为读者提供一套实用的工具和方法,以支持他们自己的后端开发工作。
|
18天前
|
缓存 JSON 负载均衡
构建高效RESTful API的最佳实践
【4月更文挑战第22天】在当今互联网应用的开发中,后端系统的核心通常体现在API的设计和实现上。一个设计良好、性能优异的RESTful API能够极大地提升应用的响应速度及用户体验。本文将探讨在构建高效RESTful API时应当遵循的一系列最佳实践,包括合理的数据结构设计、缓存策略、负载均衡技术以及API版本管理等。通过这些实践,可以确保API服务的高性能与易维护性,并适应不断变化的业务需求。