来自:指月小筑 https://lixueduan.com

原文:https://lixueduan.com/post/grpc/02-hello-world/

本文主要对 gRPC 框架做了简单的介绍,同时记录了一个简单的 hello wolrd 教程。

1. 概述

gRPC 系列相关代码见 Github

gRPC 是一个高性能、通用的开源 RPC 框架,其由 Google 主要面向移动应用开发并基于 HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。

gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如 JSON)。

2. 环境准备

1)protoc

首先需要安装 protocol buffers compile 即 protoc 和 Go Plugins。

具体见 Protobuf 章节

2)gRPC

然后是安装 gRPC 。

$ go get -u google.golang.org/grpc

国内由于某些原因,安装超时的话可以在这里查看解决办法:https://github.com/grpc/grpc-go#FAQ

或者设置 GOPROXY ,具体看这里 https://goproxy.cn

3)gRPC plugins

接着是下载 gRPC Plugins,用于生成 gRPC 相关源代码。

$ go get google.golang.org/grpc/cmd/protoc-gen-go-grpc

3. Helloworld

环境

首先确保自己的环境是 OK 的:

  • 1)终端输入 protoc --version 能打印出版本信息;
  • 2)$GOPATH/bin 目录下有 protoc-gen-goprotoc-gen-go-grpc 这两个可执行文件。

本教程版本信息如下

  • protoc 3.14.0
  • protoc-gen-go v1.25.0
  • gPRC v1.35.0
  • protoc-gen-go-grpc 1.0.1

项目结构如下

helloworld/
├── client
│   └── main.go
├── helloworld
│   ├── hello_world_grpc.pb.go
│   ├── hello_world.pb.go
│   └── hello_world.proto
└── server└── main.go

1. 编写.proto文件

hello_world.proto文件内容如下:

//声明proto的版本 只有 proto3 才支持 gRPC
syntax = "proto3";
// 将编译后文件输出在 github.com/lixd/grpc-go-example/helloworld/helloworld 目录
option go_package = "github.com/lixd/grpc-go-example/helloworld/helloworld";
// 指定当前proto文件属于helloworld包
package helloworld;// 定义一个名叫 greeting 的服务
service Greeter {// 该服务包含一个 SayHello 方法 HelloRequest、HelloReply分别为该方法的输入与输出rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// 具体的参数定义
message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}

这里定义了一个服务 Greeter,其中有一个方法名为 SayHello。其接收参数为HelloRequest类型,返回HelloReply类型。

服务定义为:

// 定义一个名叫 greeting 的服务
service Greeter {// 该服务包含一个 SayHello 方法 HelloRequest、HelloReply分别为该方法的输入与输出rpc SayHello (HelloRequest) returns (HelloReply) {}
}

2. 编译生成源代码

使用 protoc 编译生成对应源文件,具体命令如下:

protoc --go_out=. --go_opt=paths=source_relative \--go-grpc_out=. --go-grpc_opt=paths=source_relative \./hello_world.proto

会在当前目录生成hello_world.pb.gohello_world_grpc.pb.go两个文件。

具体 protobuf 如何定义,各个参数的作用见 [protobuf][protobuf]

3. Server

package mainimport ("context""log""net"pb "github.com/lixd/grpc-go-example/helloworld/helloworld""google.golang.org/grpc"
)const (port = ":50051"
)// greeterServer 定义一个结构体用于实现 .proto文件中定义的方法
// 新版本 gRPC 要求必须嵌入 pb.UnimplementedGreeterServer 结构体
type greeterServer struct {pb.UnimplementedGreeterServer
}// SayHello 简单实现一下.proto文件中定义的 SayHello 方法
func (g *greeterServer) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {log.Printf("Received: %v", in.GetName())return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}func main() {listen, err := net.Listen("tcp", port)if err != nil {log.Fatalf("failed to listen: %v", err)}s := grpc.NewServer()// 将服务描述(server)及其具体实现(greeterServer)注册到 gRPC 中去.// 内部使用的是一个 map 结构存储,类似 HTTP server。pb.RegisterGreeterServer(s, &greeterServer{})log.Println("Serving gRPC on 0.0.0.0" + port)if err := s.Serve(listen); err != nil {log.Fatalf("failed to serve: %v", err)}
}

具体步骤如下:

  • 1)定义一个结构体,必须包含pb.UnimplementedGreeterServer 对象;
  • 2)实现 .proto文件中定义的API;
  • 3)将服务描述及其具体实现注册到 gRPC 中;
  • 4)启动服务。

4. Client

package mainimport ("context""log""os""time"pb "github.com/lixd/grpc-go-example/helloworld/helloworld""google.golang.org/grpc"
)const (address     = "localhost:50051"defaultName = "world"
)func main() {conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())if err != nil {log.Fatalf("did not connect: %v", err)}defer conn.Close()c := pb.NewGreeterClient(conn)// 通过命令行参数指定 namename := defaultNameif len(os.Args) > 1 {name = os.Args[1]}ctx, cancel := context.WithTimeout(context.Background(), time.Second)defer cancel()r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})if err != nil {log.Fatalf("could not greet: %v", err)}log.Printf("Greeting: %s", r.GetMessage())
}

具体步骤如下:

  • 1)首先使用 grpc.Dial() 与 gRPC 服务器建立连接;
  • 2)使用pb.NewGreeterClient(conn)获取客户端;
  • 3)通过客户端调用ServiceAPI方法client.SayHello

5. Test

先运行服务端

lixd@17x:~/17x/projects/grpc-go-example/helloworld/server$ go run main.go
2021/01/23 14:47:20 Serving gRPC on 0.0.0.0:50051
2021/01/23 14:47:32 Received: world
2021/01/23 14:47:52 Received: 指月

