首页 > 其他分享 >context里的超时时间是怎么在微服务之间传递的

context里的超时时间是怎么在微服务之间传递的

时间:2024-03-17 13:11:19浏览次数:15  
标签:服务 请求 信息 传递 context 超时

题目:有A、B三个服务,调用链路为:A->B,为了控制调用的超时时间。A服务生成一个context,超时时间设置为3s,在A服务调用B服务的时候会把context传给B服务。这样子就能控制调用超时时间为3s,请问context里的超时是怎么在两个服务之间传递的,通过什么传递的?

在Go语言中,当微服务A需要将context的信息传递给微服务B时,实际上并不是直接将context对象通过网络发送。相反,context中的某些信息(如截止时间、取消信号等)会被提取出来,并作为请求的一部分发送给微服务B。

以下是context信息如何在网络上从微服务A传递到微服务B的步骤:

1.提取信息:在微服务A中,当准备发起对微服务B的请求时,会从当前的context中提取出需要传递的信息。这通常包括截止时间(如果有的话)和取消信号。

2.设置请求元数据:这些信息会被设置到请求的元数据(Metadata)中。对于HTTP请求,这可能意味着将截止时间转换为超时头(如果协议支持),或者将取消信号转换为某种形式的请求标识,以便在必要时能够中断处理。对于gRPC,可以使用元数据或特定的RPC上下文来传递这些信息。

3.发送请求:微服务A发起一个gRPC请求时,它会将元数据附加到请求头(Headers)中,这些元数据包含了关于请求的各种信息,如认证 信息、用户代理等。元数据在请求头中时键值对的形式传递。

4.解析元数据:微服务B接收到请求后,会从请求头中解析请求的元数据,从中提取出截止时间和取消信号(如果有的话)。然后,微服务B会创建一个新的context对象,并将这些信息设置到新的context中。

5.处理请求:微服务B使用新创建的context来处理请求。这意味着如果微服务A的context被取消,微服务B可以通过检查其自己的context来得知这一点,并相应地中断处理。

需要注意的是,这种传递方式并不是自动的;开发者需要显式地从context中提取信息,并将其设置到请求中。此外,不同的通信协议和框架可能有不同的方式来处理context信息的传递。例如,gRPC提供了专门的上下文传播机制,而HTTP则可能需要开发者自行实现一些逻辑来传递这些信息。

最后,还要考虑到安全性和隐私性问题。不应该将敏感信息或不应暴露给微服务B的信息通过context传递。因此,在设计和实现这种传递机制时,需要仔细考虑哪些信息应该被传递,以及如何安全地传递这些信息。

grpc超时传递是通过metadata进行传递的,最终会被转化为grpc-timeout的值,代码如下:

if v := r.Header.Get("grpc-timeout"); v != "" {
  to, err := decodeTimeout(v)
  if err != nil {
   return nil, status.Errorf(codes.Internal, "malformed time-out: %v", err)
  }
  st.timeoutSet = true
  st.timeout = to
}

 从请求头里取出超时时间的元数据,然后再通过得到的值构建一个context。 

标签:服务,请求,信息,传递,context,超时
From: https://www.cnblogs.com/wuyepeng/p/18078462

相关文章

  • Jmeter之线程组之间变量的传递
    在会员登录请求中,对请求返回的结果进行提取,需要使用JSON提取器(添加/后置处理器/JSON提取器)Namesofcreatedvariables填入token,即创建的变量名,其值来源于$.content.token(字符表示返回值的根路径)3.2添加后置处理器调试后置处理程序3.3添加后置处理器BeanShell后置......
  • [vscode]使用cmake时将命令行参数传递给调试目标
    一、简介本文介绍了在vscode中使用cmake工具时,如何传递参数给编译目标的方法。前提:使用vscode+cmake编译C/C++程序。二、方法在.vscode/目录下新建settings.json文件,并将待传底的参数写在cmake.debugConfig里。下面介绍了一个示例,将参数first_arg,second-arg和thirdarg......
  • C++发布订阅者模式:实现简单消息传递系统
     概述:这个C++示例演示了发布者-订阅者模式的基本实现。通过`Event`类,发布者`Publisher`发送数据,而订阅者`Subscriber`订阅并处理数据。通过简单的回调机制,实现了组件间松散耦合的消息传递。好的,我将为你提供一个简单的C++实例,演示如何使用发布者-订阅者模式。在这个例......
  • 滴水逆向笔记系列-win32总结4-50.创建线程-51.线程控制_CONTEXT结构
    第五十课win32创建线程1.进程与线程程序就是在硬盘里还没跑起来的二进制文件,进程就是已经运行中的程序,一个进程至少有一个线程,比如一个正在举行的活动需要几十个人帮忙干活,进程就是那个活动,线程就是那几十个人一个线程启动是需要占用一个cpu的一个新线程也会创建一个新堆......
  • [算法学习笔记] 传递闭包
    DescriptionWarning:本文只介绍传递闭包在OI中的简单应用。传递闭包在OI中,一般用来处理图上点之间的连通性问题。它在图上体现在原图上任意两个直接或者间接可达的点都连边。在上图中,显然\(\{1,2\}\{2,3\}\{1,3\}\)均可达。在“传递闭包图”上如上三对点对都需要连边。......
  • 从后端获取的数据,是多层嵌套的,该如何传递给各个tab和子组件,如表单和表格?
    当后端返回的数据是多层嵌套结构时,传递给各个Tab和子组件(如表单和表格)可以按照以下步骤进行:状态管理:使用React的状态管理库如Redux、MobX或React的ContextAPI来集中存储从后端获取的多层嵌套数据。这样可以确保所有子组件都可以访问到这些数据。//使用Redux示例import{c......
  • 使用useContext和useReducer实现类似于redux的简单状态管理
    useContext和useReducer的联合用法(实现多组件多状态管理)useReduceruseReducer(reducer,initialArg,init?)参数reducer:(state:S,action:A)=>newState:S;用于更新state的纯函数。参数为state和action,返回值是更新后的state。state与action可以是任意合法值。initi......
  • 标准库之context(很重要)
    目录标准库之context一、为什么需要context1.基本并发的示例2.全局变量方式的并发3.通道方式的并发4.官方版的方案二、Context初识1.Context接口2.两个顶级Context(1)Background()和TODO()(2)区别3.派生Context(With系列函数)(1)WithCancel(可取消context)i.context控制goroutin......
  • vue中router页面之间参数传递,params失效,建议使用query
    vue中router页面之间参数传递,params失效,建议使用query简介:本文讲解vue中router页面之间参数传递,params失效,建议使用query。在vue中有一个router功能,他可以用来页面之间的参数传递,他有两种方式一种是params方式,一种是query方式,但是params方式特别容易导致参数的丢失问......
  • Python 向函数传递参数(小结)
    目录1、位置实参2、关键字实参3、形参默认值4、将队列的副本传入函数5、传递任意数量的实参6、传递任意数量的关键字实参1、位置实参调用函数时,传递参数的顺序与函数定义中的参数顺序一致。defperson(name,age):passperson('Marry',34)2、关键字实参调用......