过滤器获取service方法返回慢_Gateway:自定义过滤器
生活随笔
收集整理的這篇文章主要介紹了
过滤器获取service方法返回慢_Gateway:自定义过滤器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
自定義局部過濾器
需求:在application.yml中對某個路由配置過濾器,該過濾器可以在控制臺輸出配置文件中指定名稱的請求參數的值。
在gateway-server模塊中編寫過濾器工廠類MyParamGatewayFilterFactory
package?com.icoding.filter;import?org.springframework.cloud.gateway.filter.GatewayFilter;
import?org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import?org.springframework.http.server.reactive.ServerHttpRequest;
import?org.springframework.stereotype.Component;
import?java.util.Arrays;
import?java.util.List;
/**?自定義局部過濾器?*/
@Component
public?class?MyParamGatewayFilterFactory?extends
????????AbstractGatewayFilterFactory?{
????private?static?final?String?PARAM_KEY?=?"param";
????/**?定義構造器(必須)?*/
????public?MyParamGatewayFilterFactory(){
????????super(Config.class);
????}
????/**?接收過濾器傳進來的字段集合(可選)?*/
????@Override
????public?List?shortcutFieldOrder()?{return?Arrays.asList(PARAM_KEY);
????}
????/**?重寫攔截方法(必須)?*/
????@Override
????public?GatewayFilter?apply(Config?config)?{return?(exchange,?chain)?->?{
????????????//?獲取請求對象
????????????ServerHttpRequest?request?=?exchange.getRequest();
????????????//?獲取請求參數?http://localhost:10010/api/user/get/2?name=zhangsan&age=30if?(request.getQueryParams().containsKey(config.param)){
????????????????request.getQueryParams().get(config.param).forEach(value?->?{
????????????????????System.out.println(config.param?+?"?=?"?+?value);
????????????????});
????????????}
????????????//?放行return?chain.filter(exchange);
????????};
????}
????/**?定義配置類,接收配置文件中的屬性(必須)?*/
????public?static?class?Config?{
????????private?String?param;
????????public?String?getParam()?{return?param;
????????}
????????public?void?setParam(String?param)?{
????????????this.param?=?param;
????????}
????}
}
在gateway-server模塊中修改application.yml配置文件
package?com.icoding.filter;import?org.springframework.cloud.gateway.filter.GatewayFilter;
import?org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import?org.springframework.http.server.reactive.ServerHttpRequest;
import?org.springframework.stereotype.Component;
import?java.util.Arrays;
import?java.util.List;
/**?自定義局部過濾器?*/
@Component
public?class?MyParamGatewayFilterFactory?extends
????????AbstractGatewayFilterFactory?{
????private?static?final?String?PARAM_KEY?=?"param";
????/**?定義構造器(必須)?*/
????public?MyParamGatewayFilterFactory(){
????????super(Config.class);
????}
????/**?接收過濾器傳進來的字段集合(可選)?*/
????@Override
????public?List?shortcutFieldOrder()?{return?Arrays.asList(PARAM_KEY);
????}
????/**?重寫攔截方法(必須)?*/
????@Override
????public?GatewayFilter?apply(Config?config)?{return?(exchange,?chain)?->?{
????????????//?獲取請求對象
????????????ServerHttpRequest?request?=?exchange.getRequest();
????????????//?獲取請求參數?http://localhost:10010/api/user/get/2?name=zhangsan&age=30if?(request.getQueryParams().containsKey(config.param)){
????????????????request.getQueryParams().get(config.param).forEach(value?->?{
????????????????????System.out.println(config.param?+?"?=?"?+?value);
????????????????});
????????????}
????????????//?放行return?chain.filter(exchange);
????????};
????}
????/**?定義配置類,接收配置文件中的屬性(必須)?*/
????public?static?class?Config?{
????????private?String?param;
????????public?String?getParam()?{return?param;
????????}
????????public?void?setParam(String?param)?{
????????????this.param?=?param;
????????}
????}
}server:
??port:?10010
spring:
??application:
????name:?api-gateway
??cloud:
????gateway:#?默認過濾器,對所有路由生效
??????default-filters:#?添加響應頭過濾器,添加一個響應頭為name,值為admin
????????-?AddResponseHeader=name,admin
??????routes:#?路由id,可以隨意寫
????????-?id:?user-service-route#?代理的服務地址;lb表示負載均衡(從eureka中獲取具體服務)
??????????uri:?lb://user-service#?路由斷言,可以配置映射路徑
??????????predicates:
????????????-?Path=/api/user/**
??????????filters:#?表示過濾1個路徑,2表示兩個路徑,以此類推
????????????-?StripPrefix=1#?自定義過濾器
????????????-?MyParam=name
eureka:
??client:
????service-url:
??????defaultZone:?http://localhost:8761/eureka,http://localhost:8762/eurekaserver:
??port:?10010
spring:
??application:
????name:?api-gateway
??cloud:
????gateway:#?默認過濾器,對所有路由生效
??????default-filters:#?添加響應頭過濾器,添加一個響應頭為name,值為admin
????????-?AddResponseHeader=name,admin
??????routes:#?路由id,可以隨意寫
????????-?id:?user-service-route#?代理的服務地址;lb表示負載均衡(從eureka中獲取具體服務)
??????????uri:?lb://user-service#?路由斷言,可以配置映射路徑
??????????predicates:
????????????-?Path=/api/user/**
??????????filters:#?表示過濾1個路徑,2表示兩個路徑,以此類推
????????????-?StripPrefix=1#?自定義過濾器
????????????-?MyParam=name
eureka:
??client:
????service-url:
??????defaultZone:?http://localhost:8761/eureka,http://localhost:8762/eureka
測試訪問
http://localhost:10010/api/user/1?name=admin 檢查后臺是否輸出name和admin
http://localhost:10010/api/user/1?name2=admin 則是不會輸出的。
自定義全局過濾器
需求:模擬一個登錄的校驗。基本邏輯:如果請求中有token參數,則認為請求有效,放行。
在gateway-server模塊中編寫全局過濾器類MyGlobalFilter
課堂代碼:
package?com.icoding.filter;import?org.springframework.cloud.gateway.filter.GatewayFilter;
import?org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import?org.springframework.http.server.reactive.ServerHttpRequest;
import?org.springframework.stereotype.Component;
import?java.util.Arrays;
import?java.util.List;
/**?自定義局部過濾器?*/
@Component
public?class?MyParamGatewayFilterFactory?extends
????????AbstractGatewayFilterFactory?{
????private?static?final?String?PARAM_KEY?=?"param";
????/**?定義構造器(必須)?*/
????public?MyParamGatewayFilterFactory(){
????????super(Config.class);
????}
????/**?接收過濾器傳進來的字段集合(可選)?*/
????@Override
????public?List?shortcutFieldOrder()?{return?Arrays.asList(PARAM_KEY);
????}
????/**?重寫攔截方法(必須)?*/
????@Override
????public?GatewayFilter?apply(Config?config)?{return?(exchange,?chain)?->?{
????????????//?獲取請求對象
????????????ServerHttpRequest?request?=?exchange.getRequest();
????????????//?獲取請求參數?http://localhost:10010/api/user/get/2?name=zhangsan&age=30if?(request.getQueryParams().containsKey(config.param)){
????????????????request.getQueryParams().get(config.param).forEach(value?->?{
????????????????????System.out.println(config.param?+?"?=?"?+?value);
????????????????});
????????????}
????????????//?放行return?chain.filter(exchange);
????????};
????}
????/**?定義配置類,接收配置文件中的屬性(必須)?*/
????public?static?class?Config?{
????????private?String?param;
????????public?String?getParam()?{return?param;
????????}
????????public?void?setParam(String?param)?{
????????????this.param?=?param;
????????}
????}
}server:
??port:?10010
spring:
??application:
????name:?api-gateway
??cloud:
????gateway:#?默認過濾器,對所有路由生效
??????default-filters:#?添加響應頭過濾器,添加一個響應頭為name,值為admin
????????-?AddResponseHeader=name,admin
??????routes:#?路由id,可以隨意寫
????????-?id:?user-service-route#?代理的服務地址;lb表示負載均衡(從eureka中獲取具體服務)
??????????uri:?lb://user-service#?路由斷言,可以配置映射路徑
??????????predicates:
????????????-?Path=/api/user/**
??????????filters:#?表示過濾1個路徑,2表示兩個路徑,以此類推
????????????-?StripPrefix=1#?自定義過濾器
????????????-?MyParam=name
eureka:
??client:
????service-url:
??????defaultZone:?http://localhost:8761/eureka,http://localhost:8762/eurekaserver:
??port:?10010
spring:
??application:
????name:?api-gateway
??cloud:
????gateway:#?默認過濾器,對所有路由生效
??????default-filters:#?添加響應頭過濾器,添加一個響應頭為name,值為admin
????????-?AddResponseHeader=name,admin
??????routes:#?路由id,可以隨意寫
????????-?id:?user-service-route#?代理的服務地址;lb表示負載均衡(從eureka中獲取具體服務)
??????????uri:?lb://user-service#?路由斷言,可以配置映射路徑
??????????predicates:
????????????-?Path=/api/user/**
??????????filters:#?表示過濾1個路徑,2表示兩個路徑,以此類推
????????????-?StripPrefix=1#?自定義過濾器
????????????-?MyParam=name
eureka:
??client:
????service-url:
????? defaultZone: http://localhost:8761/eureka,http://localhost:8762/eurekapackage com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.core.annotation.Order;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;/**?*?全局過濾器?*/????@Component//?@Order(1)????:? Ordered這個接口也可以使用注解來排序public class MyGlobalFilter implements GlobalFilter, Ordered {????/*如果你有token就讓他們訪問,如果沒有token,不讓訪問*/????@Override ?? public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain)?{??????? System.out.println("全局過濾器執行了。。。。。。。");????????//獲取參數????????String?token?=?exchange.getRequest().getQueryParams().getFirst("token");????????/*????????*??String?aa?=?"";????????*??String?bb?=?"??????????";????????*??String?cc?=?null;????????*????????*???如果是isBlank?都是返回true????????*????????*?*/????????if(StringUtils.isBlank(token)){????????????//為空,token沒有值,阻止往下執行??????????? exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);?//設置返回的狀態碼????????????//不會繼續往下執行了!????????????return?exchange.getResponse().setComplete();????????}????????//放行????????return?chain.filter(exchange);????}????/*數值越小越先執行*/????@Override????public?int?getOrder()?{????????return?5;????}}package com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.core.annotation.Order;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;/**?*?全局過濾器?*/????@Component//?@Order(1)????:? Ordered這個接口也可以使用注解來排序public class MyGlobalFilter implements GlobalFilter, Ordered {????/*如果你有token就讓他們訪問,如果沒有token,不讓訪問*/????@Override ?? public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain)?{??????? System.out.println("全局過濾器執行了。。。。。。。");????????//獲取參數????????String?token?=?exchange.getRequest().getQueryParams().getFirst("token");????????/*????????*??String?aa?=?"";????????*??String?bb?=?"??????????";????????*??String?cc?=?null;????????*????????*???如果是isBlank?都是返回true????????*????????*?*/????????if(StringUtils.isBlank(token)){????????????//為空,token沒有值,阻止往下執行??????????? exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);?//設置返回的狀態碼????????????//不會繼續往下執行了!????????????return?exchange.getResponse().setComplete();????????}????????//放行????????return?chain.filter(exchange);????}????/*數值越小越先執行*/????@Override????public?int?getOrder()?{????????return?5;????}}package?com.icoding.filter;
import?org.springframework.cloud.gateway.filter.GatewayFilter;
import?org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import?org.springframework.http.server.reactive.ServerHttpRequest;
import?org.springframework.stereotype.Component;
import?java.util.Arrays;
import?java.util.List;
/**?自定義局部過濾器?*/
@Component
public?class?MyParamGatewayFilterFactory?extends
????????AbstractGatewayFilterFactory?{
????private?static?final?String?PARAM_KEY?=?"param";
????/**?定義構造器(必須)?*/
????public?MyParamGatewayFilterFactory(){
????????super(Config.class);
????}
????/**?接收過濾器傳進來的字段集合(可選)?*/
????@Override
????public?List?shortcutFieldOrder()?{return?Arrays.asList(PARAM_KEY);
????}
????/**?重寫攔截方法(必須)?*/
????@Override
????public?GatewayFilter?apply(Config?config)?{return?(exchange,?chain)?->?{
????????????//?獲取請求對象
????????????ServerHttpRequest?request?=?exchange.getRequest();
????????????//?獲取請求參數?http://localhost:10010/api/user/get/2?name=zhangsan&age=30if?(request.getQueryParams().containsKey(config.param)){
????????????????request.getQueryParams().get(config.param).forEach(value?->?{
????????????????????System.out.println(config.param?+?"?=?"?+?value);
????????????????});
????????????}
????????????//?放行return?chain.filter(exchange);
????????};
????}
????/**?定義配置類,接收配置文件中的屬性(必須)?*/
????public?static?class?Config?{
????????private?String?param;
????????public?String?getParam()?{return?param;
????????}
????????public?void?setParam(String?param)?{
????????????this.param?=?param;
????????}
????}
}server:
??port:?10010
spring:
??application:
????name:?api-gateway
??cloud:
????gateway:#?默認過濾器,對所有路由生效
??????default-filters:#?添加響應頭過濾器,添加一個響應頭為name,值為admin
????????-?AddResponseHeader=name,admin
??????routes:#?路由id,可以隨意寫
????????-?id:?user-service-route#?代理的服務地址;lb表示負載均衡(從eureka中獲取具體服務)
??????????uri:?lb://user-service#?路由斷言,可以配置映射路徑
??????????predicates:
????????????-?Path=/api/user/**
??????????filters:#?表示過濾1個路徑,2表示兩個路徑,以此類推
????????????-?StripPrefix=1#?自定義過濾器
????????????-?MyParam=name
eureka:
??client:
????service-url:
??????defaultZone:?http://localhost:8761/eureka,http://localhost:8762/eurekaserver:
??port:?10010
spring:
??application:
????name:?api-gateway
??cloud:
????gateway:#?默認過濾器,對所有路由生效
??????default-filters:#?添加響應頭過濾器,添加一個響應頭為name,值為admin
????????-?AddResponseHeader=name,admin
??????routes:#?路由id,可以隨意寫
????????-?id:?user-service-route#?代理的服務地址;lb表示負載均衡(從eureka中獲取具體服務)
??????????uri:?lb://user-service#?路由斷言,可以配置映射路徑
??????????predicates:
????????????-?Path=/api/user/**
??????????filters:#?表示過濾1個路徑,2表示兩個路徑,以此類推
????????????-?StripPrefix=1#?自定義過濾器
????????????-?MyParam=name
eureka:
??client:
????service-url:
????? defaultZone: http://localhost:8761/eureka,http://localhost:8762/eurekapackage com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.core.annotation.Order;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;/**?*?全局過濾器?*/????@Component//?@Order(1)????:? Ordered這個接口也可以使用注解來排序public class MyGlobalFilter implements GlobalFilter, Ordered {????/*如果你有token就讓他們訪問,如果沒有token,不讓訪問*/????@Override ?? public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain)?{??????? System.out.println("全局過濾器執行了。。。。。。。");????????//獲取參數????????String?token?=?exchange.getRequest().getQueryParams().getFirst("token");????????/*????????*??String?aa?=?"";????????*??String?bb?=?"??????????";????????*??String?cc?=?null;????????*????????*???如果是isBlank?都是返回true????????*????????*?*/????????if(StringUtils.isBlank(token)){????????????//為空,token沒有值,阻止往下執行??????????? exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);?//設置返回的狀態碼????????????//不會繼續往下執行了!????????????return?exchange.getResponse().setComplete();????????}????????//放行????????return?chain.filter(exchange);????}????/*數值越小越先執行*/????@Override????public?int?getOrder()?{????????return?5;????}}package com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.core.annotation.Order;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;/**?*?全局過濾器?*/????@Component//?@Order(1)????:? Ordered這個接口也可以使用注解來排序public class MyGlobalFilter implements GlobalFilter, Ordered {????/*如果你有token就讓他們訪問,如果沒有token,不讓訪問*/????@Override ?? public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain)?{??????? System.out.println("全局過濾器執行了。。。。。。。");????????//獲取參數????????String?token?=?exchange.getRequest().getQueryParams().getFirst("token");????????/*????????*??String?aa?=?"";????????*??String?bb?=?"??????????";????????*??String?cc?=?null;????????*????????*???如果是isBlank?都是返回true????????*????????*?*/????????if(StringUtils.isBlank(token)){????????????//為空,token沒有值,阻止往下執行??????????? exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);?//設置返回的狀態碼????????????//不會繼續往下執行了!????????????return?exchange.getResponse().setComplete();????????}????????//放行????????return?chain.filter(exchange);????}????/*數值越小越先執行*/????@Override????public?int?getOrder()?{????????return?5;????}}package?com.icoding.filter;
import?org.apache.commons.lang.StringUtils;
import?org.springframework.cloud.gateway.filter.GatewayFilterChain;
import?org.springframework.cloud.gateway.filter.GlobalFilter;
import?org.springframework.core.Ordered;
import?org.springframework.http.HttpStatus;
import?org.springframework.stereotype.Component;
import?org.springframework.web.server.ServerWebExchange;
import?reactor.core.publisher.Mono;
/**?自定義全局過濾器?*/
@Component
public?class?MyGlobalFilter?implements?GlobalFilter,?Ordered?{
????@Override
????public?Mono?filter(ServerWebExchange?exchange,?GatewayFilterChain?chain)?{
????????System.out.println("==全局過濾器MyGlobalFilter==");
????????String?token?=?exchange.getRequest().getQueryParams().getFirst("token");if?(StringUtils.isBlank(token)){
????????????//?設置響應狀態碼:?401?未授權
????????????exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
????????????//?返回響應完成return?exchange.getResponse().setComplete();
????????}
????????//?放行return?chain.filter(exchange);
????}
????@Override
????public?int?getOrder()?{
????????//?值越小越先執行return?1;
????}
package?com.icoding.filter;
import?org.apache.commons.lang.StringUtils;
import?org.springframework.cloud.gateway.filter.GatewayFilterChain;
import?org.springframework.cloud.gateway.filter.GlobalFilter;
import?org.springframework.core.Ordered;
import?org.springframework.http.HttpStatus;
import?org.springframework.stereotype.Component;
import?org.springframework.web.server.ServerWebExchange;
import?reactor.core.publisher.Mono;
/**?自定義全局過濾器?*/
@Component
public?class?MyGlobalFilter?implements?GlobalFilter,?Ordered?{
????@Override
????public?Mono?filter(ServerWebExchange?exchange,?GatewayFilterChain?chain)?{
????????System.out.println("==全局過濾器MyGlobalFilter==");
????????String?token?=?exchange.getRequest().getQueryParams().getFirst("token");if?(StringUtils.isBlank(token)){
????????????//?設置響應狀態碼:?401?未授權
????????????exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
????????????//?返回響應完成return?exchange.getResponse().setComplete();
????????}
????????//?放行return?chain.filter(exchange);
????}
????@Override
????public?int?getOrder()?{
????????//?值越小越先執行return?1;
????}
測試訪問
訪問 http://localhost:10010/api/user/1
訪問 http://localhost:10010/api/user/1?token=admin
回復關鍵詞
?JUC????分布式限流???消息隊列???alibaba????JVM性能調優????
看更多精彩教程
別忘了點個在看哦!轉發那就太好了!
總結
以上是生活随笔為你收集整理的过滤器获取service方法返回慢_Gateway:自定义过滤器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打印机打印网页不清晰_打印机墨水:你不知
- 下一篇: 动态规划立体匹配代码_411,动态规划和