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标 ...
随机推荐
- mybatis insert 自动生成key
<selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE& ...
- Eclipse快捷键和练习题(倒叙,排序)
1 快捷键 内容辅助键 Alt+/ 自动补齐main方法 main 然后 Alt+/ 自动补齐输出语句 syso 然后 Alt+/ 格式化Ctrl+Shift+f 代码区域右键 -- So ...
- ARM汇编中一些重要伪指令
IMPORT ,定义表示这是一个外部变量的标号,不是在本程序定义的 EXPORT ,表示本程序里面用到的变量提供给其他模块调用的. 以上两个在汇编和C语言混合编程的时候用到 ENDP 表示PRO ...
- 单例模式到Java内存模型
先说单例模式: 经典的单例模式实现: 饿汉式: public class Singleton { private static Singleton instance = new Singleton() ...
- MFC中按钮控件的用法笔记(转)
VC学习笔记1:按钮的使能与禁止 用ClassWizard的Member Variables为按钮定义变量,如:m_Button1:则m_Button1.EnableWindow(true); 使按钮 ...
- [Delphi] Webbroker ISAPI 示例说明
新建Webbroker项目: 选择类型: 开始可以使用:Indy VCL Application 方便调试,完成后,再新建一个DLL 项目,引用业务单元. 示例代码如下: unit uDataMo ...
- Android-bindService远程服务(Aidl)-初步
之前上一篇讲解到本地服务,本地服务只能在自身APP中Activity访问Service,调用Service里面到方法等操作 如果想A应用访问B应用里面的方法,属于跨进程调用,如果Android不特供这 ...
- EF 查询视图返回重复数据的问题
在特殊的情况下查询过滤视图 会出现重复的数据结果集(返回的多条数据结果一致). 原因是啥:主键 在数据库设计的理念中:每个表都应该的唯一的主键.但视图不同,EF中会自动按视图的最前几个非空型字段设置为 ...
- [Erlang06]在Erlang shell怎么在目录A下编译目录B下的文件,并把生成文件统一放置目录C?
问题描述: 我们想快速测试一个小功能,第一个反应就是打开Erl shell 直接输入,但是当想测试一个复杂的函数时,一般会写成一个*.erl文件,然后在shell下: cd(FileDir). c(F ...
- windows中卸载Jenkins
背景: 之前安装的Jenkins没有pipeline选项,可能是之前安装时没有选择建议插件.后面使用最新版本时还是没有插件 解决: 卸载Jenkins,删除掉C:\Users\用户名\.jenkins ...