gRPC使用protobuf格式数据传输;至于什么是protuf,怎样使用,参见:http://idoubi.cc/2017/12/02/protobuf%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B%E6%8C%87%E5%8D%97/
使用protobuf最好在goland上安装protobuf插件,便于检查protobuf的语法错误。
gRPC特点:
- 基于HTTP/2
HTTP/2 提供了连接多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。可以节省带宽、降低TCP链接次数、节省CPU,帮助移动设备延长电池寿命等。gRPC 的协议设计上使用了HTTP2 现有的语义,请求和响应的数据使用HTTP Body 发送,其他的控制信息则用Header 表示。 - IDL使用ProtoBuf
gRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。 - 多语言支持(C, C++, Python, PHP, Nodejs, C#, Objective-C、Golang、Java)
- gRPC支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它语言的版本正在积极开发中,其中,grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言,grpc-java已经支持Android开发。
插播me:
工具VS框架:框架就是库,工具可以直接用,不在此基础上开发,框架就是二次开发的工具,哈哈
问:为什么我使用nginx-(nginx是c语言开发的)的时候,不需要学习c语言和使用c语言开发,而我使用grpc的时候,如果选定是用哪个语言的版本
答:nginx是一种工具,也可以说一个库,如果不在nginx上进行二次开发,就不需要使用c,只需要按照配置使用nginx即可。
而使用grpc,需要选好是go语言使用,还是c,那是因为要在grpc上进行开发,在这里grpc就是一个类库,调用需要使用语言去调用。
所有的语言,即所谓的开发语言,都是运行在os上,而os是对硬件及其使用方法的抽象,os提供了很多接口,也就是方法,这些方法可以操作计算机的硬件,我们利用各种语言开发程序,就是为了让计算机硬件给我们干活,开发出来的软件,本身是没有生命的,被编译器编译成二进制文件,在需要系统调用的地方做上标记,当运行的时候,系统调用的时候,就会陷入os内核调用,去调用os的接口。所谓的库-含框架,以及工具,都是我们可以拿来即可用的代码,使用库需要语言调用,使用工具一般只需要配置即可,或者按照工具的使用说明使用即可,如果不对工具进行二次开发,是不需要研究工具是用那种语言开发的。
20200425更新:我认为自己此前的认识不对,插播错误。nginx和grpc的根本区别是,nginx是配置好之后独立运行的进程,而grpc只是个插件,插件,是个工具,是我们在开发中节省开发量的一个东西,调用它的功能肯定要用计算机语言啊。包括protobuf也只是一个序列化工具,所以调用需要用语言。再说protobuf确实支持c,go等多种语言。
如何使用gRPC
1.安装好protobuf,客户端和服务端皆需要
2.安装好protobuf对go的支持包,客户端和服务端皆需要
3.安装gRPC,客户端和服务端皆需要
4.使用
4.1 server端
package main
import (
"context"
"fmt"
pt "gRPC/client/pbclient"
"google.golang.org/grpc"
"net"
)
const(
post = "127.0.0.1:18881"
)
//实现pb包内,的接口
type Server struct{}
func(this *Server)SayHello(ctx context.Context,in *pt.HelloRequest)(*pt.HelloResponse,error){
return &pt.HelloResponse{Message:"hello"+in.Name},nil
}
func main(){
ln,err := net.Listen("tcp",post)
if err != nil{
panic(err)
}
//1:创造一个rpc服务器
srv := grpc.NewServer()
//2:在rpc服务器上注册pb的数据-需要提前想好要提供的rpc调用的方法,写好.proto文件,把proto文件转化成pb.go文件,实现pb.go文件接口
pt.RegisterHelloServerServer(srv,&Server{})
//rpc服务器的载体-绑定一个连接
err = srv.Serve(ln)
if err != nil {
fmt.Println(err)
}
}
syntax = "proto3";
package my_grpc_proto;
service HelloServer{
//rpc 代理的方法
rpc SayHello(HelloRequest)returns(HelloResponse){}
}
message HelloRequest{
string name = 1;
}
message HelloResponse{
string message = 1;
}
===========client端也需要这个.proto文件,以及需要如下的运行方式=========
在.proto文件所在的目录下,执行以下代码
protoc --go_out=plugins=grpc:./ *.proto
4.2client端
package main
import (
"fmt"
pt "gRPC/client/pbclient"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
const(
post = "127.0.0.1:18881"
)
func main(){
//1:发起rpc连接
conn,err := grpc.Dial(post,grpc.WithInsecure())
if err!=nil {
panic(err)
}
defer conn.Close()
//2:生成rpc 连接的客户端
c := pt.NewHelloServerClient(conn)
//3:调用pb.go的代理的方法
resp,err := c.SayHello(context.Background(),&pt.HelloRequest{Name:"yz"})
if err !=nil {
fmt.Println(err)
}
fmt.Println(resp)
}