Zato:基于Python的ESB和后端应用服务器

概述

Zato是一个用Python编写的开源ESB和应用服务器。按照设计,它用于构建后端应用程序(即仅是API)和在SOA中整合系统。

查看Zato的项目文档点击这里,查看其GitHub页点击这里。

Zato的目标用户是使用Python或者Ruby和PHP等其它动态语言的开发人员,或者是那些考虑在工作中尝试动态语言的技术团队,后者或是因为看到动态语言在其它地方使用,或是因为愿意尝试用其中一种动态语言编写的非前端系统。

该平台是轻量级但完整的,它涵盖了架构师、程序员或者系统管理员的所有视角,对许多特性提供开箱即用的支持,包括HTTP、SON、SOAP、SQL、AMQP、JMS WebSphere MQ、ZeroMQ、Redis NoSQL、FTP、基于浏览器的GUI、CLI、API、安全、统计、作业调度、负载均衡和热部署。另外,它还提供了大量指南和参考样式方面的文档。

它的最初版本于2013年5月18日发布,最新的1.1版在6月初发布。

体系结构

Zato环境是一个或者多个集群的集合。每个集群由多个共享同一个SQL和Redis数据库的服务器构成。这些服务器的前端是集群专属的HA HTTP负载均衡器。

所有的服务器始终处于活动状态,并且总是运行同一组服务。为了实现active-standby设定,负载均衡器可以根据需要把任意服务器离线。

负载均衡器是一个嵌入式的HAProxy实例,管理员通过命令行或者通过GUI调用SSL XML-RPC对其进行远程控制,该过程可以用也可以不用客户端证书。用户可以给服务器赋予权重,以及使用HAProxy自身提供的其它功能,如连接ACL或速率限制。

服务器基于gunicorn/gevent项目构建。该项目是一个联合体,它使用libevent来选择每个平台支持的最佳异步事件通知库,如Linux平台上的epoll。

为了充分利用单台计算机能够提供的所有CPU,Zato按照设定好的数值预先生成一定数量的工作进程,每个进程使用选定的异步网络连接库来处理连接,所有进程监听相同的套接字。负载均衡器用于在不同的计算机之间分配负载及提供HA。

集群中的一台服务器担当启动AMQP/JMS WebSphere MQ/ZeroMQ资源调度器和连接器的角色。如果这台服务器意外宕机,那么始终处于活动状态的ping机制可以保证另外一台服务器接管这个角色。

应用程序可以使用多种协议进行集成,包括HTTP(对JSON/SOAP和纯XML有特殊支持)、FTP、AMQP、JMS WebSphere MQ(用于实现与现有的MQ Java应用程序之间的无缝互通性)、Redis和SQL。其中,HTTP协议是同步调用Zato服务的唯一方式。这种情况下,请求应用程序会进入阻塞状态等待响应。

程序员可以使用任何Python库。如果Zato自身尚未提供某个功能,也可以使用其它技术实现,如XML-RPC或者SMTP,该过程仅是一个导入Python内置包的问题而已。

集群管理使用基于浏览器的GUI和CLI。前者主要用于管理处于运行状态的集群,后者则用于在操作系统中安装Zato组件,如服务器。

集群配置信息存储在Redis和SQL操作型数据库中。Redis存储快速变化和频繁更新的数据,如统计信息或用户的运行时信息,而SQL ODB存储可以简单地映射成关系结构的数据。

虽然主要使用GUI进行环境配置,但也可以将集群的配置信息以JSON格式导出/导入,而且导出结果可以存储到一个外部的配置版本库,从而可以对其进行版本管理、标记或者版本间差异比较。

带有GUI的内置调度器可以用于一次性作业或者循环作业(也可以用Cron语法)。

服务器和服务只通过Redis和SQL ODB进行状态共享。没有自定义的协议或者数据格式用于保持服务器状态的一致性。

Zato使用超过160个自带的管理服务来进行自我管理,其中每一项都可以通过命令行或者在HTTP上以JSON/SOAP方式调用公共API获得。GUI和CLI工具本身都是这些服务的客户端。

Zato已经为Python应用程序创建了方便的客户端,所以用Python编写的应用程序在与Zato暴露的服务进行通信时还是只能使用Python对象。

服务

Zato服务是实现了单个特定方法的Python类。它可以接收输入和产生输出,也可以只接收输入或者只产生输出。

服务可以从GUI或者命令行以静态的或者热部署的方式安装。安装过程会自动将服务编译成字节码。

