GRPC-JAVA

近一年来一直在用公司内wiki进行技术调研以及记录,后期有时间将逐步迁移至博客园。

参考资料:

https://github.com/grpc/grpc-java

https://www.cnblogs.com/gutousu/p/9951956.html

它可以一次性的在一个 .proto 文件中定义服务并使用任何支持它的语言去实现客户端和服务器,反过来,它们可以在各种环境中,从Google的服务器到你自己的平板电脑- gRPC 帮你解决复杂的不同语言间通信以及不同使用环境的问题。 protocol buffers 还能获得其他好处,包括高效的序列号,简单的 IDL 以及容易进行接口更新,且无注册中心。

依赖包

<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
</dependency>
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java-util</artifactId>
</dependency>
<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-all</artifactId>
</dependency>

build

<build>
   
    <extensions>
        <extension>
            <!-- provides os.detected.classifier (i.e. linux-x86_64, osx-x86_64) property -->
            <groupId>kr.motd.maven</groupId>
            <artifactId>os-maven-plugin</artifactId>
            <version>1.6.1</version>
        </extension>
    </extensions>

    <plugins>
       
        <plugin>
            <groupId>org.xolstice.maven.plugins</groupId>
            <artifactId>protobuf-maven-plugin</artifactId>
            <configuration>
                <protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}
                </protocArtifact>
                <pluginId>grpc-java</pluginId>
                <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
                </pluginArtifact>
                <!-- proto文件目录 -->
                <protoSourceRoot>${project.basedir}/src/main/proto</protoSourceRoot>
            </configuration>
            <executions>
                <execution>
                    <id>bean</id>
                    <goals>
                        <goal>compile</goal>
                        <goal>test-compile</goal>
                    </goals>
                    <configuration>
                        <!-- 生成的Java文件目录 -->
                        <outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>
                    </configuration>
                </execution>

                <execution>
                    <id>grpc</id>
                    <goals>
                        <goal>compile-custom</goal>
                        <goal>test-compile-custom</goal>
                    </goals>
                    <configuration>
                        <!-- 生成的grpc-Java文件目录 -->
                        <outputDirectory>${project.build.directory}/generated-sources/protobuf/grpc-java
                        </outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

proto-demo

syntax = "proto2";

package java_test;

service TestService {
    rpc method (Request) returns (Result) {

    }
}

message Request {
    optional string request1 = 1;
    optional string request2 = 2;
}

message Result {
    optional string result1 = 1;
    optional string result2 = 2;
}

编译项目,生成bean文件和通信文件

server端demo

package com.baidu.traffic.sc.test;

import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
import java_test.TestGrpc;
import java_test.TestServiceGrpc;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * Created by liushouyun on 2019-12-20 12:36.
 */

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


    @Override
    public void method(TestGrpc.Request request, StreamObserver<TestGrpc.Result> responseObserver) {
        TestGrpc.Result result = TestGrpc.Result.newBuilder().setResult1("结果1").setResult2("结果2不想给你").build();
        responseObserver.onNext(result);
        responseObserver.onCompleted();
        // super.method(request, responseObserver);
    }

    @Override
    public void afterPropertiesSet() throws IOException {
        ServerBuilder.forPort(8582)
                .addService(new JavaGrpcServer())
                .build().start();
    }
}

 client端demo

package com.baidu.traffic.signal.test;

import io.grpc.Channel;
import io.grpc.ManagedChannelBuilder;
import io.swagger.annotations.Api;
import java_test.TestGrpc;
import java_test.TestServiceGrpc;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by liushouyun on 2019-12-20 12:36.
 */

@Api(tags = "grpc-test")
@RestController
@RequestMapping(value = "/test/grpc")
@Slf4j
public class JavaGrpcClient {

    private Channel channel = channel();

    @GetMapping("/run")
    public TestResult run() {
        TestServiceGrpc.TestServiceBlockingStub testServiceBlockingStub = TestServiceGrpc.newBlockingStub(channel);
        TestGrpc.Request request = TestGrpc.Request.newBuilder().setRequest1("ha?").setRequest2("en?").build();
        TestGrpc.Result result = testServiceBlockingStub.method(request);
        return new TestResult(result.getResult1(), result.getResult2());
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    private class TestResult {
        private String result1;
        private String result2;
    }

    private Channel channel() {
        return ManagedChannelBuilder
                .forAddress("127.0.0.1", 8582)
                .usePlaintext()
                .build();
    }
}

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java IO流

    package cn.bdqn.demo; import java.io.File; import java.io.FileInputStream; impo...

    房上的猫
  • JavaScript 网页脚本语言 由浅入深

    1)基础 学习目的: 1. 客户端表单验证 2. 页面动态效果 3. jQuery的基础 什么是JavaScript? 一种描述性语言,也是一种基于对象和事件驱...

    房上的猫
  • C# 操作 access 数据库

    private staticstring connStr = @"Provider= Microsoft.Ace.OLEDB.12.0;...

    房上的猫
  • 爬取B站18000条《黑神话:悟空》实机演示弹幕,做成词云

    从不畏惧死亡,只是不忍世道沦丧。哪怕前途多尸骨,身后无退路—— 这个世界,总有勇敢的生命,再次踏上取经之途。由游戏科学开发的西游题材单机·动作·角色扮演游戏《黑...

    松鼠爱吃饼干
  • guava并发工具

    一个传统的Futrue代表一个异步计算的结果:一个可能完成也可能没有完成输出结果的计算。一个Future可以用在进度计算,或者说是 一个提供给我们结果的服务的承...

    IT大咖说
  • 国足如何“夺取伊血”?数据分析揭示需做好2点!

    国足将于9月6日在沈阳奥体中心迎来12强赛的第二个对手伊朗!对于这个对手,中国的球迷可能既陌生又熟悉。在国足与伊朗的交锋中,既有金州惨案这样另球迷伤心的回忆,也...

    华章科技
  • Netty 实现简单的RPC远程调用 原

    RPC又称远程过程调用,我们所知的远程调用分为两种,现在在服务间通信的方式也太多已这两种为主

    chinotan
  • 如何制定SEO文章发布模板?

    我们都知道SEO编辑每天面临着大量的文章发布,为了使得原创文章发挥最大的效果,我们通常会按照,符合SEO标准的策略,去发布文章,一个成熟的SEO团队,通常会有一...

    蝙蝠侠IT
  • 深入理解C#3.x的新特性(4):Automatically Implemented Property

    深入理解C#3.x的新特性系列在沉寂一个月之后,今天继续。在本系列前3部分中,我们分别讨论了Anonymous Type,Extension Method和La...

    蒋金楠
  • 【ssm个人博客项目实战05】easy ui datagrid实现数据的分页显示1、数据格式准备工作2、业务层实现3、控制层实现4、前端视图处理

    前面一节 我们已经实现博客类别的dao层的实现,其中特别讲解了博客类别的分页的实现,那么现在我们实现了后台的分页,那么前台分页怎么显示呢,这时候我们用到了eas...

    yukong

扫码关注云+社区

领取腾讯云代金券