+5

Cùng tìm hiểu cơ bản về Dapr - Distributed Application Runtime (Phần 2)

Sau một thời gian dài dằng dặc thì mình lại tiếp tục tìm hiểu về Dapr nhé. Trong bài viết lần này mình sẽ thực hiện tính năng Service Invocation của Dapr nhé.

Service Invocation

Là cách giao tiếp giữa các service trong hệ thống phân tán. Thông thường khi gọi từ service A sang service B, ta sẽ sử dụng HTTP Request, gRPC, ... Vậy Dapr giúp được gì cho chúng ta ?

image.png

Như các bạn đã thấy Dapr sẽ đứng ở giữa để forward request & response cho 2 service A & B, khi 2 dapr giao tiếp với nhau nó đã tự động mã hoá message & xác thực giữa 2 service với nhau

Xây dựng 1 ứng dụng đơn giản

Trong bài này mình sẽ viết 1 todolist đơn giản để tìm hiểu về Service Invocation của Dapr. Tổng quan về ứng dụng: Service A (go) tạo và lưu trữ danh sách todolist trong mảng, Service B (python) get Todolist từ service A.

Trước khi bắt đầu thì toàn bộ source code mình để ở đây nhé: https://github.com/lequocbinh04/dapr-demo-go-python.

Server todolist với Go

Đầu tiên ta sẽ khởi tạo một HTTP request mục đích để add một việc mới vào list. Chi tiết hàm addTodoListHandle bạn có thể xem ở đây.

go func(s *server) {
		log.Printf("starting http server on port %d", 8080)
		http.HandleFunc("/add-todo-list", addTodoListHandle(s))
		http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {
			writeRes(w, "pong")
		})
		http.ListenAndServe(":8080", nil)
}(serverStruct)

Tiếp theo ta sẽ khởi tạo một gRPC server với mục đích để python gọi sang và get todolist

lis, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
if err != nil {
    log.Fatalf("failed to listen: %v", err)
}

s := grpc.NewServer()

pb.RegisterTodoListServer(s, serverStruct)
log.Printf("server listening at %v", lis.Addr())

if err := s.Serve(lis); err != nil {
    log.Fatalf("failed to serve: %v", err)
}

Để run server ta dùng lệnh:

dapr run --app-id server --app-port 4999 --dapr-grpc-port 5000 -- go run main.go 
Dapr sidecar is up and running.
Updating metadata for app command: go run main.go
You're up and running! Both Dapr and your app logs will appear here.

== APP == 2022/11/10 12:57:20 starting http server on port 8080
== APP == 2022/11/10 12:57:20 server listening at [::]:4999

Lúc này http server của bạn sẽ được chạy ở port 8080, gRPC server của bạn sẽ được chạy ở port 4999 và gRPC của Dapr sẽ được chạy ở cổng 5000, bây giờ ở client (trong ví dụ này mình dùng python) sẽ gọi tới cổng 5000 nhé (thật ra các bạn gọi tới 4999 cũng được kết quả tương tự nhưng nó không đi qua Dapr nhé :v).

Client với Python

Code của phần này thì đơn giản hơn:

port = "5000"

with grpc.insecure_channel('localhost:' + str(port)) as channel:
    stub = todolist_pb2_grpc.TodoListStub(channel)
    metadata = (('dapr-app-id', 'server'),)
    response = stub.GetTodolist(request=todolist_pb2.google_dot_protobuf_dot_empty__pb2.Empty(), metadata=metadata)
    return response

Mục đích là để kết nối tới server todolist (thông qua Dapr các bạn có thể thấy ở đây mình đã gọi tới localhost port 5000), phần metadata các bạn phải thêm trường dapr-app-id với value là id của app mà bạn muốn gọi tới, ở đây id app là "server" (do cái câu command để run cái server có cái flag --app-idserver ấy)

Tiếp theo chúng ta tiến hành start client

dapr run --app-id client -- python .\main.py

Ở đây chúng ta không cần phải khai báo dapr grpc port nữa do cả 2 đang dùng trên cùng 1 máy nên không cần nhé, trong trường hợp 2 service ở 2 VPS khác nhau thì câu lệnh lúc này sẽ là

dapr run --app-id client --dapr-grpc-port 5000 -- python .\main.py

Thử nghiệm

Để lấy ra danh sách các todolist các bạn gọi GET request tới localhost:3000/todo nhé

image.png

Thêm mới 1 todo vào list: image.png

Tiến hành get lại: image.png

Tới đây thì mình đã demo xong cơ bản về Service Invocation trong Dapr, ở bài viết sau mình sẽ tiếp tục thử nghiệm các tính năng hay ho của Dapr như Tracing, Distributed lock, .... nhé. Còn những example hay ho hơn các bạn có thể tham khảo tại repo của Dapr. Nhớ up vote nếu cảm thấy bài viết hữu ích nhé ❤️


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí