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 接口定义成功
- 百倍性能的PL/SQL优化案例(r11笔记第13天)
- HDUOJ --2566
- HDUOJ ----1709
- Golang语言之异常处理
- HDUOJ---1171
- HDUOJ ------1398
- 转--一个Go推送服务器集群:gopush-cluster
- 关于闪回区溢出导致的数据hang(r11笔记第12天)
- catalan---卡特兰数(小结)
- Golang语言 Socket
- 带交互的telnet小工具,Golang版
- 数据库收缩数据文件的尝试(二)(r11笔记第10天)
- HDUOJ--Holding Bin-Laden Captive!
- HDUOJ----Ignatius and the Princess III
- 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 数组属性和方法
- Centos7 离线安装MySQL
- springboot 事务,多张表的操作事务回滚
- 移动硬盘显示盘符但是打不开,提示加密
- GORM V2 模型定义、约定、标签
- 字符串:简单的反转还不够!
- TypeScript 实战算法系列(七):实现图的遍历
- 63. Vue MUI的基本使用
- 初学web自动化测试--笔记1
- R语言作图——Line plot with error
- Python自学成才之路 玩转虚拟环境
- 基于腾讯云的 Rust 和 WebAssembly 函数即服务
- 谷歌开源NLP模型可视化工具LIT,模型训练不再「黑箱」
- Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案
- 社区开源框架预制件相关模块:CollectManager详解
- Kettle构建Hadoop ETL实践(三):Kettle对Hadoop的支持