GIỚI THIỆU VỀ gRPC CỰC HỮU ÍCH CHO DEV

02/11/2021 37
grpc 13
CODEWELL

Các hãng công nghệ lớn luôn luôn tìm kiếm những phương pháp mới để nâng cao hiệu năng cho sản phẩm của họ. Trong bài viết này, chúng ta sẽ tìm hiểu và khám phá về một framework RPC mới dựa trên protobufs  và HTTP/2  của Google có tên là gRPC dưới sự hướng dẫn từ chuyên gia của CO-WELL Asia.

 

1. Giới thiệu về Protocol buffers

 

Protobuf là một giao thức để tuần tự hóa dữ liệu có cấu trúc, tương tự với JSON hay XML nhưng nhỏ hơn, nhanh hơn và đơn giản hơn. Theo hình bên dưới thì tốc độ encode gấp 3 JSON và decode gấp 4-5 lần.

grpc 1 1
So sánh tốc độ encoding, decoding của gRPC

Khi làm việc với Protobuf, bạn định nghĩa các data được cấu trúc như thế nào thì sau đó Proto Complier sẽ biên dịch ra mã nguồn tùy theo ngôn ngữ mà các bạn sử dụng, không như JSON được sử dụng rộng rãi mà mọi ngôn ngữ đều có thể áp dụng một tiêu chuẩn chung còn Protobuf là sản phẩm nội bộ của Google nên chỉ Google mới có thể tạo ra những driver cho từng ngôn ngữ. Hơn nữa Protobuf lữu trữ data dưới dạng Binary nên rất khó có thể đọc.

 

Protobuf rất phù hợp để làm ngôn ngữ giao tiếp giữa các server hơn là server và browser-client đơn giản vì hầu hết browser-client giao tiếp với server bằng REST API + JSON ngoài ra cần thêm khả năng readable ở browser.

 

Ưu điểm của Protocol Buffers

Một số thông số khi so sánh với XML được đưa ra bởi Google như sau:

  • Đơn giản hơn
  • Nhỏ hơn từ 3 đến 10 lần
  • Nhanh hơn từ 20 đến 100 lần
  • Rõ ràng hơn
  • Dễ dàng sinh các class để sử dụng trực tiếp cho các ngôn ngữ lập trình

 

2. gRPC là gì?

grpc 2

Trước hết gRPC theo google giới thiệu:
gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authentication. It is also applicable in last mile of distributed computing to connect devices, mobile applications and browsers to backend services.

 

gRPC là một RPC framework giúp bạn kết nối giữa các service trong hệ thống, nó hỗ trợ load balancing, tracing, health checking và authentication hỗ trợ từ mobile, trình duyệt cho tới back-end service.

 

gRPC sử dụng Protocol Buffer để transfer data thay vì JSON/XML truyền thống nên tốc độ được gia tăng đáng kể, ngoài ra nó cũng dùng RPC thay cho REST API. Trong việc thiết kế API sự khác biệt giữa REST API với RPC là REST được thiết kế tập trung vào Resource còn RPC thì tập trung vào action.

 

3. Tại sao gPRC hoạt động hiệu quả hơn RPC

 

Câu trả lời là HTTP/2, công nghệ gRPC được xây dựng dựa trên HTTP/2. Những cải tiến của HTTP/2 so với các phiên bản tiền nhiệm cho phép các kết nối http hoạt động tốt hơn, hiệu quả hơn. Chúng ta cùng điểm qua một số tính năng HTTP/2 nổi trội:

  • Multiplexing (ghép kênh): một trong những tính năng quan trọng nhất của HTTP/2 là ghép kênh, chúng ta có thể gửi và nhận nhiều kết quả trong cùng 1 kết nối duy nhất.
  • Nén Header: khi thực hiện mỗi http request chúng ta cần cung cấp các thông tin cần thiết cho request đó như thông tin cookie, agent, … việc gửi các thông tin này lặp đi lặp lại sẽ tốn một lượng tài nguyên nhất định và làm giảm hiệu quả hoạt động của ứng dụng. Với HTTP/2 quá trình này sẽ được tối ưu hóa bằng cách nén thông tin đó lại, trong cơ chế này cả client và server đều lưu trữ thông tin của các lần request trước, các lần request sau có thể lược bỏ bớt các thông tin mà các request trước đã có.
  • Dữ liệu nhị phân: HTTP/2 truyền dữ liệu ở dạng nhị phân thay vì dạng text như các phiên bản trước. Nó giúp quá trình truyền tải hiệu quả hơn và tránh các lôi thường gặp khi xử lý dữ liệu các request như khoảng trống, các ký tự đặc biệt,…

 

