低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

grpc 的入门使用

2020 年 2 月 27 日

grpc的入门使用

grpc 是一个高性能、通用的开源 RPC 框架,基于 HTTP/2 协议标准和 Protobuf 序列化协议开发,支持众多的开发语言。在对接口具有严格约束或者传递大量数据的场景中得到了广泛的应用。本文作者从什么是 grpc 开始介绍,讲诉了 protobuf 的语法以及如何使用 grpc 框架,对于想学习 grpc 的初学者来说,是一篇极好的入门教程,下来就跟随作者一起学习吧。

PS:丰富的一线技术、多元化的表现形式,尽在“360 云计算”,点关注哦!


简介

什么是 grpc

grpc 是一个由 google 推出的、高性能、开源、通用的 rpc 框架。它是基于 HTTP2 协议标准设计开发,默认采用 Protocol Buffers 数据序列化协议,支持多种开发语言。


什么是 protobuf buffers

ProtoBuf buffer 是一种数据表达方式,以.proto 结尾的数据文件,可以类比 json、xml 等。


针对 ProtoBuf buffer 数据源,可以利用 protoc 工具来生成各种语言的访问类。


其操作步骤:


1.定义数据元;


2.生成数据元的访问类。


优点:


  • 编解码速度更快;

  • 传输的数据更小。


protobuf buffers 定义数据元的语法

一个.proto 文件,主要包括以下部分:


