Zato學習筆記2 入門教程1

概覽

本文將指引你創建一個整合了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

  • 經過HTTP協議接收JSON和XML輸入
  • 從2個系統中調用HTTP JSON服務
  • 實現JSON格式基於ZeroMQ的可配置的通知機制
  • 從Redis中取得業務規則

在教程結束時你能很好的瞭解Zato的特性,如:命令行接口,Web管理界面,熱部署,統計等。後端

雖然這些只是Zato中的不多一部分知識,可是會給你一個完整的概念瀏覽器

消息流

service-complete
咱們從一個最簡單銀行應用開始:

  • 一個客戶端應用但願經過CUST_ID獲得某個客戶的更多信息
    • 客戶的姓氏和名字
    • 最後一次交易時間
    • 最後一次的交易金額
  • 客戶數據存儲在CRM系統中
  • 交易信息則保存在其它地方
  • 對於某些客戶類型,在客戶進行任何操做時都通知欺詐檢測系統

上圖中Service和Redis顏色同樣,是由於他們都在Zato集羣中,而其它的不屬於Zato

客戶端應用(Client App)是什麼咱們不討論,它能夠用不少前端技術實現,本文中的客戶端用Curl來模擬

快速創建一個Zato集羣

開始以前,你須要安裝好了Redis和PostgreSQL,這兩樣東西是外部組件,沒有打包到Zato裏面,因此你要單獨安裝。你也可使用Oracle替換PostgreSQL,這裏咱們仍是使用PostgreSQL。

ubuntu下能夠簡單的使用apt-get install redis-serverapt-get install postgresql來安裝

  • 安裝好Redis和Prostgres並啓動
  • 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生成了哪些東西:

  • 一個身份認證系統
  • 2個服務器
  • 在服務器前面有個HA負載均衡
  • 一個web admin面板和一個admin帳號
  • ODB結構放在Postgres和Redis中
  • 一些用於啓動或中止環境的腳本

到這裏,咱們經過命令搭建了一個完整的環境

後面咱們會使用的一些重要TCP端口以下:

Port 說明
11223 負載均衡使用的HTTP端口(外面應用經過它調用你開發的服務)
17010 server1的HTTP端口
17011 server2的HTTP端口
8183 web admin的HTTP端口(在瀏覽器中用admin用戶登陸)

quickstart-ports
負載均衡和servers能夠運行在不一樣的主機上,本教程中把這些都放在了本機中.

雖然這只是個教程,但真實環境中一樣能夠這樣作,到時只將’server1’需改名爲’dev1’,而後手動增長和配置更多的’server’

經過CUrl調用服務

此刻,你須要確認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格式.

  • 咱們能看到沒有錯誤發生 (ZATO_OK)
  • cid做爲一個標識可以協調跨多個系統的服務

熱部署你的第一個服務

開啓你最愛的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重置密碼
web-admin-login
在主菜單點擊Services,選擇創建的集羣,輸入get-client搜索服務,以下圖:
web-admin-search
雖然不能在外部訪問,但已經能夠證明咱們部署的服務已經存在

經過HTTP暴露一個服務並調用

在web admin中,轉到Connections -> Channels -> Plain HTTP,以下圖
web-admin-channels
web-admin-channels-new
全部字段都應該是自解釋的,在web admin手冊中有詳細介紹,強調服務命名的重要性是爲了解耦一個服務可能對應多個通道的問題
web-admin-channels-new-success
至此,通道已經創建,全部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'}

這就是第一部分.你創建了一個集羣,一個服務,在熱部署該服務後調用成功,以這一部分爲基礎,下一部分咱們把焦點放在業務功能上.

相關文章
相關標籤/搜索