前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >grpc使用客户端技巧

grpc使用客户端技巧

作者头像
杉枫
发布2018-01-03 14:48:40
2.4K0
发布2018-01-03 14:48:40
举报

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

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

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

  demo样例:

代码语言:txt
复制
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();
        }
    }

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-05-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档