Go语言grpc和protobuf


Posted in Golang onApril 13, 2022

1. 什么是grpc和protobuf

1.1 grpc

gRPC是一个高性能、开源和通用的RPC框架,面向移动和HTTP/2设计。

目前提供C、Java和Go语言版本,分别是:

grpc,grpc-java,grpc-go.其中C版本支持C,

C++,Node.js,Python,Ruby,Objective-C,PHP和C#支持.

grpc遵循HTTP/2协议,是一个二进制协议

grpc与http一样,底层都是tcp连接,遵循socket套接字

RPC是指远程过程调用,两台服务器A,B。A(客户端)调用B(服务端)上的方法,由于不在同一个内存空间,不能直接调用,需要通过网络调用。

Go语言grpc和protobuf

1.2 protobuf

Protocol Buffer是一种协议。
Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格式,性能比Json、XML真的强2-100倍!

protobuf经历了protobuf2和protobuf3,pb3比pb2简化了很多,目前主流的版本是pb3

protobuf优点:

1.性能好:
压缩性能;
序列化和发序列化快,比Json、XML强2-100倍;
传输速度快。

2.便捷性好:
使用简单,自动生成序列化和反序列化代码;
维护成本低,只维护proto文件
向后兼容,不必破坏旧格式
加密性好

3.跨语言,跨平台,支持各种语言

protobuf缺点:

1.通用性差,json可以任何语言都支持,但是protobuf需要专门的解析库

2.自解释性差,只有通过proto文件才能了解数据结构

2.go下grpc

2.1官网下载protobuf工具

官网:https://github.com/protocolbuffers/protobuf/releases

Go语言grpc和protobuf

2.2 下载go的依赖包

go get github.com/golang/protobuf/protoc-gen-go

2.3 编写proto文件

option go_package = "./;proto";

解释:

./;:生成文件的路径

proto:生成文件的包名

hello.proto

syntax = "proto3";
package services;
option go_package = "./;proto";
service Greeter {
    rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
    string name = 1;
}
message HelloReply {
    string message = 1;
}

2.4 生成hello.pb.proto文件

cd到proto目录下
命令:protoc -I . hello.proto   --go_out=plugins=grpc:.
命令解释:
protoc -I .:在当前路径下寻找hello.proto文件
--go_out=plugins=grpc:.  :生成go语言的proto文件放在当前路径下

Go语言grpc和protobuf

2.5 编写server端代码

Go语言grpc和protobuf

package main
import (
	"context"
	"file_test/grpc_go/proto"
	"net"

	"google.golang.org/grpc"
)
type Server struct {}
// 业务逻辑
func (s *Server) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloReply, error) {
	res := &proto.HelloReply{
		Message: "hello " + request.Name,
	}
	return res, nil
}
// 启动rpc的server服务
func start() {
	// 1.实例化server
	g := grpc.NewServer()
	// 2.注册逻辑到server中
	proto.RegisterGreeterServer(g,&Server{})
	// 3.启动server
	lis,err:=net.Listen("tcp","127.0.0.1:8081")
	if err !=nil{
		panic("监听错误:"+err.Error())
	}

	err = g.Serve(lis)
	if err !=nil{
		panic("启动错误:"+err.Error())
	}
}
func main() {
	start()
}

2.6 编写client端代码

package main
import (
	"context"
	"file_test/grpc_go/proto"
	"fmt"

	"google.golang.org/grpc"
)
// rpc调用
func clientRpc(body map[string]string) (res *proto.HelloReply, err error) {
	name := body["name"]
	conn, err := grpc.Dial("127.0.0.1:8081", grpc.WithInsecure())
	if err != nil {
		return nil,err
	}
	defer conn.Close()
	rpc := proto.NewGreeterClient(conn)
	response, err := rpc.SayHello(context.Background(), &proto.HelloRequest{Name: name})
	if err != nil {
		return nil,err
	}
	return response,nil
}
// 业务代码
func start() {
	body := make(map[string]string)
	body["name"] = "jeff"
	response,err := clientRpc(body)
	if err!=nil{
		fmt.Println("rpc调用失败:",err)
		return
	}
	fmt.Println(response.Message)
}
func main() {
	start()
}
//结果:
hello jeff

2.7 python和go相互调用实践(跨语言调用)

proto文件共用。

1.开启python的server端,go的client端测试。

2.开启go的server端,python的clinet端测试。

以上就是golang下grpc框架的使用编写示例的详细内容!

Golang 相关文章推荐
Golang全局变量加锁的问题解决
May 08 Golang
入门学习Go的基本语法
Jul 07 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
golang 语言中错误处理机制
Aug 30 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
golang使用map实现去除重复数组
Apr 14 Golang
golang语言指针操作
Apr 14 Golang
Golang map映射的用法
Apr 22 Golang
Go语言编译原理之变量捕获
Aug 05 Golang
GO中sync包自由控制并发示例详解
Aug 05 Golang
Golang流模式之grpc的四种数据流
Apr 13 #Golang
Golang数据类型和相互转换
Apr 12 #Golang
Go语言的协程上下文的几个方法和用法
Apr 11 #Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 #Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Golang原生rpc(rpc服务端源码解读)
Apr 07 #Golang
Go并发4种方法简明讲解
You might like
一个程序下载的管理程序(二)
2006/10/09 PHP
php 代码优化的42条建议 推荐
2009/09/25 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
angularJS自定义directive之带参方法传递详解
2018/10/09 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
Django中使用session保持用户登陆连接的例子
2019/08/06 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
python实现可下载音乐的音乐播放器
2020/02/25 Python
欧迪办公美国官网:Office Depot
2016/08/22 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
英文翻译的自我评价语句
2013/10/04 职场文书
土木工程专业大学毕业生求职信
2013/10/13 职场文书
舞蹈教育学专业自荐信
2014/06/15 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
2014年测量员工作总结
2014/12/12 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
如何用python反转图片,视频
2021/04/24 Python
Python爬虫进阶之Beautiful Soup库详解
2021/04/29 Python
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS