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
猜你喜欢
- 本文实例讲述了PHP学习记录之面向对象(Object-oriented programming,OOP)基础。分享给大家供大家参考,具体如下
- 介绍百度aip模块是用于实现百度云与用户接口,简单来说就是使用百度云所拥有的人工智能模块。模块使用pip install baidu-aip
- MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理
- 本文介绍了Python小波分析库Pywavelets,分享给大家,具体如下:# -*- coding: utf-8 -*- import n
- python字符串-删除末位字符(rstrip)rstrip函数用于删除字符串末位指定字符,默认为空白符。语法str.rstrip([cha
- uwsgi介绍uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作
- 最近真的感觉到了python生态的强大(倒吸一口凉气)现在介绍一个可以生成动态二维码的库(myqr)效果如图:第一步要安装myqr库在cmd
- 有时候会碰到需求,将字典来反转,即:字典中的键作为值,而字典中的值作为键。对于字典比较小,可以使用普通方法方法一:使用普通方法转换>&
- django程序,需要写很多api,每个函数都需要几个装饰器,例如@csrf_exempt @require_POST 
- 如下所示:#coding=utf-8#读取图片 返回图片某像素点的b,g,r值import cv2import numpy as npimg
- 一.GO程序目录结构在GOPATH目录下的结构--bin(存放编译后生成的可执行文)|----hello.exe(可执行文件)--pkg(存
- 话不多说,请看代码:SQLServer Procedure Pagination_basic:ALTER PROCEDURE [qianch
- Python中对象的行为是由它的类型 (Type) 决定的。所谓类型就是支持某些特定的操作。数字对象在任何编程语言中都是基础元素,支持加、减
- BLOG地址:http://www.planabc.net/article.asp?id=107学习标准的朋友,一般都会在学习的过程中接触到
- 实例如下:# bytes object b = b"example" # str object s = "ex
- 一、题目描述求解用户登陆信息表中,每个用户连续登陆平台的天数,连续登陆基础为汇总日期必须登陆,表中每天只有一条用户登陆数据(计算中不涉及天内
- 1.绘制面积图面积图常用于描述某指标随时间的变化程度。其面积也通常可以有一定的含义。绘制面积图使用的是plt.stackplot()方法。以
- 1.什么是解构?ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。它在语法上比ES5所提供的更加简洁、紧凑、清晰。
- 目标最近实验室里成立了一个计算机兴趣小组倡议大家多把自己解决问题的经验记录并分享就像在CSDN写博客一样虽然刚刚起步但考虑到后面此类经验记录
- sql调优的几种方式:避免使用select *、用union all 代替union、小表驱动大表、批量操作、多用limit、in中值太多、