Golang RPC 之 gRPC
时间:2022-05-04
本文章向大家介绍Golang RPC 之 gRPC,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言(Golang、Python、Java等),本篇只介绍 Golang 的 gRPC 使用。因为 gRPC 对 HTTP/2 协议的支持使其在 Android、IOS 等客户端后端服务的开发领域具有良好的前景。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP/2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等。
安装:
- gRPC 的安装:
$ go get -u google.golang.org/grpc
- 因为 gRPC 是基于 protobuf 实现的接口序列化,所以也要安装 protobuf: 安装及简介教程(Golang 序列化之 ProtoBuf)。
实践:
下面我们使用 gRPC 定义一个接口,该接口实现对传入的数据进行大写的格式化处理。
1. 创建项目 golang Demo 工程:
- client目录下的 main.go 实现了客户端用于发送数据并打印接收到 server 端处理后的数据
- server 目录下的 main.go 实现了服务端用于接收客户端发送的数据,并对数据进行大写处理后返回给客户端
- example 包用于编写 proto 文件并生成 data 接口
2. 定义 gRPC 接口:
syntax = "proto3";
package example;
service FormatData {
rpc DoFormat(Data) returns (Data){}
}
message Data {
string text = 1;
}
3. 编译 protobuf:
$ protoc -I=. --go_out=plugins=grpc:. . // 在 example 目录中执行编译,会生成:data.pb.go
4. 实现 server 端:
package main
import (
"Demo/example"
"net"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
"golang.org/x/net/context"
"strings"
"log"
)
// 定义监听地址
const (
HOST string = "localhost"
PORT string = "8080"
)
// 定义接口
type FormatData struct{}
func (fd *FormatData) DoFormat(ctx context.Context, in *example.Data) (out *example.Data, err error) {
str := in.Text
out = &example.Data{Text: strings.ToUpper(str)}
return out, nil
}
// 直接在 main 方法中注册接口
func main() {
listener, err := net.Listen("tcp", HOST+":"+PORT)
if err != nil {
log.Fatalln("faile listen at: " + HOST + ":" + PORT)
} else {
log.Println("Demo server is listening at: " + HOST + ":" + PORT)
}
rpcServer := grpc.NewServer()
example.RegisterFormatDataServer(rpcServer, &FormatData{})
reflection.Register(rpcServer)
if err = rpcServer.Serve(listener); err != nil {
log.Fatalln("faile serve at: " + HOST + ":" + PORT)
}
}
5. 实现 client 端:
package main
import (
"google.golang.org/grpc"
"log"
"Demo/example"
"golang.org/x/net/context"
)
// 定义请求地址
const (
ADDRESS string = "localhost:8080"
)
// main 方法实现对 gRPC 接口的请求
func main() {
conn, err := grpc.Dial(ADDRESS, grpc.WithInsecure())
if err != nil {
log.Fatalln("Can't connect: " + ADDRESS)
}
defer conn.Close()
client := example.NewFormatDataClient(conn)
resp,err := client.DoFormat(context.Background(), &example.Data{Text:"hello,world!"})
if err != nil {
log.Fatalln("Do Format error:" + err.Error())
}
log.Println(resp.Text)
}
6. 执行验证结果:
- 先启动 server,之后再执行 client
- client 侧控制台如果打印的结果为: HELLO,WORLD! ,证明 gRPC 接口定义成功
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AkShare-中国宏观-FR007利率互换曲线
- Github标星59.7k:用动画的形式呈现解LeetCode题目的思路
- 《爱情公寓》电影版,十年一瞬间(下)
- 实战:上亿数据如何秒查
- 《爱情公寓》电影版,十年一瞬间(上)
- Ajax爬取今日头条街拍美图
- 现在的房租有多高(杭州)?
- 英雄联盟皮肤大拼图
- Python爬虫-MongoDB
- Python爬虫-selenium
- 用Python识别图形验证码,实现自动登陆!
- 当Docker遇到Intellij IDEA,再次解放了生产力~
- 用Python爬取自主品牌汽车,看看国产汽车究竟长什么样?(上)
- 工具包 | 使用Python绘制Sci学术期刊配图
- 深入剖析AQS和CAS,看了都说好