gRpc的四种通信方式详细介绍

这篇具有很好参考价值的文章主要介绍了gRpc的四种通信方式详细介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

gRpc的四种通信方式详细介绍,# GRPC专栏,qt,开发语言,学习方法,AI编程

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁
🦄 博客首页——猫头虎的博客🎐
🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

gRpc的四种通信方式

gRpc的四种通信方式详细介绍,# GRPC专栏,qt,开发语言,学习方法,AI编程

四种通信方式

  1. 简单rpc 一元rpc (Unary RPC)
  2. 服务端流式RPC (Server Streaming RPC)
  3. 客户端流式RPC (Client Streaming RPC)
  4. 双向流RPC (Bi-directional Stream RPC)

摘要
本文详细介绍了gRpc的四种主要通信方式,包括简单RPC、服务端流式RPC、客户端流式RPC和双向流式RPC。每种方式都有其特点和应用场景,以及相应的代码实现。

导语
在分布式系统中,通信是至关重要的。gRpc作为一个高性能、开源和通用的RPC框架,为我们提供了多种通信方式。那么,这些通信方式都有哪些特点和应用场景呢?让我们一起深入了解。

引言
“通信是连接分布式系统的桥梁,而gRpc则为我们提供了这座桥梁的多种形式。从简单的一对一通信到复杂的双向流通信,gRpc都能为我们提供稳定和高效的解决方案。”

简单RPC(一元RPC)

  1. 第一个RPC程序,实际上就是一元RPC

特点

当client发起调用后,提交数据,并且等待 服务端响应。开发过程中,主要采用就是一元RPC的这种通信方式。

gRpc的四种通信方式详细介绍,# GRPC专栏,qt,开发语言,学习方法,AI编程

语法

service HelloService{
  rpc hello(HelloRequest) returns (HelloResponse){}
  rpc hello1(HelloRequest1) returns (HelloResponse1){}
}

服务端流式RPC

一个请求对象,服务端可以回传多个结果对象。

特点

gRpc的四种通信方式详细介绍,# GRPC专栏,qt,开发语言,学习方法,AI编程

使用场景

client --------> Server
股票标号
<-------
某一个时刻的 股票的行情

语法

service HelloService{
  rpc hello(HelloRequest) returns (stream HelloResponse){}
  rpc hello1(HelloRequest1) returns (HelloResponse1){}
}

关键代码

