目錄
過濾器執行順序
自定義過濾器
自定義GatewayFilter
定義GatewayFilter
配置過濾器
啟動服務并訪問
自定義GlobalFilter
定義GlobalFilter
啟動服務并訪問
服務部署
過濾器執行順序
如果?個項?中, 既有GatewayFilter, ?有 GlobalFilter時, 執?的先后順序是什么呢?
請求路由后, ?關會把當前項?中的GatewayFilter和GlobalFilter合并到?個過濾器鏈(集合)中, 并進?排序, 依次執?過濾器.
每?個過濾器都必須指定?個int類型的order值, 默認值為0, 表?該過濾的優先級. order值越?,優先級越?,執?順序越靠前.
? Filter通過實現Order接?或者添加@Order注解來指定order值.
? Spring Cloud Gateway提供的Filter由Spring指定. ??也可以?定義Filter, 由??指定.
? 當過濾器的order值?樣時, 會按照 defaultFilter > GatewayFilter > GlobalFilter的順序執?.
自定義過濾器
Spring Cloud Gateway提供了過濾器的擴展功能, 開發者可以根據實際業務來?定義過濾器, 同樣?定義過濾器也?持GatewayFilter 和 GlobalFilter兩種.
自定義GatewayFilter
?定義GatewayFilter, 需要去實現對應的接? GatewayFilterFactory , Spring Boot 默認幫我們
實現的抽象類是 AbstractGatewayFilterFactory , 我們可以直接使?.
定義GatewayFilter
package gateway;import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Slf4j
@Component
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomConfig> implements Ordered {public CustomGatewayFilterFactory() {super(CustomConfig.class);}@Overridepublic GatewayFilter apply(CustomConfig config) {return new GatewayFilter() {/*** ServerWebExchange: HTTP 請求-響應交互契約, 提供了對HTTP請求和響應的訪問* GatewayFilterChain: 過濾器鏈* Mono: Reactor的核心類, 數據流發布者,Mono最多只能觸發一個事件.可以把Mono用在異步完成任務時,發出通知* chain.filter(exchange) 執行請求* Mono.fromRunnable() 創建一個包含Runnable元素的數據流*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//Pre類型 執行請求 Post類型log.info("Pre Filter, config:{} ",config); //Pre類型過濾器代碼邏輯return chain.filter(exchange).then(Mono.fromRunnable(()->{log.info("Post Filter...."); //Post類型過濾器代碼邏輯}));}};}@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}
}
針對這個Filter的配置, 使?CustomConfig 定義
package gateway;import lombok.Data;@Data
public class CustomConfig {private String name;
}
代碼說明
1. 類名統?以GatewayFilterFactory結尾, 因為默認情況下, 過濾器的name會采?該定義類的前綴. 這?的name=Custom(yml配置中使?)
2. apply?法中, 同時包含Pre和Post過濾, then?法中是請求執?結束之后處理的
3. CustomConfig 是?個配置類, 該類只有?個屬性name, 和yml的配置對應
4. 該類需要交給Spring管理, 所以需要加 @Service 注解
5. getOrder表?該過濾器的優先級, 值越?, 優先級越低
配置過濾器
spring:cloud:gateway:routes:- id: order-service #路由規則id, 隨便起, 不重復即可uri: lb://order-service/ #目標服務地址predicates: #路由條件- Path=/order/**,/feign/**filters:- AddRequestParameter=userName, xiaoming- name: Custom #過濾器名稱args:name: test_custom
啟動服務并訪問
自定義GlobalFilter
定義GlobalFilter
package gateway;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.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Slf4j
@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("Pre Global Filter");return chain.filter(exchange).then(Mono.fromRunnable(()->{log.info("Post Global Filter...");}));}@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}
}
啟動服務并訪問
從日志中可以看出,當GatewayFilter和GlobalFilter過濾器的order一樣時,會先執行GatewayFilter,然后再執行GlobalFilter。其中會先執行 Pre?GatewayFilter,然后執行 Pre?GlobalFilter,然后執行 Post?GlobalFilter,最后執行 Post?GatewayFilter。
服務部署
1. 修改數據庫, Nacos等相關配置
2. 對三個服務進?打包: product-service, order-service, gateway
3. 上傳jar到Linux服務器
4. 啟動Nacos
啟動前最好把data數據刪除掉.
5. 啟動服務
#后臺啟動order-service, 并設置輸出?志到logs/order.log
nohup java -jar order-service.jar >logs/order.log &
#后臺啟動product-service, 并設置輸出?志到logs/order.log
nohup java -jar product-service.jar >logs/product-9090.log &
#啟動?關
nohup java -jar gateway.jar >logs/gateway.log &
觀察日志: