首页 > 编程语言 >Java的GRPC

Java的GRPC

时间:2024-09-01 18:25:53浏览次数:10  
标签:HelloResponse Java GRPC public response grpc Hello HelloRequest

环境配置

<?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>org.example</groupId>  
    <artifactId>JAVA-GRPC</artifactId>  
    <version>1.0-SNAPSHOT</version>  
  
    <properties>        <maven.compiler.source>17</maven.compiler.source>  
        <maven.compiler.target>17</maven.compiler.target>  
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
    </properties>    <dependencies>        <!-- gRPC core library -->  
        <dependency>  
            <groupId>io.grpc</groupId>  
            <artifactId>grpc-netty</artifactId>  
            <version>1.56.0</version> <!-- 使用最新版本 -->  
        </dependency>  
        <dependency>            <groupId>io.grpc</groupId>  
            <artifactId>grpc-protobuf</artifactId>  
            <version>1.56.0</version>  
        </dependency>        <dependency>            <groupId>io.grpc</groupId>  
            <artifactId>grpc-stub</artifactId>  
            <version>1.56.0</version>  
        </dependency>        <!-- Protocol Buffers -->  
        <dependency>  
            <groupId>com.google.protobuf</groupId>  
            <artifactId>protobuf-java</artifactId>  
            <version>3.24.0</version> <!-- 使用最新版本 -->  
        </dependency>  
        <dependency>            <groupId>javax.annotation</groupId>  
            <artifactId>javax.annotation-api</artifactId>  
            <version>1.3.2</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>                    <!--suppress UnresolvedMavenProperty -->  
                    <protocArtifact>com.google.protobuf:protoc:3.19.2:exe:${os.detected.classifier}</protocArtifact>  
                    <pluginId>grpc-java</pluginId>  
                    <!--suppress UnresolvedMavenProperty -->  
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.44.1:exe:${os.detected.classifier}</pluginArtifact>  
                </configuration>                <executions>                    <execution>                        <goals>                            <goal>compile</goal>  
                            <goal>compile-custom</goal>  
                        </goals>                    </execution>                </executions>            </plugin>        </plugins>    </build>  
  
</project>

代码生成

// 声明版本  
syntax = "proto3";   
  
//服务方法,接受客户端参数,返回服务端响应  
service SayHello {  
  rpc SayHello(HelloRequest) returns (HelloResponse) {}  
}  
  
//类似结构体  
message HelloRequest {  
  string username = 1;  
  int64 code = 2;  
}  
  
message HelloResponse {  
  string responseMsg = 1;  
}

然后点击idea的maven为所有项目生成源代码并更新文件夹,来生成对应的java代码。

客户端

代码示例

public class Main {  
    public static void main(String[] args) {  
        // 创建 gRPC 连接  
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 2333)  
                .usePlaintext() // 使用明文传输  
                .build();  
  
        // 创建客户端存根  
        SayHelloGrpc.SayHelloBlockingStub stub = SayHelloGrpc.newBlockingStub(channel);  
  
        // 创建请求  
        Hello.HelloRequest request = Hello.HelloRequest.newBuilder()  
                .setUsername("World java")  
                .setCode(12345)  
                .build();  
  
        // 发送请求并接收响应  
        Hello.HelloResponse response = stub.sayHello(request);  
        System.out.println("Response: " + response.getResponseMsg());  
  
        // 关闭通道  
        channel.shutdown();  
    }  
}

ManagedChannel创建

ManagedChannel 是 gRPC Java 中用于与 gRPC 服务器进行通信的主要接口。它提供了一种安全且高效的方式来管理连接。

// 创建 gRPC 连接
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 2333).usePlaintext().build();

这里usePlaintext()代表使用明文进行传输。

存根创建

SayHelloGrpc.SayHelloBlockingStub stub = SayHelloGrpc.newBlockingStub(channel);

方法调用

我们有了存根,那么调用方法就很简单了。

Hello.HelloRequest request = Hello.HelloRequest.newBuilder()  
        .setUsername("World java")  
        .setCode(12345)  
        .build();  
  
// 发送请求并接收响应  
Hello.HelloResponse response = stub.sayHello(request);  
System.out.println("Response: " + response.getResponseMsg());

创建对应的请求和回应对象,然后通过存根调用方法即可。

服务端

代码示例

  
public class HelloServer extends SayHelloGrpc.SayHelloImplBase {  
  
    @Override  
    public void sayHello(Hello.HelloRequest req, StreamObserver<Hello.HelloResponse> responseObserver) {  
        String message = "Hello " + req.getUsername() + "\nYour code is: " + req.getCode();  
        Hello.HelloResponse response = Hello.HelloResponse.newBuilder()  
                .setResponseMsg(message)  
                .build();  
  
        // 发送响应  
        responseObserver.onNext(response);  
        responseObserver.onCompleted();  
    }  
  
