东营建设信息网站,自己做网站开发,深圳seo优化排名,网站开发建设需要什么Spring Cloud Gateway的工作流程 具体的流程#xff1a; 用户发送请求到网关 请求断言#xff0c;用户请求到达网关后#xff0c;由Gateway Handler Mapping#xff08;网关处理器映射#xff09;进行Predicates#xff08;断言#xff09;#xff0c;看一下哪一个符合…Spring Cloud Gateway的工作流程 具体的流程 用户发送请求到网关 请求断言用户请求到达网关后由Gateway Handler Mapping网关处理器映射进行Predicates断言看一下哪一个符合路由规则选择对应的过滤器进行处理 spring:cloud:gateway:routes:- id: api_routeuri: http://localhost:8123predicates:- Path/api/**filters:- AddRequestHeadertoken,wahahaawahaha上面是使用application.yml对网关进行路由规则的制定 - id: api_route: 这是路由的标识符。这只是一个名称可以是任何描述性的名称uri:http//localhost:8123是表示请求要转发的路径predicates断言比如指定了- Path/api/**任何到达网关的请求如果请求资源定位符是/api/开头的都会进行匹配例如网关的端口是8090,我发送请求http://localhost:8090/api/hello那么网关就会将请求转发到http://localhost:8123/api/hello但是转发之前会经过filters,例如上面的AddRequestHeadersource,api会在请求头加一个source,api 请求过滤请求到达Gateway Web Handler里面有很多Filter过滤器多个Filter像一个Chain链条一样串起来符合路由断言的请求会先后经过这些Filter进行处理在FIlter中可以进行限流、访问控制、参数校验、添加请求头等 服务处理如果请求经过所有FIlter无异常会将请求转发给真正的后端进行处理 响应过滤后端处理完结果后返回给Gateway的过滤器再次做处理逻辑上可以称为 Post-Filters
总结客户端的请求先通过匹配规则找到合适的路由就能映射到具体的服务。然后请求经过过滤器处理后转发给具体的服务服务处理后再次经过过滤器处理最后返回给客户端。
常见路由断言规则 自定义过滤器
如果要定义的过滤器比较复杂可以使用自定义过滤器
Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1. 获取请求头ServerHttpRequest request exchange.getRequest();String path INTERFACE_HOST request.getPath().value();String method request.getMethod().toString();log.info(请求唯一标识 request.getId());log.info(请求路径 path);log.info(请求方法 method);log.info(请求参数 request.getQueryParams());String sourceAddress request.getLocalAddress().getHostString();log.info(请求来源地址 sourceAddress);log.info(请求来源地址 request.getRemoteAddress());ServerHttpResponse response exchange.getResponse();// 2. 访问控制 - 黑白名单if (!IP_WHITE_LIST.contains(sourceAddress)) {response.setStatusCode(HttpStatus.FORBIDDEN);return response.setComplete();}// 3. 用户鉴权return chain.filter(exchange);}// 设置order调用顺序Overridepublic int getOrder() {return -1;}public MonoVoid handleNoAuth(ServerHttpResponse response) {response.setStatusCode(HttpStatus.FORBIDDEN);return response.setComplete();}public MonoVoid handleInvokeError(ServerHttpResponse response) {response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);return response.setComplete();}
}其实学习SpringCloud Gateway就是进行一些配置没有什么资料比官方更丰富所以强烈建议去看官方文档官方文档