Xây dựng ứng dụng máy chủ máy khách bằng gRPC

gRPC là một khung RPC hiện đại, nguồn mở, hiệu suất cao có thể chạy trong bất kỳ môi trường nào. Google Play có thể kết nối hiệu quả các dịch vụ trong và giữa các trung tâm dữ liệu nhờ tính năng hỗ trợ cắm được để cân bằng tải, theo dõi, kiểm tra tình trạng và xác thực. Giải pháp này cũng có thể áp dụng cho giai đoạn cuối của quá trình điện toán được phân phối để kết nối các thiết bị, ứng dụng dành cho thiết bị di động và trình duyệt với các dịch vụ phụ trợ. Bạn có thể tìm thấy tài liệu trên trang web chính thức của gRPC và nhận hỗ trợ từ các cộng đồng nguồn mở. Hướng dẫn này chỉ cho bạn các giải pháp xây dựng ứng dụng Android bằng gRPC.

grpc.io là trang web chính thức của dự án gRPC. Để tìm hiểu thêm về cách hoạt động của gRPC, hãy xem bài viết gRPC là gì?gRPC Concepts. Để tìm hiểu cách sử dụng gRPC trong một ứng dụng Android, hãy xem ví dụ về Hello World trong phần gRPC Android Java Quickstart (Bắt đầu nhanh cho Android Java). Bạn cũng có thể tìm thấy một số ví dụ khác về gRPC Android trên GitHub.

Tính năng

Lệnh gọi quy trình giúp việc này trở nên đơn giản
Vì đây là RPC, nên mô hình lập trình là các lệnh gọi quy trình: khía cạnh kết nối mạng của công nghệ bị loại bỏ khỏi mã xử lý ứng dụng, khiến nó trông gần như là một lệnh gọi hàm trong quá trình thông thường. Hoạt động tương tác của máy chủ – máy chủ sẽ không bị hạn chế về mặt ngữ nghĩa của các phương thức tài nguyên HTTP (chẳng hạn như GET, PUT, POST và DELETE). So với API REST, cách triển khai của bạn trông tự nhiên hơn mà không cần phải xử lý siêu dữ liệu của giao thức HTTP.
Truyền dẫn mạng hiệu quả nhờ HTTP/2
Việc truyền dữ liệu từ thiết bị di động sang máy chủ phụ trợ có thể là một quá trình tốn rất nhiều tài nguyên. Khi sử dụng giao thức HTTP/1.1 tiêu chuẩn, việc thường xuyên kết nối từ thiết bị di động đến dịch vụ đám mây có thể làm tiêu hao pin, tăng độ trễ và chặn các ứng dụng khác kết nối. Theo mặc định, gRPC chạy trên giao thức HTTP/2, hỗ trợ truyền trực tuyến hai chiều, kiểm soát luồng, nén tiêu đề và khả năng ghép kênh các yêu cầu qua một kết nối TCP/IP. Kết quả là gRPC có thể giảm mức sử dụng tài nguyên, dẫn đến giảm thời gian phản hồi giữa ứng dụng và các dịch vụ chạy trên đám mây, giảm mức sử dụng mạng và thời lượng pin lâu hơn cho ứng dụng chạy trên thiết bị di động.
Tích hợp sẵn tính năng hỗ trợ trao đổi dữ liệu truyền trực tuyến
gRPC được thiết kế với sự hỗ trợ của HTTP/2 để phát trực tuyến hai chiều song công ngay từ đầu. Tính năng truyền trực tuyến cho phép một yêu cầu và phản hồi có kích thước lớn tuỳ ý, chẳng hạn như các thao tác yêu cầu tải lên hoặc tải xuống một lượng lớn thông tin. Với tính năng truy cập trực tuyến, ứng dụng và máy chủ có thể đọc và viết thông báo cùng lúc, cũng như đăng ký nhau mà không cần theo dõi mã nhận dạng tài nguyên. Điều này giúp việc triển khai ứng dụng của bạn linh hoạt hơn.
Tích hợp liền mạch với Protocol Buffer
gRPC sử dụng Vùng đệm giao thức (Protobuf) làm phương thức chuyển đổi tuần tự/huỷ chuyển đổi tuần tự bằng trình bổ trợ tạo mã được tối ưu hoá cho Android (Protobuf Java Lite). So với định dạng dựa trên văn bản (chẳng hạn như JSON), Protobuf cung cấp khả năng trao đổi dữ liệu hiệu quả hơn về tốc độ dồn và kích thước mã, giúp định dạng này phù hợp hơn để sử dụng trong môi trường thiết bị di động. Ngoài ra, cú pháp định nghĩa thông báo/dịch vụ ngắn gọn của Protobuf giúp bạn xác định mô hình dữ liệu và giao thức ứng dụng cho ứng dụng của mình dễ dàng hơn nhiều.

