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

}

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

grpc使用客户端技巧的更多相关文章

  1. gRPC java 客户端,服务器端通讯使用json格式

    使用 protobuf 作为通讯内容序列化的简单例子请看:http://www.cnblogs.com/ghj1976/p/5458176.html . 本文是使用 json 做为内容序列化的简单例子 ...

  2. grpc协议--客户端构造

    由于服务端不在构造,已经构造完成不做构造 gRPC 接口名字为service,proto文件内有定义 1.本目录生成grpc文件 python -m grpc_tools.protoc -I. --p ...

  3. Go gRPC教程-客户端流式RPC(四)

    前言 上一篇介绍了服务端流式RPC,客户端发送请求到服务器,拿到一个流去读取返回的消息序列. 客户端读取返回的流的数据.本篇将介绍客户端流式RPC. 客户端流式RPC:与服务端流式RPC相反,客户端不 ...

  4. GRpc添加客户端的四种方式

    随着微服务的发展,相信越来越多的.net人员也开始接触GRpc这门技术,大家生成GRpc客户端的方式也各不相同,今天给大家介绍一下依据Proto文件生成Rpc客户端的四种方式 前提:需要安装4个Nug ...

  5. gRPC(2):客户端创建和调用原理

    1. gRPC 客户端创建流程 1.1 背景 gRPC 是在 HTTP/2 之上实现的 RPC 框架,HTTP/2 是第 7 层(应用层)协议,它运行在 TCP(第 4 层 - 传输层)协议之上,相比 ...

  6. ASP.NET Core 3.0 使用gRPC

    一.简介 gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建.它使用HTTP/2作为通信协 ...

  7. google多语言通信框架gRPC

    google多语言通信框架gRPC系列(一)概述 gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找 ...

  8. 初识google多语言通信框架gRPC系列(一)概述

    gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找多平台多语言的通信框架,微软的WCF框架很强大和灵 ...

  9. grpc介绍

    grpc入门(一) 一.什么是grpc grpc是谷歌开源的一款高性能的rpc框架 (https://grpc.io),可以使用protocol buffers作为IDL(Interface Defi ...

随机推荐

  1. Check Box、Radio Button、Combo Box控件使用

    Check Box.Radio Button.Combo Box控件使用 使用控件的方法 1.拖动控件到对话框 2. 定义控件对应的变量(值变量或者控件变量) 3.响应控件各种消息 Check Box ...

  2. 001_a记录和canme的区别

    1.什么是域名解析? 域名解析就是国际域名或者国内域名以及中文域名等域名申请后做的到IP地址的转换过程.IP地址是网路上标识您站点的数字地址,为了简单好记,采用域名来代替ip地址标识站点地址.域名的解 ...

  3. centos6.5环境搭建openvp服务器及windows客户端搭建及配置详解

    1.环境搭建 说明: vpn client 192.168.8.16/24 openvpn server: eth0: 192.168.8.41 eth1: 172.16.1.10 app serve ...

  4. Go语言规格说明书 之 结构体类型(Struct types)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...

  5. wordpress更换主题未能连接到FTP服务器

    报错原因:由于你的 WordPress 所在的目录没有写入权限,而wordpress安装主题或者更新时,企图通过ftp帐号进行更新,所以无法完成安装或更新 解决办法: 找到wp-config.php文 ...

  6. PYTHON-操作系统基础-2-练习

    #===============================================# # 1.简述cpu.内存.硬盘的作用# cpu是人的大脑,负责控制全身和运算# 内存是人的记忆,负责 ...

  7. as无法在vivo上安装程序解决

    1. vivo手机真的很麻烦,首先要确定vivo账号密码,允许安装后还一直失败.记录下解决方案 在工程目录的gradle.properties中添加android.injected.testOnly ...

  8. [Android四大组件之二]——Service

    Service是Android中四大组件之一,在Android开发中起到非常重要的作用,它运行在后台,不与用户进行交互. 1.Service的继承关系: java.lang.Object → andr ...

  9. Windows不能在本地计算机启动MongoDB,错误代码 100

    今天在计算机上面启动MongoDB时,直接给我报错,Windows不能在本地计算机启动MongoDB,服务错误代码 100. 这种问题解决方法是: 找到data文件夹db下面的mongod.lock文 ...

  10. PHP 发送HTTP请求的几种方式

    1.curl仍然是最好的HTTP库,没有之一. 可以解决任何复杂的应用场景中的HTTP 请求2. 文件流式的HTTP请求比较适合处理简单的HTTP POST/GET请求,但不适用于复杂的HTTP请求3 ...