首页 > 其他分享 >grpc - 使用

grpc - 使用

时间:2022-10-19 13:55:54浏览次数:81  
标签:protobuf grpc grpcPort 使用 com public TestResult

GRPC - 使用

protobuf

定义protobuf,并将protobuf文件,通过java的plugin打包生成java-grpc相关文件。参照:grpc-protobuf

mvn依赖

<dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java-util</artifactId>
            <version>3.21.7</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty-shaded</artifactId>
            <version>1.30.0</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-protobuf</artifactId>
            <version>1.30.0</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-stub</artifactId>
            <version>1.30.0</version>
        </dependency>

grpc-server:

@Component
public class GrpcServer extends TestServiceGrpc.TestServiceImplBase implements InitializingBean {

    @Value("${grpc-port}")
    private int grpcPort;

    @Override
    public void searchUser(TestInfo request, StreamObserver<TestResult> responseObserver) {
        TestResult result = TestResult.newBuilder().setCode("123").setMsg("testOK").build();
        log.info(String.valueOf(request));
        responseObserver.onNext(result);
        responseObserver.onCompleted();
    }


    @Override
    public void afterPropertiesSet() throws Exception {
        grpcPort=9099;
        ServerBuilder.forPort(grpcPort)
                .addService(new GrpcServer())
                .build()
                .start();

    }
}

grpc-client:

@Component
public class GrpcClient {

        private Channel channel = channel();

        @Value("${grpcIp:127.0.0.1}")
        private String grpcIp;

        @Value("${grpcPort:9099}")
        private int grpcPort;


        public TestResult run(TestInfo testInfo) {
            TestServiceGrpc.TestBlockingStub serviceStub = TestServiceGrpc.newBlockingStub(channel);

            TestResult testResult = serviceStub.searchUser(testInfo);
            return testResult;
        }

    /**
     * Channel
     * @return
     */
    private Channel channel() {
            grpcIp="127.0.0.1";
            grpcPort=9099;
            return ManagedChannelBuilder.forAddress(grpcIp,grpcPort).usePlaintext().build();
        }

    }

Test试用

@RestController
@RequestMapping("/grpc")
public class TestGrpcController {

    @Autowired
    GrpcClient grpcClient;

    @RequestMapping("/test")
    public String grpcTest(){
        TestInfo testInfo = TestInfo.newBuilder().setCode("AAAA").build();
        TestResult testResult = grpcClient.run(testInfo);
        String json = null;
        try {
            json = JsonFormat.printer().print(testResult);
            //JsonFormat.parser().merge(json, TestInfo.newBuilder());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
        return json;
    }

异常

1. io.grpc.netty.shaded.io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record:

因client端采用TLS访问,而服务端默认是PlainText返回信息。

2. Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com.google.protobuf.UnknownFieldSet$Parser]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.google.protobuf.UnknownFieldSet$Parser and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.yumchina.share.app.auth.hub.test.proto.AuthResult["unknownFields"]->com.google.protobuf.UnknownFieldSet["parserForType"])
因grpc产生的对象,不具备set方法,因此无法直接jackson序列化返回。需要引入protobuf-java-util工具类。

标签:protobuf,grpc,grpcPort,使用,com,public,TestResult
From: https://www.cnblogs.com/DennyZhao/p/16805967.html

相关文章

  • NModbus4的使用
    NModbus4的使用 目录步骤1:打开串口步骤二:创建ModbusSerialMaster,设置超时参数步骤三:设置协议参数,开始读写可选步骤四:以asyncawait方式读写 回到顶部步......
  • Java Lambda 表达式的各种形态和使用场景,看这篇就够了
    Lambda表达式是Java8中添加的功能。引入Lambda表达式的主要目的是为了让Java支持函数式编程。Lambda表达式是一个可以在不属于任何类的情况下创建的函数,并且可以......
  • mysql使用load data infile导入数据
    做阿里天池编程题时候,需要导入sql数据,但是sql数据很大,总共有2g多。  由于没怎么做过运维,不会搞大批量数据的导入,就把里面的sql复制粘贴出来,然后粘贴到sqlyog里面慢慢......
  • 使用Kong网关API接口配置
    一、Upstream1、创建Upstream:curl-i-XPOSTIPAddress:8001/upstreams-d'name=upstream-test'-d'slots=1000'2、创建Targets目标地址并且关联Upstream:curl-i-XPO......
  • VUE3.0 中如何使用SVG图标
    1.文件下新建SvgIcon文件夹以及子文件index.js,index.vue,svg文件夹(用于存放svg图片) 2.编写index.vue组件<template><svg:class="svgClass"aria-hidden="true">......
  • DataSet与DataLoaders使用教程
    title:DataSet与DataLoaders使用教程mathjax:truedate:2022-10-0409:13:43tags:DataSetDataLoaderDataSet与DataLoaders使用教程4、PyTorch的Dataset与Data......
  • dict字典的基本使用
    字典dict字典是一个非线性结构,是key-value组成的键值对的数据集合。字典的特点:可变的、无序的、key不重复。字典的定义【{}或者dict()】可以定义一个空字典例如:a=dict()b......
  • FFmpeg中使用loop输入流与shortest参数后,音视频流时长被改变
    问题来自于制作视频水印需求给一段视频加上一张静态图片制作的logo,在网上已经有很多例子了,只要把它放置在视频的固定位置即可,这个功能非常容易实现:ffmpeg-ivideo.mp4-il......
  • Postman使用
    1.下载下载链接:https://www.postman.com/downloads/中文文档:https://postman.org.cn/getting-started/installation-and-updates/2.使用2.1注册账号2.2在WorksSpace......
  • windows环境使用tomcat部署jenkins配置
    一、安装包下载jdk:https://www.oracle.com/java/technologies/downloads/#java8tomcat:https://tomcat.apache.org/download-80.cgijenkins.war:http://updates.jenkins-c......