首页 > 其他分享 >gRPC使用实例

gRPC使用实例

时间:2023-05-30 17:36:51浏览次数:45  
标签:示例 gRPC 实例 使用 服务器 responseObserver public 客户端

当然!这是三个使用Java实现的gRPC示例代码,用于演示gRPC的基本用法和通信模式:

示例1:简单的Unary RPC

在此示例中,客户端向服务器发送请求,并接收单个响应。

gRPC服务定义文件(.proto文件):

syntax = "proto3";

package com.example.grpcdemo;

service GreetingService {
    rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
    string name = 1;
}

message HelloResponse {
    string message = 1;
}

服务器实现类

import io.grpc.*;
import com.example.grpcdemo.*;

public class GreetingServiceImpl extends GreetingServiceGrpc.GreetingServiceImplBase {
    @Override
    public void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {
        String message = "Hello, " + request.getName() + "!";
        HelloResponse response = HelloResponse.newBuilder().setMessage(message).build();

        responseObserver.onNext(response);
        responseObserver.onCompleted();
    }
}

服务器启动类

import io.grpc.*;
import java.io.IOException;

public class Server {
    public static void main(String[] args) throws IOException, InterruptedException {
        Server server = ServerBuilder.forPort(50051)
                .addService(new GreetingServiceImpl())
                .build();

        server.start();

        System.out.println("Server started.");

        server.awaitTermination();
    }
}

客户端实现类

import io.grpc.*;
import com.example.grpcdemo.*;

public class GreetingClient {
    public static void main(String[] args) {
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
                .usePlaintext()
                .build();

        GreetingServiceGrpc.GreetingServiceBlockingStub stub = GreetingServiceGrpc.newBlockingStub(channel);

        HelloRequest request = HelloRequest.newBuilder().setName("John").build();
        HelloResponse response = stub.sayHello(request);

        System.out.println(response.getMessage());

        channel.shutdown();
    }
}

在示例1中,我们定义了一个名为GreetingService的gRPC服务,其中包含一个名为SayHello的RPC方法。

服务器实现类GreetingServiceImpl继承自生成的GreetingServiceGrpc.GreetingServiceImplBase类,并重写了sayHello方法。在该方法中,我们根据请求中的名称构造响应消息,并通过StreamObserver发送响应。

服务器启动类通过ServerBuilder创建服务器,并将GreetingServiceImpl作为服务添加到服务器中。然后,启动服务器并等待终止。

客户端实现类GreetingClient创建一个与服务器的连接,并使用生成的GreetingServiceGrpc.GreetingServiceBlockingStub来发送请求并接收响应。最后,打印响应消息。

运行服务器和客户端代码后,您将看到客户端成功向服务器发送请求,并接收到响应消息。

示例2:Server Streaming RPC

在此示例中,客户端向服务器发送请求,并接收一系列的响应流。

gRPC服务定义文件(.proto文件):

syntax = "proto3";

package com.example.grpcdemo;

service NumberService {
    rpc GetNumbers (NumberRequest) returns (stream NumberResponse);
}

message NumberRequest {
    int32 count = 1;
}

message Number

Response {
    int32 number = 1;
}

服务器实现类

import io.grpc.*;
import com.example.grpcdemo.*;

public class NumberServiceImpl extends NumberServiceGrpc.NumberServiceImplBase {
    @Override
    public void getNumbers(NumberRequest request, StreamObserver<NumberResponse> responseObserver) {
        int count = request.getCount();

        for (int i = 0; i < count; i++) {
            NumberResponse response = NumberResponse.newBuilder().setNumber(i + 1).build();
            responseObserver.onNext(response);
        }

        responseObserver.onCompleted();
    }
}

服务器启动类客户端实现类与示例1中的代码相同。

在示例2中,我们定义了一个名为NumberService的gRPC服务,其中包含一个名为GetNumbers的RPC方法。

服务器实现类NumberServiceImpl继承自生成的NumberServiceGrpc.NumberServiceImplBase类,并重写了getNumbers方法。在该方法中,我们根据请求中的count字段循环生成一系列的响应,并通过StreamObserver逐个发送响应。

客户端代码与示例1中的客户端代码相同。

运行服务器和客户端代码后,您将看到客户端成功向服务器发送请求,并接收到一系列的响应流。

示例3:Client Streaming RPC

在此示例中,客户端通过流式方式向服务器发送一系列的请求,并接收单个响应。

gRPC服务定义文件(.proto文件):

syntax = "proto3";

package com.example.grpcdemo;

service SumService {
    rpc CalculateSum (stream NumberRequest) returns (SumResponse);
}

message NumberRequest {
    int32 number = 1;
}

message SumResponse {
    int32 sum = 1;
}

服务器实现类

import io.grpc.*;
import com.example.grpcdemo.*;

public class SumServiceImpl extends SumServiceGrpc.SumServiceImplBase {
    @Override
    public void calculateSum(StreamObserver<SumResponse> responseObserver) {
        StreamObserver<NumberRequest> requestObserver = new StreamObserver<NumberRequest>() {
            int sum = 0;

            @Override
            public void onNext(NumberRequest request) {
                int number = request.getNumber();
                sum += number;
            }

            @Override
            public void one rror(Throwable t) {
                // 处理错误
            }

            @Override
            public void onCompleted() {
                SumResponse response = SumResponse.newBuilder().setSum(sum).build();
                responseObserver.onNext(response);
                responseObserver.onCompleted();
            }
        };

        responseObserver.onNext(requestObserver);
    }
}

