[TOC] --- ## build.gradle 新增GRPC套件 ``` groovy plugins { id 'org.springframework.boot' id 'io.spring.dependency-management' id 'java' id 'com.google.protobuf' } ... ... dependencies { ... implementation 'io.github.lognet:grpc-spring-boot-starter' ... } protobuf { protoc { artifact = "com.google.protobuf:protoc:3.23.2" } plugins { grpc { artifact = "io.grpc:protoc-gen-grpc-java:1.55.1" } } generateProtoTasks { all()*.plugins { grpc {} } } } sourceSets { main { java { srcDirs 'build/generated/source/proto/main/grpc' srcDirs 'build/generated/source/proto/main/java' } } } ``` --- ## Add proto file 路徑在 ``` src/main/proto ``` 這邊我們新增一個helloworld.proto ``` proto3 syntax = "proto3"; option java_multiple_files = true; option java_package = "helloworld"; package helloworld; service GreetingService { rpc SayHello (RequestMessage) returns (ResponseMessage) {} } message RequestMessage { string name = 1; } message ResponseMessage { string message = 1; } ``` 接下來將proto build成java檔 ``` gradle ./gradlew clean build ``` --- ## Add GRPCService ``` java package web.grpc.controller; import org.lognet.springboot.grpc.GRpcService; import org.springframework.beans.factory.annotation.Autowired; import helloworld.GreetingServiceGrpc; import helloworld.RequestMessage; import helloworld.ResponseMessage; import io.grpc.stub.StreamObserver; import web.service.TestService; @GRpcService public class GreetingController extends GreetingServiceGrpc.GreetingServiceImplBase { @Autowired private TestService testService; @Override public void sayHello(RequestMessage req, StreamObserver<ResponseMessage> responseObserver) { ResponseMessage reply = ResponseMessage.newBuilder() .setMessage("Hello " + req.getName() + ", from server").build(); responseObserver.onNext(reply); responseObserver.onCompleted(); } } ``` --- ## Add Test code ``` java @PostMapping("testGrpc.do") @ResponseBody public ApiResult testGrpc() throws InterruptedException { Map<String,Object> returnMap = new HashMap<>(); final ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 6565) .usePlaintext() .build(); RequestMessage request = RequestMessage.newBuilder().setName("Himanshu").build(); ResponseMessage response; try { response = GreetingServiceGrpc.newBlockingStub(channel).sayHello(request); System.out.println(response.getMessage()); } catch (StatusRuntimeException e) { e.printStackTrace(); } finally { channel.shutdownNow().awaitTermination(5, TimeUnit.SECONDS); } return ApiResult.builder(ApiResult.ReturnCode.SUCC).setData(returnMap); } ``` ---