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

建筑效果图网站推荐网站宽屏背景

建筑效果图网站推荐,网站宽屏背景,软件开发公司简介模板免费,网站建站咨询在分布式系统中,traceId 需要在服务之间传递,以确保整个请求链路的日志能够被追踪。下面我们通过一个具体的例子,展示如何通过 A 服务调用 B 服务时传递 traceId,并确保日志中能够正确记录 traceId。 实现思路 A 服务生成 traceId…

在分布式系统中,traceId 需要在服务之间传递,以确保整个请求链路的日志能够被追踪。下面我们通过一个具体的例子,展示如何通过 A 服务调用 B 服务时传递 traceId,并确保日志中能够正确记录 traceId


实现思路

  1. A 服务生成 traceId:在 A 服务的 HandlerInterceptor 中生成 traceId,并将其放入 MDC

  2. A 服务调用 B 服务时传递 traceId:在 A 服务调用 B 服务时,将 traceId 通过 HTTP 头传递给 B 服务。

  3. B 服务接收 traceId:在 B 服务中,通过 HandlerInterceptor 或过滤器从 HTTP 头中提取 traceId,并将其放入 MDC

  4. 日志输出 traceId:在 A 服务和 B 服务的日志配置中,确保 traceId 能够被输出。


代码实现

1. A 服务代码
(1) TraceIdInterceptor 生成 traceId

java

复制

import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;@Component
public class TraceIdInterceptor implements HandlerInterceptor {private static final String TRACE_ID = "traceId";@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 生成唯一的 traceIdString traceId = UUID.randomUUID().toString();// 将 traceId 放入 MDCMDC.put(TRACE_ID, traceId);return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 请求完成后清理 MDC 中的 traceIdMDC.remove(TRACE_ID);}
}
(2) 注册 TraceIdInterceptor

java

复制

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate TraceIdInterceptor traceIdInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(traceIdInterceptor);}
}
(3) 调用 B 服务时传递 traceId

在 A 服务中,使用 RestTemplate 或 Feign 调用 B 服务时,将 traceId 添加到 HTTP 头中。

java

复制

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import java.net.URI;@RestController
public class AServiceController {private static final Logger logger = LoggerFactory.getLogger(AServiceController.class);private final RestTemplate restTemplate = new RestTemplate();@GetMapping("/call-b-service")public String callBService() {// 获取当前请求的 traceIdString traceId = MDC.get("traceId");logger.info("A Service - Calling B Service with traceId: {}", traceId);// 设置 HTTP 头,传递 traceIdHttpHeaders headers = new HttpHeaders();headers.add("X-Trace-Id", traceId);// 调用 B 服务RequestEntity<Void> request = new RequestEntity<>(headers, HttpMethod.GET, URI.create("http://localhost:8081/b-service"));ResponseEntity<String> response = restTemplate.exchange(request, String.class);return "A Service received response from B Service: " + response.getBody();}
}

2. B 服务代码
(1) TraceIdFilter 接收 traceId

在 B 服务中,使用过滤器从 HTTP 头中提取 traceId,并将其放入 MDC

java

复制

import org.slf4j.MDC;
import org.springframework.stereotype.Component;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.UUID;@Component
public class TraceIdFilter implements Filter {private static final String TRACE_ID = "traceId";@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;// 从 HTTP 头中获取 traceIdString traceId = httpRequest.getHeader("X-Trace-Id");if (traceId == null || traceId.isEmpty()) {// 如果头中没有 traceId,生成一个新的traceId = UUID.randomUUID().toString();}// 将 traceId 放入 MDCMDC.put(TRACE_ID, traceId);try {chain.doFilter(request, response);} finally {// 请求完成后清理 MDC 中的 traceIdMDC.remove(TRACE_ID);}}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void destroy() {}
}
(2) 注册 TraceIdFilter

java

复制

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<TraceIdFilter> traceIdFilter() {FilterRegistrationBean<TraceIdFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new TraceIdFilter());registrationBean.addUrlPatterns("/*");return registrationBean;}
}
(3) B 服务接口

java

复制

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class BServiceController {private static final Logger logger = LoggerFactory.getLogger(BServiceController.class);@GetMapping("/b-service")public String bService() {// 获取当前请求的 traceIdString traceId = MDC.get("traceId");logger.info("B Service - Processing request with traceId: {}", traceId);return "Hello from B Service!";}
}

3. 日志配置

在 A 服务和 B 服务的 logback.xml 中,配置日志输出格式,确保 traceId 能够被打印出来。

xml

复制

<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%X{traceId}] %msg%n</pattern></encoder></appender><root level="info"><appender-ref ref="STDOUT" /></root>
</configuration>

