grpc使用客户端技巧

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

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

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

  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();
        }
    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JMCui

项目工具类

一、前言     在工作中,难免遇到各种各样的问题,每个人似乎都有一套自己的解决方案。而我,又不想每次解决完问题就把东西扔了,捡了芝麻,丢了西瓜,什么时候才能进...

3596
来自专栏码匠的流水账

聊聊sentinel的SimpleHttpCommandCenter

sentinel-transport-simple-http-0.1.1-sources.jar!/com/alibaba/csp/sentinel/trans...

441
来自专栏码匠的流水账

聊聊springboot的HeapDumpWebEndpoint

spring-boot-actuator-autoconfigure-2.0.1.RELEASE-sources.jar!/org/springframewor...

311
来自专栏码匠的流水账

聊聊SecurityContextPersistenceFilter

本文主要研究下SecurityContextPersistenceFilter的作用。

492
来自专栏不想当开发的产品不是好测试

MD5 in JAVA

using Apache Commons 需要引入org.apache.commons.codec.digest.DigestUtils这个包,pom.xml文...

18410
来自专栏积累沉淀

研究MapReduce源码之实现自定义LineRecordReader完成多行读取文件内容

TextInputFormat是Hadoop默认的数据输入格式,但是它只能一行一行的读记录,如果要读取多行怎么办? 很简单 自己写一个输入格式,然后写一个对...

1729
来自专栏小尘哥的专栏

springboot使用rabbitMQ(带回调)

配置文件2:RabbitConstants(主要用于用户名、密码等值从配置文件获取,也可以用@Value方式)

636
来自专栏向治洪

android之listview缓存图片(缓存优化)

网上关于这个方面的文章也不少,基本的思路是线程+缓存来解决。下面提出一些优化: 1、采用线程池 2、内存缓存+文件缓存 3、内存缓存中网上很多是采用SoftRe...

2499
来自专栏码匠的流水账

聊聊springboot session timeout参数设置

本文主要介绍下spring boot中对session timeout参数值的设置过程。

1162
来自专栏Android开发指南

5.AsyncHttp、post

2737

扫码关注云+社区