Contents

gRPC

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)
}