服务可以使用任何数据格式,但是Zato对JSON、SOAP和普通XML提供更多支持。如果使用了其中任何一种,序列化和反序列化都会在后台完成,开发人员只需通过点号就可以使用纯Python对象,而不必基于诸如XSD那样的模式创建Bean/模型/存根/类——尽管这意味着将没有代码完成。

同一服务可以在HTTP、AMQP、JMS WebSphere MQ、ZeroMQ和调度器上暴露,而不需要修改任何代码,也不需要重启服务器。特别地,只有在HTTP上暴露的服务可以进行同步调用。

SimpleIO(SIO)是一种声明式语法,用于表示简单的请求和响应。选用该语法,服务可以在不修改代码的情况下通过JSON或者XML/SOAP暴露。SIO不能处理复杂文档,它不接受任意嵌套的结构。任何结构的任何文档都可以用于Zato,只是有时不能用于SIO。

下面是一个基础服务的示例,该服务使用Yahoo YQL/JSON和Google’s XML API获取一家公司的市场资本总额。

该服务接收一个股票代码(例如GOOG或RHT),发出两个HTTP请求,然后清理响应并把它们组合成一个通用格式。根据请求格式的不同,组合结果以JSON或XML格式返回。

# anyjson
from anyjson import loads 

# bunch
from bunch import bunchify 

# decimal
from decimal import Decimal 

# lxml
from lxml.objectify import fromstring 

# Zato
from zato.server.service import Service 

class GetMarketCap(Service):
""" 根据公司股票代码返回其市场资本总额,单位是10亿USD。 

"""
class SimpleIO:
response_elem = 'market_cap'
input_required = ('symbol',)
output_required = ('provider', 'value') 

def handle(self): 

# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 

# Yahoo
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 

# 通过名称获取到Y!的连接
yahoo = self.outgoing.plain_http.get('Yahoo! YQL') 

# 创建用于YQL查询的URL参数。
q = 'select * from yahoo.finance.quotes where symbol="{}"'.format(
self.request.input.symbol)
url_params = {'q':q, 'format':'json', 

'env':'http://datatables.org/alltables.env'} 

# 调用 Y!,并从JSON响应创建一个bunch实例,这样就可以用点号
# 引用这些元素。
yahoo_response = bunchify(loads(yahoo.conn.get(self.cid, url_params).text)) 

# 清理Y!的响应——如果有业务响应,就去掉最后一个字符。
# 假设响应总是以10亿为单位。
if yahoo_response.query.results.quote:
value1 = yahoo_response.query.results.quote.MarketCapitalization
value1 = Decimal(value1[:-1]) if value1 else 'n/a'
else:
value1 = 'n/a' 

# 一个新的响应条目会附加到条目列表,根据服务调用方式的不同,
#Zato会把它序列化为JSON或者XML。 

item1 = {'provider':'Yahoo!', 'value': str(value1)}
self.response.payload.append(item1) 

# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 

# Google
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 

# 通过名称获取到Google的连接
google = self.outgoing.plain_http.get('Google Finance') 

# 创建用于调用Google的URL参数
url_params = {'stock':self.request.input.symbol} 

# 调用 Google并从XML响应创建一个Objectify实例,这样就可以
# 用点号引用这些元素。
google_response = fromstring(google.conn.get(self.cid, 

url_params).text) 

# 清理Google的响应——如果有业务响应,就将百万转换成十亿。
if hasattr(google_response.finance, 'market_cap'):
value2 = Decimal(google_response.finance.market_cap.get('data')) / 1000
else:
value2 = 'n/a' 

# 此外,将一个纯Python字典(hashmap)附加到响应对象,并由Zato
# 完成序列化
item2 = {'provider':'Google', 'value': str(value2)}
self.response.payload.append(item2)

这是一个非常简单的集成示例,而并不是所有的场景都允许使用SIO,但是不管服务多复杂,有一点需要强调,就是不应该回避使用Python进行编码。除了可执行外,从许多方面看来,它都非常像伪代码——这里有更多的使用示例可以说明这一点。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索python
, zeromq
, 服务器
, zeromq丢消息
, redis 3.0集群
, 集群
, lxml
, 服务
, python 服务端
, amqp
, gunicorn
, 一个
, python安装requests库
或者
,以便于您获取更多的相关知识。

时间: 2024-09-19 08:58:33

Zato:基于Python的ESB和后端应用服务器的相关文章

