当前位置: 首页 > news >正文

go-zero/grpc的rpc服务间传递额外数据

go-zero/grpc的rpc服务间传递额外数据

2024/02/18

客户端:

md := metadata.New(map[string]string{"signature": "0123456789", "timestamp": "2021-07-01 00:00:00"})
ctx := metadata.NewOutgoingContext(ctx, md)
addResp, err := adderClient.Add(ctx, addReq) // rpc 调用

初始化 md 也可如下方式:

md := metadata.Pairs("signature", "0123456789","timestamp", "2021-07-01 00:00:00",
)
ctx := metadata.NewOutgoingContext(ctx, md)
addResp, err := adderClient.Add(ctx, addReq) // rpc 调用

追加新的如下:

ctx = metadata.AppendToOutgoingContext(ctx, "noncestr", "abc")

也可使用 md 的 Set 和 Append 方法追加:

md.Set("extra", "extra-value")
md.Append("append", "append-value")

服务端:

md, _ := metadata.FromIncomingContext(ctx)
或直接:
vals := metadata.ValueFromIncomingContext(ctx, "signature")

注意 key 都会被转为小写,即使客户端为大写:

// Keys beginning with "grpc-" are reserved for grpc-internal use only and may
// result in errors if set in metadata.
func New(m map[string]string) MD {md := make(MD, len(m))for k, val := range m {key := strings.ToLower(k)md[key] = append(md[key], val)}return md
}func Pairs(kv ...string) MD {if len(kv)%2 == 1 {panic(fmt.Sprintf("metadata: Pairs got the odd number of input pairs for metadata: %d", len(kv)))}md := make(MD, len(kv)/2)for i := 0; i < len(kv); i += 2 {key := strings.ToLower(kv[i])md[key] = append(md[key], kv[i+1])}return md
}func (md MD) Set(k string, vals ...string) {if len(vals) == 0 {return}k = strings.ToLower(k)md[k] = vals
}

而且 key 只能由 数字、字母和三个特殊字符“-_.”组成,大写字母会自动被转为小写字母。

相关文章:

  • 前端架构: 实现脚手架终端UI样式之ANSI escape code, Chalk, Ora介绍
  • 在VS里使用C#制作窗口应用
  • Hive 最全面试题及答案(基础篇)
  • Python系列(19)—— 条件语句
  • 汽车会撞死人,应不应该限制汽车?
  • Maven的下载安装配置教程
  • 昇腾ACL应用开发之模型转换ATC
  • unity学习(34)——角色选取界面(跨场景坑多)
  • MySQL 多表操作
  • Tomcat 学习之 Servlet
  • 12 Autosar_SWS_MemoryMapping.pdf解读
  • Android全新UI框架之常用ComposeUI组件
  • Mysql表字符集更换
  • unity学习(32)——跳转到角色选择界面(父子类问题)
  • Pytorch 复习总结 3
  • 【刷算法】从上往下打印二叉树
  • Apache Zeppelin在Apache Trafodion上的可视化
  • docker python 配置
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • gf框架之分页模块(五) - 自定义分页
  • go语言学习初探(一)
  • leetcode-27. Remove Element
  • nginx 负载服务器优化
  • nodejs调试方法
  • PAT A1017 优先队列
  • Spring-boot 启动时碰到的错误
  • Vue.js 移动端适配之 vw 解决方案
  • 爱情 北京女病人
  • 经典排序算法及其 Java 实现
  • 前端js -- this指向总结。
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 手机端车牌号码键盘的vue组件
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 一个完整Java Web项目背后的密码
  • kubernetes资源对象--ingress
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • #pragam once 和 #ifndef 预编译头
  • (06)金属布线——为半导体注入生命的连接
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (python)数据结构---字典
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)ssm码农论坛 毕业设计 231126
  • (七)Java对象在Hibernate持久化层的状态
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (新)网络工程师考点串讲与真题详解
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • *1 计算机基础和操作系统基础及几大协议
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net 4.0发布后不能正常显示图片问题
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net Signalr 使用笔记