然后运行客户端

lixd@17x:~/17x/projects/grpc-go-example/helloworld/client$ go run main.go
2021/01/23 14:47:32 Greeting: Hello world
lixd@17x:~/17x/projects/grpc-go-example/helloworld/client$ go run main.go 指月
2021/01/23 14:47:52 Greeting: Hello 指月

到此为止 gRPC 版的 hello world 已经完成了。

4. 小结

使用 gRPC 的 3个 步骤:

  • 1)需要使用 protobuf 定义接口,即编写 .proto 文件;
  • 2)然后使用 protoc 工具配合编译插件编译生成特定语言或模块的执行代码,比如 Go、Java、C/C++、Python 等。
  • 3)分别编写 server 端和 client 端代码,写入自己的业务逻辑。

gRPC 系列相关代码见 Github

5. 参考

https://grpc.io/docs/languages/go/quickstart/

https://github.com/grpc/grpc-go

史上最细gRPC(Go)入门教程(二)---gRPC初体验--hello world相关推荐

  1. 史上最详细的JNI入门教程HelloNative

    为什么80%的码农都做不了架构师?>>>    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注. 1 为什么写本文 互 ...

  2. 史上最简单的Git入门教程

    1. 版本控制系统简介 1.1 何为版本控制 版本控制最主要的功能就是追踪文件的变更.它将什么时候.什么人更改了文件的什么内容等信息忠实地了已录下来.每一次文件的改变,文件的版本号都将增加.除了记录版 ...

  3. ArcEngine 入门教程-控件初体验

    缘起 个人总结梳理,顺便练练文笔,For me and for you like me! 目标 我一直很认同古人所说的君子性非异也,善假于物也,本文主要目的是告诉读者如何使用帮助来学习了解ArcEng ...

  4. 史上最全Python快速入门教程,让你快速入门python学好python

    Python是面向对象,高级语言,解释,动态和多用途编程语言.Python易于学习,而且功能强大,功能多样的脚本语言使其对应用程序开发具有吸引力. Python的语法和动态类型具有其解释性质,使其成为 ...

  5. agx 安装ros opencv_史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门...

    一.Python OpenCV 入门 欢迎阅读系列教程,内容涵盖 OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定. OpenCV 用于各种图像和视频分析 ...

  6. 史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门

    推荐下我自己建的人工智能Python学习群:[809160367],群里有我整理的一份关于pytorch.python基础,图像处理opencv\自然语言处理.机器学习.数学基础等资源库,想学习人工智 ...

  7. 魔方教程一步一步图解(史上最简单的魔方入门教程)新手一看就会

    IT数学系列最常见的魔方是三阶魔方,是匈牙利布达佩斯建筑学院厄尔诺·鲁比克教授在1974年发明的.魔方教程一步一步图解新手一看就会. 魔方教程一步一步图解 魔方共6色6面,每面又分为中央块(最中间的块 ...

  8. 【Python教程】史上最全Python快速入门教程,满满都是干货

    Python是面向对象,高级语言,解释,动态和多用途编程语言.Python易于学习,而且功能强大,功能多样的脚本语言使其对应用程序开发具有吸引力. Python的语法和动态类型具有其解释性质,使其成为 ...

  9. 史上最浅显易懂的 RxJava 入门教程

    来源:KunMinX www.jianshu.com/p/f392727c5aca 工作需要刚好在学习 RxJava + Retrofit2 + OkHttp3 网络请求框架,网上搜了一些 RxJav ...

最新文章

  1. 关于JavaScript中的同步(SYNC)和异步(ASYNC)
  2. JMX 与系统管理--转
  3. linux 相册管理,图片管理(时间线、相册管理)- 深度看图 -Deepin深度系统用户手册...
  4. 摩托罗拉能否追回逝去的那些年?
  5. 【NLP】一文搞懂NLP中的对抗训练
  6. P1003 铺地毯(模拟)
  7. 鸿蒙和安卓,到底有什么区别?
  8. Asterisk 1.4.42将成绝唱
  9. OpenCV学习笔记(十七):查找并绘制轮廓:findContours(),drawContours(),approxPolyDP()
  10. 阶乘取模算法java_np问题(大数阶乘取模)
  11. 华为推出地图服务 助力开发者强化地图能力
  12. linux 移动一行到指定行,linux – 移动行以跟随文件中的另一行
  13. 从零开始学习python编程-从零开始学Python程序设计
  14. 六款值得推荐的数据挖掘得力助手
  15. android免费ocr软件,安卓ocr软件那个好用 免费安卓ocr文字识别软件推荐
  16. python pdfminer的功能_使用Python pdfMiner提取每页文本?
  17. 错误:VM5729:1 Blocked script execution in ‘about:blank‘
  18. JAVA数据结构之Map和Set
  19. Error -27796: Failed to connect to server ip地址: [10060] Connection timed out
  20. PID详解3(摄像头循迹分析)

热门文章

  1. 【ECNU OJ 3373】 骑士游戏 最短路径+动态规划
  2. GitHub Copilot 已上线,AI 编程这等来啦!
  3. java忽略转移i字符_Java。 比较字符串时忽略重音
  4. 影驰gtx960显卡怎么样_影驰gtx960 2g_影驰gtx960 2g跑分
  5. 骇客帝国弹幕2.0--移动鼠标触发弹幕
  6. 赛灵思FPGA功耗实测与XPE模拟计算对比分析
  7. win10开机桌面壁纸位置
  8. 机械革命无法使用U盘启动linux,机械革命bios设置,教您机械革命bios怎么设置u盘启动...
  9. JAVA三角形边长定义_Java编译:定义三角形的三条边长a=4,b=8.54,c=4.44;求三角形的周长d...
  10. 树莓派ssh远程连接