zato oracle_Zato-基于Python的ESB和后端应用服务器

Zato是一个基于Python的开源ESB和应用服务器,用于系统集成和构建API。它支持HTTP、JSON、SOAP、SQL等多种协议,并提供了GUI、CLI和API。Zato具有负载均衡、热部署、服务自动管理等功能,适用于动态语言环境。1.1版本增加了更多特性,如服务用Python编写,可同时通过多个通道公开,并支持异步调用。
摘要由CSDN通过智能技术生成

zato oracle

总览

Zato是用Python编写的开源ESB和应用程序服务器。 它旨在将系统集成到SOA中并构建后端应用程序(即,仅API)。

你可以找到该项目的文件在这里和GitHub的页面在这里

Zato旨在供已经在其工具集中使用Python或其他动态语言(例如Ruby或PHP)的任何人,或技术团队考虑在他们的工作中尝试使用动态语言,因为他们已经看到它们在其他地方使用过,或者愿意希望尝试使用其中一种编写的非前端系统。

该平台是轻量级的,但是很完整。 开箱即用的支持包括HTTP,JSON,SOAP,SQL,AMQP,JMS WebSphere MQ,ZeroMQ,Redis NoSQL,FTP,基于浏览器的GUI,CLI,API,安全性,统计信息,作业计划,负载平衡,热部署以及大量的文档,包括指南和参考样式,从架构师,程序员或系统管理员的角度涵盖了所有内容。

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

建筑

Zato环境是一组一个或多个集群。 每个群集由共享一个SQL和Redis数据库的服务器组成。 特定于群集的HA HTTP负载均衡器位于服务器的前面。

所有服务器始终处于活动状态,并且始终运行同一组服务。 为了实现主动-备用设置,如有必要,可以使用负载均衡器使任何服务器脱机。

负载平衡器是嵌入式HAProxy实例,由管理员从命令行或使用GUI下方使用SSL XML-RPC通过GUI远程控制(带有或不带有客户端证书)。 可以为服务器分配权重并使用HAProxy本身提供的任何其他功能,例如连接ACL或速率限制。

服务器建立在gunicorn / gevent项目的顶部, 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的内置 程序包的问题

基于浏览器的GUICLI用于群集管理。 尽管前者主要与已经运行的集群的管理有关,但是CLI用于在操作系统中安装Zato组件(例如服务器)。

Redis和一个SQL操作数据库用于存储集群的配置。 Redis用于快速更改和频繁更新的数据(例如统计信息或用户的运行时信息),而SQL ODB存储易于映射到关系结构的数据。

尽管主要用于配置GUI,但也可以将集群的配置导出到JSON /从JSON 导入/导入集群,并将其存储在外部配置存储库中,在该存储库中可以对其进行版本控制,标记或区分。

带有GUI的内置调度程序可以用于一次性或重复作业(也可以使用Cron语法)。

服务器和服务永远不会共享任何状态,除非通过Redis或SQL ODB。 没有自定义协议或数据格式可以使服务器保持一致状态。

Zato使用160多种自己的管理服务进行自我管理,并且每个服务均可通过带有JSON / SOAP的HTTP上的公共API或从命令行中获得。 GUI和CLI工具本身就是这些服务的所有客户端。

