思考gRPC :为什么是HTTP/2

本文深入探讨了gRPC这一高性能跨语言RPC方案的设计动机与原则,详细介绍了其支持的环境与特性,如物联网、手机、浏览器的支持,以及stream和流控功能。同时,文章解析了HTTP/2的基本概念及其与gRPC的关系,强调了gRPC为何选择HTTP/2作为底层传输协议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

gRPC是google开源的高性能跨语言的RPC方案。gRPC的设计目标是在任何环境下运行,支持可插拔的负载均衡,跟踪,运行状况检查和身份验证。它不仅支持数据中心内部和跨数据中心的服务调用,它也适用于分布式计算的最后一公里,将设备,移动应用程序和浏览器连接到后端服务。

GRPC设计的动机和原则

个人觉得官方的文章令人印象深刻的点:

  • 内部有Stubby的框架,但是它不是基于任何一个标准的
  • gRPC支持任意环境使用,支持物联网、手机、浏览器
  • gRPC支持stream和流控

HTTP/2是什么

在正式讨论gRPC为什么选择HTTP/2之前,我们先来简单了解下HTTP/2。

HTTP/2可以简单用一个图片来介绍:

HTTP/2

来自:https://hpbn.co/

可以看到:

  • HTTP/1里的header对应HTTP/2里的 HEADERS frame
  • HTTP/1里的payload对应HTTP/2里的 DATA frame

原文链接

client/ ├── pom.xml ├── src │ └── main │ ├── java │ │ └── com │ │ └── example │ │ ├── ArithmeticClient.java │ └── proto │ └── arithmetic.proto 两个独立的Ubuntu系统,server和client,目前都已成功安装GRPC,我现在想在服务端用C++,客户端用java,实现以下功能: 客户端向服务端发送两个数,服务端进行加减法,然后将结果返回客户端 请给出流程步骤及代码,要详细和完整 我的protoc-gen-grpc-java插件版本(1.30.0) 我的Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae) Maven home: /opt/maven Java version: 11.0.27, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64 Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "6.8.0-59-generic", arch: "amd64", family: "unix" protoc版本:libprotoc 3.12.4 echo $JAVA_HOME 输出:/usr/lib/jvm/java-11-openjdk-amd64 客户端ip:192.168.42.132 服务端IP:192.168.42.133 目前server端已处理完毕,其中arithmetic.proto: syntax = "proto3"; package arithmetic; service Arithmetic { rpc Add (OperationRequest) returns (OperationResponse) {} rpc Subtract (OperationRequest) returns (OperationResponse) {} } message OperationRequest { int32 number1 = 1; int32 number2 = 2; } message OperationResponse { int32 result = 1; } server.cpp: #include <grpcpp/grpcpp.h> #include <iostream> #include "arithmetic.grpc.pb.h" using grpc::Server; using grpc::ServerBuilder; using grpc::ServerContext; using grpc::Status; using namespace arithmetic; class ArithmeticServiceImpl final : public Arithmetic::Service { public: // 必须添加public访问修饰符 Status Add(ServerContext* context, const OperationRequest* request, OperationResponse* reply) override { reply->set_result(request->number1() + request->number2()); return Status::OK; } Status Subtract(ServerContext* context, const OperationRequest* request, OperationResponse* reply) override { reply->set_result(request->number1() - request->number2()); return Status::OK; } }; int main() { std::string server_address("0.0.0.0:50051"); ArithmeticServiceImpl service; ServerBuilder builder; builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); builder.RegisterService(&service); std::unique_ptr<Server> server(builder.BuildAndStart()); std::cout << "Server listening on " << server_address << std::endl; server->Wait(); return 0; } 请生成java端的代码,要求是由用户输入两个数,并且要说明文件级别架构 在client文件夹内操作 按顺序详细给出操作步骤,要认真仔细,确保可以编译和运行,一定要认真审查 java的pom.xml到底如何配置,老是报错,这个要认真思考和推理,详细解释pom文件
05-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值