服务器启动类客户端实现类与示例1中的代码相同。

在示例3中,我们定义了一个名为SumService的gRPC服务,其中包含一个名为CalculateSum的RPC方法。

服务器实现类SumServiceImpl继承自生成的SumServiceGrpc.SumServiceImplBase类,并重写了calculateSum方法。在该方法中,我们通过创建一个新的StreamObserver来处理客户端发送的一系列NumberRequest请求。在每个请求到达时,我们提取出数字并计算它们的总和。当请求流结束时,我们构造一个SumResponse响应,并通过responseObserver发送响应。

客户端代码与示例1中的客户端

代码相同。

运行服务器和客户端代码后,您可以使用客户端通过流式方式发送一系列数字,并接收到总和的响应。

这些示例代码演示了gRPC在Java中的基本用法和通信模式。请确保您已正确配置gRPC和相关依赖项,并根据需要更改主机和端口。

标签:示例,gRPC,实例,使用,服务器,responseObserver,public,客户端
From: https://www.cnblogs.com/lukairui/p/17443836.html

相关文章

  • Thrift使用实例
    当然!这是三个使用Java实现的Thrift示例代码,用于演示Thrift的基本用法和通信模式:示例1:简单的服务端和客户端在此示例中,我们将创建一个简单的Thrift服务端和客户端,客户端向服务端发送请求并接收响应。Thrift定义文件(.thrift文件):namespacejavacom.example.thriftdemoservice......
  • CSS 删除线:在 CSS 中使用文本装饰和划线
    CSS删除线是一个CSS属性,它使文本看起来像是被删除线一样,就像这样。在网络开发和写作中,这经常用于表示文本已被删除或不再相关。但它也可以用于不同的事情。删除线可以应用于span元素、段落、div、显示内联块或任何其他需要文本修饰的元素。除了下划线、斜体和粗体,CSS删除线也......
  • leetcode Kth Largest Element in a Stream——要熟悉heapq使用
    703.KthLargestElementinaStreamEasyDesignaclasstofind thekthlargestelementinastream.Notethatitisthekthlargestelementinthesortedorder,notthekthdistinctelement.Your KthLargest classwillhaveaconstructorwhichacceptsanin......
  • 漏洞扫描工具Nessus详细使用教程
    漏洞扫描工具Nessus详细使用教程zkzq于 2022-02-0918:14:35 发布28574 收藏 195分类专栏: 黑客工具 文章标签: 网络安全 web安全 渗透测试版权黑客工具专栏收录该内容11篇文章13订阅订阅专栏零基础学黑客,搜索公众号:白帽子左一1原文地址......
  • Dubbo使用实例
    下面是一个使用Java实现的Dubbo示例代码,包括服务提供者和服务消费者:首先,您需要确保已安装ZooKeeper,并且ZooKeeper服务器正在运行。接下来,您可以使用以下示例代码创建Dubbo的服务提供者和服务消费者:服务提供者示例代码:接口定义:publicinterfaceGreetingService{String......
  • .net调用动态库NationECCode.dll使用电子凭证二维码解码接口
    .net调用动态库NationECCode.dll使用电子凭证二维码解码接口 C#.net调用示例代码:[DllImport("NationECCode.dll",CallingConvention=CallingConvention.StdCall)]publicstaticexternvoidNationEcTrans(stringurl,stringinput,IntPtroutput);......
  • 如何使用ComboBox以获取用户的单选并可编辑
    如何使用ComboBox以获取用户的单选并可编辑ComboBox是一种单选下拉框,和ChoiceBox很类似。ComboBox不仅可以接收用户的一个选项,还可以提供可编辑框,让用户输入内容。效果展示示例代码importjavafx.application.Application;importjavafx.geometry.Insets;importjava......
  • python中如何使用正则表达式查询字符串
    '''Createdon2019年12月2日@author:hp''''''上一篇文章介绍了那么多关于正则表达式的用法,现在终于到了python中如何使用正则表达式了,不急,请诸君慢慢来''''''之前在讲字符串时,已经说过了字符串的格式化输出,大家没看的可以看我的上一篇文章格式化输出时,是含有模式串......
  • #yyds干货盘点#Linux编辑器vim使用
    vim:是一款编辑器,只负责写代码;相当于windows的记事本;gcc:是一款编译器,只负责程序的翻译;gdb:是一款调试器,只负责程序的调试;vim是一个功能强大的多模式编辑器,是Linux/UNIX上最常用的文本编辑器,它的作用是建立、编辑、显示文本文件。Vim没有菜单,只有命令。命令模式(默认):输入的任何......
  • vues全局使用WebSocket
    //import{showInfoMsg,showErrorMsg}from'@/utils/popInfo'//importElementUIfrom'element-ui';import{Toast}from'vant';functioninitWebSocket(baseObj){console.log(baseObj)//constwsUri=WS_API+&quo......