Monitor việc gọi API real-time với Go và Redis

Sharing is caring!

Hôm trước, tui có một bài viết về việc sử dụng cơ chế Pub/Sub của Redis bằng command line. Hôm nay tui sẽ dùng Golang kết hợp với Redis để làm một cái demo nho nhỏ để đẩy message qua lại giữa Weather Services với API Monitor Server, sau đó dùng socket để broadcast message này ra web.

1. Mô tả bài toán:

Khỏi nói nhiều, các bạn xem hình sẽ hiểu:

Dùng Postman để gọi endpoint API (như trong bài Concurrency trong Golang) “http://localhost:9000/api/temperature/city_name”. Thì chương trình “Weather Services” sẽ xử lý việc tính nhiệt độ, sau đó trả dữ liệu về cho user đồng thời sẽ PUBLISH một message dạng json vào Redis thông qua một channel.

Tiếp, một chương trình khác là “API Monitor” sẽ SUBSCRIBE channel này để nhận message json, sau đó sẽ dùng socket để broadcast message này đến các web client đang kết nối.

2. Viết code chương trình:

Weather Services:

Đối với chương trình này, chúng ta sẽ sử dụng lại code của bài trước và thêm phần connect với Redis:

Install Redis client:

$ go get -u “github.com/gomodule/redigo/redis”

tại file main.go:

import package: “github.com/gomodule/redigo/redis”

 

Tạo kiểu dữ liệu mới:

Thêm một hàm để publish message qua Redis:

Hàm publishMessage() sẽ nhận 2 tham số:

  • Redis Connection
  • Channel lưu giữ data cần publish

Ta sẽ cho hàm này chạy như là một routine.

Trong hàm main, ta thêm đoạn code để connect với Redis:

Trong hàm xử lý của api endpoint “/api/temperature/{city}”, thêm vào cuối hàm này đoạn code sau:

Sửa hàm temperature để trả về 2 giá trị, 1 là nhiệt độ, 2 là success:

Thêm biến success khi gọi hàm temperature():

API Monitor:

Sử dụng iris để tạo Web Server:

install iris:

$ go get -u “github.com/kataras/iris”

install go-socket.io:

$ go get -u “github.com/googollee/go-socket.io”

file main.go:

import package:

Tạo hàm deliverMessage() để nhận message từ Redis và broadcast thông qua socket

Hàm này nhận 2 tham số:

  • Redis Connection
  • Socket Server

Tiếp, trong hàm main();

Tạo Web server và socket:

Connect đến Redis và tạo Pub/Sub connection để Subscribe message:

Mở socket:

Tạo routine:

Run Iris web server:

tạo một file index.html trong thư mục public, để làm web client (sử dụng jquery, socket.io client):

3. Chạy chương trình:

Run Redis server (Xem chi tiết các chạy Redis ở bài Redis Pub/Sub):

redisserver

Tại thư mục weather-services-redis:

$ go run main.go

Tại thư mục api-monitor:

$go run main.go

Mở Chrome và Firefox, nhập url http://localhost:8000

Dùng Postman để gọi API:

http://localhost:9000/api/temperature/tokyo

http://localhost:9000/api/temperature/seoul

http://localhost:9000/api/temperature/saigon

Khi đó, các bạn sẽ thấy kết quả json vừa trả về cho Postman và đồng thời Message cũng sẽ được notify trên Chrome và Firefox.

Kết quả như sau:

 

Source code:

https://github.com/lmdat/weather-services-redis

https://github.com/lmdat/api-monitor

 

Sharing is caring!

Concurrency kết hợp với RESTful API trong Golang

Vincent Le

Tui là Lê Minh Đạt, tên tiếng anh là Vincent(do thích nhân vật Vincent Valentine, ai từng là fan của trò Final Fantasy VII thì sẽ biết nhân vật này, hehe). Đang tập tành làm một blogger viết về mảng lập trình, mong muốn được chia sẻ những gì đã học được, tích góp được trong 10 năm đi làm thợ code.

shares