    public static void main(String[] args) throws IOException, InterruptedException {  
        // 创建 gRPC 服务器  
        Server server = ServerBuilder.forPort(2333)  
                .addService(new HelloServer())  
                .build()  
                .start();  
  
        System.out.println("Server started on port 2333...");  
  
        // 等待服务器停止  
        server.awaitTermination();  
    }  
}

服务端创建

public static void main(String[] args) throws IOException, InterruptedException {  
    // 创建 gRPC 服务器  
    Server server = ServerBuilder.forPort(2333)  
            .addService(new HelloServer())  
            .build()  
            .start();  
  
    System.out.println("Server started on port 2333...");  
  
    // 等待服务器停止  
    server.awaitTermination();  
}

这里类似于客户端的存根创建,我们这里创建服务端并进行服务绑定。

服务创建

public class HelloServer extends SayHelloGrpc.SayHelloImplBase {  
  
    @Override  
    public void sayHello(Hello.HelloRequest req, StreamObserver<Hello.HelloResponse> responseObserver) {  
        String message = "Hello " + req.getUsername() + "\nYour code is: " + req.getCode();  
        Hello.HelloResponse response = Hello.HelloResponse.newBuilder()  
                .setResponseMsg(message)  
                .build();  
  
        // 发送响应  
        responseObserver.onNext(response);  
        responseObserver.onCompleted();  
    }

直接继承生成的对应类,然后我们在对应的方法中填写对应的逻辑即可。这里的StreamObserver<Hello.HelloResponse> responseObserver类有常用的3个方法:

  • onNext(HelloResponse response): 用于发送一个响应对象到客户端。
  • onCompleted(): 指示所有响应已经发送完成,客户端可以结束处理。
  • onError(Throwable t): 用于在发生错误时向客户端报告错误。

标签:HelloResponse,Java,GRPC,public,response,grpc,Hello,HelloRequest
From: https://www.cnblogs.com/Ho1dF0rward/p/18391569

相关文章

  • Java:有效括号字符串验证器
    Java实现的有效括号字符串验证器引言在编程中,经常需要验证一组字符串中的括号是否正确配对。例如,检查一段代码或表达式中的圆括号、方括号和花括号是否成对出现。这类问题不仅在编程语言解析器中非常重要,也是许多软件开发场景中的基础需求。本文将介绍一种基于Java语言实......
  • Java反射
    1.反射1.1.反射引入编译时知道类或对象的具体信息,此时直接对类和对象进行操作即可,无需反射如果编译不知道类或对象的具体信息,就使用反射来实现。比如类名、属性和属性值放在XML文件中,需要在运行时读取XML文件,动态获取类的信息publicclassTest{publicstaticvo......
  • 2025毕业设计精选:如何用Java SpringBoot+Vue构建受灾救援物资管理系统,实现实时监控,提
    ✍✍计算机毕业编程指导师⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、微信小程序、大数据实战项目集⚡⚡文......
  • JAVA之JVM入门
    Java虚拟机(JVM)是Java平台的核心部分之一,它为Java程序提供了运行环境。一、历史背景1.SunClassicVM发布时间:1996年重要功能:Java1.0的默认JVM。支持基本的字节码执行。简单的垃圾回收机制。2.HotSpotVM发布时间:1999年重要功能:JDK1.3开始成为默认JVM。引入了......
  • Java 入门指南:Java 并发编程 —— AQS、AQLS、AOS 锁与同步器的框架
    AQSAQS是AbstractQueuedSynchronizer的缩写,即抽象队列同步器,是Java.util.concurrent中的一个基础工具类,用于实现同步器(Synchronizer)的开发。AQS提供了一种实现锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的同步器,使得开发者能够更方便地编写线程安全的......
  • Gluon 编译 JavaFx -> android apk
    Gluon编译JavaFx->androidapk本文的内容属在linux服务器上搭建Gluon编译android-apk环境这一篇文章直接跟着官网操作一次性成功虚拟机版本centos8Architecture:x86-64开始安装相关前置工具gccversion6orhigherldversion2.26orhighersudoyumupd......
  • 计算机毕业设计选题推荐-个人健康档案管理系统-Java/Python项目实战
    ✨作者主页:IT研究室✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......
  • 计算机毕业设计选题推荐-公司考勤管理系统-Java/Python项目实战
    ✨作者主页:IT研究室✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......
  • 计算机毕业设计选题推荐-果树生长信息管理系统-Java/Python项目实战
    ✨作者主页:IT毕设梦工厂✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......
  • 计算机毕业设计选题推荐-客栈管理系统-酒店预订-民宿管理系统-Java/Python项目实战
    ✨作者主页:IT毕设梦工厂✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......