简介

什么是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 {
} // 新增students
func (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())
}
}

go grpc的入门使用的更多相关文章

  1. GRPC快速入门

    转载请注明来自ChenJiehua的<GRPC快速入门> GRPC是一个高性能.通用的开源RPC框架,基于HTTP/2协议标准和Protobuf序列化协议开发,支持众多的开发语言. 概述 ...

  2. gRPC快速入门记录

    为什么使用grpc 1.protocl buffer一种高效的序列化结构. 2.支持http 2.0标准化协议. http/2 1.http/2对每个源只需创建一个持久连接,在这一个连接内,可以并行的 ...

  3. 【微服务落地】服务间通信方式: gRPC的入门

    gRPC是什么 官方介绍: https://grpc.io/docs/what-is-grpc/introduction/ "A high-performance, open-source ...

  4. gRPC初探——概念介绍以及如何构建一个简单的gRPC服务

    目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...

  5. ASP.NET Core 3.0 gRPC 拦截器

    目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 拦截器 一. 前言 前面两篇文章给大家介绍了使用g ...

  6. .NET周报【1月第3期 2023-01-20】

    这应该是2023年农历新年前的最后一篇.NET周报,再次预祝大家新年快乐! 国内文章 看我是如何用C#编写一个小于8KB的贪吃蛇游戏的 https://www.cnblogs.com/InCerry/ ...

  7. Grpc微服务从零入门

    快速入门 安装 JDK 毫无疑问,要想玩Java,就必须得先装Java JDK,目前公司主要使用的是Oracle JDK 8,安装完成后要配置环境才能正常使用,真蠢,不过也就那么一下下,认了吧.配置方 ...

  8. grpc入门(三)

    grpc入门(三) 一.介绍 本文是关于grpc的第三篇博文,是对前两篇博文的具体代码实现,秉着个人一贯的风格,没有太多抒情和总结,直接就上代码. 文章代码参考:https://github.com/ ...

  9. ASP.NET Core gRPC 入门全家桶

    一. 说明 本全家桶现在只包含了入门级别的资料,实战资料更新中. 二.官方文档 gRPC in Asp.Net Core :官方文档 gRPC 官网:点我跳转 三.入门全家桶 正片: ASP.NET ...

  10. gRPC (1):入门及服务端创建和调用原理

    1. RPC 入门 1.1 RPC 框架原理 RPC 框架的目标就是让远程服务调用更加简单.透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP).序列化方式(XML/Json/ 二进制)和 ...

随机推荐

  1. U盘或光盘启动的Win7-8-10的PE系统制作步骤

    U盘或光盘启动的Win7-8-10的PE系统制作步骤 1.打开http://www.ushendu.com/下载PE制作工具 2.下载完成后安装到我的电脑, 把准备好的U盘插到电脑上,打开U深度PE制 ...

  2. SuperMap Objects .NET知识库:SQL查询以及通配符

    1     SQL 语句的构建 在SuperMap组件产品中,有许多接口都用到了过滤条件,也就是标准 SQL 语句中的 WHERE 子句部分,比如各种涉及属性查询的接口.网络分析中弧段的过滤条件.拓扑 ...

  3. Spring+MyBatis企业应用实战(第二版)2018-电子书+源码+SQL脚本

    Spring+MyBatis企业应用实战(第二版)2018学习资料: 电子书: 链接:https://pan.baidu.com/s/1yAdlA5F_HuZMbO4who5jVw 提取码:58yz ...

  4. Scala,一门「特立独行」的语言!

    入门 Spark 的路上很难不接触 Scala . Scala 似乎是为 java 提供了很多『类似函数式编程』的语法糖,这里记录一下这个语言独特的地方分享给读者朋友们. 参考资料主要有: 曹洁 . ...

  5. ConcurrentHashMap源码分析-JDK18

    前言 ConcurrentHashMap是一个线程安全的HashMap,主要用于解决HashMap中并发问题. 在ConcurrentHashMap之前,也有线程安全的HashMap,比如HashTa ...

  6. 【宝塔】搭建随机图API

    创建站点 首先,我们打开服务器的宝塔面板,如果没安装的推荐安装一个,因为这个对建站小白来说非常的方便. 我们参加一个 API 站点 然后到站点设置里申请一个 ssl 认证,再打开强制 https 添加 ...

  7. Spring 框架基础

    一.Spring框架 1.框架简介 Spring是一个开源框架,框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架.Spring使用基 ...

  8. nginx配置好访问返回502错误

    CentOS服务器配置好Nginx重新加载了配置文件,浏览器访问提示错误: 502 Bad Gatewaynginx/1.16.1 如图: 页面上直接显示了nginx名称,一般是说nginx服务器返回 ...

  9. ctfshow--红包一 ob混淆

    上来是一段混淆的ob混淆的js代码,还会有个setinterval无限debugger反调试 点击查看代码 function _0x51ba() { const _0x4b06d7 = ['paddi ...

  10. JAVA8——StringJoiner类

    引言:在阅读项目代码是,突然看到了StringJoiner这个类的使用,感觉很有意思,对实际开发中也有用,实际上是运用了StringBuilder的一个拼接字符串的封装处 介绍 StringJoine ...