grpc的具体实现(Java版本)

这篇具有很好参考价值的文章主要介绍了grpc的具体实现(Java版本)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

grpc(java实现)

可以看看中文官方文档或者官方文档
grpc是什么,官方文档告诉你,我来告诉你怎么使用Java实现!

maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.examole</groupId>
    <artifactId>grpc-study-demo-01</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-all</artifactId>
            <version>1.12.0</version>
        </dependency>


    </dependencies>
    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.4.1.Final</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.0</version>
                <configuration>
                    <pluginId>grpc-java</pluginId>
                    <protocArtifact>com.google.protobuf:protoc:3.0.2:exe:${os.detected.classifier}</protocArtifact>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.2.0:exe:${os.detected.classifier}</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

proto文件

文件布局:
grpc的具体实现(Java版本)
命名**.proto文件在proto文件夹内

syntax = "proto3"; // 协议版本

// 选项配置
option java_package = "com.example.grpc.api";
option java_outer_classname = "RPCDateServiceApi";
option java_multiple_files = true;

// 定义包名
package com.example.grpc.api;

// 定义服务类型:服务接口.定义请求参数和相应结果
service RPCDateService {
  rpc getDate (RPCDateRequest) returns (RPCDateResponse) {
  }
}

// 定义请求体(即我们发送出去的请求数据的数据类型,由1递增)
message RPCDateRequest {
  int32 id = 1;
  string userName = 2;
  string message = 3;
  int32 age = 4;
}

// 定义相应内容(即定义我们接收请求数据的数据类型)
message RPCDateResponse {
  string serverDate = 1;
}

四种服务类型
grpc的具体实现(Java版本)
other
grpc的具体实现(Java版本)

使用插件生成

grpc的具体实现(Java版本)
成功的话,就会出现下面的target文件
(注意:如果下面的server代码里,调用不出来该用的类,那么注意一下生成的target-》generated-sources-》protobuf下的包类型是否和图中一致,不一致的话:鼠标右击该包-》找到Mark Directory as改变成图中的包样式,这样即可调用插件为我们生成的类)
grpc的具体实现(Java版本)

注意:(如果运行失败且出现下面的报错信息,没有则跳过)
grpc的具体实现(Java版本)
出现这个错误,那代表你的maven版本不够(在setting设置下的maven看一下,我的3.6貌似不行,需要3.8才能运行插件)
grpc的具体实现(Java版本)

服务端server

public class GrpcServer {
    public static void main(String[] args) {
        Server server=null;
        try {
            server = ServerBuilder.forPort(8888)
                    .addService(new MyRPCDateServiceImpl())
                    .build().start();
            server.awaitTermination();//持续等待信息
        } catch (IOException e) {
            System.out.println("server--错误信息===>"+e);
        } catch (InterruptedException e) {
            System.out.println("server--错误信息===>"+e);
        } finally {
            if (server!=null) {
                server.shutdown();
            }
        }
    }
}

实现类

public class MyRPCDateServiceImpl extends RPCDateServiceGrpc.RPCDateServiceImplBase {
    @Override
    public void getDate(RPCDateRequest request, StreamObserver<RPCDateResponse> responseObserver) {
        try {
            String message = request.getId() + "\ngetUserName:" +
                    request.getUserName() + "\ngetMessage:" +
                    request.getMessage() + "\ngetAge:" +
                    request.getAge() + "\ngetSerializedSize:" +
                    request.getAllFields();
            System.out.println("message" + message);
            RPCDateResponse build = RPCDateResponse.newBuilder().setServerDate(message).build();
            System.out.println("bulid:" + build);
            responseObserver.onNext(build);
            responseObserver.onCompleted();
        } catch (Exception e) {
            System.out.println("impl---错误信息====》");
            responseObserver.onError(e);
        }
    }
}

客户端client

public class GrpcClient {
    public static void main(String[] args) {
        //1.拿到一个通信的channel
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost",8888)
                .usePlaintext().build();
        try {
            //2.将信息传入request对象
            RPCDateRequest build = RPCDateRequest.newBuilder()
                    .setId(117)
                    .setUserName("yyx")
                    .setMessage("喜欢吃蔬菜")
                    .setAge(22).build();
            System.out.println("build:" + build+"...");
            RPCDateServiceGrpc.RPCDateServiceBlockingStub stub = RPCDateServiceGrpc.newBlockingStub(channel);
            stub.getDate(build);
            while (true) {
                Scanner scanner = new Scanner(System.in);
                String next = scanner.next();
                if (next .equals("exit")) {
                    break;
                }
            }
        }finally {
            channel.shutdown();
        }
    }
}

服务端启动->客户端启动(发送数据)->服务端接收数据
而这一整个过程的调用由我们的impl类进行承接,至于底层grpc帮我们实现好了
grpc的具体实现(Java版本)

如果有哪里纰漏,还望大佬们指出,我定修改完善
工作中具体用法后面用到了再写
文章来源地址https://www.toymoban.com/news/detail-471948.html

