Golang语言实现gRPC的具体使用
作者:鹿鱼 时间:2024-05-05 09:26:19
gRPC
是通信协议基于 HTTP/2
,支持多语言的 RPC
框架,使用 Protobuf
作为它的接口设计语言(IDL
),可以通过 protoc
工具生成 Golang
语言的结构体。
RPC:Remote Procedure Call
的缩写,译为远程过程调用(也可译为远程方法调用或远程调用),它是计算机通信协议。该协议可以实现调用远程服务就像调用本地服务一样简单,无需关心跨网络,跨平台,跨语言等问题。
gRPC
消息序列化方式通常使用 Protobuf
,它是二进制格式,体积小,网络传输快,占用带宽流量少,调用性能更高。
gRPC 的特点
IDL
gRPC
使用ProtoBuf
来定义服务,ProtoBuf
是由Google
开发的一种数据序列化协议(类似于XML
、JSON
)。ProtoBuf
能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。多语言支持
gRPC
支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前已提供了C
版本grpc
、Java
版本grpc-java
和Go
版本grpc-go
,其中,grpc
支持C
、C++
、Node.js
、Python
、Ruby
、Objective-C
、PHP
和C#
等语言,grpc-java
已经支持Android
开发。HTTP2
gRPC基于HTTP2标准设计,带来了更多强大功能,如双向流、头部压缩、多复用请求等。这些功能带来重大益处,如节省带宽、降低TCP链接次数、节省CPU使用和延长电池寿命等。同时,gRPC还能够提高了云端服务和Web应用的性能。gRPC既能够在客户端应用,也能够在服务器端应用,从而以透明的方式实现客户端和服务器端的通信和简化通信系统的构建。
使用 gRPC 定义服务端
gRPC 默认使用 Protobuf 作为接口设计语言,在 .proto
文件中使用 service 关键字定义服务,使用 rpc 和 returns 关键字定义指定请求参数和返回结果的方法。
gRPC 提供了 Protobuf 编译器插件 protoc-gen-grpc
,用于编译 .proto
文件,生成服务端和客户端代码,我们只需在服务端编写实现 Api 的代码,然后在客户端调用 Api。
syntax = "proto3";
import "google/protobuf/any.proto";
package hello;
option go_package = "proto/gen/go";
message HelloReq {
string name = 1;
}
message HelloResp {
int32 code = 1;
string greet = 2;
google.protobuf.Any details = 3;
}
service HelloService {
rpc Greet(HelloReq) returns (HelloResp);
}
使用 gRPC 的客户端
通过 protoc 命令编译 .proto
文件,自动生成服务端和客户端代码。
在服务端,手动编写生成的服务端方法的业务逻辑代码,然后运行 gRPC 服务,接收并处理客户端请求,gRPC 服务自动解码请求参数,然后执行服务的方法,并将返回结果自动进行编码。
在客户端,实现和服务相同的方法,然后客户端可以本地调用这些方法,将请求参数封装在 Protobuf 的消息类型中,gRPC 将请求发送给服务器,并返回服务器的 Protobuf 序列化方式的响应消息。
参考文章:
Golang 语言 gRPC 到底是什么?
gRPC简介
来源:https://juejin.cn/post/7127090482319982623
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
python中time.ctime()实例用法
windows下安装php的memcache模块的方法
![](https://img.aspxhome.com/file/2023/5/104165_0s.png)
解决pycharm无法调用pip安装的包问题
Python OpenCV中的drawMatches()关键匹配绘制方法
![](https://img.aspxhome.com/file/2023/1/110041_0s.png)
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
浅谈MySQL索引优化分析
![](https://img.aspxhome.com/file/2023/3/115543_0s.png)
python+gdal+遥感图像拼接(mosaic)的实例
Go语言学习笔记之错误和异常详解
![](https://img.aspxhome.com/file/2023/3/114803_0s.jpg)
JS与jQuery判断文本框还剩多少字符可以输入的方法
基于PHP实现一个简单的在线聊天功能
![](https://img.aspxhome.com/file/2023/2/129402_0s.png)
给验证码增加干扰的杂点
go mod 安装依赖 unkown revision问题的解决方案
![](https://img.aspxhome.com/file/2023/6/127056_0s.jpg)
django自带的权限管理Permission用法说明
![](https://img.aspxhome.com/file/2023/1/61491_0s.jpg)
在Pandas DataFrame中插入一列的方法实例
Python实现合并excel表格的方法分析
Pycharm中配置远程Docker运行环境的教程图解
![](https://img.aspxhome.com/file/2023/8/97278_0s.png)
sql server 锁表语句分享
如何用ASP获知机器的网络配置?
Django实现基于类的分页功能
![](https://img.aspxhome.com/file/2023/5/118775_0s.jpg)