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的更多相关文章

  1. 【Networking】gRPC golang 相关资料

    参考资料: Golang gRPC 示例:  http://www.cnblogs.com/YaoDD/p/5504881.html grpc golang学习心得(1)----安装与测试:   ht ...

  2. gRPC Golang/Python使用

    gRPC Golang/Python使用 以前开发网站都是用http协议,学过TCP/IP协议的人都知道,在传输层TCP的基础上,应用层HTTP就是填充了一定规则的文本. 1.gRPC使用和介绍 工作 ...

  3. Golang gRPC 和 gRPC-gateway 结合使用

    一.安装 go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway go get -u github.com/g ...

  4. Golang gRPC 使用

    一.概念 1.gRPC默认使用protocol buffers,这是google开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如JSON),可以用proto files创建gRPC服务 ...

  5. gRPC helloworld service, RESTful JSON API gateway and swagger UI

    概述 本篇博文完整讲述了如果通过 protocol buffers 定义并启动一个 gRPC 服务,然后在 gRPC 服务上提供一个 RESTful JSON API 的反向代理 gateway,最后 ...

  6. 开源RPC(gRPC/Thrift)框架性能评测

    海量互联网业务系统只能依赖分布式架构来解决,而分布式开发的基石则是RPC:本文主要针对两个开源的RPC框架(gRPC. Apache Thrift),以及配合GoLang.C++两个开发语言进行性能对 ...

  7. grpc,protoc, protoc-gen-go,rust

    Rust 与服务端编程的碎碎念https://zhuanlan.zhihu.com/p/30028047 GRPC:golang使用protobuf https://segmentfault.com/ ...

  8. 【学习笔记】Golang学习方向整理

    前言 作为一个Java开发,给大家说Golang方向,好吓人...溜了溜了... 哦对了,如有不对的地方,还请指出.感谢! 某面试平台golang技能要求简要摘录 掌握 GO 语言,熟悉常用 pack ...

  9. golang下的grpc

    facebook的thrift也是开源rpc库,性能高出grpc一倍以上,grpc发展的较晚,期待以后有长足的进步.简单来说thrift = grpc + protobuf gRPC基于HTTP/2标 ...

随机推荐

  1. mybatis insert 自动生成key

    <selectKey keyProperty="id" resultType="java.lang.String" order="BEFORE& ...

  2. Eclipse快捷键和练习题(倒叙,排序)

    1    快捷键 内容辅助键  Alt+/ 自动补齐main方法  main 然后 Alt+/ 自动补齐输出语句  syso 然后 Alt+/ 格式化Ctrl+Shift+f 代码区域右键 -- So ...

  3. ARM汇编中一些重要伪指令

    IMPORT ,定义表示这是一个外部变量的标号,不是在本程序定义的 EXPORT ,表示本程序里面用到的变量提供给其他模块调用的. 以上两个在汇编和C语言混合编程的时候用到 ENDP    表示PRO ...

  4. 单例模式到Java内存模型

    先说单例模式: 经典的单例模式实现: 饿汉式: public class Singleton { private static Singleton instance = new Singleton() ...

  5. MFC中按钮控件的用法笔记(转)

    VC学习笔记1:按钮的使能与禁止 用ClassWizard的Member Variables为按钮定义变量,如:m_Button1:则m_Button1.EnableWindow(true); 使按钮 ...

  6. [Delphi] Webbroker ISAPI 示例说明

    新建Webbroker项目: 选择类型: 开始可以使用:Indy VCL Application 方便调试,完成后,再新建一个DLL 项目,引用业务单元.   示例代码如下: unit uDataMo ...

  7. Android-bindService远程服务(Aidl)-初步

    之前上一篇讲解到本地服务,本地服务只能在自身APP中Activity访问Service,调用Service里面到方法等操作 如果想A应用访问B应用里面的方法,属于跨进程调用,如果Android不特供这 ...

  8. EF 查询视图返回重复数据的问题

    在特殊的情况下查询过滤视图 会出现重复的数据结果集(返回的多条数据结果一致). 原因是啥:主键 在数据库设计的理念中:每个表都应该的唯一的主键.但视图不同,EF中会自动按视图的最前几个非空型字段设置为 ...

  9. [Erlang06]在Erlang shell怎么在目录A下编译目录B下的文件,并把生成文件统一放置目录C?

    问题描述: 我们想快速测试一个小功能,第一个反应就是打开Erl shell 直接输入,但是当想测试一个复杂的函数时,一般会写成一个*.erl文件,然后在shell下: cd(FileDir). c(F ...

  10. windows中卸载Jenkins

    背景: 之前安装的Jenkins没有pipeline选项,可能是之前安装时没有选择建议插件.后面使用最新版本时还是没有插件 解决: 卸载Jenkins,删除掉C:\Users\用户名\.jenkins ...