【Grpc(二)】兩種stub, 四種模式(unary,客戶端stream,服務端strea)示例

protobuff定義:

syntax = "proto3";

package com.liyao;

option java_package = "com.liyao.protobuf.test.service";
option java_outer_classname = "MyServiceProto";
option java_multiple_files = true;

message MyRequest {
    repeated uint32 keys = 1;
}

message MyResponse {
    string value = 1;
}

service MyService {
    rpc GetByKey (MyRequest) returns (MyResponse);
    rpc GetByKeyServerStream (MyRequest) returns (stream MyResponse);
    rpc GetByKeyClientStream (stream MyRequest) returns (MyResponse);
    rpc GetByKeyBiStream (stream MyRequest) returns (stream MyResponse);
}

服務比較簡單,請求包含一個int的list,返回對應的key。

服務端實現類:

public class MyRpcServiceImpl extends MyServiceGrpc.MyServiceImplBase {

    private final Map<Integer, String> map = ImmutableMap.<Integer, String>builder()
            .put(1, "v1")
            .put(2, "v2")
            .put(3, "v3")
            .put(4, "v4")
            .put(5, "v5")
            .build();

    @Override
    public void getByKey(MyRequest request, StreamObserver<MyResponse> responseObserver) {
        int key = request.getKeys(0);
        String value = map.getOrDefault(key, "null");

        responseObserver.onNext(MyResponse.newBuilder().setValue(value).build());
        responseObserver.onCompleted();
    }

    @Override
    public void getByKeyServerStream(MyRequest request, StreamObserver<MyResponse> responseObserver) {
        for (int key : request.getKeysList()) {
            String value = map.getOrDefault(key, "null");
            responseObserver.onNext(MyResponse.newBuilder().setValue(value).build());
        }
        responseObserver.onCompleted();
    }

    @Override
    public StreamObserver<MyRequest> getByKeyClientStream(StreamObserver<MyResponse> responseObserver) {
        return new StreamObserver<MyRequest>() {
            String values = "";
            @Override
            public void onNext(MyRequest myRequest) {
                int key = myRequest.getKeys(0);
                values += map.getOrDefault(key, "null");
            }

            @Override
            public void onError(Throwable throwable) {

            }

            @Override
            public void onCompleted() {
                responseObserver.onNext(MyResponse.newBuilder().setValue(values).build());
                responseObserver.onCompleted();
            }
        };
    }

    @Override
    public StreamObserver<MyRequest> getByKeyBiStream(StreamObserver<MyResponse> responseObserver) {
        return new StreamObserver<MyRequest>() {
            @Override
            public void onNext(MyRequest myRequest) {
                int key = myRequest.getKeys(0);
                String value = map.getOrDefault(key, "null");
                responseObserver.onNext(MyResponse.newBuilder().setValue(value).build());
            }

            @Override
            public void onError(Throwable throwable) {

            }

            @Override
            public void onCompleted() {
                responseObserver.onCompleted();
            }
        };
    }
}

服務端啓動類:

public class RpcServer {
    public static final int port = 8088;

    public static void main( String[] args ) throws IOException, InterruptedException {
        MyRpcServiceImpl service = new MyRpcServiceImpl();
        Server server = io.grpc.ServerBuilder
                .forPort(port)
                .addService(service)
                .build();
        server.start();
        server.awaitTermination();
    }
}

客戶端啓動類:

public class RpcClient {
    private static ManagedChannel channel = ManagedChannelBuilder
            .forAddress("127.0.0.1", RpcServer.port)
            .usePlaintext()
            .build();

    private static MyServiceGrpc.MyServiceBlockingStub blockingStub = MyServiceGrpc.newBlockingStub(channel);
    private static MyServiceGrpc.MyServiceStub asyncStub = MyServiceGrpc.newStub(channel);

    private static final StreamObserver<MyResponse> responseObserver = new StreamObserver<MyResponse>() {
        @Override
        public void onNext(MyResponse response) {
            System.out.println("receive: " + response.getValue());
        }

        @Override
        public void onError(Throwable t) {
            System.out.println("error");
        }

        @Override
        public void onCompleted() {
            System.out.println("completed");
        }
    };

    public static void main(String[] args) throws InterruptedException {
        simpleSync();
        simpleAsync();
        serverStreamSync();
        serverStreamAsync();
        clientStream();
        biStream();

        Thread.sleep(100000);
    }

    private static void simpleSync() {
        MyRequest request = MyRequest.newBuilder()
                .addKeys(1)
                .build();
        String value = blockingStub.getByKey(request).getValue();
        System.out.println(value);
    }

    private static void simpleAsync() {
        MyRequest request = MyRequest.newBuilder()
                .addKeys(1)
                .build();
        asyncStub.getByKey(request, responseObserver);
    }

    private static void serverStreamSync() {
        MyRequest request = MyRequest.newBuilder()
                .addKeys(1)
                .addKeys(2)
                .addKeys(3)
                .build();
        Iterator<MyResponse> itr = blockingStub.getByKeyServerStream(request);
        while (itr.hasNext()) {
            System.out.println(itr.next());
        }
    }

    private static void serverStreamAsync() {
        MyRequest request = MyRequest.newBuilder()
                .addKeys(1)
                .addKeys(2)
                .addKeys(3)
                .build();
        asyncStub.getByKeyServerStream(request, responseObserver);
    }

    private static void clientStream() {
        StreamObserver<MyRequest> requestData = asyncStub.getByKeyClientStream(responseObserver);
        for (int i = 1; i <= 5; i++) {
            requestData.onNext(MyRequest.newBuilder().addKeys(i).build());
        }
        requestData.onCompleted();
    }

    private static void biStream() {
        StreamObserver<MyRequest> requestData = asyncStub.getByKeyBiStream(responseObserver);
        for (int i = 1; i <= 5; i++) {
            requestData.onNext(MyRequest.newBuilder().addKeys(i).build());
        }
        requestData.onCompleted();
    }
}

對於同步stub,只能調用unary以及服務端stream的方法;對於異步stub,可以調用任意方法;

unary以及服務端stream寫法比較簡單;對於客戶端stream的情況,需要在構建請求參數的observer。

更具體的見https://blog.csdn.net/u010900754/article/details/106203724

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章