Nếu bạn đang tìm kiếm một nền tảng ESB nguồn mở, và bạn thích Python hơn các ngôn ngữ khác, thì Zato chính là một ứng cử viên sáng giá.

Tôi sẽ không làm bạn rối vì một đống tính năng Zato cung cấp. Bạn có thể tìm thấy chúng ngay trên trang chủ của Zato. Trong bài viết này tôi chỉ muốn giới thiệu một demo, một ví dụ rất nhỏ, để giúp bạn nhanh chóng làm quen với Zato. Nhưng trước hết, bạn cần có một cái nhìn tổng quan về kiến trúc của Zato để có thể nắm bắt những phần sau.

Kiến trúc Zato

Zato được thiết kế với tư tưởng high performance và scalability. Khi bạn khởi động Zato, chúng ta sẽ có — không phải một server đơn lẻ — mà là một cluster trong đó bao gồm vài servers, HAProxy, Operational Database (Postgres), Key/Value store database (Redis) và scheduler như trong hình dưới:

Zato architecture

Thiết kế này đem lại cho Zato khả năng xử lý một số lượng connections gần như không giới hạn. Ngay cả với cấu hình nhỏ nhất, Zato cũng có thể xử lý hàng trăm ngàn concurrent requests. Quá mạnh mẽ phải không ạ?

Bây giờ chúng ta sẽ bắt đầu với ESB. Rất nhanh thôi!

Demo scenario

Trong demo này, chúng ta setup 1 Zato cluster như là ESB core, sau đó chúng ta run 2 Node.js processes để giả lập các dịch vụ bên ngoài. Một cho JSON Document service và một cho XML Document service.

Sáu đó chúng ta thử gửi một tài liệu XML cho JSON Document service thông qua ESB, để xem thử JSON Document service có nhận được và chuyển hóa (transformation) thành một tài liệu JSON mới hay không.

Zato - Demo scenario

Let’s start

GitHub repository đã được chuẩn bị sẵn cho bạn. Hãy chắc chắn rằng bạn đã có git, docker, docker-compose trên máy. Chúng ta cũng sẽ trưng dụng các ports 8183, 8185, 8186, và 11223.

Khi mọi thứ đã sẵn sàng, hãy mở terminal ưa thích của bạn và:

git clone https://github.com/greenglobal/zato-demo.git
cd zato-demo
docker-compose up

Tiến trình giống như trong clip bên dưới:

Click on the image above to load video player

Ở lần đầu tiên, có thể mất vài phút để tải xuống một số docker images từ Docker Hub. Sau đó nếu không có gì sau, chúng ta sẽ nhận được:

Admin dashboard

Bạn có thể kiểm soát Zato qua giao diện web, CLI và API. Trong bài này, chúng ta thao tác chủ yếu trên giao diện web, tạm gọi là “Zato dashboard”.

Truy cập http://localhost:8183 trên trình duyệt và login với tài khoản:

  • username: admin
  • password: 2cdd3856-ced5-43b8-b3c1-7e8a5cdb0c37

Password này tự động sinh ra khi build image. Nếu bạn quên, có thể dùng lệnh sau để đọc ra từ docker container:

docker exec cluster1 cat /opt/zato/web_admin_password

External services

Như đã đề cập ở trên, chúng ta có JSON Document service và XML Document service đang chạy ở 2 ports 8185 và 8186. Chúng là 2 Node.js processes riêng biệt.

Vai trò cơ bản của ESB là ghép nối các dịch vụ khác nhau lại, cho phép chúng tương tác với nhau mà không cần phải can thiệp sửa đổi gì. Các dịch vụ có thể khác nhau về giao thức (protocol), định dạng dữ liệu (data format) và cấu trúc dữ liệu (data structure).

Trong ví dụ của chúng ta, JSON Document service sử dụng định dạng JSON và ở ra một RESTFul API. Trong khi XML Document service sử dụng định dạng XML để lưu trữ dữ liệu.

Về cơ bản, XML Document service và JSON Document service không thể nói chuyện với nhau được vì chúng không cùng ngôn ngữ. Nhưng, Zato ESB trong vai trò người trung gian, sẽ giúp chúng. 2 dịch vụ này kết nối tới ESB, truyền dữ liệu sang ESB, ESB sẽ phiên dịch (translate), điều tiết (mediate), chuyển hóa (transform) và rồi gửi sang cho bên nhận những gì nó trông đợi.

