关于request:微服务的全链路请求RequestContextHolder

我的项目开发过程中,有没有很想定义一个全局变量,作用域针对于单次 request申请,在整个申请过程中都能够随时获取。当应用feign、dubbo等做服务调用时,如果该变量的作用域还能传递到整个微服务链路,那就更好了。这就是本文想实现的成果,刚工作时基于 Oracle ADF 开发,就能够定义基于 RequestScope 作用域的变量。 在后面《微服务的全链路日志(Sleuth+MDC)》文章中,咱们实现了日志的全链路,原理是基于 spring cloud sleuth 和 MDC 的框架来实现 traceId 等值的全程传递。本文算是姊妹篇,但一些实现的框架有所不同,本文是基于 spring 自带的 RequestContextHolder,和 servlet 的 HttpServletRequest 来实现的。 1. 单服务单线程实现如果只心愿实现单个服务内的作用域,而且整个API的逻辑内都是单线程,那么最容易想到的计划就是 ThreadLocal。定义一个 ThreadLocal 变量,在每一个API申请的时候赋值,在申请完结后革除,咱们很多框架在AOP中解决这段逻辑。 但当初更容易,Spring框架自带的 RequestContextHolder 人造反对这么做。寄存变量总要有提供 Getter/Setter 办法的容器吧,上面就介绍 HttpServletRequest。 1.1. HttpServletRequestHttpServletRequest 大家应该都不生疏,一次 API 申请中,所有客户端的申请都被封装成一个 HttpServletRequest 对象里。这个对象在 API 申请时创立,响应实现后销毁,就很适宜作为 Request 作用域的容器。 1、Attribute 和 Header、Parameter而往容器中投放和获取变量的办法,则能够用 HttpServletRequest 对象的 setAttribute/getAttribute 办法来实现。现在大家可能都对 Attribute比拟生疏,它在晚期 JSP 开发时用的比拟多,用于 Servlet之间的值传递,不过用于以后场景也非常符合。 有人说那为啥不必 Header、Parameter 呢?它们也是 Request 作用域内的容器。简略有两点: Header、Parameter 设计之初就不是用于做服务端容器的,所以它们通常只能在客户端赋值,在服务端 HttpServletRequest 也只提供了 Getter接口,而没有 Setter接口。但 Attribute 就同时提供了 Getter/Setter 接口。Header、Parameter 存储对象的 Value 都是 String 字符串,也是不便客户端数据基于 HTTP 协定传输时不便。但 Attribute 存储对象的 Value 是 Object,也就更适宜寄存各种类型的对象。那么在Web开发中,咱们日常是如何获取 HttpServletRequest 对象的呢? ...

April 18, 2022 · 4 min · jiezi

关于request:requestresponse

一、Request 1.Request 继承体系 2.Request 获取申请数据 3.Request 申请参数中文乱码解决 4.Request 申请转发 二、Response 1.Response 设置响应数据性能介绍 2.Response 实现重定向 2.Response

April 4, 2022 · 1 min · jiezi