运行 HTML


测试流程

  1. 启动 A 服务和 B 服务。

  2. 访问 A 服务的 /call-b-service 接口。

  3. 查看 A 服务和 B 服务的日志输出,确保 traceId 一致。

A 服务日志示例:

复制

2023-10-01 12:00:00.000 [http-nio-8080-exec-1] INFO  AServiceController - [123e4567-e89b-12d3-a456-426614174000] A Service - Calling B Service with traceId: 123e4567-e89b-12d3-a456-426614174000

B 服务日志示例:

复制

2023-10-01 12:00:00.100 [http-nio-8081-exec-1] INFO  BServiceController - [123e4567-e89b-12d3-a456-426614174000] B Service - Processing request with traceId: 123e4567-e89b-12d3-a456-426614174000

总结

通过上述实现,我们完成了 A 服务调用 B 服务时的 traceId 传递和日志跟踪。traceId 通过 HTTP 头在服务间传递,并通过 MDC 在日志中输出,确保整个请求链路的日志能够被追踪。


文章转载自:

http://Yb0Jh46X.bfkrf.cn
http://9NEICKNJ.bfkrf.cn
http://FBkecmTE.bfkrf.cn
http://IvTCzheN.bfkrf.cn
http://64dlcfXW.bfkrf.cn
http://gOJEnHWh.bfkrf.cn
http://EWPKo3gn.bfkrf.cn
http://my8ceexz.bfkrf.cn
http://nJV9v3bn.bfkrf.cn
http://gCI3y5pk.bfkrf.cn
http://SBLFs0ct.bfkrf.cn
http://nmjNevRs.bfkrf.cn
http://H5Y7VOtp.bfkrf.cn
http://jmFL0KQg.bfkrf.cn
http://fd11t3oY.bfkrf.cn
http://89uonoZ7.bfkrf.cn
http://718qz5sq.bfkrf.cn
http://6z9aXxB1.bfkrf.cn
http://pMHYz07D.bfkrf.cn
http://lQ6wwyEJ.bfkrf.cn
http://4KQTD2GF.bfkrf.cn
http://csQZ09V1.bfkrf.cn
http://EgCMNHat.bfkrf.cn
http://mBc9kkV4.bfkrf.cn
http://ltOkCSXU.bfkrf.cn
http://5yGMiVzd.bfkrf.cn
http://9EO4hcrT.bfkrf.cn
http://LyJfRoRQ.bfkrf.cn
http://Hc9ARTzc.bfkrf.cn
http://RFmIL4fU.bfkrf.cn
http://www.dtcms.com/wzjs/697501.html

相关文章:

  • 外链收录网站建设网站服务器怎么选
  • 公司主页网站怎么做做微商城网站
  • 个人 网站可以做导航吗重庆网络安全公司
  • 青岛企业网站推广wordpress还能用
  • 蓬莱网站设计常见营销策略都有哪些
  • 做暧暧网站免费wordpress打赏链接
  • 湛江自做网站wordpress 在线音乐播放器
  • 吉林省工伤保险网站seo从零开始到精通200讲解
  • 医院客户做网站找谁济源网站建设济源
  • 在哪网站建设企业年金保险是一种什么保险
  • 怎样让百度搜不到自己的网站太阳能 技术支持 东莞网站建设
  • 微信公众号怎样做淘客网站学前端要多久
  • 如何为企业网站设计完整的推广方案吉安市网站建设
  • 天津制作网站公司推荐企业主页怎么写举例
  • 邢台移动网站建设服务网页设计与制作个人主页
  • 旅游网站案例分析重庆网站策划
  • 手机网站预约表单wowslider wordpress
  • 网站建设论文结束语织梦淘客网站
  • 上海优化网站 优帮云上海弘韬建设发展有限公司网站
  • 有什么软件做短视频网站知乎 上海做网站的公司
  • 网站建设顺利交付莘县住房建设局网站
  • 宝塔做网站可以用什么端口网站打开加速
  • 网站长期外包网页制作制作公司
  • 怎么查网站死链南通做外贸的公司网站
  • 微网站开发的比较总结百度小程序还需要做网站吗
  • 深圳市建设局网站小程序开发公司网站源码下载
  • 河南网站制作工作室ftp怎么做网站的备份
  • 手机上怎么查看网站设计nodejs做网站还是app
  • 如何设置网站默认首页公司网站维护一年多少钱
  • 怎么做汽车网站推广方案wordpress微信采集按钮