基于Python+Django的Kubernetes集群管理平台

原文出自[听云技术博客]:http://blog.tingyun.com/web/article/detail/1345 时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也已经稳定地运行在不同规模的kubernetes集群上,不得不说,无论是从应用部署.迭代,还是从资源调度管理等方面都有其难以言喻的优势,但是随着业务的不断增长,以及服务的多元化,容器的体量与管理的难度也随之增长. 浅述Kubernetes集群日常管理维护中的一些痛点: 1.较为庞大的集群规模及容器数量维护管理

基于Python的阿里云API签名算法及邮件推送服务

基于Python的阿里云API签名算法及邮件推送服务

ShutIt:一个基于Python的shell自动化框架

译者注:本文通过实例简单介绍了ShutIt这个基于Python的自动化框架的使用方法.除了pexpect,我们又多了这个选择.以下是译文. ShutIt是一个易于使用的基于shell的自动化框架.它对基于python的expect库(pexpect)进行了包装.你可以把它看作是"没有痛点的expect".它可以通过pip进行安装. Hello World 让我们从最简单的例子开始吧.创建一个名为example.py的文件: import shutit      session = sh

基于Python的构建工具 Buildout

问题描述 Buildout是一个基于Python的构建工具, 通过一个配置文件,可以从多个部分创建.组装并部署你的应用,即使应用包含了非Python的组件,Buildout也能够胜任. Buildout不但能够像setuptools一样自动更新或下载安装依赖包,而且还能够像virtualenv一样,构建一个封闭隔离的开发环境.

基于Python实现的百度贴吧网络爬虫实例_python

本文实例讲述了基于Python实现的百度贴吧网络爬虫.分享给大家供大家参考.具体如下: 完整实例代码点击此处本站下载. 项目内容: 用Python写的百度贴吧的网络爬虫. 使用方法: 新建一个BugBaidu.py文件,然后将代码复制到里面后,双击运行. 程序功能: 将贴吧中楼主发布的内容打包txt存储到本地. 原理解释: 首先,先浏览一下某一条贴吧,点击只看楼主并点击第二页之后url发生了一点变化,变成了: http://tieba.baidu.com/p/2296712428?see_lz=

基于python脚本实现软件的注册功能(机器码+注册码机制)_python

一.前言: 目的:完成已有python图像处理工具的注册功能 功能:用户运行程序后,通过文件自动检测认证状态,如果未经认证,就需要注册.注册过程是用户将程序运行后显示的机器码(C盘的卷序号)发回给管理员,管理员对机器码加密后生成加密文件或字符串返回给用户.每次启动程序,在有注册文件的情况下,程序就会通过DES和base64解码,并与此刻获取到的C盘卷序列号比对,如果一致则运行主程序.如果注册文件解码后与卷序号不一致,就要提醒用户输入注册码,如果对新输入的解码后和重新获取的机器码一致,则通过认证,

基于Mule的ESB技术讨论

问题描述 本人一直在研究基于Mule的ESB技术,刚刚换到一家新公司,想继续深入的学习这部分技术,可是发现新公司做这部分的人太少了,技术交流上比较少,想在论坛上认识研究这部分技术的大牛,咱们一起讨论,一起进步,本人QQ(496896408).上一家公司我在医疗行业做得是ESB,现在的新公司是做银行业务的,有做这部分的同行的话,我们可以一起学习,一起进步,我做这部分两年时间,自认为还是菜鸟,还得继续努力!ESB的发展前景不知道怎么样?好多大公司都在使用,今后我想去二线城市(比如:西安)发展,过几年

基于Python 的进程管理工具supervisor使用指南_python

Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上.Supervisor 官方版目前只能运行在 Python 2.4 以上版本,但是还无法运行在 Python 3 上,不过已经有一个 Python 3 的移植版 supervisor-py3k. 什么情况下我们需要进程管理呢?就是执行一些需要以守护进程方式执行的程序,比如一个后台任务,我最常用的是用来启动和管理基于 Tornado 写的 Web 程序. 除此之

基于python编写的微博应用_python

本文实例讲述了基于python编写的微博应用,分享给大家供大家参考.具体如下: 在编写自己的微博应用之前,先要到weibo开放平台申请应用的公钥和私钥. 下载python版的SDK,打开example目录,仿照oauthSetTokenUpdate.py进行编码, 复制代码 代码如下: # -*- coding: utf-8 -*- from weibopy.auth import OAuthHandler from weibopy.api import API consumer_key= '应