syntax = "proto3";package studentpb;service Student {     rpc add (StudentReqs) returns (StudentReply) {} //新增学生接口}
message StudentReqs { repeated StudentReq s = 1;}
message StudentReq{ string name= 1; int32 age = 2;}
message StudentReply { int32 errno = 1; string errmsg = 2;}
复制代码


  • 关键字 syntax:指定使用的 proto3 语法;

  • 关键字 package:定义一个包,需要注意避免命名冲突;

  • 关键字 message 来定义请求或相应需要使用的消息格式,里面可以包含了不同类型的字段 。一个.proto 文件中,可以包含多个 message 的定义。

  • 关键字 server 来定一个服务。GRPC 的服务是通过参数和返回类型来指定可以远程调用的方法。

  • 字段的约束规则


repeated:前置 repeated 关键词,声明该字段为数组类型。


proto3 不支持 proto2 中的 required 和 optional 关键字。


字段支持的类型

支持基础类型、枚举类型、map 类型、数组类型、message 类型等。


  • 基础类型

  • 枚举类型


syntax = "proto3";
message Student{ string name = 1; // 定义enum类型 enum Sex { BOY = 0; GIRL = 1; } Sex sex = 1; // 使用Corpus作为字段类型}message类型syntax = "proto3";
message Students { repeated Student s = 1;}
message Student{ string name = 1; // 定义enum类型 enum Sex { BOY = 0; GIRL = 1; } Sex sex = 4; // 使用Corpus作为字段类型}
复制代码


如何利用 protoc 工具生成访问类

prooc 常用参数

案例

文件目录如下:


其中“t.proto”内容如下:


syntax = "proto3";package studentpb;service Student {     rpc add (StudentReqs) returns (StudentReply) {} //新增学生接口}
message StudentReqs { repeated StudentReq s = 1;}
message StudentReq{ string name= 1; int32 age = 2;}
message StudentReply { int32 errno = 1; string errmsg = 2;}
复制代码


生成 go 访问类的语句如下:


 protoc --go_out=plugins=grpc:. protobuf/*.proto
复制代码


GO 如何利用 GRPC 通信

pb 文件

syntax = "proto3";package studentpb;service Student {     rpc add (StudentReqs) returns (StudentReply) {} //新增学生接口}
message StudentReqs { repeated StudentReq s = 1;}
message StudentReq{ string name= 1; int32 age = 2;}
message StudentReply { int32 errno = 1; string errmsg = 2;}
复制代码


执行如下命令,生成 grpc 访问类


protoc --go_out=plugins=grpc:. *.proto


服务端

目录结构如下:


main.go 内容如下:


package main
import ( "context" "fmt" "google.golang.org/grpc" "log" "net" "test/studentpb")
type Student struct {}
// 新增studentsfunc (r *Student) Add(ctx context.Context, in *studentpb.StudentReqs) (*studentpb.StudentReply, error) { return &studentpb.StudentReply{ Errno: 0, Errmsg: "ok", }, nil}
func main() {
// 建立server监听 rpcAddr := "127.0.0.1:8601" server, err := net.Listen("tcp", rpcAddr) if err != nil { fmt.Println("failed to listen", rpcAddr) panic(err) }
// 建立rpc server var RpcServer = grpc.NewServer() err = RpcServer.Serve(server) if err != nil { log.Fatalf("failed to listen: %v", err) }
// 对外提供服务 r := new(Student) studentpb.RegisterStudentServer(RpcServer, r) select { }}
复制代码


用户端

用户端的目录结构和服务端一样。main.go 的内容如下:


package main


import (   "context"   "fmt"   "google.golang.org/grpc"   "test/studentpb"   "time")
func main() { addr := "127.0.0.1:8601" timeout := 10
//建立rpc通道 client, err := grpc.Dial(addr, grpc.WithInsecure()) if err != nil { panic("连接失败") } defer client.Close()
// 创建studentrpc对象 rpcClient := studentpb.NewStudentClient(client)
// 创建上线文 ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeout)*time.Second) defer cancel()
//封装请求参数 req := &studentpb.StudentReqs{} req.S = append(req.S, &studentpb.StudentReq{Name:"张三", Age:12})
// 打印结果 res , err := rpcClient.Add(ctx, req) if err != nil { fmt.Println("请求错误", err) } else { fmt.Println(res.GetErrno(), res.GetErrmsg()) }}
复制代码


本文转载自 360 云计算公众号。


原文链接:https://mp.weixin.qq.com/s/0TnMIuHE0BZ7sFXTm0kvDw


2020 年 2 月 27 日 17:061477

评论

发布
暂无评论
发现更多内容

大作业2

追风

架构师一期

道高一丈,且看CWE4.2的新特性

华为云开发者社区

技术 安全 漏洞

LeetCode题解:剑指 Offer 40. 最小的k个数,sort,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

3D 可视化突发公共卫生事件 ,防护效率高达90%

一只数据鲸鱼

疫情 物联网 数据可视化 数据监测 3D可视化

窝家恶补三月,字节跳动三面,终于喜提offer!分享面试感受

Java架构之路

Java 程序员 架构 面试 编程语言

字节面试坎坷之路,第一次二面凉了!捞起来之后一面就凉了;我太难了呀!

Java架构之路

Java 程序员 架构 面试 编程语言

你真的会学习吗?从结构化思维说起

阿里巴巴云原生

云原生 技术人 自我思考 职场成长 成长笔记

美团工作7年,精华全在这份学习笔记里了,已成功帮助多位朋友拿到5个大厂Offer

Java成神之路

Java 程序员 架构 面试 编程语言

5年Java开发,面试4大厂(阿里、拼多多、字节、美团)后,我总结出大厂高频面试真题及解析

Java成神之路

Java 程序员 架构 面试 编程语言

智慧公安警务大数据分析研判云平台开发

13530558032

CEG挖矿系统APP开发|CEG挖矿软件开发

开發I852946OIIO

系统开发

圣诞狂欢,保险师APP赋能精细、个性化的运营服务

DT极客

Alibaba面试官:“这该死的程序员,知识竟如此渊博!”

Java架构之路

Java 程序员 架构 面试 编程语言

阿里云开源项目 OAM 负责人张磊入选「中国开源先锋 33 人」

阿里巴巴云原生

开源 开发者 云原生 k8s cncf

ModelArts黑科技揭秘|弹性训练,让训练资源张弛有度

华为云开发者社区

学习 华为云

从根上理解高性能、高并发(二):深入操作系统,理解I/O与零拷贝技术

JackJiang

网络编程 高并发 高性能 即时通讯

这份阿里P8级别内部疯传的“Linux私房菜”让你一次吃个饱

Java架构之路

Java 程序员 架构 面试 编程语言

浅谈如何做客户端性能测试

行者AI

性能测试

腾讯大牛亲自带你学:Java安全weblogic T3协议漏洞!

比伯

Java 编程 架构 面试 计算机

业务架构设计迭代演进思路

程序员架构进阶

架构 中台 业务架构

第八课性能优化作业-判断合并链表

Geek_michael

极客大学架构师训练营

智慧平安小区整体解决方案,智慧社区管控系统开发

13530558032

Java程序员晋升之路:“Java高级核心知识全面解析”

Java架构之路

Java 程序员 架构 面试 编程语言

利用文字技术帮助选购商品,慧眼“识”物的人都这样做……

华为云开发者社区

文字识别 智能 识别

SpringBoot系列(7)- 自动装配

引花眠

springboot

ARTS打卡 第28周

引花眠

微服务 ARTS 打卡计划 springboot

阿里“云钉一体”加速整合 低代码开发平台“钉钉宜搭”发布

人称T客

软件测试所需要掌握的技能

测试人生路

软件测试

区块链食品溯源系统开发,农产品溯源小程序搭建

13530558032

如何通过一个SDK轻松搞定人脸识别,拯救初入职场的程序猿

华为云开发者社区

人脸识别 智能 识别

阿里Java岗个人面经分享(技术三面+技术HR面):Java基础+Spring+JVM+并发编程+算法+缓存

Java成神之路

Java 程序员 架构 面试 编程语言

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

grpc的入门使用-InfoQ