前言

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

简介

什么是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 mainimport (   "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 {   }}

用户端

目录结构如下:

package mainimport (   "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技术:360技术是360技术团队打造的技术分享公众号,每天推送技术干货内容,更多技术信息欢迎关注“360技术”微信公众号

grpc框架_grpc的入门使用相关推荐

  1. Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次 ...

  2. grpc框架_分布式RPC框架dubbo、motan、rpcx、gRPC、thrift简介与性能比较

    Dubbo Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.曾有一段时间放弃维护,不过当前 ...

  3. python rpc微服务框架_grpc的微服务探索实践

    对于微服务的实践,一般都是基于Java和Golang的,博主最近研究了下基于Python的微服务实践,现在通过一个简单的服务来分析Python技术栈的微服务实践 技术栈:Python3 + grpc ...

  4. Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射 下一篇:Farseer.net轻量级ORM开源 ...

  5. 分布式应用框架Akka快速入门

    转自:分布式应用框架Akka快速入门_jmppok的专栏-CSDN博客_akka 本文结合网上一些资料,对他们进行整理,摘选和翻译而成,对Akka进行简要的说明.引用资料在最后列出. 1.什么是Akk ...

  6. 分布式事物框架Easy-Transaction--使用入门介绍

    分布式事物框架Easy-Transaction--使用入门介绍 The origin This framework is inspired by a PPT (<大规模SOA系统的分布式事务处理 ...

  7. 分布式事物框架--EasyTransaction的入门介绍

    分布式事物框架--EasyTransaction的入门介绍 柔性事务,分布式事务,TCC,SAGA,可靠消息,最大努力交付消息,事务消息,补偿,全局事务,soft transaction, distr ...

  8. 数据可视化js框架 d3.js入门

    数据可视化js框架 d3.js入门 [一] 选择元素绑定数据 1.下载.引入d3.js 2.d3.select():选择所有指定元素的第一个 3.d3.selectAll() :选择指定元素的全部 e ...

  9. ❤️《Vue前端基础框架集合从入门到高级》(小白也可学,建议收藏)❤️

    <Vue前端基础框架集合从入门到高级>,小白也可学 文章目录 <Vue前端基础框架集合从入门到高级>,小白也可学 ❤️一.前端核心分析 ❤️1.1.概述 ❤️1.2.前端三要素 ...

最新文章

  1. 十进制 转换为 二进制
  2. 解决hash冲突的常用方法
  3. 【Java设计模式】装饰模式
  4. 阿里云边缘容器服务、申通 IoT 云边端架构入选 2021 云边协同发展阶段性领先成果
  5. BOOL 值在 debug 和 release 模式下初始化不一样!!!
  6. 攻防世界 ——crypto
  7. 掘进循环作业图表_Word版本。煤矿安全生产标准化评分方法(2020)8.4 掘进
  8. 实现Linux select IO复用C/S服务器代码
  9. 微服务应用实现无损上下线实践
  10. 查linux有哪些task_浅谈Linux线程模型
  11. Unity 导出Supermap exe
  12. Python—实现ssh客户端(连接远程服务器)
  13. ftp网页服务器不允许匿名登录,我的FTP服务器不让匿名登陆,怎么办?
  14. java考试时间,Java认证考试知识点:Java时间类的函数
  15. 高仿斗鱼 android,Android 高仿斗鱼滑动验证码
  16. php源码查后门,某一次排查源码后门的过程
  17. CTF训练(密码学)——位移密码
  18. Android之shape属性设置
  19. linux bond四网卡绑定,Linux bond 网卡绑定配置教程
  20. android app开机启动画面,Android-如何设置APP开机启动(图文)

热门文章

  1. mysql ---- 多表查询
  2. PD连接远程mysql_PowerDesigner连接远程Oracle数据库 | 学步园
  3. python语言中有3种表示字符串的方式、单引号和_Python中三种类型的引号(单引号、双引号、三引号)...
  4. VS2010怎样显示行号
  5. oracle 替换全部空格
  6. 华硕v4000fj笔记本怎么样_所有已开箱笔记本的目录汇总 20200812
  7. 知识总结和记录——递归
  8. Ubuntu 16.04安装Docker-Compose 与 Can't connect to docker from docker-compose
  9. CMake - SWIG - 移植动态库
  10. 10.15. TUI