Tổng quan về việc sử dụng

Làm theo hướng dẫn gRPC cơ bản – Android Java để sử dụng gRPC cho ứng dụng Android gồm 4 bước:

  • Xác định các dịch vụ RPC bằng vùng đệm giao thức và tạo giao diện ứng dụng gRPC.
  • Xây dựng một kênh đóng vai trò là phương tiện cho các lệnh gọi RPC giữa ứng dụng và máy chủ.
  • Tạo một mã giả lập ứng dụng làm điểm truy cập để bắt đầu các lệnh gọi RPC từ phía máy khách.
  • Thực hiện lệnh gọi RPC đến máy chủ từ xa như khi thực hiện các lệnh gọi quy trình cục bộ.

Để minh hoạ, các byte được truyền ở dạng văn bản thuần tuý trong ví dụ được cung cấp. Tuy nhiên, ứng dụng của bạn phải luôn mã hoá dữ liệu mạng trong phiên bản chính thức. gRPC cung cấp tính năng hỗ trợ mã hoá SSL/TLS cũng như trao đổi mã thông báo OAuth ( OAuth2 với các dịch vụ của Google) để xác thực. Để biết thêm thông tin chi tiết, hãy xem phần TLS trên AndroidSử dụng OAuth2.

Giao thông vận tải

gRPC cung cấp hai lựa chọn triển khai Transport cho các ứng dụng Android: OkHttp và Cronet.

Chọn một công cụ di chuyển (nâng cao)

  • OkHttp
    OkHttp là một ngăn xếp mạng nhẹ được thiết kế để sử dụng trên thiết bị di động. Đây là phương thức truyền tải mặc định của gRPC để chạy trong môi trường Android. Để sử dụng OkHttp làm phương thức truyền tải gRPC cho ứng dụng của bạn, hãy tạo kênh bằng AndroidChannelBuilder. Lớp này sẽ gói OkHttpChannelBuilder và sẽ đăng ký trình giám sát mạng với hệ điều hành Android để phản hồi nhanh các thay đổi về mạng. Bạn có thể xem một ví dụ về cách sử dụng trong gRPC-Java AndroidChannelBuilder.
  • Cronet (thử nghiệm)
    Cronet là ngăn xếp mạng của Chromium được đóng gói dưới dạng một thư viện dành cho thiết bị di động. Thư viện này hỗ trợ kết nối mạng mạnh mẽ với giao thức QUIC tiên tiến, có thể đặc biệt hiệu quả trong các môi trường mạng không đáng tin cậy. Để tìm hiểu thêm thông tin chi tiết về Cronet, vui lòng xem phần Thực hiện các thao tác mạng bằng Cronet. Để sử dụng Cronet làm phương thức truyền tải gRPC cho ứng dụng của bạn, hãy tạo kênh bằng CronetChannelBuilder. Bạn có thể xem ví dụ về cách sử dụng trong gRPC-Java Cronet Transport.

Nói chung, các ứng dụng nhắm đến các phiên bản SDK gần đây nên sử dụng Cronet vì nó mang đến một ngăn xếp mạng mạnh mẽ hơn. Nhược điểm của việc sử dụng Cronet là tăng kích thước APK, vì việc thêm phần phụ thuộc Cronet nhị phân sẽ thêm >1 MB vào kích thước ứng dụng, so với ~100 KB cho OkHttp. Kể từ GMSCore phiên bản 10, bạn có thể tải bản sao mới nhất của Cronet từ Dịch vụ Google Play. Bạn có thể không còn lo ngại về kích thước APK, mặc dù các thiết bị không cài đặt GMSCore mới nhất có thể vẫn ưu tiên sử dụng OkHttp.