到了这里,关于grpc的具体实现(Java版本)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【gRPC实现java端调用go的服务】

    在lib下面的存在一个simple.proto文件,我们使用插件protobuf-maven-plugin对其进行编译。配置如下: 利用插件进行编译 后可以获得对应的文件。 在client下创建一个grpc的包,并将以上两个文件放入。最后创建一个SimpleClient。 最后在Application中调用即可

    2024年02月04日
    浏览(55)
  • 可以写作文的AI写作,看看这五款

    随着人工智能技术的不断发展,AI写作软件逐渐走进了我们的生活,这些软件可以帮助我们快速生成高质量的作文,节省了大量的时间和精力。在市场上有许多种类的AI写作软件,下面我将介绍五款比较受欢迎的。 首先, 我们来看看“爱制作AI”。这款软件具有强大的语言处

    2024年02月03日
    浏览(61)
  • 【Turfjs的java版本JTS】前面讲了Turfjs可以实现几何计算,空间计算的功能,如果后端要做这项功能也有类似的类库,JTS

    JTS = Java Topology Suite 几何计算: 1. 前端js就用这个 Turfjs的类库。参考网站: 计算两线段相交点 | Turf.js中文网 2. 后端java语言就可以用 JTS这个类库,参考网站:  JTS参考网站: 1. https://github.com/locationtech/jts GitHub - locationtech/jts: The JTS Topology Suite is a Java library for creating and m

    2024年02月09日
    浏览(35)
  • [JAVA版本] 最新websocket获取B站直播弹幕——非官方API

    如果只想要代码实现,直接看第二部分。 fastjson2用于解析JSON字符串 ,可自行替换成别的框架。 hutool-core用于解压zip数据 ,可自行替换成别的框架。 2023年9月B站如果不登录,获取到的弹幕消息是经过脱敏的,获取不到用户名和用户ID。 获取方式: 电脑浏览器登录B站,按F1

    2024年02月19日
    浏览(44)
  • strimzi实战之三:prometheus+grafana监控(按官方文档搞不定监控?不妨看看本文,已经踩过坑了)

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 由于整个系列的实战都涉及到消息生产和消费,所以咱们需要一套监控服务,用于观察各种操作的效果,例如生产消息是否成功、消息是否被消费、有没有发生堆积等 因此,在前文完成了最基本的部

    2024年02月08日
    浏览(45)
  • 推荐一款工具类微信小程序,感兴趣的朋友可以看看

    目录 1、文本处理 2、图像处理 3、效率计算 4、娱乐类 5、部分源码介绍 微信小程序是一种基于微信平台的应用程序,它可以在微信中直接运行,无需下载和安装。以下是微信小程序的一些特点和介绍:   快速启动 :微信小程序无需下载和安装,用户可以直接在微信中打开使

    2024年02月16日
    浏览(40)
  • 如何实现Python 3.8.10应该安装什么版本的urllib3和 chardet的具体操作步骤

    如何安装适合Python 3.8.10的urllib3和chardet版本 作为一名经验丰富的开发者,你可以帮助那些刚入行的小白解决他们遇到的问题。在这个任务中,你需要教会一位小白如何安装Python 3.8.10需要的urllib3和chardet版本。下面是一份包含步骤的流程表格,用于指导你的讲解: 步骤 操作

    2024年01月16日
    浏览(43)
  • 今年最火的拼团玩法,全民拼购模式,这个点子你可以看看

    什么是全民拼购? “全民拼购”是将“社交电商”与“拼购玩法”结合起来的一种全新的营销模式,它通过更人性化的方式,将商品的销售利益最大化,既能激励消费者参与,又能促进商品的销售,实现“多方共赢”。 全民拼购是“社交电商”和“拼购玩法”结合的商业模

    2024年02月14日
    浏览(36)
  • 如何通过华硕路由器官方自带功能实现远程FTP、远程观影、远程同步、远程访问登陆界面,有了IPV6,甚至可以买个域名再实现黑裙远程登录

    恩山无线论坛地址:(本人即作者)有更详细的IPV6应用教程从0开始-华硕官方固件使用IPV6 DDNS+安装插件实现远程备份同步、下载、观影-恩山无线论坛 (right.com.cn) 一、远程FTP、观影 通过楼上面的设置,我们已经取得华硕DDNS解析IPV6公网地址 设置启用WLAN访问 ON 启用TLS支持 否

    2024年02月05日
    浏览(93)
  • 云原生 envoy xDS 动态配置 java控制平面开发 支持restful grpc实现 EDS 动态endpoint配置

    大纲 基础概念 Envoy 动态配置API 配置方式 动静结合的配置方式 纯动态配置方式 实战 Envoy 的强大功能之一是支持动态配置,当使用动态配置时,我们不需要重新启动 Envoy 进程就可以生效。 Envoy 通过从磁盘文件或网络接口 读取配置,动态地重新加载配置。动态配置使用所谓的

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包