gRPC
Contents
gRPC
gRPC是Google开发的一种高性能的远程 procedure call(RPC)框架,它使用HTTP/2作为传输协议,Protocol Buffers(protobuf)作为序列化格式。gRPC的设计目标是创建可扩展、高性能、可靠的跨语言的RPC框架,以满足现代分布式系统的需求。
gRPC的核心理念是通过一种简单、高效的方式实现跨语言的RPC通信。它的设计灵感来自于Twitter开发的Finagle框架,并在Google内部得到了广泛的应用。
gRPC的主要优势包括:
- 高性能:gRPC使用HTTP/2作为传输协议,可以实现低延迟、高吞吐量的RPC通信。
- 跨语言:gRPC支持多种编程语言,包括C++、Java、Python、Go、JavaScript等,可以实现跨语言的RPC通信。
- 可扩展性:gRPC支持流式通信、压缩、加密等功能,可以根据需要扩展功能。
- 可靠性:gRPC支持重试、超时、负载均衡等功能,可以保证RPC通信的可靠性。
1、核心概念
gRPC的核心概念包括:
- RPC:远程 procedure call,是一种在不同进程、不同机器上执行的函数调用。gRPC提供了一种简单、高效的RPC通信方式。
- HTTP/2:gRPC使用HTTP/2作为传输协议,HTTP/2是一种更高效、更安全的HTTP协议。
- Protocol Buffers(protobuf):gRPC使用protobuf作为序列化格式,protobuf是一种轻量级、高效的数据结构序列化库。
gRPC的核心联系是:通过HTTP/2协议实现高性能的RPC通信,并使用protobuf作为序列化格式。
2、metadata
是一个键值对列表,key必须是ASCII 字符串,value可以是二进制数据(通常编码为 ASCII 字符串)或普通字符串,可以理解为类似http多header,Metadata 的 Key 是大小写不敏感的,传输过程中通常会被自动转换为小写
限制:自定义的metdadata不能以grpc-开头
metadata操作
package main
import (
"context"
"fmt"
"google.golang.org/grpc/metadata"
)
func main() {
ctx := context.Background()
// metadata key
MDKey := "name"
// 设置metadata数据
metaData := map[string]string{
MDKey: "jerry",
}
md := metadata.New(metaData)
ctx = metadata.NewOutgoingContext(ctx, md)
// 从ctx中获取metadata, get方法返回到是个slice,取第一个即可
data := ""
if md, ok := metadata.FromIncomingContext(ctx); ok {
names := md.Get(MDKey)
if len(names) > 0 {
data = names[0]
}
}
fmt.Printf("name: %v", data)
}