Golang语言实现gRPC的具体使用

作者:鹿鱼 时间:2024-05-05 09:26:19 

gRPC 是通信协议基于 HTTP/2,支持多语言的 RPC 框架,使用 Protobuf 作为它的接口设计语言(IDL),可以通过 protoc 工具生成 Golang 语言的结构体。

RPCRemote Procedure Call 的缩写,译为远程过程调用(也可译为远程方法调用或远程调用),它是计算机通信协议。该协议可以实现调用远程服务就像调用本地服务一样简单,无需关心跨网络,跨平台,跨语言等问题。

gRPC 消息序列化方式通常使用 Protobuf,它是二进制格式,体积小,网络传输快,占用带宽流量少,调用性能更高。

Golang语言实现gRPC的具体使用

gRPC 的特点

  • IDL

    gRPC 使用 ProtoBuf 来定义服务,ProtoBuf 是由 Google 开发的一种数据序列化协议(类似于 XMLJSON)。ProtoBuf 能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。

  • 多语言支持

    gRPC 支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前已提供了 C 版本 grpcJava 版本 grpc-javaGo 版本 grpc-go,其中,grpc 支持 CC++Node.jsPythonRubyObjective-CPHPC# 等语言,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

标签:Golang,gRPC
0
投稿

猜你喜欢

  • python中time.ctime()实例用法

    2022-11-09 05:25:32
  • windows下安装php的memcache模块的方法

    2023-11-20 05:47:38
  • 解决pycharm无法调用pip安装的包问题

    2023-01-25 23:43:16
  • Python OpenCV中的drawMatches()关键匹配绘制方法

    2022-10-31 22:36:57
  • 浅谈js中startsWith 函数不能在任何浏览器兼容的问题

    2024-04-23 09:11:38
  • 浅谈MySQL索引优化分析

    2024-01-16 00:04:08
  • python+gdal+遥感图像拼接(mosaic)的实例

    2023-02-22 23:40:34
  • Go语言学习笔记之错误和异常详解

    2024-02-05 11:39:15
  • JS与jQuery判断文本框还剩多少字符可以输入的方法

    2024-04-25 13:07:20
  • 基于PHP实现一个简单的在线聊天功能

    2024-05-03 15:52:38
  • 给验证码增加干扰的杂点

    2008-05-16 11:34:00
  • go mod 安装依赖 unkown revision问题的解决方案

    2024-05-09 14:59:34
  • django自带的权限管理Permission用法说明

    2023-07-25 04:18:06
  • 在Pandas DataFrame中插入一列的方法实例

    2021-08-17 19:39:18
  • Python实现合并excel表格的方法分析

    2022-04-24 21:30:22
  • Pycharm中配置远程Docker运行环境的教程图解

    2022-08-06 09:39:19
  • sql server 锁表语句分享

    2012-02-12 15:49:20
  • 如何用ASP获知机器的网络配置?

    2010-06-11 19:58:00
  • Django实现基于类的分页功能

    2022-04-06 21:49:03
  • sql将时间类型转换为字符串类型汇总

    2024-01-25 10:33:42
  • asp之家 网络编程 m.aspxhome.com