Trong bài viết trước, sau khi hiện thực gRPC server, mình đã sử dụng Postman để call tới các service của gRPC server. Nếu sử dụng code thì chúng ta phải làm như thế nào? Trong bài viết này, mình sẽ hướng dẫn các bạn làm điều này các bạn nhé!
Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:
Ứng dụng ví dụ này của mình sẽ consume HelloService mà mình đã hiện thực trong bài viết trước nha các bạn!
gRPC sử dụng khái niệm channel để tạo connection tới gRPC server, các client application sẽ sử dụng channel để tạo các stub dùng để tương tác với gRPC server. Khi sử dụng Protocol Buffers Maven Plugin để generate Java code từ tập tin service contract .proto, plugin này cũng generate các class Stub và chúng ta có thể sử dụng những class Stub này để giao tiếp với gRPC server.
Cho ví dụ của bài viết này, mình cũng sử dụng tập tin service contract .proto và cấu hình Protocol Buffers Maven plugin như bài viết trước.
Các class Stub mà Protocol Buffers Maven Plugin generate nằm trong class HelloServiceGrpc đó các bạn:
Bây giờ, để consume HelloService của gRPC server trong bài viết trước, chúng ta sẽ khởi tạo đối tượng channel sử dụng thông tin host, port của gRPC server trước:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com.huongdanjava.grpc; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; public class Application { public static void main(String[] args) { ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080) .usePlaintext() .build(); } } |
Class ManagedChannel implement interface Channel của gRPC Java và chúng ta sử dụng class ManagedChannelBuilder để tạo đối tượng của class ManagedChannel.
Mặc định thì gRPC channel sẽ sử dụng secure connection để connect tới gRPC server, các bạn có thể cấu hình sử dụng plaintext bằng cách sử dụng phương thức usePlaintext() của class ManagedChannelBuilder.
gRPC hỗ trợ việc call synchronous và asynchronous tới gRPC server. Synchronous thì client sẽ call gRPC server và đợi response còn asynchronous thì response sẽ trả về asynchronously. Tương ứng với 2 cơ chế call thì chúng ta sẽ có các class Stub tương ứng. Cho ví dụ của mình thì các bạn có thể sử dụng class HelloServiceBlockingStub để call tới gRPC server synchronously, còn nếu muốn sử dụng asynchronous thì các bạn có thể sử dụng class HelloServiceStub các bạn nhé!
Mình sẽ sử dụng synchronous như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package com.huongdanjava.grpc; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; public class Application { public static void main(String[] args) { ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080) .usePlaintext() .build(); HelloServiceGrpc.HelloServiceBlockingStub stub = HelloServiceGrpc.newBlockingStub(channel); HelloResponse helloResponse = stub.hello(HelloRequest.newBuilder() .setName("Khanh") .build()); System.out.println(helloResponse.getMessage()); channel.shutdown(); } } |
Chúng ta sẽ tạo synchronous stub sử dụng phương thức static newBlockingStub() của class HelloServiceGrpc. Tham số của phương thức newBlockingStub() này là channel tới gRPC server mà chúng ta cần tương tác.
Sau khi đã có đối tượng stub thì giờ chúng ta có thể call operation hello của gRPC server sử dụng đối tượng stub này. Chúng ta sẽ build request message và nhận response message từ gRPC server.
Kết quả khi mình chạy ví dụ này như sau:
Như vậy là chúng ta đã consume thành công hello operation của gRPC server rồi đó các bạn!