視頻網(wǎng)站如何做推廣搜索引擎大全網(wǎng)站
目錄
介紹:
核心概念
依賴
路由
斷言 ? ?
基本的斷言工廠
自定義斷言
過濾器
路由過濾器
過濾器工廠
自定義路由過濾器
全局過濾器
其他
過濾器執(zhí)行順序
前置后置(?)
跨域問題
yaml 解決
配置類解決?
介紹:
Gateway網(wǎng)絡(luò)為微服務(wù)架構(gòu)提供簡單且統(tǒng)一的API路由管理,作為系統(tǒng)的統(tǒng)一入口。
核心概念
路由(route):路由是網(wǎng)關(guān)中最基礎(chǔ)的部分,路由信息包括一個(gè)ID、一個(gè)URI、一組斷言工廠、一組Filter組成。
斷言(predicates):斷言函數(shù)允許開發(fā)者去定義匹配Http request中的任何信息,比如請求頭和參數(shù)等。如果斷言為真,則說明請求的URL和配置的路由匹配。
過濾器(Filter):Spring Cloud Gateway中的filter分為Gateway Filter和Global Filter。Filter可以對請求和響應(yīng)進(jìn)行處理。Filter只有pre和post兩種。
依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
路由
spring:application:name: gatewaycloud:nacos:discovery:server-addr: 192.168.178.129:8848gateway:routes:- id: shop-useruri: lb://shop-user # nacos 中注冊的服務(wù)名predicates:- Path=/config/test- id: shop-user2uri: 192.168.178.128:111 #ippredicates:- Path=/config/test2
斷言 ? ?
基本的斷言工廠
Path?? ? | 請求路徑必須符合指定規(guī)則 | - Path=/red/{segment},/blue/** |
After? | 是某個(gè)時(shí)間點(diǎn)后的請求 | - After=2012-01-20T17:42:47.789-07:00[America/Denver] |
Before | 是某個(gè)時(shí)間點(diǎn)之前的請求 | - Before=2012-01-20T17:42:47.789+07:00[Asia/Shanghai |
Between | 是某兩個(gè)時(shí)間點(diǎn)之前的請求 | - Between=2012-01-20T17:42:47.789-07:00[America/Denver] ,2012-01-20T17:42:47.789+07:00[Asia/Shanghai |
Cookie?? ? | 請求必須包含某些cookie | ?- Cookie=chocolate,ch.p |
Header? | 請求必須包含某些header | - Header=X-Request-ld, \d+ |
Host? | 請求必須是訪問某個(gè)host(域名) | - Host=.something.org,.anotherhost.org |
Method?? ? | 請求凡是必須是指定方式 | - Method=GEt,POST |
Query | 請求參數(shù)必須包含指定參數(shù)? | - Query=name,kack或者- Query=name |
RemoteAddr?? ? | 請求者的ip必須是指定范圍 | ?- RemoteAddr=192.168.1.1/24 |
官網(wǎng):路由謂詞工廠
自定義斷言
步驟:
- 開頭任意取名,但是必須以RoutePredicateFactory后綴結(jié)尾
- 繼承AbstractRoutePredicateFactory抽象類仿照這個(gè)源碼寫,這個(gè)源碼的路由規(guī)則是根據(jù)時(shí)間來定義的
public class AfterRoutePredicateFactory extends AbstractRoutePredicateFactory<Config> {public static final String DATETIME_KEY = "datetime";public AfterRoutePredicateFactory() {super(Config.class);}//支持shortcut 如果不重寫 用簡便形式寫就會報(bào)錯(cuò)public List<String> shortcutFieldOrder() {return Collections.singletonList("datetime");}//ServerWebExchange這個(gè)類似與request,這個(gè)是判斷是否讓請求通過的規(guī)則public Predicate<ServerWebExchange> apply(final Config config) {return new GatewayPredicate() {public boolean test(ServerWebExchange serverWebExchange) {ZonedDateTime now = ZonedDateTime.now();return now.isAfter(config.getDatetime());}public Object getConfig() {return config;}public String toString() {return String.format("After: %s", config.getDatetime());}};}//路由規(guī)則public static class Config {private @NotNull ZonedDateTime datetime;public Config() {}public ZonedDateTime getDatetime() {return this.datetime;}public void setDatetime(ZonedDateTime datetime) {this.datetime = datetime;}}
}
過濾器
路由過濾器
路由過濾器允許以某種方式修改傳入的HTTP請求或傳出的HTTP響應(yīng)。路由過濾器僅適用于特定的路由。
過濾器工廠
AddRequestHeader | 給當(dāng)前請求添加一個(gè)請求頭 | - AddRequestHeader=X-Request-red, blue |
RemoveRequestHeader | 移除請求頭 | - RemoveRequestHeader=X-Request-Foo |
SetRequestHeader | 標(biāo)記請求頭 | - SetRequestHeader=X-Request-Red, Blue |
AddRequestParameter | 添加請求參數(shù) | - AddRequestParameter=red, blue |
RemoveRequestParameter | 刪除請求參數(shù) | - RemoveRequestParameter=red |
RemoveResponseHeader | 從響應(yīng)結(jié)果中移除一個(gè)響應(yīng)頭 | - RemoveResponseHeader=X-Response-Foo |
SetResponseHeader | 編輯響應(yīng)中的響應(yīng)頭 | - SetResponseHeader=X-Response-Red, Blue |
RemoveResponseHeader | 刪除響應(yīng)中的響應(yīng)頭 | - RemoveResponseHeader=X-Response-Foo |
PrefixPath | 這將作為所有匹配請求的路徑的前綴 | - PrefixPath=/mypath |
SetPath | 修改訪問地址 | - SetPath=/segment |
RedirectTo | 重定向 | - RedirectTo=302, https://acme.org |
全部:GatewayFilter 工廠
默認(rèn)過濾器
server:port: 10010 # 網(wǎng)關(guān)端口
spring:application: name: gateway # 服務(wù)名稱cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: - id: user-service # url: http://127.0.0.1:8081 url: lb//userservice predicates: # 路由斷言,也就是判斷請求是否符合路由規(guī)則的條件- Path=/usr/** # 這個(gè)是按照路徑匹配,只要以/user/開頭就符合要求- id: order-service url: lb//orderservicepredicates:- Path=/order/** default-filters: # 默認(rèn)過濾器,會對所有的路由請求都生效- AddRequestHeader=Truth,luxifa is following her dream # 添加請求頭
自定義路由過濾器
1、新建過濾器名稱要以GatewayFilterFactory結(jié)尾
2、繼承AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config>重寫其中的方法
@Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config>
{public MyGatewayFilterFactory(){super(MyGatewayFilterFactory.Config.class);}@Overridepublic GatewayFilter apply(MyGatewayFilterFactory.Config config){return new GatewayFilter(){@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain){ServerHttpRequest request = exchange.getRequest();System.out.println("進(jìn)入了自定義網(wǎng)關(guān)過濾器MyGatewayFilterFactory,status:"+config.getStatus());if(request.getQueryParams().containsKey("atguigu")){return chain.filter(exchange);}else{exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);return exchange.getResponse().setComplete();}}};}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("status");}public static class Config{@Getter@Setterprivate String status;//設(shè)定一個(gè)狀態(tài)值/標(biāo)志位,它等于多少,匹配和才可以訪問}
}
全局過濾器
創(chuàng)建全局過濾器實(shí)現(xiàn)GlobalFilter, Ordered 接口,重寫其中的方法
public class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 在此處編寫全局過濾器的邏輯return chain.filter(exchange);}/*** 數(shù)字越小優(yōu)先級越高* @return*/@Overridepublic int getOrder(){return 1;}
}
其他
過濾器執(zhí)行順序
默認(rèn)路由過濾器 --》路由過濾器 ---》 全局過濾器
前置后置(?)
前置過濾直接在return chain.filter(exchange);? 前寫入前置邏輯
后置過濾器
@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain, String name, String args) {Mono<Void> result = chain.filter(exchange);return result.then(Mono.fromRunnable(() -> {// 編寫后置邏輯}));}
跨域問題
yaml 解決
spring:cloud:gateway:globalcors: # 全局的跨域處理add-to-simple-url-handler-mapping: true # 解決options請求被攔截問題corsConfigurations:'[/**]': # 攔截所有請求allowedOrgins: # 允許哪些網(wǎng)站的跨域請求- "http://localhost:8090"- "http://www.leyou.com"allowedMethods: # 允許的跨域ajax的請求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允許在請求頭攜帶的信息 * 代表允許所有請求頭allowCredentials: true #是否允許攜帶cookiemaxAge: 360000 # 這次跨域檢測的有效期
配置類解決?
@Configuration
public class CorsConfig {@Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedMethod("*");config.addAllowedOrigin("*");config.addAllowedHeader("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}