网站首页 > 教程文章 正文
前言
在微服务架构下,业务系统的功能是由大量的微服务组成,例如:一个电商购物平台下单环节就需要订单服务、库存服务、短信服务和物流服务等逐级调用。但是每个服务是由不同的研发团队负责的,部署在成百上千台服务器上。
在这么复杂的数据传递过程中最怕发生系统故障,因为很难去快速定位到问题。所以就要引入服务间的链路追踪。
在技术调研过程中大致有以下几种方案:
1、基于 Sleuth + Zipkin 方案
2、通过 SkyWalking 实施链路追踪
3、自建链路追踪
这里选择了自建链路追踪的方式,至于为啥不用1、2 就不多讲了,这次的坑是在自建过程中采用的是通过 OpenFeign 来作为服务间远程数据交换,通过在HTTP请求的Header 总增加TraceId 参数来作为服务间的链路追踪。
OpenFeign调用传递Header方案
import feign.RequestInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
@Configuration
@Slf4j
public class FeignClientConfig {
@Bean
public RequestInterceptor headerInterceptor() {
return template -> {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (null != attributes) {
HttpServletRequest request = attributes.getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
template.header(name, values);
}
}
}
};
}
}
问题
上面说到有些服务是其他团队负责研发的,有自己的网关、鉴权等。那么在通过OpenFeign调用的时候出现了返回乱码,具体如下:
{
"code": "200",
"message": "请求成功",
"result": "\u0015\u0013\u0001\u0000Y[?3Y\u000EHGHВY\u0018H%@@m\u001BL%\u0019u\u000Ev-+8&t\t<\u001EW0002\teZ\u0004Xk,lt5\u0010\u0004V\u0000*D*0\u0000[\u0005y\u001B\b,rC\u0012\u000G3m?<v\"]m`p1^Jh\u00M#$\u001F<\rHf[\u0002"
}
比较奇怪的是只有个别服务是有问题的,也没有办法去看对方的代码。
原因分析
最终定位到的原因是Request 的Header 中设置Accept-Encoding:gzip, deflate, br;的问题,如果加上就会返回乱码。
最开始的时候以为是编码的问题,所以小编尝试了各种编码,但是始终无法解决问题。
后来想到 Accept-Encoding 不参与数据传递就OK啦!
增加代码:
总结:
之所以添加:"Accept-Encoding" = "gzip, deflate, br"
是因为,浏览器对于从服务器中返回的对应的gzip压缩的网页,会自动解压缩,所以Request的时候,添加对应的Header信息,表示接收压缩后的数据。
而此代码中,如果也添加此头信息,结果就是,返回的压缩后的数据,由于没有解码,客户端将压缩后的数据当做普通的html文本来处理,当前显示出来的内容,是乱码了。
小编选择的是排除掉 Accept-Encoding ,当然也可以只去掉 gzip参数。
猜你喜欢
- 2025-09-11 Spring Boot3 中 RESTful 接口调用全解析:从阻塞到响应式的实战指南
- 2025-09-11 springcloud实战:服务间通信OpenFeign熔断
- 2025-09-11 项目终于用上了动态Feign,真香!_feign动态服务名
- 2025-09-11 RestTemplate和Feign的区别_feign和httpclient的区别
- 2025-09-11 OpenFeign:让你的Java代码像本地调用一样简单
- 2025-09-11 【完结14章】SpringCloud+Netty集群实战千万级 IM系统
- 2025-09-11 Eureka服务发现框架和微服务调用组件Feign
- 2025-09-11 Spring Cloud OpenFeign - 远程调用
- 2025-09-11 「SpringCloud」(十二)OpenFeign+Ribbon实现负载均衡
- 2025-09-11 微服务 - 服务接口调用 OpenFeign
- 最近发表
-
- K8s 部署频繁出错?一套流程教你快速定位故障,工作效率翻倍
- 防火墙服务无法启用,显示灰色的解决办法
- 网络问题-电脑无法上网处理思路以及办法 (总集)
- Win10学院:Windows Denfender无法启动怎么办?
- Windows账户登录问题解决方案_登录windows账户什么意思
- IIS无法启动提示计算机上"."的服务W3SVC,一分钟搞定,抓紧收藏
- 已申请到免费顶级域名如何管理_顶级域名免费注册
- 网站被劫持了老是跳转怎么办_网站被劫持到其它网站如何解决
- 这些“常用药”被注销!涉及维生素、去痛片、眼药水等!快看看你家有吗?
- 《皕宋楼藏书志》清 藏书家陆心源与其门人李宗莲合编的藏书目录
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)