go grpc的入门使用
简介
什么是grpc
grpc是一个由google推出的、高性能、开源、通用的rpc框架。它是基于HTTP2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。
什么是protobuf buffers
ProtoBuf buffer 是一种数据表达方式,以.proto结尾的数据文件,可以类比json、xml等。针对ProtoBuf buffer 数据源,可以利用protoc 工具来生成各种语言的访问类。其操作步骤:
- 定义数据元;
- 生成数据元的访问类。
优点:
- 编解码速度更快;
- 传输的数据更小。
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的入门使用的更多相关文章
- GRPC快速入门
转载请注明来自ChenJiehua的<GRPC快速入门> GRPC是一个高性能.通用的开源RPC框架,基于HTTP/2协议标准和Protobuf序列化协议开发,支持众多的开发语言. 概述 ...
- gRPC快速入门记录
为什么使用grpc 1.protocl buffer一种高效的序列化结构. 2.支持http 2.0标准化协议. http/2 1.http/2对每个源只需创建一个持久连接,在这一个连接内,可以并行的 ...
- 【微服务落地】服务间通信方式: gRPC的入门
gRPC是什么 官方介绍: https://grpc.io/docs/what-is-grpc/introduction/ "A high-performance, open-source ...
- gRPC初探——概念介绍以及如何构建一个简单的gRPC服务
目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...
- 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 ...
- .NET周报【1月第3期 2023-01-20】
这应该是2023年农历新年前的最后一篇.NET周报,再次预祝大家新年快乐! 国内文章 看我是如何用C#编写一个小于8KB的贪吃蛇游戏的 https://www.cnblogs.com/InCerry/ ...
- Grpc微服务从零入门
快速入门 安装 JDK 毫无疑问,要想玩Java,就必须得先装Java JDK,目前公司主要使用的是Oracle JDK 8,安装完成后要配置环境才能正常使用,真蠢,不过也就那么一下下,认了吧.配置方 ...
- grpc入门(三)
grpc入门(三) 一.介绍 本文是关于grpc的第三篇博文,是对前两篇博文的具体代码实现,秉着个人一贯的风格,没有太多抒情和总结,直接就上代码. 文章代码参考:https://github.com/ ...
- ASP.NET Core gRPC 入门全家桶
一. 说明 本全家桶现在只包含了入门级别的资料,实战资料更新中. 二.官方文档 gRPC in Asp.Net Core :官方文档 gRPC 官网:点我跳转 三.入门全家桶 正片: ASP.NET ...
- gRPC (1):入门及服务端创建和调用原理
1. RPC 入门 1.1 RPC 框架原理 RPC 框架的目标就是让远程服务调用更加简单.透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP).序列化方式(XML/Json/ 二进制)和 ...
随机推荐
- Qt编写视频监控系统73-不同视频流不同类型的判断和解析(http/m3u8/rtsp/rtmp等)
一.前言 这套视频监控系统大概从2018年起步整体框架,一步步积累到现在,中间经历了无数次的各种视频文件.视频流.视频设备的播放测试,比如光视频文件就有mp4/wmv/rmvb/mkv/avi等格式, ...
- Qt开源作品8-通用控件移动
一.前言 在做一些项目的过程中,有一种应用场景是需要拖动设备在一个容器中,自由拖动摆放到合适的位置,然后保存对应设备的坐标位置信息,在软件启动好以后自动加载配置好的坐标位置信息,将每个设备移动到对应的 ...
- 实时音视频入门学习:开源工程WebRTC的技术原理和使用浅析
本文由ELab技术团队分享,原题"浅谈WebRTC技术原理与应用",有修订和改动. 1.基本介绍 WebRTC(全称 Web Real-Time Communication),即网 ...
- 【狂神说Java】Java零基础学习笔记-面向对象
[狂神说Java]Java零基础学习笔记-面向对象 面向对象01:什么是面向对象 面向过程&面向对象 面向过程思想 步骤清晰简单,第一步做什么,第二步做什么.... 面对过程适合处理一些较为简 ...
- 记录uniapp上传图片转base64
// 图片转base64 imageToBase64() { return new Promise((reslove, reject) => { uni.getFileSystemManager ...
- Mac_工具使用汇总
Mac安装低版本的Xcode后会出现各种问题,现汇总如下: 1. python3: error: unable to find utility "python3", not a ...
- useMemo和useCallback的使用
useMemo const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]); 把"创建" ...
- 云数据库与Web网站:构建高效、可扩展的网络应用
本文分享自天翼云开发者社区<云数据库与Web网站:构建高效.可扩展的网络应用>,作者:3****m 一.云数据库与Web网站的关系 云数据库与Web网站之间存在着密切的关系.Web网站需要 ...
- DataV过滤器
人才库: return data.filter(function (item) { return item.职级 === ''; }) 区县分析: //一级指标 const t = Object. ...
- 我喜欢 amy 同学的腿……
1.我是人间之屑,这点我先承认大约不会错,但并不代表我的一切都是 hitonokuzu 为了防止对成语的吴勇(迫真),这就是人渣的意思. 2.看来亚里士多德的观点还是没有过时,老祖宗说的对.老祖宗指的 ...