本文將指引你創建一個整合了3個外部應用的簡單的服務,經過HTTP和ZeroMQ來傳輸,經過JSON和XML來交換數據html
服務是什麼?
服務是一個功能,至關於一個函數或方法,但服務運行的層次更高,函數和方法是代碼層面的接口(使用APIs時通常是引入一些代碼),而服務是系統層面的(經過網絡協議如HTTP訪問)前端
一個原子的和可重用的服務可用於構建一個在線的中間件和後端應用web
服務經過一些協議被調用或接受鏈接,如: plain HTTP, SOAP, JSON, AMQP, JMS WebSphere MQ, ZeroMQ, SQL, and FTP(S).redis
Zato結合Redis提供了一個用於執行週期性任務的計劃任務管理器sql
服務在安全認證方面使用 HTTP Basic Auth, WS-Security 和 technical accounts.數據庫
你能夠經過命令行界面,API和Web admin面板來管理Zatojson
咱們將完成下面幾件事:ubuntu
在教程結束時你能很好的瞭解Zato的特性,如:命令行接口,Web管理界面,熱部署,統計等。後端
雖然這些只是Zato中的不多一部分知識,可是會給你一個完整的概念瀏覽器
咱們從一個最簡單銀行應用開始:
上圖中Service和Redis顏色同樣,是由於他們都在Zato集羣中,而其它的不屬於Zato
客戶端應用(Client App)是什麼咱們不討論,它能夠用不少前端技術實現,本文中的客戶端用Curl來模擬
開始以前,你須要安裝好了Redis和PostgreSQL,這兩樣東西是外部組件,沒有打包到Zato裏面,因此你要單獨安裝。你也可使用Oracle替換PostgreSQL,這裏咱們仍是使用PostgreSQL。
ubuntu下能夠簡單的使用apt-get install redis-server
和apt-get install postgresql
來安裝
Redis不須要用戶,Postgres須要用下面的命令配置一下
$ sudo su - postgres # OS X users may skip it
$ createuser --no-superuser --no-createdb --no-createrole zato1
$ createdb --owner=zato1 zato1
$ psql --dbname zato1 --command="ALTER ROLE zato1 WITH PASSWORD 'zato1'"
接下來咱們快速創建一個學習用的集羣,先作些準備:
* 一個空目錄($path
)
* PostgreSQL的IP,端口,數據庫和帳號密碼($odb_host, $odb_port, $odb_db_name, $odb_user and $odb_password
)
* 用於鏈接Redis的IP,端口,密碼($kvdb_host, $kvdb_port and $kvdb_password
)
好了,如今能夠運行下面的命令,代入上面準備好的參數
注意Redis密碼默認爲空
$ zato quickstart create $path \
postgresql $odb_host $odb_port $odb_user $odb_db_name \
$kvdb_host $kvdb_port --verbose
代入後運行:
$ zato quickstart create ~/tmp/qs-1/ \ postgresql localhost 5432 zato1 zato1 \ localhost 6379 --verbose 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-34657 created Web admin user:[admin], password:[esou-kozo-unda-snon] Start the cluster by issuing the /home/dsuch/tmp/qs-1/zato-qs-start.sh command Visit https://zato.io/support for more information and support options $
注意到Web admin user:[admin], password:[esou-kozo-unda-snon]
沒,這個帳號密碼用於登陸剛創建的web admin系統,密碼是個隨機的密碼,你能夠用zato update password命令修改
看看咱們用zato quickstart create
生成了哪些東西:
到這裏,咱們經過命令搭建了一個完整的環境
後面咱們會使用的一些重要TCP端口以下:
Port | 說明 |
---|---|
11223 | 負載均衡使用的HTTP端口(外面應用經過它調用你開發的服務) |
17010 | server1的HTTP端口 |
17011 | server2的HTTP端口 |
8183 | web admin的HTTP端口(在瀏覽器中用admin用戶登陸) |
負載均衡和servers能夠運行在不一樣的主機上,本教程中把這些都放在了本機中.
雖然這只是個教程,但真實環境中一樣能夠這樣作,到時只將’server1’需改名爲’dev1’,而後手動增長和配置更多的’server’
此刻,你須要確認Redis和PostgreSQL都正常而且容許Zato鏈接,你能經過下面的命令檢測:
$ zato check-config /path/to/server1 SQL ODB connection OK Redis connection OK $
若是你的輸出和上面不同,則下面的./zato-qs-start.sh
會失敗,因此請務必確認一下.
好了,咱們運行zato-qs-start.sh
把Zato跑起來:
$ ./zato-qs-start.sh Starting the Zato quickstart environment Running sanity checks [1/6] Redis connection OK [2/6] SQL ODB connection OK [3/6] Load-balancer started [4/6] server1 started [5/6] server2 started [6/6] Web admin started Zato quickstart environment started Visit https://zato.io/support for more information and support options $
Zato內置了一些有用的功能,其中一個是zato.ping
,它會在Zato啓動時自動加載,你可使用Curl訪問它(下面的輸出稍微格式化了下)
$ curl localhost:11223/zato/ping -d '{}' {"zato_env": {"details": "", "result": "ZATO_OK", "cid": "K215495307960446051245422023713428938487"}, "zato_ping_response": {"pong": "zato"}} $
zato.ping
的響應是JSON格式.
開啓你最愛的IDE來創建咱們的第一個Zato服務
保存下面的代碼到my_service.py文件
from zato.server.service import Service class GetClientDetails(Service): def handle(self): self.log_input()
zato.server.service.Service
的子類handle(self)
是服務須要實現的惟一的方法,是服務的核心log_input
是服務能夠訪問的一個helper方法,你能想像,log_input會輸出全部的輸入數據到server日誌中代碼保存好了,咱們如今就能夠熱部署它.
說到這裏,咱們有幾種方法使代碼生效,熱部署是其中一種
經過命令行或web admin面板,你將一個服務推送到集羣中一個服務器,Zato將自動複製該服務到全部節點,不須要任何重啓,更新一個服務也是同樣.
要從命令行熱部署一個服務你須要拷貝Python模塊到pick-up目錄
本教程中你能夠在$path/server1/pickup-dir
和$path/server2/pickup-dir
中任選一個,都不會有問題,另外一個目錄會自動同步
好了,選擇一個目錄拷貝模塊:
$ cp my_service.py $path/server1/pickup-dir
如今,每一個server的日誌文件中(./logs/server.log
)會出現下面的內容
INFO - zato.hot-deploy.create:33 - Uploaded package id:[1], payload_name:[my_service.py]
一個服務能夠在多個獨立的通道,不一樣的安全配置,傳輸協議,數據格式下被使用,因此你須要明確的告訴Zato外部程序怎樣調用服務,咱們用瀏覽器打開http://localhost:8183/在web admin中進行配置
還記得前面生成的admin帳號的密碼嗎?不記得了能夠參考https://zato.io/docs/admin/cli/update-password.html重置密碼
在主菜單點擊Services
,選擇創建的集羣,輸入get-client
搜索服務,以下圖:
雖然不能在外部訪問,但已經能夠證明咱們部署的服務已經存在
在web admin中,轉到Connections -> Channels -> Plain HTTP,以下圖
全部字段都應該是自解釋的,在web admin手冊中有詳細介紹,強調服務命名的重要性是爲了解耦一個服務可能對應多個通道的問題
至此,通道已經創建,全部server都自動更新了它們的HTTP配置,咱們能夠用Curl來測試一下
$ curl localhost:11223/tutorial/first-service -d '{}' $
這裏沒有任何輸出,是由於咱們的服務返回的None,輸入數據被記錄到某一個server的日誌中了,咱們能夠用grep命令查找確認一下
日誌中咱們能夠看到
INFO - {u'impl_name': u'my_service.GetClientDetails', u'name': u'my-service.get-client-details', u'cid': u'K226134078656111264088116403218497665719', u'invocation_time': datetime.datetime(2013, 5, 14, 7, 39, 47, 417059), u'job_type': None, u'data_format': u'json', u'slow_threshold': 99999, u'request.payload': '', u'wsgi_environ': {'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'gunicorn/0.16.1', 'SCRIPT_NAME': '', 'wsgi.input': <gunicorn.http.body.Body object at 0x4396a50>, 'REQUEST_METHOD': 'GET', 'HTTP_HOST': 'localhost:11223', 'PATH_INFO': '/tutorial/first-service', 'wsgi.multithread': False, 'QUERY_STRING': '', 'HTTP_CONNECTION': 'close', 'HTTP_ACCEPT': '*/*', 'HTTP_USER_AGENT': 'curl/7.22.0', 'wsgi.version': (1, 0), 'REMOTE_PORT': '42325', 'RAW_URI': '/tutorial/first-service', 'REMOTE_ADDR': '127.0.0.1', 'wsgi.run_once': False, 'wsgi.errors': <open file '<stderr>', mode 'w' at 0x7f34db2fe270>, 'wsgi.multiprocess': False, 'wsgi.url_scheme': 'http', 'gunicorn.socket': <socket at 0x42e9290 fileno=25 sock=127.0.0.1:17011 peer=127.0.0.1:42325>, 'SERVER_NAME': 'localhost', 'SERVER_PORT': '11223', u'zato.http.response.headers': {u'X-Zato-CID': u'K226134078656111264088116403218497665719'}, 'wsgi.file_wrapper': <class gunicorn.http.wsgi.FileWrapper at 0x202e390>}, u'environ': {}, u'user_msg': u'', u'usage': 27, u'channel': u'http-soap'}
這就是第一部分.你創建了一個集羣,一個服務,在熱部署該服務後調用成功,以這一部分爲基礎,下一部分咱們把焦點放在業務功能上.