您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

grpc的入门使用

时间:2020-07-08 15:15:12  来源:  作者:
grpc的入门使用

 

前言

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类型等。

  • 基础类型
grpc的入门使用

 

  • 枚举类型
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常用参数

grpc的入门使用

 

案例

文件目录如下:

grpc的入门使用

 

其中“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

服务端

目录结构如下:

grpc的入门使用

 

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技术”微信公众号

 



Tags:grpc   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在使用gRpc的过程中,有一个想法:gRpc客户端、服务端是怎么交互的呢?从这个想法萌生出一个验证方法,通过抓包来分析其交互过程与底层数据,一起来看看吧。1. gRpc是什么gRpc是什么?g...【详细内容】
2021-07-12  Tags: grpc  点击:(136)  评论:(0)  加入收藏
前言grpc是一个高性能、通用的开源RPC框架,基于HTTP/2协议标准和Protobuf序列化协议开发,支持众多的开发语言。在对接口具有严格约束或者传递大量数据的场景中得到了广泛的应...【详细内容】
2020-07-08  Tags: grpc  点击:(143)  评论:(0)  加入收藏
本文的目的是对gRPC有一个高级的了解。 它还将解释gRPC与Web应用程序通信遵循的现有协议和体系结构之间的异同。...【详细内容】
2020-05-05  Tags: grpc  点击:(53)  评论:(0)  加入收藏
此时,您应该已经听说过" gRPC"(标题中至少一次)。 在本文中,我将着重介绍采用gRPC作为微服务之间的通信介质的好处。首先,我将尝试简要介绍一下架构演变的历史。 其次,我将重点...【详细内容】
2020-04-08  Tags: grpc  点击:(58)  评论:(0)  加入收藏
gRPC 1.24.2 发布了。gRPC 是 Google 开源的高性能、通用 RPC 框架,面向移动和 HTTP/2 设计,是由谷歌发布的首款基于 Protocol Buffers 的 RPC 框架。gRPC 基于 HTTP/2 标准设...【详细内容】
2019-10-14  Tags: grpc  点击:(118)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条