gRPC——简介与Hello World
gRPC简介
gRPC 是一个高性能、开源、通用的RPC框架,由Google推出,基于HTTP2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库。
在gRPC客户端可以直接调用不同服务器上的远程程序,使用姿势看起来就像调用本地程序一样,很容易去构建分布式应用和服务。和很多RPC系统一样,服务端负责实现定义好的接口并处理客户端的请求,客户端根据接口描述直接调用需要的服务。客户端和服务端可以分别使用gRPC支持的不同语言实现。
官方文档
https://grpc.io/docs/what-is-grpc/introduction/
主要特性
- 强大的IDL
gRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。
- 多语言支持
gRPC支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它语言的版本正在积极开发中,其中,grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言,grpc-java已经支持Android开发。
- HTTP2
gRPC基于HTTP2标准设计,所以相对于其他RPC框架,gRPC带来了更多强大功能,如双向流、头部压缩、多复用请求等。这些功能给移动设备带来重大益处,如节省带宽、降低TCP链接次数、节省CPU使用和延长电池寿命等。同时,gRPC还能够提高了云端服务和Web应用的性能。gRPC既能够在客户端应用,也能够在服务器端应用,从而以透明的方式实现客户端和服务器端的通信和简化通信系统的构建。
gRPC与Protobuf介绍
微服务架构中,由于每个服务对应的代码库是独立运行的,无法直接调用,彼此间的通信就是个大问题
gRPC可以实现微服务,将大的项目拆分为多个小且独立的业务模块,也就是服务,各服务间使用高效的protobuf协议进行RPC调用,gRPC默认使用protocol buffers,这是google开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如JSON)
可以用proto files创建gRPC服务,用message类型来定义方法参数和返回类型
安装gRPC和Protobuf
- go get github.com/golang/protobuf/proto
- go get google.golang.org/grpc(无法使用,用如下命令代替)
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text go get -u github.com/golang/protobuf/{proto,protoc-gen-go} git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto cd $GOPATH/src/ go install google.golang.org/grpc
- go get github.com/golang/protobuf/protoc-gen-go
上面安装好后,会在GOPATH/bin下生成protoc-gen-go.exe
但还需要一个protoc.exe,windows平台编译受限,很难自己手动编译,直接去网站下载一个,地址:https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.0
,同样放在GOPATH/bin下
流程
源代码:https://gitee.com/shentuzhigang/mini-project/blob/master/grpc_demo/helloworld
编写.proto描述文件
编译生成.pb.go文件
服务端实现约定的接口并提供服务
客户端按照约定调用.pb.go文件中的方法请求服务
Step1:编写描述文件:hello.proto
syntax = "proto3"; // 指定proto版本
package hello; // 指定默认包名// 指定golang包名
option go_package = "./";// 定义Hello服务
service Hello {// 定义SayHello方法rpc SayHello(HelloRequest) returns (HelloResponse) {}
}// HelloRequest 请求结构
message HelloRequest {string name = 1;
}// HelloResponse 响应结构
message HelloResponse {string message = 1;
}
hello.proto文件中定义了一个Hello Service,该服务包含一个SayHello方法,同时声明了HelloRequest和HelloResponse消息结构用于请求和响应。客户端使用HelloRequest参数调用SayHello方法请求服务端,服务端响应HelloResponse消息。一个最简单的服务就定义好了。
Step2:编译生成.pb.go文件
$ cd proto/hello# 编译hello.proto
$ protoc -I . --go_out=plugins=grpc:. ./hello.proto
在当前目录内生成的hello.pb.go文件,按照.proto文件中的说明,包含服务端接口HelloServer描述,客户端接口及实现HelloClient,及HelloRequest、HelloResponse结构体。
注意:不要手动编辑该文件
Step3:实现服务端接口 server/main.go
package mainimport ("fmt""net""golang.org/x/net/context""google.golang.org/grpc""google.golang.org/grpc/grpclog"pb "helloworld/proto/hello" // 引入编译生成的包
)const (// Address gRPC服务地址Address = "127.0.0.1:50052"
)// 定义helloService并实现约定的接口
type helloService struct{}// HelloService Hello服务
var HelloService = helloService{}// SayHello 实现Hello服务接口
func (h helloService) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {resp := new(pb.HelloResponse)resp.Message = fmt.Sprintf("Hello %s.", in.Name)return resp, nil
}func main() {listen, err := net.Listen("tcp", Address)if err != nil {grpclog.Fatalf("Failed to listen: %v", err)}// 实例化grpc Servers := grpc.NewServer()// 注册HelloServicepb.RegisterHelloServer(s, HelloService)fmt.Println("Listen on " + Address)err = s.Serve(listen)if err != nil {fmt.Println(err)}
}
服务端引入编译后的proto包
定义一个空结构用于实现约定的接口,接口描述可以查看hello.pb.go文件中的HelloServer接口描述。
实例化grpc Server并注册HelloService
开始提供服务。
运行:
$ go run main.go
Listen on 127.0.0.1:50052 //服务端已开启并监听50052端口
Step4:实现客户端调用 client/main.go
package mainimport ("fmt""golang.org/x/net/context""google.golang.org/grpc""google.golang.org/grpc/grpclog"pb "helloworld/proto/hello" // 引入proto包
)const (// Address gRPC服务地址Address = "127.0.0.1:50052"
)func main() {// 连接conn, err := grpc.Dial(Address, grpc.WithInsecure())if err != nil {grpclog.Fatalln(err)}defer func() {err := conn.Close()if err != nil {}}()// 初始化客户端c := pb.NewHelloClient(conn)// 调用方法req := &pb.HelloRequest{Name: "gRPC"}res, err := c.SayHello(context.Background(), req)if err != nil {grpclog.Fatalln(err)}fmt.Println(res.Message)
}
客户端初始化连接后直接调用hello.pb.go中实现的SayHello方法,即可向服务端发起请求,使用姿势就像调用本地方法一样。
运行:
$ go run main.go
Hello gRPC. // 接收到服务端响应
如果你收到了"Hello gRPC"的回复,恭喜你已经会基本使用grpc了。
参考文章
- 微服务/gRPC
gRPC——简介与Hello World相关推荐
- gRPC in ASP.NET Core 3.x - gRPC 简介(2)
前一篇: gRPC in ASP.NET Core 3.x - gRPC 简介(1) 身份认证 这里指的不是用户的身份认证,而是指多个server和client之间,它们如何识别出来谁是谁,并且能安全 ...
- gRPC(1)- gRPC 简介
概述 在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,使您可以更轻松地创建分布式应用程序和服务.与许多 RPC 系统一样,gRPC 基于定义服务的 ...
- gRPC简介及简单使用(C++)
gRPC是一个现代的.开源的.高性能远程过程调用(RPC)框架,可以在任何平台运行.gRPC使客户端和服务器端应用程序能够透明地进行通信,并简化了连接系统的构建.gRPC支持的语言包括C++.Ruby ...
- gRPC in ASP.NET Core 3.x - gRPC 简介(1)
gRPC的结构 在我们搭建gRPC通信系统之前,首先需要知道gRPC的结构组成. 首先,需要一个server(服务器),它用来接收和处理请求,然后返回响应. 既然有server,那么肯定有client ...
- Go中的gRPC简介
给使用 Go 语言的初学者的 gRPC 概述 文章目录 RPC 它是怎么工作的? 用例 Protocol Buffers 安装 gRPC 实现 总结 架构 向后兼容性 架构演变 验证 语言互操作性 R ...
- grpc协议_gRPC和协议缓冲区简介
grpc协议 gRPC is a burgeoning piece of technology that allows you to build web services where you can ...
- gRPC amp; Protocol Buffer 构建高性能接口实践
介绍如何使用 gRPC 和 ProtoBuf,快速了解 gRPC 可以参考这篇文章第一段:gRPC quick Start. 接口开发是软件开发占据举足轻重的地位,是现代软件开发之基石.体现在无论是前 ...
- gRPC in ASP.NET Core 3.x - gRPC 消息定义
之前写了几篇关于 Protoco Buffer 的文章. gRPC in ASP.NET Core 3.x - gRPC 简介(1) gRPC in ASP.NET Core 3.x - gRPC 简 ...
- python go rpc_Python RPC 之 gRPC
转http://blog.csdn.net/coderinfo/article/details/60883030 gRPC 简介: gRPC 是一款高性能.开源的 RPC 框架,产自 Google,基 ...
最新文章
- 编码能力的提升?_20131228
- NBT:未培养病毒基因组的最少信息标准(MIUViG)
- 暂无支持此机型的手机版本_华为AR地图发布重要更新版本 新增对8款机型的支持...
- java中哈希表怎么表示_java中HashMap概念是什么?怎么存取实现它?
- Python全栈开发之3、数据类型set补充、深浅拷贝与函数
- django-多级联动课堂版0912
- 软件公司内部协作平台的选型(项目/BUG/需求管理及用户支持)
- [转]Android TV 遥控器适配
- 数据科学 IPython 笔记本 六、SciPy 统计推断
- 腾讯会议发布3.0版本;微软将推出元宇宙产品;Firefox启动最大WebRTC升级|WebRTC风向
- 微信亲戚备注分组名称_【微信分组备注名称大全】qq分组备注名称大全
- 当股份制银行核心数据遇到国产数据库
- 德州仪器发布99%高效GaN逆变器功率级的参考设计
- 关于ajax同步状态及sucess,complete的顺序的理解
- 旋转矩阵、欧拉角、四元数、旋转向量(旋转角)
- 转载:mongo常规操作 大于/小于/不等于……
- 【红帽RHCA考试内容解析】
- VC常用控件用法(转载)
- Topcoder Open 2011 Qualification Round 3报告
- 基于underlay和overlay转换的四层负载均衡
热门文章
- 2012-02-14 貌似情人节
- linux 进程管理 ppt,linux操作系统-进程管理和打印管理.ppt
- java编写单词数_JAVA flink小试——单词计数
- linux ls 升序,ls 命令查看文件时候,按修改时间倒序或升序排列
- c语言提供了6个位运算,C语言基础丨运算符之位运算符(六)
- php验证时区是否存在,php – 验证来自不同网站的时区名称?
- tf dense layer两种创建方式的对比和numpy实现
- scala maven plugin
- 如何利用计算机网络辅助自己,如何借助计算机网络辅助大学英语写作教学.doc...
- Android向本地写入一个XML文件和解析XML文件