Skip to content

Tạo project sử dụng gRPC

Mục lục:

  1. Cài đặt dependency và plugin bằng Maven
  2. Tạo tệp tin.proto
  3. Dùng plugin để generate code
  4. Copy code vừa sinh vào project

Tạo tệp tin .proto

Cấu tạo một tệp tin .proto tại src/java/proto/như sau.

syntax = "proto3"; // Quy định cú pháp theo syntax 3

option java_multiple_files = true; // Option sinh ra nhiều file 
option java_package = "vn.edu.siu.ailab.grpc.proto"; // Đây là tên của package mà chúng ta dự định sinh code vào. 
option java_outer_classname = "GreetingProto"; // Tên của các tệ

// Tên của service gRPC sẽ sinh ra.
// Một service sẽ có nhiều định dạng request và reply khác nhau. 
service Greeter {
    // Sends a greeting
    rpc SayHello (HelloRequest) returns (HelloReply) {
    }
}

// The request message containing the user's name.
message HelloRequest {
    string name = 1;
}

// The response message containing the greetings
message HelloReply {
    string message = 1;
}

Trong ví dụ này là một service SayHello đơn giản, với 1 request thì phản hồi 1 reply. Các ví dụ khác xem thêm tại https://github.com/grpc/grpc-java/blob/master/examples/src/main/proto/route_guide.proto

Một số trường hợp có định dạng phản hồi khác: - Request: 1 chuỗi đối tượng --> Reply: 1 đối tượng

// A server-to-client streaming RPC.
rpc RecordRoute(stream HelloRequest) returns (HelloReply) {}

  • Request: 1 đối tượng --> Reply: 1 chuỗi đối tượng

    // A client-to-server streaming RPC.
    rpc ListFeatures(HelloRequest) returns (stream HelloReply) {}
    

  • Request: 1 chuỗi đối tượng --> Reply: 1 chuỗi đối tượng

    // A Bidirectional streaming RPC.
    rpc RouteChat(stream HelloRequest) returns (stream HelloReply) {}
    

Dùng plugin để generate code

Để sinh code dựa trên khai báo .proto ở bước trên, ta cần cài đặt maven như sau:

<build>
  <extensions>
    <extension>
      <groupId>kr.motd.maven</groupId>
      <artifactId>os-maven-plugin</artifactId>
      <version>1.6.2</version>
    </extension>
  </extensions>
  <plugins>
    <plugin>
      <groupId>org.xolstice.maven.plugins</groupId>
      <artifactId>protobuf-maven-plugin</artifactId>
      <version>0.6.1</version>
      <configuration>
        <protocArtifact>com.google.protobuf:protoc:3.19.2:exe:${os.detected.classifier}</protocArtifact>
        <pluginId>grpc-java</pluginId>
        <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.47.0:exe:${os.detected.classifier}</pluginArtifact>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>compile</goal>
            <goal>compile-custom</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Sau khi setup xong maven, thực thi build project này bằng lệnh: mvn clean install

Copy code vừa sinh vào project

Sau khi maven build và compile project, ta kiêm tra tại đường dẫn target/generated-resources/proto: (kiểm tra lại) Lúc này đã có các tệp tin .java như sau được sinh ra, điều ta cầ làm là copy chúng vào lại folder theo package đã define trong tệp tin .proto:

image-to-show

Tiếp tục tìm tại thư mục target/generated-resources/proto, tìm thấy tệp tin GreeterGrpc.java. Ta copy tệp tin .java này sang src/main/java/... của project.

Như vậy, việc generate code trên tệp tin .proto đã hoàn thành. Ta có thể tiếp tục lập trình bằng java thông qua việc kế thừa lại class GreeterGrpc.GreeterImplBase, ví dụ như custom câu trả về, kết nối CSDL,v.v...

Ví dụ về việc kế thừa để ứng dụng bằng java như sau:

package vn.edu.siu.ailab.grpc.service;

import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService; 
import vn.edu.siu.ailab.grpc.proto.HelloRequest; //proto ta generate ra
import vn.edu.siu.ailab.grpc.proto.HelloReply; //proto ta generate ra

@GrpcService //annotation của dịch gRPC
public class CustomGreeterImpl extends GreeterGrpc.GreeterImplBase  { // đối tượng GreeterGrpc.GreeterImplBase do ta generate ra
    @Override
    public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
        String message = request.getName();
        System.out.println("Received Message from: " + message);


        HelloReply greetingResponse = HelloReply.newBuilder()
                .setMessage("Received your " + message + ". Hello From Server. ")
                .build();

        responseObserver.onNext(greetingResponse);
        responseObserver.onCompleted();
    }
}

Ghi chú:

Vì project lúc này sẽ bao gồm việc generate, ta có thể cân nhắc tổ chức module service-proto phục vụ generate code như một module thuộc project lớn. Tham khảo cách tổ chức tại repo này: https://github.com/TechPrimers/grpc-spring-boot-example