Remote Procedure Call (RPC) là một giao thức cho phép một chương trình (client) gọi một hàm hoặc thủ tục trên một máy chủ từ xa như thể nó đang gọi hàm cục bộ. RPC ẩn giấu các chi tiết của giao tiếp mạng, giúp các nhà phát triển dễ dàng tích hợp và sử dụng các dịch vụ từ xa.
Giả sử bạn có một dịch vụ tính toán trên server và bạn muốn sử dụng nó từ client.
Server (Python):
from xmlrpc.server import SimpleXMLRPCServer def add(x, y): return x + y server = SimpleXMLRPCServer(("localhost", 8000)) print("Server đang chạy trên cổng 8000...") server.register_function(add, "add") server.serve_forever()
Client (Python):
import xmlrpc.client client = xmlrpc.client.ServerProxy("http://localhost:8000/") result = client.add(5, 3) print(f"Kết quả là: {result}")
Trong ví dụ này, client gọi hàm add
trên server để thực hiện phép cộng. Kết quả sẽ được trả về cho client.
gRPC là một phiên bản nâng cao của RPC, được phát triển bởi Google. Nó sử dụng HTTP/2 để truyền tải và Protocol Buffers (protobuf) làm ngôn ngữ định nghĩa dịch vụ. gRPC cho phép xây dựng các dịch vụ có khả năng tương tác với nhau một cách hiệu quả, nhanh chóng và dễ dàng.
.proto
sử dụng Protocol Buffers..proto
.syntax = "proto3"; package calculator; // Định nghĩa dịch vụ Calculator service Calculator { rpc Add (AddRequest) returns (AddResponse); } // Định nghĩa các message message AddRequest { int32 x = 1; int32 y = 2; } message AddResponse { int32 result = 1; }
Chạy lệnh sau để tạo mã nguồn cho Python (cần cài đặt gRPC):
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. calculator.proto
import grpc from concurrent import futures import calculator_pb2 import calculator_pb2_grpc class Calculator(calculator_pb2_grpc.CalculatorServicer): def Add(self, request, context): result = request.x + request.y return calculator_pb2.AddResponse(result=result) def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) calculator_pb2_grpc.add_CalculatorServicer_to_server(Calculator(), server) server.add_insecure_port('[::]:50051') server.start() print("Server đang chạy trên cổng 50051...") server.wait_for_termination() if __name__ == '__main__': serve()
import grpc import calculator_pb2 import calculator_pb2_grpc def run(): with grpc.insecure_channel('localhost:50051') as channel: stub = calculator_pb2_grpc.CalculatorStub(channel) response = stub.Add(calculator_pb2.AddRequest(x=5, y=3)) print(f"Kết quả là: {response.result}") if __name__ == '__main__': run()
RPC và gRPC đều là những công nghệ mạnh mẽ cho việc phát triển các ứng dụng phân tán. RPC cung cấp cách tiếp cận đơn giản để gọi các hàm từ xa, trong khi gRPC mang đến hiệu suất cao hơn và khả năng mở rộng tốt hơn. gRPC, với sự hỗ trợ của HTTP/2 và Protocol Buffers, giúp tối ưu hóa hiệu suất và trải nghiệm lập trình viên.
Việc lựa chọn giữa hai công nghệ này phụ thuộc vào nhu cầu cụ thể của ứng dụng, yêu cầu về hiệu suất và khả năng tương tác giữa các dịch vụ.