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

建设银行内部审批哪些网站南通网站seo服务

建设银行内部审批哪些网站,南通网站seo服务,做有网被视频网站有哪些,银川网站建设哪家优质在基于SpringCloud开发的微服务中#xff0c;我们一般会选择在网关层记录请求和响应日志#xff0c;并将其收集到ELK中用作查询和分析。 今天我们就来看看如何实现此功能。 日志实体类 首先我们在网关中定义一个日志实体#xff0c;用于组装日志对象 Data public class …在基于SpringCloud开发的微服务中我们一般会选择在网关层记录请求和响应日志并将其收集到ELK中用作查询和分析。 今天我们就来看看如何实现此功能。 日志实体类 首先我们在网关中定义一个日志实体用于组装日志对象 Data public class AccessLog {/**用户编号**/private Long userId;/**路由**/private String targetServer;/**协议**/private String schema;/**请求方法名**/private String requestMethod;/**访问地址**/private String requestUrl;/**请求IP**/private String clientIp;/**查询参数**/private MultiValueMapString, String queryParams;/**请求体**/private String requestBody;/**请求头**/private MultiValueMapString, String requestHeaders;/**响应体**/private String responseBody;/**响应头**/private MultiValueMapString, String responseHeaders;/**响应结果**/private HttpStatusCode httpStatusCode;/**开始请求时间**/private LocalDateTime startTime;/**结束请求时间**/private LocalDateTime endTime;/**执行时长单位毫秒**/private Integer duration;}网关日志过滤器 接下来我们在网关中定义一个Filter用于收集日志信息。 Component public class AccessLogFilter implements GlobalFilter, Ordered {private final ListHttpMessageReader? messageReaders  HandlerStrategies.withDefaults().messageReaders();/*** 打印日志* param accessLog 网关日志*/private void writeAccessLog(AccessLog accessLog) {log.info(----access---- : {}, JsonUtils.obj2StringPretty(accessLog));}/*** 顺序必须是-1否则标准的NettyWriteResponseFilter将在您的过滤器得到一个被调用的机会之前发送响应* 也就是说如果不小于 -1 将不会执行获取后端响应的逻辑* return*/Overridepublic int getOrder() {return -100;}Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 将 Request 中可以直接获取到的参数设置到网关日志ServerHttpRequest request  exchange.getRequest();AccessLog gatewayLog  new AccessLog();gatewayLog.setTargetServer(WebUtils.getGatewayRoute(exchange).getId());gatewayLog.setSchema(request.getURI().getScheme());gatewayLog.setRequestMethod(request.getMethod().name());gatewayLog.setRequestUrl(request.getURI().getRawPath());gatewayLog.setQueryParams(request.getQueryParams());gatewayLog.setRequestHeaders(request.getHeaders());gatewayLog.setStartTime(LocalDateTime.now());gatewayLog.setClientIp(WebUtils.getClientIP(exchange));// 继续 filter 过滤MediaType mediaType  request.getHeaders().getContentType();if (MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType)|| MediaType.APPLICATION_JSON.isCompatibleWith(mediaType)) { // 适合 JSON 和 Form 提交的请求return filterWithRequestBody(exchange, chain, gatewayLog);}return filterWithoutRequestBody(exchange, chain, gatewayLog);}/*** 没有请求体的请求只需要记录日志*/private MonoVoid filterWithoutRequestBody(ServerWebExchange exchange, GatewayFilterChain chain, AccessLog accessLog) {// 包装 Response用于记录 Response BodyServerHttpResponseDecorator decoratedResponse  recordResponseLog(exchange, accessLog);return chain.filter(exchange.mutate().response(decoratedResponse).build()).then(Mono.fromRunnable(() - writeAccessLog(accessLog)));}/*** 需要读取请求体* 参考 {link ModifyRequestBodyGatewayFilterFactory} 实现*/private MonoVoid filterWithRequestBody(ServerWebExchange exchange, GatewayFilterChain chain, AccessLog gatewayLog) {// 设置 Request Body 读取时设置到网关日志ServerRequest serverRequest  ServerRequest.create(exchange, messageReaders);MonoString modifiedBody  serverRequest.bodyToMono(String.class).flatMap(body - {gatewayLog.setRequestBody(body);return Mono.just(body);});// 通过 BodyInserter 插入 body(支持修改body), 避免 request body 只能获取一次BodyInserterMonoString, ReactiveHttpOutputMessage bodyInserter  BodyInserters.fromPublisher(modifiedBody, String.class);HttpHeaders headers  new HttpHeaders();headers.putAll(exchange.getRequest().getHeaders());// the new content type will be computed by bodyInserter// and then set in the request decoratorheaders.remove(HttpHeaders.CONTENT_LENGTH);CachedBodyOutputMessage outputMessage  new CachedBodyOutputMessage(exchange, headers);// 通过 BodyInserter 将 Request Body 写入到 CachedBodyOutputMessage 中return bodyInserter.insert(outputMessage, new BodyInserterContext()).then(Mono.defer(() - {// 重新封装请求ServerHttpRequest decoratedRequest  requestDecorate(exchange, headers, outputMessage);// 记录响应日志ServerHttpResponseDecorator decoratedResponse  recordResponseLog(exchange, gatewayLog);// 记录普通的return chain.filter(exchange.mutate().request(decoratedRequest).response(decoratedResponse).build()).then(Mono.fromRunnable(() - writeAccessLog(gatewayLog))); // 打印日志}));}/*** 记录响应日志* 通过 DataBufferFactory 解决响应体分段传输问题。*/private ServerHttpResponseDecorator recordResponseLog(ServerWebExchange exchange, AccessLog accessLog) {ServerHttpResponse response  exchange.getResponse();return new ServerHttpResponseDecorator(response) {Overridepublic MonoVoid writeWith(Publisher? extends DataBuffer body) {if (body instanceof Flux) {DataBufferFactory bufferFactory  response.bufferFactory();// 计算执行时间accessLog.setEndTime(LocalDateTime.now());accessLog.setDuration((int) (LocalDateTimeUtil.between(accessLog.getStartTime(),accessLog.getEndTime()).toMillis()));accessLog.setResponseHeaders(response.getHeaders());accessLog.setHttpStatusCode(response.getStatusCode());// 获取响应类型如果是 json 就打印String originalResponseContentType  exchange.getAttribute(ServerWebExchangeUtils.ORIGINAL_RESPONSE_CONTENT_TYPE_ATTR);if (StrUtil.isNotBlank(originalResponseContentType) originalResponseContentType.contains(application/json)) {Flux? extends DataBuffer fluxBody  Flux.from(body);return super.writeWith(fluxBody.buffer().map(dataBuffers - {// 设置 response body 到网关日志byte[] content  readContent(dataBuffers);String responseResult  new String(content, StandardCharsets.UTF_8);accessLog.setResponseBody(responseResult);// 响应return bufferFactory.wrap(content);}));}}// if body is not a flux. never got there.return super.writeWith(body);}};}/*** 请求装饰器支持重新计算 headers、body 缓存** param exchange 请求* param headers 请求头* param outputMessage body 缓存* return 请求装饰器*/private ServerHttpRequestDecorator requestDecorate(ServerWebExchange exchange, HttpHeaders headers, CachedBodyOutputMessage outputMessage) {return new ServerHttpRequestDecorator(exchange.getRequest()) {Overridepublic HttpHeaders getHeaders() {long contentLength  headers.getContentLength();HttpHeaders httpHeaders  new HttpHeaders();httpHeaders.putAll(super.getHeaders());if (contentLength  0) {httpHeaders.setContentLength(contentLength);} else {// TODO: this causes a HTTP/1.1 411 Length Required // on// httpbin.orghttpHeaders.set(HttpHeaders.TRANSFER_ENCODING, chunked);}return httpHeaders;}Overridepublic FluxDataBuffer getBody() {return outputMessage.getBody();}};}/*** 从dataBuffers中读取数据* author jam* date 2024/5/26 22:31*/private byte[] readContent(List? extends DataBuffer dataBuffers) {// 合并多个流集合解决返回体分段传输DataBufferFactory dataBufferFactory  new DefaultDataBufferFactory();DataBuffer join  dataBufferFactory.join(dataBuffers);byte[] content  new byte[join.readableByteCount()];join.read(content);// 释放掉内存DataBufferUtils.release(join);return content;}}代码较长建议直接拷贝到编辑器只要注意下面一个关键点 getOrder()方法返回的值必须要-1否则标准的NettyWriteResponseFilter将在您的过滤器被调用的机会之前发送响应即不会执行获取后端响应参数的方法 通过上面的两步我们已经可以获取到请求的输入输出参数了在 writeAccessLog()中将其打印到日志文件方便通过ELK进行收集。 在实际项目中网关日志量一般会非常大不建议使用数据库进行存储。 实际效果 服务正常响应 服务异常响应
http://www.w-s-a.com/news/657876/

