柚子快報(bào)邀請(qǐng)碼778899分享:Gateway的使用
柚子快報(bào)邀請(qǐng)碼778899分享:Gateway的使用
身份認(rèn)證、權(quán)限檢驗(yàn)、路由、負(fù)載均衡、網(wǎng)絡(luò)限流
zuul是阻塞式,gateway是響應(yīng)式異步性能更好
1、導(dǎo)入pom依賴,搭建(網(wǎng)關(guān)單獨(dú)作為一個(gè)服務(wù),也要注冊(cè)入nacos、eruake)
2、配置
spring:
application:
name: gatewayservice # 服務(wù)名稱
profiles:
active: dev #開(kāi)發(fā)環(huán)境,這里是dev
cloud:
nacos:
server-addr: http://localhost:80 # Nacos地址
config:
file-extension: yaml # 文件后綴名
gateway:
routes:
- id: user-service # 路由標(biāo)示,必須唯一
uri: lb://userservice # 路由的月標(biāo)地址
predicates: # 路由斷言,判斷請(qǐng)求是否符合規(guī)則
- Path=/user/** # 路徑斷言,判斷路徑是否是以/user開(kāi)頭,如果是則符合
- id: order-service # 路由標(biāo)示,必須唯一
uri: lb://orderservice # 路由的月標(biāo)地址
predicates: # 路由斷言,判斷請(qǐng)求是否符合規(guī)則
- Path=/order/** # 路徑斷言,判斷路徑是否是以/user開(kāi)頭,如果是則符合
3、測(cè)試
4、路由斷言工廠
5、GatewayFilter(對(duì)請(qǐng)求和微服務(wù)返回?cái)?shù)據(jù)做處理)
官網(wǎng)有31種,自行查閱
filters: # 過(guò)濾器
- AddRequestHeader=Truth,Itcast is freaking awesome! # 加請(qǐng)求頭
filters作用于單獨(dú)某個(gè)路由的局部過(guò)濾器;default-filters作用于全局所有生效
gateway:
routes:
- id: user-service # 路由標(biāo)示,必須唯一
uri: lb://userservice # 路由的月標(biāo)地址
predicates: # 路由斷言,判斷請(qǐng)求是否符合規(guī)則
- Path=/user/** # 路徑斷言,判斷路徑是否是以/user開(kāi)頭,如果是則符合
- id: order-service # 路由標(biāo)示,必須唯一
uri: lb://orderservice # 路由的月標(biāo)地址
predicates: # 路由斷言,判斷請(qǐng)求是否符合規(guī)則
- Path=/order/** # 路徑斷言,判斷路徑是否是以/user開(kāi)頭,如果是則符合
filters:
- AddRequestHeader=Truth,Itcast is freaking awesome!
default-filters:
- AddRequestHeader=Truth,Itcast is freaking awesome!
6、GlobalFilter(全局,對(duì)一切的請(qǐng)求、響應(yīng)做處理,和上面作用一樣,區(qū)別在于上面基于配置邏輯固定,GlobalFilter基于自己定義實(shí)現(xiàn))
public interface GlobalFilter {
Mono
}
@Order用于定義多個(gè)過(guò)濾器下執(zhí)行的順序,越小越優(yōu)先
// @Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
@Override
public Mono
// 1.獲取請(qǐng)求參數(shù)
ServerHttpRequest request = exchange.getRequest();
MultiValueMap
// 2.獲取參數(shù)中的 authorization 參數(shù)
String auth = params.getFirst("authorization");
// 3.判斷參數(shù)值是否等于 admin
if ("admin".equals(auth)) {
// 4.是,放行
return chain.filter(exchange);
}
// 5.否,攔截
// 5.1.設(shè)置狀態(tài)碼
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
// 5.2.攔截請(qǐng)求
return exchange.getResponse().setComplete();
}
@Override
public int getOrder() {
return -1;
}
}
7、GlobalFilter和GatewayFilter的執(zhí)行順序
filters、defalut-filters都是GatewayFilter,
底層代碼使用適配器模式,
GatewayFilter類將GlobalFilter適配了過(guò)來(lái),組合在一個(gè)過(guò)濾器鏈路中執(zhí)行。
順序: 有來(lái)自配置文件的,有來(lái)自實(shí)現(xiàn)接口的,配置文件是按申明指定order再加上實(shí)現(xiàn)類自己定義了order。假如有同順序的,加載執(zhí)行順序?yàn)橄萪efault-filters->filters>GlobalFilter, 核心實(shí)現(xiàn)方法在RouteDefinitionRouteLocator類的getFilters()方法和FilteringWebHandler類handle()方法,將所有的排序集合返回
8、網(wǎng)關(guān)的統(tǒng)一跨域處理(域名、端口不同)
網(wǎng)關(guān)處理跨域采用的同樣是CORS方案,并且只需要簡(jiǎn)單配置即可實(shí)現(xiàn)
default-filters:
- AddRequestHeader=Truth,Itcast is freaking awesome!
globalcors: #全局的跨域處理
add-to-simple-url-handler-mapping: true #解決options請(qǐng)求被攔截問(wèn)題
corsConfigurations:
[/**]':
allowedOrigins: # 允許哪些網(wǎng)站的跨域請(qǐng)求
- "http://localhost:8090"
- "http://www.leyou.com"
alLowedMethods: # 允許的跨域ajax的請(qǐng)方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
alLowedHeaders: "*" # 允許在請(qǐng)中攜帶的頭信息
allowCredentials: true # 是否允許攜帶cookie
cookiemaxAge: 360000 # 這次跨域檢測(cè)的有效期
柚子快報(bào)邀請(qǐng)碼778899分享:Gateway的使用
好文鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。