文档章节

Grpc介绍 — ProToBuf基本使用

喵了_个咪
 喵了_个咪
发布于 02/28 10:56
字数 1482
阅读 19
收藏 0

RPC(Remote Procedure Call)远程过程调用,关注笔者的同学应该知道之前笔者出过关于Thrift对应的问题,这次主要来说的是Google开源的Grpc,和Thrift有很大的区别Grpc是基于HTTP2.0并且依赖protobuf,为什么又推出关于grpc的文章呢?请大家继续往下看。

附上:

喵了个咪的博客:w-blog.cn

博文实例demo:GitHub - sunmi-OS/grpc-php-to-golang-demo

grpc官网:grpc / grpc.io

protobuf代码仓库:Releases · protocolbuffers/protobuf · GitHub

一,为什么要用grpc它的优势是什么

一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。 gRPC基于HTTP/2标准设计,带来诸如双向流控、头部压缩、单TCP连接上的多复用请求等特性。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

性能 Grpc PK Thrift 借鉴:开源RPC(gRPC/Thrift)框架性能评测 - 沧海一滴 - 博客园

PS:笔者也做了对应的性能测试,后面的文章会附上详细步骤,通过这个现有的结果一个简单的结论

从压测的结果商米我们可以得到以下重要结论:

  • 整体上看,长连接性能优于短连接,性能差距在两倍以上;
  • 对比Go语言的两个RPC框架,Thrift性能明显优于gRPC,性能差距也在两倍以上;
  • 对比Thrift框架下的的两种语言,长连接下Go 与C++的RPC性能基本在同一个量级,在短连接下,Go性能大概是C++的二倍;
  • 两套RPC框架,以及两大语言运行都非常稳定,5w次请求耗时约是1w次的5倍;

这里主要要回答的一个问题是既然已经用thrift并且性能还是grpc的2倍为什么还要用grpc呢?

这里主要要说到两个Go的微服务框架,go-kit和istio

  • go-kit 支持thrift但是在thrift的情况下不支持链路追踪
  • istio因为是无侵入式连thrift也不支持

主要的导致这个问题的原因在于thrift的传输方式是通过TCP的方式传输,对于这些框架想在传输过程中加入些链路的ID是无法实现的,istio连对于thrift的请求次数感知都做不到,对于grpc因为是基于http2在harder头上可以做很多补充参数,对于这类微服务框架非常友好。


二,安装protobuf

安装protobuf为了生成对应语言的文件必须需要protoc的命名,protoc是c语言的protobuf的命名,有两种访问一个是自己编译:

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-cpp-3.6.1.tar.gz
> tar -zxvf protobuf-cpp-3.6.1.tar.gz
> cd protobuf-3.6.1
> ./configure
> make
> make install
> protoc --version
libprotoc 3.6.1

或者根据更具系统直接使用编译好的bin文件运行protoc(这里使用的是MAC OSX系统)

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protoc-3.6.1-osx-x86_64.zip
> tar -zxvf protoc-3.6.1-osx-x86_64.zip
> cd protoc-3.6.1-osx-x86_6/bin
> ./protoc --version
> libprotoc 3.6.1

安装好了我们就要来运行下测试程序了


三,Golang 环境准备

不得不说Go是Google的亲儿子,自然Grpc的支持不会差依赖只需要一个命令就可以(这里使用的是go 1.11版本):

> go get google.golang.org/grpc

如果大家报错,原因是这个代码已经转移到github上面了,但是代码里面的包依赖还是没有修改,还是google.golang.org这种,所以有的不能使用go get的方式安装,可以使用以下安装方式:

> 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
> git clone https://github.com/golang/sys.git $GOPATH/src/golang.org/x/sys
> 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

先使用笔者的准备好的:

> cd $GOPATH/src
> mkdir -p grpc-php-to-golang-demo/protobuf
> cd grpc-php-to-golang-demo/protobuf
> vim helloworld.proto

文件内容如下:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";

package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

生成对应的文件:

> mkdir -p go-server/helloworld
> protoc --go_out=plugins=grpc:./go-server/helloworld ./helloworld.proto
> cd go-server/helloworld/
> ll
total 16
drwxr-xr-x  3 wenzhenxi  staff    96  2 15 14:24 ./
drwxr-xr-x  3 wenzhenxi  staff    96  2 15 14:23 ../
-rw-r--r--  1 wenzhenxi  staff  6915  2 15 14:24 helloworld.pb.go

编写服务端和客户端Go程序:

> cd $GOPATH/src/grpc-php-to-golang-demo
> mkdir -p golang/holleworld
> cd golang/holleworld

服务端:

> vim server.go 

package main

import (
	"log"
	"net"

	pb "grpc-php-to-golang-demo/protobuf/go-server/helloworld"

	"google.golang.org/grpc"
	"golang.org/x/net/context"
	"google.golang.org/grpc/reflection"
)

const (
	port = ":50051"
)

// server is used to implement helloworld.GreeterServer.
type server struct{}

// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
	return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}

func main() {
	lis, err := net.Listen("tcp", port)
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	s := grpc.NewServer()
	pb.RegisterGreeterServer(s, &server{})
	// Register reflection service on gRPC server.
	reflection.Register(s)
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

客户端:

> vim client.go

package main

import (
	"log"
	"os"
	"time"

	pb "grpc-php-to-golang-demo/protobuf/go-server/helloworld"

	"google.golang.org/grpc"
	"golang.org/x/net/context"
)

const (
	address     = "localhost:50051"
	defaultName = "world"
)

func main() {
	// Set up a connection to the server.
	conn, err := grpc.Dial(address, grpc.WithInsecure())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	c := pb.NewGreeterClient(conn)

	// Contact the server and print out its response.
	name := defaultName
	if len(os.Args) > 1 {
		name = os.Args[1]
	}

	go func() {
		r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
		if err != nil {
			log.Fatalf("could not greet: %v", err)
		}
		log.Printf("Greeting: %s", r.Message)
	}()

	time.Sleep(10 * time.Second)

}

运行测试:

> go build server.go
> go build client.go
./server
./client
2019/02/15 14:35:35 Greeting: Hello world

此时在go to go的场景就调用通了

最终产物可以参考demoGitHub - sunmi-OS/grpc-php-to-golang-demo

© 著作权归作者所有

共有 人打赏支持
喵了_个咪
粉丝 331
博文 155
码字总数 204044
作品 4
杨浦
技术主管
私信 提问
Grpc介绍 — Go-Service To PHP-Client

笔者现在公司项目大部分是PHP进行开发,要完成整体微服务化必须要考虑PHP使用上的可行性,Grpc也是支持PHP作为client端发起Grpc请求,但是依赖的扩展等都相对复杂(毕竟不是亲儿子),那么本...

喵了_个咪
03/06
0
0
Protobuf和GRPC(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feilengcui008/article/details/60475459 数据交互协议和RPC框架对于分布式系统来说是必不可少的组件,这个系...

feilengcui008
2017/03/05
0
0
grpc| python 实战 grpc

date: 2018-5-15 22:12:32 title: grpc| python 实战 grpc description: 只要代码可以跑起来, 很多难题都会迎刃而解. so, keep coding and stay hungry. 之前用 swoole 写 server 时就接触过...

daydaygo
2018/05/16
0
0
前端 Web gRPC 实践和优化

Web gRPC 是 gRPC 在 Web 上的一个适配实现。关于他的介绍以及为什么要用 gRPC 就不在这解释了,如果你决定使用 Web gRPC,并且正在寻找前端的库和解决方案,看一看这篇文章,应该会有所帮助...

徐健本尊
2018/10/25
0
0
Notepad++ 的 protobuf 高亮显示和列表显示

项目地址: https://github.com/chai2010/notepadplus-protobuf

chai2010
2015/07/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

单元测试

右键方法 Go To --> Test,简便快速生成测试方法。 相关注解 @RunWith(SpringRunner.class) 表示要在测试环境中跑,底层实现是 jUnit测试工具。 @SpringBootTest 表示启动整个 Spring工程 @A...

imbiao
昨天
0
0
欧拉公式

欧拉公式表达式 欧拉公式的几何意 cosθ + j sinθ 是个复数,实数部分也就是实部为 cosθ ,虚数部分也就是虚部为 j sinθ ,对应复平面单位圆上的一个点。 根据欧拉公式和这个点可以用 复指...

sharelocked
昨天
2
0
burpsuite无法抓取https数据包

1.将浏览器和burpsuite的代理都设置好 2.在浏览器地址栏输入: http://burp 3.下载下面的证书,并将证书导入浏览器 cacert.der

Frost729
昨天
2
0
JeeSite4.x 消息管理、消息推送、消息提醒

实现统一的消息推送接口,包含PC消息、短信消息、邮件消息、微信消息等,无需让所有开发者了解消息是怎么发送出去的,只需了解消息发送接口即可。 所有推送消息均通过 MsgPushUtils 工具类发...

ThinkGem
昨天
8
0
OpenML

https://www.openml.org/search?type=data

shengjuntu
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部