服务端
public void c2ss(HelloProto.HelloRequest request, StreamObserver<HelloProto.HelloResponse> responseObserver) {
        //1 接受client的请求参数
        String name = request.getName();
        //2 做业务处理
        System.out.println("name = " + name);
        //3 根据业务处理的结果,提供响应
        for (int i = 0; i < 9; i++) {
            HelloProto.HelloResponse.Builder builder = HelloProto.HelloResponse.newBuilder();
            builder.setResult("处理的结果 " + i);
            HelloProto.HelloResponse helloResponse = builder.build();

            responseObserver.onNext(helloResponse);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        responseObserver.onCompleted();
    }
客户端
public class GprcClient3 {
    public static void main(String[] args) {
        ManagedChannel managedChannel = ManagedChannelBuilder.forAddress("localhost", 9000).usePlaintext().build();
        try {
            HelloServiceGrpc.HelloServiceBlockingStub helloService = HelloServiceGrpc.newBlockingStub(managedChannel);

            HelloProto.HelloRequest.Builder builder = HelloProto.HelloRequest.newBuilder();
            builder.setName("sunshuai");
            HelloProto.HelloRequest helloRequest = builder.build();
            Iterator<HelloProto.HelloResponse> helloResponseIterator = helloService.c2ss(helloRequest);
            while (helloResponseIterator.hasNext()) {
                HelloProto.HelloResponse helloResponse = helloResponseIterator.next();
                System.out.println("helloResponse.getResult() = " + helloResponse.getResult());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            managedChannel.shutdown();
        }
    }
}

监听 异步方式 处理服务端流式RPC的开发
1. api
2. 服务端 
3. 客户端 
   public class GrpcClient4 {
    public static void main(String[] args) {
        ManagedChannel managedChannel = ManagedChannelBuilder.forAddress("localhost", 9000).usePlaintext().build();

        try {

            HelloServiceGrpc.HelloServiceStub helloService = HelloServiceGrpc.newStub(managedChannel);

            HelloProto.HelloRequest.Builder builder = HelloProto.HelloRequest.newBuilder();
            builder.setName("xiaohei");
            HelloProto.HelloRequest helloRequest = builder.build();

            helloService.c2ss(helloRequest, new StreamObserver<HelloProto.HelloResponse>() {
                @Override
                public void onNext(HelloProto.HelloResponse value) {
                    //服务端 响应了 一个消息后,需要立即处理的话。把代码写在这个方法中。
                    System.out.println("服务端每一次响应的信息 " + value.getResult());
                }

                @Override
                public void onError(Throwable t) {

                }

                @Override
                public void onCompleted() {
                    //需要把服务端 响应的所有数据 拿到后,在进行业务处理。
                    System.out.println("服务端响应结束 后续可以根据需要 在这里统一处理服务端响应的所有内容");
                }
            });

            managedChannel.awaitTermination(12, TimeUnit.SECONDS);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            managedChannel.shutdown();
        }
    }
}

客户端流式RPC

客户端发送多个请求对象,服务端只返回一个结果。

gRpc的四种通信方式详细介绍,# GRPC专栏,qt,开发语言,学习方法,AI编程

应用场景

IOT(物联网 【传感器】) 向服务端 发送数据

proto

rpc cs2s(stream HelloRequest) returns (HelloResponse){}

开发

1. api
   rpc cs2s(stream HelloRequest) returns (HelloResponse){}
2. 服务端开发
   public StreamObserver<HelloProto.HelloRequest> cs2s(StreamObserver<HelloProto.HelloResponse> responseObserver) {
        return new StreamObserver<HelloProto.HelloRequest>() {
            @Override
            public void onNext(HelloProto.HelloRequest value) {
                System.out.println("接受到了client发送一条消息 " + value.getName());
            }

            @Override
            public void onError(Throwable t) {

            }

            @Override
            public void onCompleted() {
                System.out.println("client的所有消息 都发送到了 服务端 ....");

                //提供响应:响应的目的:当接受了全部client提交的信息,并处理后,提供相应
                HelloProto.HelloResponse.Builder builder = HelloProto.HelloResponse.newBuilder();
                builder.setResult("this is result");
                HelloProto.HelloResponse helloResponse = builder.build();

                responseObserver.onNext(helloResponse);
                responseObserver.onCompleted();
            }
        };
    }
3. 客户端开发
   public class GrpcClient5 {
    public static void main(String[] args) {
        ManagedChannel managedChannel = ManagedChannelBuilder.forAddress("localhost", 9000).usePlaintext().build();
        try {
            HelloServiceGrpc.HelloServiceStub helloService = HelloServiceGrpc.newStub(managedChannel);

            StreamObserver<HelloProto.HelloRequest> helloRequestStreamObserver = helloService.cs2s(new StreamObserver<HelloProto.HelloResponse>() {
                @Override
                public void onNext(HelloProto.HelloResponse value) {
                    // 监控响应
                    System.out.println("服务端 响应 数据内容为 " + value.getResult());

                }

                @Override
                public void onError(Throwable t) {

                }

                @Override
                public void onCompleted() {
                    System.out.println("服务端响应结束 ... ");
                }
            });

            //客户端 发送数据 到服务端  多条数据 ,不定时...
            for (int i = 0; i < 10; i++) {
                HelloProto.HelloRequest.Builder builder = HelloProto.HelloRequest.newBuilder();
                builder.setName("sunshuai " + i);
                HelloProto.HelloRequest helloRequest = builder.build();

                helloRequestStreamObserver.onNext(helloRequest);
                Thread.sleep(1000);
            }

            helloRequestStreamObserver.onCompleted();

            managedChannel.awaitTermination(12, TimeUnit.SECONDS);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            managedChannel.shutdown();
        }
    }
}

双向流式RPC

客户端可以发送多个请求消息,服务端响应多个响应消息。

gRpc的四种通信方式详细介绍,# GRPC专栏,qt,开发语言,学习方法,AI编程

应用场景

聊天室

编码

 1. api
    rpc cs2ss(stream HelloRequest) returns (stream HelloResponse){}
2. 服务端
    public StreamObserver<HelloProto.HelloRequest> cs2ss(StreamObserver<HelloProto.HelloResponse> responseObserver) {
         return new StreamObserver<HelloProto.HelloRequest>() {
             @Override
             public void onNext(HelloProto.HelloRequest value) {
                 System.out.println("接受到client 提交的消息 "+value.getName());
                 responseObserver.onNext(HelloProto.HelloResponse.newBuilder().setResult("response "+value.getName()+" result ").build());
             }

             @Override
             public void onError(Throwable t) {

             }

             @Override
             public void onCompleted() {
                 System.out.println("接受到了所有的请求消息 ... ");
                 responseObserver.onCompleted();
             }
         };
    }
3. 客户端
  public class GrpcClient6 {
    public static void main(String[] args) {
        ManagedChannel managedChannel = ManagedChannelBuilder.forAddress("localhost", 9000).usePlaintext().build();
        try {
            HelloServiceGrpc.HelloServiceStub helloService = HelloServiceGrpc.newStub(managedChannel);

            StreamObserver<HelloProto.HelloRequest> helloRequestStreamObserver = helloService.cs2ss(new StreamObserver<HelloProto.HelloResponse>() {
                @Override
                public void onNext(HelloProto.HelloResponse value) {
                    System.out.println("响应的结果 "+value.getResult());
                }

                @Override
                public void onError(Throwable t) {

                }

                @Override
                public void onCompleted() {
                    System.out.println("响应全部结束...");
                }
            });


            for (int i = 0; i < 10; i++) {
                helloRequestStreamObserver.onNext(HelloProto.HelloRequest.newBuilder().setName("sunshuai " + i).build());
            }
            helloRequestStreamObserver.onCompleted();

            managedChannel.awaitTermination(12, TimeUnit.SECONDS);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            managedChannel.shutdown();
        }
    }
}

这篇博客简要介绍了gRpc的四种通信方式,包括简单RPC、服务端流式RPC、客户端流式RPC和双向流式RPC,并给出了每种方式的特点、使用场景、语法和关键代码。希望对读者有所帮助。

总结:

gRpc的四种通信方式为分布式系统提供了强大的支持。简单RPC适用于常规的请求-响应模式,服务端流式RPC和客户端流式RPC分别允许服务端和客户端发送多个消息,而双向流式RPC则支持双方的双向通信。了解这些通信方式及其应用场景,可以帮助我们更好地设计和实现分布式系统。

参考资料:

  1. gRpc官方文档:https://grpc.io/docs/
  2. “Mastering gRpc” by Alex Konrad.
  3. “Distributed Systems with gRpc” by Sarah Allen.

gRpc的四种通信方式详细介绍,# GRPC专栏,qt,开发语言,学习方法,AI编程

原创声明

======= ·

  • 原创作者: 猫头虎

作者wx: [ libin9iOak ]

学习 复习

本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。文章来源地址https://www.toymoban.com/news/detail-665983.html

到了这里,关于gRpc的四种通信方式详细介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • [golang 微服务] 4. gRPC介绍,Protobuf结合gRPC 创建微服务

    gRPC是一个 高性能 、 开源 和 通用 的 RPC 框架 , 面向移动端 和 HTTP/2 设计,目前提供 C、Java 和 Go语言版本,分别是:grpc, grpc-java, grpc-go, 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持 (1).提供几乎所有主流语言的实现, 打破语言隔阂 (2). 基于 HTTP/2 标准设计

    2024年02月04日
    浏览(45)
  • SpringBoot + Kotlin 中使用 GRPC 进行服务通信

    示例项目见:kotlin-grpc 一、导入依赖: 二、设置Proto 将 proto 文件放在 src/mian/proto 目录下 执行 ./gradlew clean build build成功则会在 build/generated/source/proto/main 下生成对应的 grpc 、 grpckt 、 java 文件 在程序中可以直接导包引入 三、Server端 写一个 service 在 main 入口引入启动 四、Cl

    2024年02月16日
    浏览(46)
  • aspnetcore微服务之间grpc通信,无proto文件

    aspnetcore微服务之间通信grpc,一般服务对外接口用restful架构,HTTP请求,服务之间的通信grpc多走内网。 以前写过一篇grpc和web前端之间的通讯,代码如下: exercisebook/grpc/grpc-web at main · liuzhixin405/exercisebook (github.com)   本次是微服务之间的通信使用了开源软件MagicOnion, 该软件定义

    2024年02月08日
    浏览(46)
  • libtorch+GPU部署wenet语音识别(gRPC通信)

    业务App中部分功能需要通过ASR识别5-7秒的语音命令,App本身不支持流式协议,需录音完成后传输至服务端进行识别及后续的NLP。 根据实际情况仅对语音模型进行增强,使用libtorch+GPU方式部署,gRPC方式调用,由于并发不大,使用flask+gunicorn部署API。 拉取 nvidia官方的cuda11.3 run

    2024年02月10日
    浏览(35)
  • gRPC-gateway使用介绍

    参考资料:gRPC-Gateway使用指南 服务中,使用了gRPC gateway(代理)来将外部的http请求映射为内部rpc调用。 接下来还需进行一些配置才能完成映射。 (8080端口提供gRPC API服务,8090端口提供HTTP API服务)

    2024年01月23日
    浏览(40)
  • gRPC---proto文件编写及文件介绍

    在编写完上面的内容后,在/proto目录下执行如下命令: 运行完代码后会在proto目录下生成两个.go文件: message类似于结构体,在消息中承载的数据分别对应于每一个字段,其中每一个字段都有一个名字和一种类型 一个proto文件中可以定义多个消息类型 required :消息体中

    2023年04月21日
    浏览(33)
  • 翻译:REST 和 gRPC 详细比较

    译者注:在微服务架构设计,构建API和服务间通信技术选型时,对 REST 和 gRPC 的理解和应用还存在知识盲区,近期看到国外的这篇文章:A detailed comparison of REST and gRPC,将二者进行了详细对比。周末有时间翻译过来,希望能帮到大家! 很长一段时间以来,REST是构建API的唯一“

    2024年02月08日
    浏览(49)
  • .NetCore gRpc 客户端与服务端的单工通信Demo

    方式一 使用vs 2022(也可以是其他版本)创建一个grpc的服务,如下这样 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uipEG9Xu-1687172462785)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20230619183828284.png)] 简单方便,创建项目后的目录结构如下图

    2024年02月09日
    浏览(57)
  • Spring boot使用gRPC 的详细教程

    本篇文章,我们介绍gRPC并通过例子详细演示使用gRPC的过程。 微信搜索关注《Java学研大本营》,加入读者群,分享更多精彩 gRPC是一个开源的、高性能的远程过程调用(RPC)框架,由谷歌提供,用于分布式系统之间的高效通信。它使用协议缓冲区(protobuf)进行有效的数据序

    2024年01月22日
    浏览(35)
  • Vue组件通信——父子组件通信的四种方法

    全局引入 在main.js文件中引入并注册 之后就可以全局使用组件了 局部引入 在父组件中引入 之后就可以在父组件中使用组件了 在子组件 prop 中可以注册一些自定义组件属性,父组件调用子组件时可以向 prop 中的自定义属性传值。 子组件代码: 父组件代码 prop 也可以通过 v-

    2023年04月16日
    浏览(103)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包