西安网站建设哪家好一些,WordPress万级数据优化,网上哪里有辅导高考生做难题的网站,网页设计制作教程dw一、Spring Cloud Gateway内置GatewayFilter
路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是特定路由。Spring Cloud Gateway 包括许多内置的 GatewayFilter 工厂。
官网地址#xff1a;https://docs.spring.io/spring-cloud-gateway…一、Spring Cloud Gateway内置GatewayFilter
路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是特定路由。Spring Cloud Gateway 包括许多内置的 GatewayFilter 工厂。
官网地址https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories
过滤器工厂作用参数AddRequestHeader为原始请求添加HeaderHeader的名称及值AddRequestParameter为原始请求添加请求参数参数名称及值AddResponseHeader为原始响应添加HeaderHeader的名称及值DedupeResponseHeader剔除响应头中重复的值需要去重的Header名称及去重策略Hystrix为路由引入Hystrix的断路器保护HystrixCommand的名称FallbackHeaders为fallbackUri的请求头中添加具体的异常信息Header的名称PrefixPath为原始请求路径添加前缀前缀路径PreserveHostHeader为请求添加一个preserveHostHeadertrue 的属性路由过滤器会检查该属性以决定是否要发送原始的Host无RequestRateLimiter用于对请求限流限流算法为令牌桶keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatusRedirectTo将原始请求重定向到指定的URLhttp状态码及重定向的urlRemoveHopByHopHeadersFilter为原始请求删除IETF组织规定的一系列Header默认就会启用可以通过配置指定仅删除哪些HeaderRemoveRequestHeader为原始请求删除某个HeaderHeader名称RemoveResponseHeader为原始响应删除某个HeaderHeader名称RewritePath重写原始的请求路径原始路径正则表达式以及重写后路径的正则表达式RewriteResponseHeader重写原始响应中的某个HeaderHeader名称、值的正则表达式重写后的值SaveSession在转发请求之前强制执行WebSession::save操作无secureHeaders为原始响应添加一系列起安全作用的响应头无支持修改这些安全响应头的值SetPath修改原始的请求路径修改后的路径SetResponseHeader修改原始响应中某个Header的值Header名称修改后的值SetStatus修改原始响应的状态码HTTP 状态码可以是数字也可以是字符串StripPrefix用于截断原始请求的路径使用数字表示要截断的路径的数量Retry针对不同的响应进行重试retries、statuses、methods、seriesRequestSize设置允许接收最大请求包的大 小。如果请求包大小超过设置的值则返回 413 Payload Too Large请求包大小单位为字节默认值为5MModifyRequestBody在转发请求之前修改原始请求体内容修改后的请求体内容ModifyResponseBody修改原始响应体的内容修改后的响应体内容
二、DefaultFilter
添加DefaultFilter将其应用于所有路由您可以使用spring.cloud.gateway.default-filters此属性配置采用DefaultFilter列表。
spring:cloud:gateway:default-filters:- AddResponseHeaderX-Response-Default-Red, Default-Blue- StripPrefix1三、GlobalFilter
GlobalFilter接口与GatewayFilter接口具有相同特征。GlobalFilter是有条件地应用于所有路由的特殊过滤器。
Spring Cloud Gateway 内置的GatewayFilter 更多介绍请见官网https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-filters
以下为自定义GlobalFilter实现记录请求方状态及耗时
ApiLoggingFilter.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.List;Slf4j
public class ApiLoggingFilter implements GlobalFilter, Ordered {private static final String START_TIME startTime;private static final String X_REAL_IP X-Real-IP;// nginx需要配置Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {if (log.isDebugEnabled()) {String info String.format(Method:{%s} Host:{%s} Path:{%s} Query:{%s},exchange.getRequest().getMethod().name(), exchange.getRequest().getURI().getHost(),exchange.getRequest().getURI().getPath(), exchange.getRequest().getQueryParams());log.debug(info);}exchange.getAttributes().put(START_TIME, System.currentTimeMillis());return chain.filter(exchange).then(Mono.fromRunnable(() - {Long startTime exchange.getAttribute(START_TIME);if (startTime ! null) {Long executeTime (System.currentTimeMillis() - startTime);ListString ips exchange.getRequest().getHeaders().get(X_REAL_IP);String ip ips ! null ? ips.get(0) : exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();String api exchange.getRequest().getURI().getRawPath();int code 500;if (exchange.getResponse().getStatusCode() ! null) {code exchange.getResponse().getStatusCode().value();}// 当前仅记录日志后续可以添加日志队列来过滤请求慢的接口if (log.isDebugEnabled()) {log.debug(来自IP地址{}的请求接口{}响应状态码{}请求耗时{}ms, ip, api, code, executeTime);}}}));}Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}}配置使用ApiLoggingFilter
GatewayConfiguration.java
Configuration(proxyBeanMethods false)
public class GatewayConfiguration {Beanpublic ApiLoggingFilter apiLoggingFilter() {return new ApiLoggingFilter();}
}四、过滤器的执行顺序
请求进入网关会碰到三类过滤器当前路由的过滤器、DefaultFilter、GlobalFilter。
请求路由后,会将 当前路由过滤器和DefaultFilter、GlobalFilter合并到一个过滤器链集合中按org.springframework.core.Ordered接口排序排序后依次执行每个过滤器 排序的规则是什么呢
每一个过滤器都必须指定一个int类型的order值order值越小优先级越高执行顺序越靠前。GlobalFilter通过实现Ordered接口或者添加Order注解来指定order值由我们自己指定。路由过滤器和defaultFilter的order由Spring指定默认是按照声明顺序从1递增。当过滤器的order值一样时会按照 defaultFilter 路由过滤器 GlobalFilter的顺序执行。传入的 HTTP 请求的第一个过滤器具有最高优先级。传出的 HTTP 响应的最后一个过滤器具有最高优先级。
详细内容可以查看源码
org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()方法是先加载defaultFilters然后再加载某个route的filters然后合并。
private ListGatewayFilter getFilters(RouteDefinition routeDefinition) {ListGatewayFilter filters new ArrayList();if (!this.gatewayProperties.getDefaultFilters().isEmpty()) {filters.addAll(this.loadGatewayFilters(routeDefinition.getId(), new ArrayList(this.gatewayProperties.getDefaultFilters())));}if (!routeDefinition.getFilters().isEmpty()) {filters.addAll(this.loadGatewayFilters(routeDefinition.getId(), new ArrayList(routeDefinition.getFilters())));}AnnotationAwareOrderComparator.sort(filters);return filters;
}org.springframework.cloud.gateway.handler.FilteringWebHandler#handle()方法会加载全局过滤器与前面的过滤器合并后根据order排序组织过滤器链。
public MonoVoid handle(ServerWebExchange exchange) {Route route (Route)exchange.getRequiredAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);ListGatewayFilter gatewayFilters route.getFilters();ListGatewayFilter combined new ArrayList(this.globalFilters);combined.addAll(gatewayFilters);AnnotationAwareOrderComparator.sort(combined);if (logger.isDebugEnabled()) {logger.debug(Sorted gatewayFilterFactories: combined);}return (new DefaultGatewayFilterChain(combined)).filter(exchange);
}