首页 > 编程语言 >gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)

gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)

时间:2023-03-23 11:03:06浏览次数:55  
标签:Java grpc gPRC gRPC io java com 服务端


之前讲过Protobuf以及Thrift,下面介绍GPRC。

注:

关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

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 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

 

gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)_服务端

在 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中将示例中的依赖复制到项目中

 

gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)_服务端_02

<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插件

 

gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)_java_03

<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插件

 

gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)_gRpc_04

然后就是在项目下新建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

目录下的写法。

gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)_java_05

这里描述文件的意思就是定义一个接口PersonService,借口内的方法是GetRealNameByUsername,方法参数是自定义请求参数,方法响应是自定义响应。

下面的message就是java中的类,分别是自定义的请求实体和响应实体,以及对应的属性。

然后就是生成代码。

依次双击上面Maven面板插件中的protobuf:complie和protobuf:compile-custom

 

gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)_maven_06

就会在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 {
    @Override
    public 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

目录下的服务和客户端的示例代码

gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)_java_07

 

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

然后运行服务端的主方法后

 

gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)_maven_08

然后再运行客户端的main方法

 

gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)_maven_09

此时再查看服务端

 

gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)_maven_10


标签:Java,grpc,gPRC,gRPC,io,java,com,服务端
From: https://blog.51cto.com/BADAOLIUMANGQZ/6144513

相关文章

  • Thrift中实现Java与Python的RPC互相调用
    在上面讲了在Java中使用Thrift实现远程过程调用。实现了在客户端调用服务端的方法。但是这都是在Java项目中。Thrift的强大之处并不止于此,如果想实现在两个不同的语言的服务......
  • ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化
    场景ProtoBuf简介protocolbuffers是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。ProtocolBuffers是一种灵活,高效,自动化机......
  • Netty中集成Protobuf实现Java对象数据传递
    在上面两篇博客基础上,对于Socket搭建服务端和客户端进行通信以及在Java中Protobuf的使用已经有了初步的理解。那么怎样使用Netty进行服务端和客户端的通信时使用protobuf进......
  • Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息
    上面讲了使用使用Socket搭建多客户端的连接与通信。那么如果在Netty中使用WebSocket进行长连接通信要怎么实现。WebSocket现在,很多网站为了实现推送技术,所用的技术都是Ajax......
  • java正则
    正则常见用法(例子来源:hutool文档):Stringcontent="ZZZaaabbbccc中文1234";Patternpattern=Pattern.compile(regex,Pattern.DOTALL);Matchermatcher=pattern.m......
  • #Java程序设计实践
    Java程序设计实践Java训练集1~3总结与心得训练集链接前言:本次训练集1~3主要考察了对java基础语法的掌握,内容包括基础程序的设计,类设计,编程规则的掌握等等,学习的重点在......
  • java学习日记20230320-类变量和类方法
    类变量和类方法static修饰的静态变量或者方法静态变量是类共享的,当class运行时。jdk8之前时放在方法区,静态域,jdk8之后放在堆中,会生成class对象在堆中;在类加载中生成;st......
  • 20.(行为型模式)java设计模式之迭代器模式
    一、什么是迭代器模式(IteratorPattern)   提供—种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部实现,属于行为型模式。应用场景:   —般来说,迭......
  • Java之size()>0 和isEmpt()性能考量
    为何要写这篇呢?主要是要纠正一个长期以来的误区:size()>0一定比isEmpt()性能差。以下内容是社区里的结论:方法一(数据量大,效率低):if(list!=null&&list.size()>0){}方法......
  • BDD之Java Testing with Spock
    为何会专门写这篇BDD呢?之前我发表过一篇《代码重构之TDD的思考》,有童靴联系到我,探讨之余,感觉这几年集成化方面的测试方案产出太少了,优秀的也太少了。今天带大家了解一个新东......