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 相关文章推荐
go:垃圾回收GC触发条件详解
Apr 24 Golang
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
Go缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
实现GO语言对数组切片去重
Apr 20 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
PHP个人网站架设连环讲(一)
2006/10/09 PHP
php 数组二分法查找函数代码
2010/02/16 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
子窗体与父窗体传值示例js代码
2013/08/01 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
angularJS 入门基础
2015/02/09 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
2019/03/07 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
利用Python批量生成任意尺寸的图片
2016/08/29 Python
django允许外部访问的实例讲解
2018/05/14 Python
Python Lambda函数使用总结详解
2019/12/11 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
金融专业毕业生推荐信
2013/11/26 职场文书
女大学生个人求职信
2013/12/09 职场文书
人力资源管理专业自荐书范文
2014/02/10 职场文书
法人委托书的范本格式
2014/09/11 职场文书
就业协议书
2014/09/12 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
自我工作评价范文
2015/03/06 职场文书
病危通知单
2015/04/17 职场文书
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL
MySQL sql模式设置引起的问题
2022/05/15 MySQL