gRPC GoLang Test
gRPC是Google开源的一个高性能、跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x +。
gRPC与thrift、avro-rpc、WCF等其实在总体原理上并没有太大的区别,简而言之GRPC并没有太多突破性的创新。
protobuf相对于用Json方式传输,效率有很大提高,Kubernetes也从最初的Json转换成了gRPC。

gRPC 在服务端提供一个 gRPC Server,客户端的库是 gRPC Stub。
典型的场景是客户端发送请求,同步或异步调用服务端的接口。
gRPC在服务端和客户端可以使用多种语言,包括Go, Python, Java or Ruby等。
下面以GoLang为例,展示一个gRPC Client调用gRPC Server的整个过程:
1. 准备gRPC环境
1) 安装Go语言环境,gRPC要求Go 1.5或以上。
2) 安装gRPC
$ go get google.golang.org/grpc
3) 安装Protocol Buffers v3
下载protoc-3.0.0-linux-x86_64.zip:https://github.com/google/protobuf/releases
解压并拷贝bin/protoc到$GOPATH (/usr/local/go/bin)
4) 安装protoc plugin for Go
$ go get -u github.com/golang/protobuf/protoc-gen-go
拷贝bin/protoc-gen-go到$GOPATH (/usr/local/go/bin)
2. 编写helloworld.proto协议文件,简单完成一个加法运算
syntax = "proto3"; package helloworld; // The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayAdd (AddRequest) returns (AddReply) {}
} // The request message containing the a+b.
message AddRequest {
uint32 a = ;
uint32 b =;
} // The response message containing the c.
message AddReply {
uint32 c = ;
}
3. 使用protoc-gen-go生成gRPC服务端和客户端代理文件helloworld.pb.go
$ protoc -I helloworld/ helloworld/helloworld.proto --go_out=plugins=grpc:helloworld
4. 编写gRPC服务端文件greeter_server/main.go
package main import (
"log"
"net" "golang.org/x/net/context"
"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
"google.golang.org/grpc/reflection"
) const (
port = ":50051"
) // server is used to implement helloworld.GreeterServer.
type server struct{} // SayAdd implements helloworld.GreeterServer
func (s *server) SayAdd(ctx context.Context, in *pb.AddRequest) (*pb.AddReply, error) {
return &pb.AddReply{C: in.A + in.B}, 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)
}
}
5. 编写gRPC客户端文件greeter_client/main.go
package main import (
"log"
"os" "golang.org/x/net/context"
"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
) const (
address = "localhost:50051"
) 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.
rs, errs := c.SayAdd(context.Background(), &pb.AddRequest{A: , B:})
if errs != nil {
log.Fatalf("could not greet: %v", errs)
}
log.Printf("Add: %d", rs.C)
}
6. 运行gRPC服务端
$ go run greeter_server/main.go
7. 运行gRPC客户端
$ go run greeter_client/main.go
输出结果: Add: 3
Demo下载地址:http://files.cnblogs.com/files/edisonxiang/helloworld.zip
gRPC GoLang Test的更多相关文章
- 【Networking】gRPC golang 相关资料
		
参考资料: Golang gRPC 示例: http://www.cnblogs.com/YaoDD/p/5504881.html grpc golang学习心得(1)----安装与测试: ht ...
 - gRPC Golang/Python使用
		
gRPC Golang/Python使用 以前开发网站都是用http协议,学过TCP/IP协议的人都知道,在传输层TCP的基础上,应用层HTTP就是填充了一定规则的文本. 1.gRPC使用和介绍 工作 ...
 - Golang gRPC 和 gRPC-gateway 结合使用
		
一.安装 go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway go get -u github.com/g ...
 - Golang gRPC 使用
		
一.概念 1.gRPC默认使用protocol buffers,这是google开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如JSON),可以用proto files创建gRPC服务 ...
 - gRPC helloworld service, RESTful JSON API gateway and swagger UI
		
概述 本篇博文完整讲述了如果通过 protocol buffers 定义并启动一个 gRPC 服务,然后在 gRPC 服务上提供一个 RESTful JSON API 的反向代理 gateway,最后 ...
 - 开源RPC(gRPC/Thrift)框架性能评测
		
海量互联网业务系统只能依赖分布式架构来解决,而分布式开发的基石则是RPC:本文主要针对两个开源的RPC框架(gRPC. Apache Thrift),以及配合GoLang.C++两个开发语言进行性能对 ...
 - grpc,protoc, protoc-gen-go,rust
		
Rust 与服务端编程的碎碎念https://zhuanlan.zhihu.com/p/30028047 GRPC:golang使用protobuf https://segmentfault.com/ ...
 - 【学习笔记】Golang学习方向整理
		
前言 作为一个Java开发,给大家说Golang方向,好吓人...溜了溜了... 哦对了,如有不对的地方,还请指出.感谢! 某面试平台golang技能要求简要摘录 掌握 GO 语言,熟悉常用 pack ...
 - golang下的grpc
		
facebook的thrift也是开源rpc库,性能高出grpc一倍以上,grpc发展的较晚,期待以后有长足的进步.简单来说thrift = grpc + protobuf gRPC基于HTTP/2标 ...
 
随机推荐
- lspci通过系统总线查看硬件设备信息
			
lspci - 列出所有PCI设备 PCI 的科普: PCI(Peripheral Component Interconnect),是一种连接电子计算机主板和外部设备的总线标准. 常见的PCI卡包括网 ...
 - 编写高质量代码改善C#程序的157个建议——建议74:警惕线程的IsBackground
			
建议74:警惕线程的IsBackground 在CLR中,线程分为前台线程和后台线程,即每个线程都有一个IsBackground属性.两者在表现形式上的唯一区别是:如果前台线程不退出,应用程序的进程就 ...
 - [Selenium With C#基础教程] Lesson-06 单选按钮
			
作者:Surpassme 来源:http://www.jianshu.com/p/08ee1929875f 声明:本文为原创文章,如需转载请在文章页面明显位置给出原文链接,谢谢. 单选按钮通常用在需要 ...
 - hdu1561之树形dp
			
The more, The Better Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
 - 了解entity framework其他query方式之Entity SQL,Raw Sql分析
			
一:linq 对ef来说不是唯一性的query... 二:Entity Sql 1. esql => entity sql... [类sql的语言] 和sql差不多,但是呢,不是sql... u ...
 - BP神经网络研究(一)
			
本随笔参考文章:<BP神经网络详解与实例>(链接: https://pan.baidu.com/s/1e2niIvD9KtLXEqwXtgdXxw 密码: vb8d) 本随笔原创,转发请注 ...
 - Android 用 res 中文件名获取资源 id 的方法
			
res 中我们可能会放很多图片和音频视频等.它们放在 R.drawable, R.raw 下面. 有一种情况是,比如我有一个数据库保存项目中声音的一些信息.声音的 id 就很难保存.因为我们不能把 R ...
 - 【09】循序渐进学 docker:docker swarm
			
写在前面的话 至此,docker 的基础知识已经了解的差不多了,接下来就来谈谈对于 docker 容器,我们如何来管理它. docker swarm 在学习 docker swarm 之前,得先知道容 ...
 - POJ - 2387 Til the Cows Come Home (最短路Dijkstra+优先队列)
			
Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before ...
 - CF1059C Sequence Transformation 题解
			
这几天不知道写点什么,状态也不太好,搬个题上来吧 题意:给定一个数n,设一个从1到n的序列,每次删掉一个序列中的数,求按字典序最大化的GCD序列 做法:按2的倍数找,但是如果除2能得到3的这种情况要特 ...