Spring Cloud Zuul記錄介面響應資料
系統在生產環境出現問題時,排查問題最好的方式就是檢視日誌了,日誌的記錄儘量詳細,這樣你才能快速定位問題。
如果需要在Zuul中進行詳細的日誌記錄,這兩種日誌必不可少。
- API請求資訊
- API響應資訊
前面有介紹過如何獲取請求資訊,文章請檢視《Spring Cloud Zuul過濾器獲取請求引數問題》。
今天正好又有一位朋友問我如何獲取響應的資料,抽時間給大家寫篇文章簡單分享下。
熟悉Zuul的朋友都知道,Zuul中有4種型別過濾器,每種都有特定的使用場景,要想記錄響應資料,那麼必須是在請求路由到了具體的服務之後,返回了才有資料,這種需求就適合用post過濾器來實現了。
這邊給大家介紹兩種方式獲取響應資料:
第一種
try {
Object zuulResponse = RequestContext.getCurrentContext().get("zuulResponse");
if (zuulResponse != null) {
RibbonHttpResponse resp = (RibbonHttpResponse) zuulResponse;
String body = IOUtils.toString(resp.getBody());
System.err.println(body);
resp.close();
RequestContext.getCurrentContext().setResponseBody(body);
}
} catch (IOException e) {
e.printStackTrace();
}
第二種
InputStream stream = RequestContext.getCurrentContext().getResponseDataStream();
try {
String body = IOUtils.toString(stream);
System.err.println(body);
RequestContext.getCurrentContext().setResponseBody(body);
} catch (IOException e) {
e.printStackTrace();
}
為什麼上面兩種方式可以取到響應內容?
在RibbonRoutingFilter或者SimpleHostRoutingFilter中可以看到下面一段程式碼:
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
this.helper.addIgnoredHeaders();
try {
RibbonCommandContext commandContext = buildCommandContext(context);
ClientHttpResponse response = forward(commandContext);
setResponse(response);
return response;
}
catch (ZuulException ex) {
throw new ZuulRuntimeException(ex);
}
catch (Exception ex) {
throw new ZuulRuntimeException(ex);
}
}
forward()方法對服務呼叫,拿到響應結果,通過setResponse()方法進行響應的設定。
protected void setResponse(ClientHttpResponse resp)
throws ClientException, IOException {
RequestContext.getCurrentContext().set("zuulResponse", resp);
this.helper.setResponse(resp.getStatusCode().value(),
resp.getBody() == null ? null : resp.getBody(), resp.getHeaders());
}
上面第一行程式碼就可以解釋我們的第一種獲取的方法,這邊直接把響應內容加到了RequestContext中。
第二種方式的解釋就在helper.setResponse的邏輯裡面了,如下:
public void setResponse(int status, InputStream entity,
MultiValueMap<String, String> headers) throws IOException {
RequestContext context = RequestContext.getCurrentContext();
context.setResponseStatusCode(status);
if (entity != null) {
context.setResponseDataStream(entity);
}
// .....
}
第二天又問了另外一個問題,怎麼獲取response的contentType?
需求是可以區分是正常的資料響應還是檔案下載:
這位朋友獲取的程式碼是:
HttpServletResponse response = ctx.getResponse();
response.getContentType()
他說上面的方式獲取不到?
我給大家介紹兩種獲取方式,如下:
第一種
List<Pair<String, String>> headerList = RequestContext.getCurrentContext().getOriginResponseHeaders();
for (Pair<String, String> pair : headerList) {
if (pair.first().equals("Content-Type")) {
System.err.println(pair.second());
}
}
第二種
Object zuulResponse = RequestContext.getCurrentContext().get("zuulResponse");
if (zuulResponse != null) {
RibbonHttpResponse resp = (RibbonHttpResponse) zuulResponse;
System.err.println(resp.getHeaders().getContentType().toString());
}
推薦下我的新書《Spring Cloud微服務-全棧技術與案例解析》
新書購買:單本75折包郵
歡迎加入我的知識星球,一起交流技術,免費學習猿天地的課程(http://cxytiandi.com/course)
PS:目前星球中正在星主的帶領下組隊學習Spring Cloud,等你哦!
相關文章
- 8、Spring Cloud ZuulSpringCloudZuul
- springcloud學習筆記(六)Spring Cloud ZuulSpringGCCloud筆記Zuul
- Spring Cloud Zuul中使用Swagger彙總API介面文件SpringCloudZuulSwaggerAPI
- Spring Cloud 之 Zuul.SpringCloudZuul
- Spring Cloud Zuul 閘道器SpringCloudZuul
- spring cloud微服務分散式雲架構Spring Cloud ZuulSpringCloud微服務分散式架構Zuul
- Spring Cloud Zuul 閘道器(一)SpringCloudZuul
- 記錄Spring Cloud應用在阿里雲架構部署SpringCloud阿里架構
- spring cloud zuul使用記錄(2)路由接入流程以及併發重新整理問題SpringCloudZuul路由
- Spring cloud(5)-路由閘道器(Zuul)SpringCloud路由Zuul
- Spring Cloud Eureka 學習記錄SpringCloud
- 最全面的改造Zuul閘道器為Spring Cloud Gateway(包含Zuul核心實現和Spring Cloud Gateway核心實現)ZuulSpringCloudGateway
- Spring Cloud Zuul與閘道器中介軟體SpringCloudZuul
- Spring Cloud 專題之四:Zuul閘道器SpringCloudZuul
- Spring Cloud 2021.0.1 移除了Hystrix、Zuul等Netflix元件SpringCloudZuul元件
- Spring Cloud正式移除Hystrix、Zuul等Netflix OSS元件SpringCloudZuul元件
- Spring 5與Spring cloud的響應式程式設計之旅SpringCloud程式設計
- 微服務閘道器Zuul遷移到Spring Cloud Gateway微服務ZuulSpringCloudGateway
- Spring Cloud教程 第九彈 微服務閘道器ZuulSpringCloud微服務Zuul
- Spring Cloud實戰系列(五) - 服務閘道器ZuulSpringCloudZuul
- 閘道器 zuul 與 spring-cloud gateway的區別ZuulSpringCloudGateway
- 在spring boot中整合微服務閘道器係統Spring Cloud ZuulSpring Boot微服務CloudZuul
- Spring Cloud Gateway修改請求和響應body的內容SpringCloudGateway
- Spring系列 SpringMVC的請求與資料響應SpringMVC
- Spring Boot 和 Spring Cloud 應用記憶體如何管理?Spring BootCloud記憶體
- spring cloud 微服務異常記錄與報警SpringCloud微服務
- Spring Cloud Zuul API服務閘道器之請求路由SpringCloudZuulAPI路由
- springboot+aop切點記錄請求和響應資訊Spring Boot
- angular4學習記錄 — 資料繫結、響應式程式設計、管道Angular程式設計
- Spring Cloud入門教程(五):API服務閘道器(Zuul) 上SpringCloudAPIZuul
- 筆記:統一的介面響應類 HttpService筆記HTTP
- Spring cloud系列十八 Spring Cloud 從Dalston.SR5到Greenwich.SR1 的升級記錄SpringCloud
- 什麼是 Spring Cloud 資料流?SpringCloud
- Spring Cloud Feign 應用SpringCloud
- Vue響應式—-資料響應式原理Vue
- Java Spring Cloud 與響應式微服務(三)客戶服務建立JavaSpringCloud微服務
- Java Spring Cloud 與響應式微服務(二)賬戶服務建立JavaSpringCloud微服務
- Java Spring Cloud 與響應式微服務(一)服務註冊中心JavaSpringCloud微服務