Khai báo outgoing connections

Trở lại Admin dashboard. Từ menu, tìm đến Connections -> Outgoing -> Plain HTTP để tạo 2 đối tượng JSON_Docs and XML_Docs như trong clip:

Click on the image above to load video player

Ở bước này, chúng ta chỉ ra mối liên kết giữa ESB với các end-points bên ngoài.

Chú ý rằng chúng ta đang sử dụng tên docker container để khai báo đường dẫn http://service1:8185/documents and http://service2:8186/documents.

Đăng ký dịch vụ Văn bản

Thuật ngữ “service” này có vẻ gây mơ hồ. Bạn tạm thời xem nó như một chức năng dịch tài liệu.

Trong ví dụ của chúng ta, có một kịch bản Python tại /service2/document_service.py trong đó chúng ta định nghĩa cách chuyển đổi dữ liệu từ XML sang JSON và gửi đến JSON Document service.

Quay lại Admin dashboard, tìm Services -> List services, nhấn “Upload a service package” và chọn file trên. Xem clip hướng dẫn:

Click on the image above to load video player

Zato hỗ trợ hot-deployment. Service sau khi upload sẽ được đồng bộ đến tất cả các servers/clusters và dùng được ngay lập tức.

Mở dịch vụ Văn bản qua HTTP

Now we need to expose our Document service so that it can be involved from outside. Let’s call it “Send XML Document”.

Trong bước này, chúng ta định nghĩa kịch bản gửi thông điệp XML sang cho máy chủ dịch vụ JSON Document. Vì dịch vụ JSON Document chỉ hiểu được dữ liệu dạng JSON nên trước khi thực sự gửi đi, ESB đã xử lý hồ sơ XML bằng kịch bản Python trong bước trước để chuyển về định dạng JSON. Tiến trình này diễn ra ngầm phía dưới, nhà quản trị chỉ việc khai báo như trong clip hướng dẫn sau đây:

Click on the image above to load video player

Lưu ý rằng, khi chúng ta khai báo URL Path là /documents, từ bên ngoài sẽ kết nối đến dịch vụ văn bản của ESB thông qua đường dẫn tuyệt đối: ví dụ https://qn-esb.org/documents. Trong trường hợp demo của chúng ta, đường dẫn sẽ là http://localhost:11223/documents với 11223 là cổng của cluster như đã đề cập ở phần trước.

Khi một yêu cầu HTTP được gửi tới Zato cluster, request sẽ được HAProxy bắt lấy và chuyển cho server thích hợp trong cụm để tiếp tục xử lý. Đến lượt server, Zato ESB bên trong đó sẽ gọi ra dịch vụ tương ứng với URL Path đã khai báo. Dịch vụ này làm các thao tác dữ liệu rồi tùy theo kịch bản mà quyết định những xử lý tiếp theo.

Trong ví dụ mẫu, chúng ta sẽ giả lập máy chủ dịch vụ XML Document để gửi một văn bản XML tới ESB với kỳ vọng, văn bản đó sẽ được ESB chuyển đổi định dạng và gửi sang dịch vụ JSON Document để lưu trữ.

Kiểm tra kết quả

Đến đây, bạn có thể sử dụng Advanced REST client để gửi một tài liệu XML đến dịch vụ JSON Document thông qua dịch vụ Văn bản của ESB, theo đường dẫn http://localhost:11223/documents. Nội dụng tài liệu như sau:

<request>
  <id>11</id>
  <subject>Hello Zato</subject>
  <body>I'm a tester and I expect this document will be inserted into list of JSON documents</body>
  <by>Kenneth Stokes</by>
  <time>612154834</time>
</request>

Kiểm tra kết quả bằng các reload lại http://localhost:8185/documents để xem có thêm item nào mới không. Clip sau minh họa cụ thể:

Click on the image above to load video player

Vậy là hoàn tất. Tôi thấy chương trình chạy rất tốt. Nếu bạn gặp khó khăn gì, đừng ngại comment hoặc tạo issue trên GitHub.

Bây giờ là lúc để khám phá sâu hơn những tính năng tuyệt vời của Zato: enable security, chuyển đổi protocol, xử lý trong hàng đợi, pub/sub model, etc.

Chúc các bạn vui vẻ với món đồ chơi thú vị này :D

Xem thêm

Bản tiếng Anh: Zato — a powerful Python-based ESB solution for your SOA