gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)
场景
ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108667427
Thrift介绍以及Java中使用Thrift实现RPC示例:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108689413
之前讲过Protobuf以及Thrift,下面介绍GPRC。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
gPRC
gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。
gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。
gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制。
gRPC的Github:
https://github.com/grpc
gPRC-JAVA:
https://github.com/grpc/grpc-java
Java中实现GRPC通信
IDEA中新建Maven项目,然后来到gRPC-java的官方的github中将示例中的依赖复制到项目中
<dependencies><dependency><groupId>io.grpc</groupId><artifactId>grpc-netty-shaded</artifactId><version>1.32.1</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId><version>1.32.1</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId><version>1.32.1</version></dependency></dependencies>
因为gRPC是基于protobuf的,同样要将.proto文件编译成代码。
所以按照其github的指示,引入Maven插件
<build><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>1.6.2</version></extension></extensions><plugins><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>0.6.1</version><configuration><protocArtifact>com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}</protocArtifact><pluginId>grpc-java</pluginId><pluginArtifact>io.grpc:protoc-gen-grpc-java:1.32.1:exe:${os.detected.classifier}</pluginArtifact></configuration><executions><execution><goals><goal>compile</goal><goal>compile-custom</goal></goals></execution></executions></plugin></plugins></build>
至此完整的pom文件代码
<?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.badao.grpc</groupId><artifactId>hellogrpc</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>io.grpc</groupId><artifactId>grpc-netty-shaded</artifactId><version>1.32.1</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId><version>1.32.1</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId><version>1.32.1</version></dependency></dependencies><build><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>1.6.2</version></extension></extensions><plugins><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>0.6.1</version><configuration><protocArtifact>com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}</protocArtifact><pluginId>grpc-java</pluginId><pluginArtifact>io.grpc:protoc-gen-grpc-java:1.32.1:exe:${os.detected.classifier}</pluginArtifact></configuration><executions><execution><goals><goal>compile</goal><goal>compile-custom</goal></goals></execution></executions></plugin></plugins></build></project>
待导入完成后。
会在右边Maven面板中的Plugins下多出protobuf插件
然后就是在项目下新建src/main/proto目录,此插件会去此目录下找proto文件,在此目录下新建Person.proto
syntax = "proto3";package com.badao.proto;option optimize_for =SPEED;
option java_package = "com.badao.grpcjava";
option java_outer_classname = "BadaoDataInfo";
option java_multiple_files = true;service PersonService {rpc GetRealNameByUsername(MyRequest) returns (MyResponse) {}
}message MyRequest {string username = 1;
}message MyResponse {string realname = 2;
}
这里的proto文件使用的是proto3的语法,这里的写法可以将github的代码克隆下来,然后参考其grpc-java\examples\src\main\proto
目录下的写法。
这里描述文件的意思就是定义一个接口PersonService,借口内的方法是GetRealNameByUsername,方法参数是自定义请求参数,方法响应是自定义响应。
下面的message就是java中的类,分别是自定义的请求实体和响应实体,以及对应的属性。
然后就是生成代码。
依次双击上面Maven面板插件中的protobuf:complie和protobuf:compile-custom
就会在target下生成对应的实体和相关的请求响应通信相关的类。
gRPC服务端搭建
在src/main/java下新建包com,badao.grpcjava,包下新建PersonServiceImpl类使其继承 PersonServiceGrpc.PersonServiceImplBase
然后重写其方法getRealNameByUsername对具体的根据昵称获取真实名字的具体实现。
package com.badao.grpcjava;import io.grpc.stub.StreamObserver;public class PersonServiceImpl extends PersonServiceGrpc.PersonServiceImplBase {@Overridepublic void getRealNameByUsername(MyRequest request, StreamObserver<MyResponse> responseObserver) {System.out.println("接收到的客户端消息为:"+request.getUsername());responseObserver.onNext(MyResponse.newBuilder().setRealname("公众号:霸道的程序猿").build());responseObserver.onCompleted();}
}
然后新建服务端GrpcServer类
package com.badao.grpcjava;import io.grpc.Server;
import io.grpc.ServerBuilder;import java.io.IOException;public class GrpcServer {private Server server;private void start() throws IOException {this.server = ServerBuilder.forPort(8899).addService(new PersonServiceImpl()).build().start();System.out.println("GRPC Java服务端启动");Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {public void run() {System.out.println("关闭JVM");GrpcServer.this.stop();}}));System.out.println("执行到这里");}private void stop(){if(null!=this.server){this.server.shutdown();}}private void awaitTermination() throws InterruptedException {if(null!=this.server){this.server.awaitTermination();}}public static void main(String[] args) throws IOException, InterruptedException {GrpcServer server = new GrpcServer();server.start();server.awaitTermination();}
}
这块的服务端的搭建可以参考gihub上示例代码的grpc-java\examples\src\main\java\io\grpc\examples\helloworld
目录下的服务和客户端的示例代码
gRPC客户端的搭建
在上面新建的包下新建GrpcClient客户端类
package com.badao.grpcjava;import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;public class GrpcClient {public static void main(String[] args) {ManagedChannel managedChannel = ManagedChannelBuilder.forAddress("localhost",8899).usePlaintext().build();PersonServiceGrpc.PersonServiceBlockingStub blockingStub = PersonServiceGrpc.newBlockingStub(managedChannel);MyResponse myResponse = blockingStub.getRealNameByUsername(MyRequest.newBuilder().setUsername("公众号:霸道的程序猿").build());System.out.println(myResponse.getRealname());}
}
然后运行服务端的主方法后
然后再运行客户端的main方法
此时再查看服务端
示例代码下载
https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12874737
gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)相关推荐
- 在Java中使用Socket模拟客户端和服务端(多线程)
1:Socket与ServerSocket的交互 2.Socket和ServerSocket介绍 Socket 构造函数 Socket() Socket(InetAddress address, in ...
- socket java 客户端_Java基于socket实现的客户端和服务端通信功能完整实例
本文实例讲述了Java基于socket实现的客户端和服务端通信功能.分享给大家供大家参考,具体如下: 以下代码参考马士兵的聊天项目,先运行ChatServer.java实现端口监听,然后再运行Chat ...
- Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信
本文计划采用socket实现客户端和服务端的任意双向通信,即客户端可以随时给服务端发消息,服务端也可以随时给客户端发消息,最终结果就是一个类似与QQ的聊天软件的功能. 以下代码可以直接拷贝到Eclip ...
- Java中利用socket实现简单的服务端与客户端的通信(基础级)
在上一篇文章中,简单的介绍了java中入门级的socket编程,简单的实现了客户端像服务器端发送数据,服务器端将数据接收并显示在控制台,没有涉及多线程.上一篇文章的链接:Java中利用socket实现 ...
- Java中利用socket实现简单的服务端与客户端的通信(入门级)
Java编程中,要想要使用网络通信,就离不开Socket编程,在此对socket进行简单的介绍.首先声明,这是一个入门级的介绍,仅仅简单的实现了客户端向服务端发送数据,服务端正常的接收数据,当接收到特 ...
- Java中Socket实现客户端和服务端通信(多线程实现全双工通信)
效果图 目录结构 服务端Server package server;import thread.SocketReader; import thread.SocketWrite;import java. ...
- java基础—网络编程——TCP客户端与服务端交互
import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import ja ...
- JAVA NIO实现客户端与服务端通信
使用java NIO实现nio客户端连接nio服务端发送消息 一丶NIO服务端 public static void main(String[] args) {server();}public sta ...
- android studio中使用AIDL进行客户端与服务端互相通信
前言 在AIDL实现IPC通信,调用远程服务端的方法.但是,远程服务端并不能主动给客户端返回信息.在很多情况下是需要远程服务端主动给客户端返回数据,客户端只需要进行监听即可,这是典型的观察者模式.这篇 ...
最新文章
- Python自然语言处理实战
- 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)...
- MySQL5.7 Replication主从复制配置教程
- HttpClient超时重复提交问题
- jquery ajax提交表单数据的两种方式
- Extjs 常见问题:如何提交combobox的值
- android 控件高度和图片一样高,Android 根据图片宽高比例设置控件宽高
- laravel validate 设置为中文(验证提示为中文)
- msl3等级烘烤时间_MSL等级说明
- 在利用计算机高级语言进行,2016计算机一级考试多选题专项训练及答案
- 欧几里得变换(Euclidean transformation)详解
- Unity3D实现3D立体游戏原理及过程
- 迎接爆炸主升浪?(附股)
- 软考-嵌入式系统设计师:[网络安全:笔记(六)]
- Matlab abs防抱死系统,防抱死制动系统建模
- 数位板时不时失控_当事情失控时进行网络分析
- 文件分隔符和转义字符
- HTML5+CSS大作业——个人旅游图片博客(7页)
- mt管理器图片在哪个文件夹_mt管理器王者荣耀文件在哪 | 手游网游页游攻略大全...
- b站 python_Python批量下载Bilibili(B站)1080P60fps视频-pip打包安装
热门文章
- Java获取List泛型的真实类型
- Springboot集成nacos实现服务发现和配置中心
- oracle11g memory_target,oracle11g MEMORY_MAX_TARGET设置成0 问题处理
- 每天学一点儿shell:Linux中crontab的用法
- Java后台架构知识点(待补充)
- EXT中给时间控件设置默认值
- sysbench mysql oltp_用sysbench进行数据库OLTP基准测试
- 快捷键截屏_关于Mac电脑截图,你必须要知道的几个快捷键!(错过会后悔哦)...
- sqlserve 热备用状态更新_核心交换机的链路聚合、冗余、堆叠、热备份
- 利用matlab命令画出以下信号的波形,MATLAB实验报告