对于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 / JSONGoogle的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):
""" Returns market capitalization value in billion USD by a company's symbol.
"""
class SimpleIO:
response_elem = 'market_cap'
input_required = ('symbol',)
output_required = ('provider', 'value')
def handle(self):
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
# Yahoo
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
# Fetch a connection to Y! by its name
yahoo = self.outgoing.plain_http.get('Yahoo! YQL')
# Build URL params to issue a YQL query with.
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'}
# Invoke Y! and create a bunch instance out of the JSON response so
# we can reference the elements using dot notation.
yahoo_response = bunchify(loads(yahoo.conn.get(self.cid, url_params).text))
# Clean up the response from Y! - chop off the last character if there
# was a business response at all. Assumes the response is always
# in billions.
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'
# A new response item is appended to the list of items Zato will
# serialize to JSON or XML, depending on how the service was invoked. item1 = {'provider':'Yahoo!', 'value': str(value1)}
self.response.payload.append(item1)
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
# Google
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
# Fetch a connection to Google by its name
google = self.outgoing.plain_http.get('Google Finance')
# Build URL params to invoke Google with
url_params = {'stock':self.request.input.symbol}
# Invoke Google and create an Objectify instance out of the XML response
# so we can reference the elements using dot notation.
google_response = fromstring(google.conn.get(self.cid, url_params).text)
# Clean up the response from Google - convert from millions to billions
# if there was a business response at all.
if hasattr(google_response.finance, 'market_cap'):
value2 = Decimal(google_response.finance.market_cap.get('data')) / 1000
else:
value2 = 'n/a'
# Again, a plain Python dict (hashmap) is appended to the response object
# and serialization will be done by Zato.
item2 = {'provider':'Google', 'value': str(value2)}
self.response.payload.append(item2)

这是一个非常简单的集成示例,并非每种情况都允许一个人使用SIO,但是无论任何服务的复杂性如何,关键是要强调Python的编码不应该避免。 许多方面通常看起来几乎像,除了这将是一个可执行的一个伪代码- 这里 一些 更多 的使用 例子 说明

实际上,这就是使用该语言创建Zato的原因-Python达到了足够高级的语言之间的最佳位置,因此人们可以同时专注于集成,而同时又减少了麻烦和特定于语言的怪癖它是一种真正的通用编程语言,而不是有限的,可能是图形的,特定于领域的4GL语言。

回到示例中,GUI可用于创建期望的资源-在示例中,它们是'Yahoo !! YQL”和“ Google财经”传出HTTP连接。 也可以使用JSON配置从命令行完成此操作,但是会显示一个GUI。

这些特定的API不需要安全性,但是需要它,可以使用HTTP基本身份验证,WS-Security用户名令牌或技术帐户(类似于基本身份验证,但不需要BASE64)。

现在可以使用GUI或从命令行热部署该服务。 后者将在这里使用:

$ cp stockmarket.py /opt/server1/pickup-dir

确认消息将写到服务器日志中:

2013-06-20 19:25:16,115 - INFO - Uploaded package id:[53],
payload_name:[stockmarket.py]

现在可以使用Zato的CLI或GUI从命令行调用它。 让我们将前者与JSON和纯XML结合使用:

$ zato service invoke /opt/server1 stockmarket.get-market-cap \
--payload '{"symbol":"GOOG"}'
{u'market_cap': [
{u'value': u'298.8', u'provider': u'Yahoo!'},
{u'value': u'298.81505', u'provider': u'Google'}
]}
$
$ zato service invoke /opt/server1/ stockmarket.get-market-cap --data-format 
xml \
--transport soap --payload '\
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" \
xmlns:zato="https://zato.io/ns/20130518"> \
<soapenv:Body> \
<zato:request> \
<zato:symbol>IBM</zato:symbol> \
</zato:request> \
</soapenv:Body> \
</soapenv:Envelope>'
<market_cap>
<zato_env>
<cid>K255124128065587321859442392853212603320</cid>
<result>ZATO_OK</result>
</zato_env>
<item_list>
<item>
<provider>Yahoo!</provider>
<value>8.763</value>
</item>
<item>
<provider>Google</provider>
<value>8.76324</value>
</item>
</item_list>
</market_cap>
$

CLI只是管理员或开发人员快速访问服务的一种手段,但实际上,该服务现在将安装在安全的HTTP通道上,客户端应用程序可以通过该通道访问该服务。 无需重启。

概览1.1中的其他功能

服务

服务是用Python编写的,但如有必要,也可以用C或C ++创建它们。