相关文章:

  • 网站管理系统 手机会员制网站搭建wordpress
  • 做物品租赁网站清新wordpress主题
  • 优秀专题网站家居企业网站建设市场
  • 中山市有什么网站推广wordpress轻应用主机
  • 洗头竖鞋带名片改良授权做网站不贵整个世界
  • 设计电子商务网站建设方案微信如何开发自己的小程序
  • 建设网站公司哪里好相关的热搜问题解决方案做网站要看什么书
  • 网站建设重要性黄岐建网站
  • 做网站电销《电子商务网站建设》精品课
  • 地方商城网站海外网站推广方法
  • 乐山 网站建设安阳给商家做网站推广
  • 网站空间一般多大邢台网站建设有哪些
  • h5网站开发工具有哪些wordpress清空post表
  • 公司开网站干嘛怎么制作一个免费的网站模板
  • 群晖wordpress搭建网站网站建设及管理
  • 中山企业网站建设公司抖音代运营合作模式
  • 南通营销网站开发做网站页面多少钱
  • 桂林生活网官方网站云主机和云电脑的区别
  • 内部网络网站怎么做vue做单页面网站
  • 如何建立网站教程wordpress粘帖图片
  • 广东网站备案要多久网站开发 pdf 文字版
  • 学校网站方案帮别人做钓鱼网站吗
  • 如何加强网站建设和信息宣传wordpress 搜索提示
  • 灰色网站怎么做php yaf 网站开发框架
  • 浙江建设网站首页提供做网站公司有哪些
  • 建公司网站报价公司seo是什么级别
  • 可信赖的武进网站建设中山网站建设方案
  • 网站设计方面有什么公司运动鞋网站建设目的
  • 学校门户网站流程建设方案找人做网站 多少钱
  • 网站域名更换相应内容网站策划 要求