4. Tạo project Java sử dụng gRPC

Bước 1: Chuẩn bị

Môi trường/công cụ cần chuẩn bị:

  • Java (JDK 1.8 hoặc phiên bản mới hơn)
  • Maven 3.x
  • IDE: Spring tool suite hoặc Eclipse

 

Cấu trúc project

grpc 3

 

Bước 2: Thêm maven dependencies

 

Hãy thêm grpc-netty, grpc-protobuf và grpc-stub dependencies:

grpc 4

Bước 3: Định nghĩa service

 

Chúng ta tạo file HelloService.proto

grpc 5

 

Tiếp theo định nghĩa một Message Structure

message HelloRequest { 

string firstName = 1

string lastName = 2

}

 

Mỗi một số cần gán cho mỗi thuộc tính và được gọi là tag. Các tags này được protocol buffer thể hiện thuộc tính thay vì sử dụng tên thuộc tính( attribute name).

 

Vi thế không giống như JSON chúng ta sẽ truyền vào thuộc tính là firstName cho mỗi lần, protocol buffer sẽ sử dụng number là 1 để trình diễn thuộc tính firstName.

 

Tiếp theo chúng ta định nghĩa message response

message HelloResponse { 

string greeting = 1

}

 

Tạo một Service Contract

 

Cuối cùng tạo service contract. Chúng ta phải tạo 1 contract để tạo 1 “hợp đồng” giữa client và server.
Trong file HelloService.proto chúng ta define hello() function.

grpc 6

Bước 4: Generating code

 

Bây giờ chúng tạo chuyển file HelloService.proto thành protocol buffer để compiler protoc thành Java files. Có nhiều cách để làm điều này.

 

  • Sử dụng Protocol Buffer Compiler

Đầu tiên chúng ta cần Protocol Buffer Compiler.

Chúng ta sẽ cài đặt theo hướng dẫn ở đây.

Ngoài ra chúng ta cần cài đặt thêm gRPC Java Codegen Plugin .

Chúng ta sử dụng command này để generate code

protoc --plugin=protoc-gen-grpc-java=$PATH_TO_PLUGIN -I=$SRC_DIR --java_out=$DST_DIR --grpc-java_out=$DST_DIR $SRC_DIR/HelloService.proto

 

  • Sử dụng Maven plugin

Là 1 developer chắc hẳn bạn muốn generate code được tích hợp vào hệ thống của mình. gRPC cũng cấp một protobuf-maven-plugin  cho maven.

grpc 7

Bước 5: Tạo Server

 

Bất kể bạn sử dụng cách nào để generate code ở trên cũng sẽ tạo ra 3 files chính dưới đây:

  • HelloRequest.java – chứa định nghĩa type HelloRequest.
  • HelloResponse.java – file này chưa type HelloResponse.
  • HelloServiceImplBase.java – file này chứa abstract class HelloServiceImplBase – chúng ta sẽ kế thừa và implement các inteface chúng ta đã được định nghĩa.

 

Bước 5.1: Overriding the Service Base Class

grpc 8

 

Bước 5.2: Running the gRPC Server

 

Tiếp theo chúng ta cần tạo gRPC server để lắng nghe các requests:

grpc 9

 

Ở đây chúng ta tạo 1 gRPC server sử dụng port 8080 và add HelloServiceImpl đã được định nghĩa.
start() function dùng để start server.

Chúng ta gọi function awaitTermination() để giữ server lắng nghe ở foreground.

 

Bước 5.3 Tạo client

 

gRPC cung cấp một channel giống connection, connection pooling, load balancing, etc. Chúng ta tạo một channel sử dụng ManagedChannelBuilder: Ở đây chúng đã cài đặt address và port. Chúng ta sử dụng plain text không sử dụng bất cứ mã hóa nào.

grpc 10

Tiếp theo, chúng ta tạo một stub và stub này sẽ gọi function hello(). Sử dụng stub để tương tác với server.

Ở đây chúng ta sử dụng blocking/synchronous stub vì thế RPC sẽ đợi response từ server và sẽ trả về một response hoặc một exception.

Chúng ta sẽ nhận được HelloResponse object trả về từ server.

Sau khi cài đặt code xong hãy chạy file GrpcServer.java trước và sẽ nhận được kết quả.

grpc 11

Tiếp tục run file GrpcClient.java và nhận được kết quả.

grpc 12

Hy vọng bài viết trên đã cho bạn cái nhìn cơ bản về gRPC. Đừng quên theo dõi chuyên mục CODEWELL trên website CO-WELL Asia để đón đọc những bài viết công nghệ bổ ích nhé!

 

Nguyễn Văn Thuần – CO-WELL Asia