除非开发人员坚持要深入研究底层细节,否则服务将与传输层分离,并且可以专注于数据验证,充​​实,转换,路由或其他服务的调用。 基于浏览器的GUI,CLI或JSON配置用于管理服务。

服务也与安全性隔离-它们可以假定如果调用它们,则意味着先前的层负责身份验证/授权。

单个服务可以同时通过多个通道公开,每个通道使用不同的数据格式,安全性定义或传输。

如果使用JSON / XML / SOAP,则服务会在输入上收到漂亮的Python对象,可以使用常规点符号(例如request.customer.payment.date)访问该对象,而无需在程序员端进行任何手动(反序列化)操作。 如果使用SimpleIO(SIO),则无论数据格式如何,都会产生相同的对象,因此,可以通过多个通道为每个客户端应用程序使用三种格式中的任何一种来公开相同的服务。

钩子可用于影响服务的生命周期,并实现多个服务之间通用的代码(除了Python的类继承之外)。

任何同步调用总是在同一OS级进程和线程中发生,因此,如果引发任何异常,则可以捕获该异常,并且可以使用实时回溯(stacktrace)。

异步调用通过Redis路由。 首先在此处发布一条消息,然后可能在另一台服务器上的另一项服务接收该请求。 这也是调度程序的工作方式,作业(服务)执行请求在Redis上发布,目标服务在输入时接收到它。

应当指出,围绕数据源,格式和传输的所有编程抽象仅是为了方便开发人员,例如,在需要实现Zato不需要的功能时,总是有可能直接访问原始消息,例如字节/字符串。提供自己。

实时群集上的几乎所有操作(如部署或重新配置)都可以在不重新启动服务器且不中断消息流的情况下完成。

图形用户界面

GUI是使用手写HTML / CSS / jQuery用Django编写的,并且在开发时考虑了信息设计和可用性专家(如Stephen Few)所假定的准则。

其主要特点是:

  • 集群管理 -到关键组件的快速链接, 能够从负载均衡器的配置中添加/删除服务器,以及从服务器和负载均衡器的角度检查服务器是否已启动并正在运行。
  • 负载平衡器-GUI,用于更新基本数据和HAProxy的配置源代码视图 。 也可以远程执行HAProxy命令并访问其统计信息
  • 服务
    • 热部署服务
    • 列出服务以及基本统计信息请求率,平均响应时间(也以图表形式)
    • 检查特定服务,暴露给什么渠道,在什么服务器上以及关于服务的基本统计信息是什么
    • 服务调用者从浏览器执行服务
    • 源代码浏览器 ,突出显示语法,以查看服务器上确切安装了什么(源代码始终可用,因为这是已部署的内容,字节码是动态生成的)
    • 上载/下载WSDL (尽管Zato本身并未使用它来验证请求),并使其在公共访问的URL上可用
    • 存储和访问样本请求/响应 (N个请求中的1个)
    • 存储和访问缓慢的请求/响应 (超过给定的阈值)
  • 安全-添加和删除的定义 可以通过通道和出站连接被重用
  • 通道和传出连接-前者是AMQPJMS WebSphere MQ纯HTTPSOAPZeroMQ ,后者包括AMQPFTPJMS WebSphere MQ纯HTTPSOAPSQLZeroMQ 。 在这些类中创建新对象或更新现有对象几乎不需要重启,也不需要编码。
  • Redis NoSQL-用于远程执行Redis命令的GUI。 同样,还可以指定数据字典 ,以表示例如在ISO 4217中,美元为美元,但数字代码为840的映射。
  • 用于创建,更新或手动执行作业的计划程序 。 运行作业意味着执行一项服务,可以选择在输入时为其提供静态有效负载。
  • 在GUI中用颜色标记群集的选项,例如,生产始终为蓝色,测试始终为绿色,显影为灰色,这是为了防止“胖手指”综合症。
  • 统计信息可以快速回答两个问题-在给定的时间范围(小时/天/月/月/年或任意时期)中,最慢的服务是什么,最常用的服务是什么。 可以在浏览器中比较数据或将数据导出到CVS(也可以通过API获得)。 负载均衡器也提供自己的运行时统计信息。

命令行界面

命令行界面可用于执行一系列管理操作,例如创建集群组件,对其进行运行状况检查,启动,停止或更新组件或管理加密材料。

下面将显示两个命令。 第一个获取有关正在运行的组件的OS级信息 。 另一台服务器可用于创建一个完整的工作环境 ,该环境由两台服务器(Web管理员和负载均衡器)组成,每台服务器均使用随机生成的加密材料进行配置和设置,以正常工作。

$ zato info /opt/z1/load-balancer
+--------------------------------+--------------------------------+
| Key | Value |
+================================+================================+
| component_details | {"created_user_host": |
| | "dev1@box1", "version": |
| | "1.1", "component": |
| | "LOAD_BALANCER", "created_ts": |
| | "2013-06-19T14:55:42.027946"} |
+--------------------------------+--------------------------------+
| component_full_path | /opt/z1/load-balancer |
+--------------------------------+--------------------------------+
| component_host | box1/box1 |
+--------------------------------+--------------------------------+
| component_running | True |
+--------------------------------+--------------------------------+
| current_time | 2013-06-20T15:05:12.078273 |
+--------------------------------+--------------------------------+
| current_time_utc | 2013-06-20T13:05:12.078289 |
+--------------------------------+--------------------------------+
| master_proc_connections | [connection(fd=4, family=2, |
| | type=1, |
| | local_address=('127.0.0.1', |
| | 20151), remote_address=(), |
| | status='LISTEN')] |
+--------------------------------+--------------------------------+
| master_proc_create_time | 2013-06-20T13:04:15.440000 |
+--------------------------------+--------------------------------+
| master_proc_create_time_utc | 2013-06-20T11:04:15.440000+00: |
| | 00 |
+--------------------------------+--------------------------------+
| master_proc_name | python |
+--------------------------------+--------------------------------+
| master_proc_pid | 10793 |
+--------------------------------+--------------------------------+
| master_proc_username | dev1 |
+--------------------------------+--------------------------------+
| master_proc_workers_no | 0 |
+--------------------------------+--------------------------------+
| master_proc_workers_pids | [] |
+--------------------------------+--------------------------------+
$
zato quickstart create /opt/qs-1 postgresql localhost 5432 zato1 zato1 
localhost 6379
ODB database password (will not be echoed):
Enter the odb_password again (will not be echoed):
Key/value database password (will not be echoed):
Enter the kvdb_password again (will not be echoed):
[1/8] Certificate authority created
[2/8] ODB schema created
[3/8] ODB initial data created
[4/8] server1 created
[5/8] server2 created
[6/8] Load-balancer created
Superuser created successfully.
[7/8] Web admin created
[8/8] Management scripts created
Quickstart cluster quickstart-309837 created
Web admin user:[admin], password:[hita-yabe-yenb-ounm]
Start the cluster by issuing the /opt/qs-1/zato-qs-start.sh command
Visit https://zato.io/support for more information and support options
$

API

Zato自己的管理服务已记录在案,可用于JSON和SOAP的客户端应用程序,以用于为开发人员或管理员创建替代工具或GUI。 实际上,基于Django的Web管理员Zato提供的就是这样一个应用程序-一切都通过API执行,Web控制台从不直接访问任何配置数据存储。

摘要

Zato 1.1是轻量级的,但功能齐全,已经可以用于许多任务。 随着时间的推移会增加更多功能。 特别是,除了在工具和GUI领域中的一系列新增功能之外,接下来的几个发行版还将着重于提供现成的业务API以连接到具体的系统或应用程序,以及用于用户创建自己的开发工具包。 还需要做更多的工作来编纂和支持其他集成模式。

翻译自: https://www.infoq.com/articles/zato/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

zato oracle

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值