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


猜你喜欢
- Python 内置的 itertools 模块包含了一系列用来产生不同类型迭代器的函数或类,这些函数的返回都是一个迭代器,我们可以通过 fo
- 提示:本文多图,请手机端注意流量。前言利用python做图片识别,识别提取图片中的文字会有很多方法,但是想要简单一点怎么办,那就可以使用te
- python高级特性1、集合的推导式•列表推导式,使用一句表达式构造一个新列表,可包含过滤、转换等操作。语法:[exp for item i
- 直接给出例子说明:cs = conn.cursor()img_ids = [1,2,3]sql = "select img_url
- 如下所示:#! usr/bin/python#coding=utf-8 import numpy as npimport matplotli
- 脚本内容代码如下:from mitmproxy import http, ctxfrom multiprocessing import Lo
- 本文实例讲述了Python画柱状统计图操作。分享给大家供大家参考,具体如下:一、工具:python的matplotlib.pyplot 库二
- 词法分析(Lexical Analysis):分析由字符组成的单词是否合法,如果没有问题的话,则产生一个单词流。 语法分析(Syntacti
- 业务场景:1、在数据库表中的数据,要求记录每一条新增数据的创建时间,时间格式要求明确至:年月日:时分秒。2、在数据库表中的数据,要求记录每一
- 如何用python做后端写网页-flask框架 什么是Flask安装flask模块Hello World更深一步:数据绑定后端传入数据从前端
- 【OpenCV】⚠️高手勿入! 半小时学会基本操作⚠️ 腐蚀膨胀概述OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今
- sql server存储过程语法 定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过
- 1. 概述information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其
- 本文实例讲述了PHP实现判断二叉树是否对称的方法。分享给大家供大家参考,具体如下:问题请实现一个函数,用来判断一颗二叉树是不是对称的。注意,
- 最近在工作中,遇到了数据合并、连接的问题,故整理如下,供需要者参考~一、concat:沿着一条轴,将多个对象堆叠到一起concat方法相当于
- jwt详解Django之auth模块(用户认证)jwt的作用json web token,一般用于用户认证就是做用户登录的(前后端分离/微信
- 1.主要用到 QFileDialog 方法打开本地文件2.界面打开前:打开后:3. 代码import sysfrom PyQt5 impor
- 一、数据库的备份1、选择要备份的数据库“accountInfo”,点击鼠标右键 → 任务 → 备份2、在打开的“备份数据库 —account
- 刚来这个公司,熟悉了环境,老大就开始让我做一个迁移、修改代码的工作,我想说的是,这种工作真没劲~~,看别人的代码、改别人的代码、这里改个变量
- 通过配置VIP,在进行主备切换时,出现的报错信息:1.当主备节点当前binlog文件名称相同时,原主节点的position小于主备切换后的p