• grpc使用客户端技巧


      grpc 使用技巧,最近在做的项目是服务端是go语言提供服务使用的是grpc框架。

    java在实现客户端的时候,参数的生成大部分采用创建者模式。java在接受go服务端

    返回数据的时候,更多的是通过parseFrom形式来创建。

      go 服务端 java 客户端 proto 文件要有些差异,见文章 https://learnku.com/articles/36922?order_by=created_at&   

      demo样例:

      

    import com.google.protobuf.ByteString;
    import com.google.protobuf.Descriptors;
    import com.google.protobuf.InvalidProtocolBufferException;
    import io.grpc.ManagedChannel;
    import io.grpc.ManagedChannelBuilder;
    import io.grpc.StatusRuntimeException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import pino.RequestInstance2;
    import pino.grpc.routeguide.*;
    import pino.pino_resp_pb;

    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.concurrent.TimeUnit;

    /**
    * Created  on 2017/5/4.
    */
    public class PinoClient {

    public static final RequestInstance2.FeatureGroup.Builder BUILDER_FEATURE = RequestInstance2.RequestInstance.newBuilder().getCommonFeature().toBuilder();
    protected static final Logger logger = LoggerFactory.getLogger("file_logger");

    private final ManagedChannel channel;
    private final RouteGuideGrpc.RouteGuideBlockingStub blockingStub;

    /** Construct client connecting to HelloWorld server at {@code host:port}. */
    public PinoClient(String host, int port) {
    this(ManagedChannelBuilder.forAddress(host, port)
    // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
    // needing certificates.
    .usePlaintext(true));
    }

    /** Construct client for accessing RouteGuide server using the existing channel. */
    PinoClient(ManagedChannelBuilder<?> channelBuilder) {
    channel = channelBuilder.build();
    blockingStub = RouteGuideGrpc.newBlockingStub(channel);
    }

    public void shutdown() throws InterruptedException {
    channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
    }

    /** call pino to server. */
    public Double callPino(double[] arr) {
    if(logger.isInfoEnabled())
    logger.info("start pino...");

    if(arr==null)
    return 0d;

    RequestInstance2.Feature feature1 = RequestInstance2.RequestInstance.newBuilder()
    .getCommonFeature().toBuilder().addFeaturesBuilder(0).setName("1").setSValue(String.valueOf(arr[0])).build();
    RequestInstance2.Feature feature2 = RequestInstance2.RequestInstance.newBuilder()
    .getCommonFeature().toBuilder().addFeaturesBuilder(0).setName("2").setSValue(String.valueOf(arr[1])).build();
    RequestInstance2.Feature feature3 = RequestInstance2.RequestInstance.newBuilder()
    .getCommonFeature().toBuilder().addFeaturesBuilder(0).setName("3").setSValue(String.valueOf(arr[2])).build();
    RequestInstance2.Feature feature4 = RequestInstance2.RequestInstance.newBuilder()
    .getCommonFeature().toBuilder().addFeaturesBuilder(0).setName("4").setSValue(String.valueOf(arr[3])).build();
    RequestInstance2.Feature feature5 = RequestInstance2.RequestInstance.newBuilder()
    .getCommonFeature().toBuilder().addFeaturesBuilder(0).setName("5").setSValue(String.valueOf(arr[4])).build();
    RequestInstance2.Feature feature6 = RequestInstance2.RequestInstance.newBuilder()
    .getCommonFeature().toBuilder().addFeaturesBuilder(0).setName("6").setSValue(String.valueOf(arr[5])).build();
    RequestInstance2.Feature feature7 = RequestInstance2.RequestInstance.newBuilder()
    .getCommonFeature().toBuilder().addFeaturesBuilder(0).setName("7").setSValue(String.valueOf(arr[6])).build();
    RequestInstance2.Feature feature8 = RequestInstance2.RequestInstance.newBuilder()
    .getCommonFeature().toBuilder().addFeaturesBuilder(0).setName("8").setSValue(String.valueOf(arr[7])).build();
    RequestInstance2.Feature feature9 = RequestInstance2.RequestInstance.newBuilder()
    .getCommonFeature().toBuilder().addFeaturesBuilder(0).setName("9").setSValue(String.valueOf(arr[8])).build();
    RequestInstance2.Feature feature10 = RequestInstance2.RequestInstance.newBuilder()
    .getCommonFeature().toBuilder().addFeaturesBuilder(0).setName("10").setSValue(String.valueOf(arr[9])).build();
    RequestInstance2.Feature feature11 = RequestInstance2.RequestInstance.newBuilder()
    .getCommonFeature().toBuilder().addFeaturesBuilder(0).setName("11").setSValue(String.valueOf(arr[10])).build();


    RequestInstance2.RequestInstance.Builder builder = RequestInstance2.RequestInstance.newBuilder()
    .addInstanceFeature(0, RequestInstance2.RequestInstance.newBuilder()
    .getCommonFeature().toBuilder()
    .addFeatures(0,feature1)
    .addFeatures(1,feature2)
    .addFeatures(2,feature3)
    .addFeatures(3,feature4)
    .addFeatures(4,feature5)
    .addFeatures(5,feature6)
    .addFeatures(6,feature7)
    .addFeatures(7,feature8)
    .addFeatures(8,feature9)
    .addFeatures(9,feature10)
    .addFeatures(10,feature11)
    );

    RequestInstance2.RequestInstance instance = builder.build();
    byte[] bytes = instance.toByteArray();
    ByteString bs = ByteString.copyFrom(bytes);

    InputHead inputHead = InputHead.getDefaultInstance().toBuilder().setVersion(20).setBodySize(bs.size()).addAppKeys(0).setAppKeys(0, 85001).build();
    Request request = Request.getDefaultInstance().toBuilder().setHead(inputHead).setBody(bs).build();

    Response response = null;
    try {
    response = blockingStub.getPredictorValue(request);
    } catch (StatusRuntimeException e) {
    logger.error("RPC failed: "+ e.getStatus());
    return 0d;
    }
    double value = 0d;
    if(response!=null){

    ByteString tempBytes = response.getBody();
    try {
    pino_resp_pb.Resp resp = pino_resp_pb.Resp.parseFrom(tempBytes);

    if(resp.getOutputCount()>0){
    pino_resp_pb.Output output = resp.getOutput(0);

    pino_resp_pb.Matrix matrix = output.getMatrix();
    if(matrix!=null&&matrix.getDoubleValCount()>0)
    value = matrix.getDoubleVal(0);
    }

    System.out.println(value);
    } catch (InvalidProtocolBufferException e) {
    logger.error(e.getMessage(),e);
    }
    }

    if(logger.isInfoEnabled())
    logger.info("end pino.");
    return value;
    }

    /**
    * Greet server. If provided, the first element of {@code args} is the name to use in the
    * greeting.
    */
    public static void main(String[] args) throws Exception {
    PinoClient client = new PinoClient("10.187.81.155", 80);

    try {
    /* Access a service running on the local machine on port 50051 */
    String user = "world";
    if (args.length > 0) {
    user = args[0]; /* Use the arg as the name to greet if provided */
    }
    double[] features = {52.9186,4.2,0.0,0,0.03168337,8.771171,54.85312,0,0,0,0};
    double[] features2 = {52.9186,4.2,0.0,0,0.03168337,8.771171,54.85312,0,0.03168337,8.771171,54.85312};
    for(int i=0;i<10;i++){
    client.callPino(features);
    client.callPino(features2);
    }
    } finally {
    client.shutdown();
    }
    }

    }

    可以关注我的公众账户 互联网开发者Club,公众账户分享个性化推荐,搜索,分布式架构,高性能,高可用

  • 相关阅读:
    hdu 2639 Bone Collector II
    文件打包bundle
    iOS UITextField垂直居中
    Mac删除废纸篓中的单一文件和文件夹
    Swift 初见
    关于 Swift
    NSString和NSDate的转换
    iOS开发之iOS7设置状态栏字体颜色
    在当前界面中隐藏状态栏
    适合所有测试人员读的书籍
  • 原文地址:https://www.cnblogs.com/freedommovie/p/6821845.html
Copyright © 2020-2023  润新知