市場(chǎng)推廣seo職位描述百度seo怎么收費(fèi)
所謂網(wǎng)關(guān)是什么意思?
? ? ? ?相當(dāng)于就是你們小區(qū)家的保安,進(jìn)出小區(qū)都得獲得保安的同意,守護(hù)你們小區(qū)的生命財(cái)產(chǎn)健康,網(wǎng)關(guān)也是如此,對(duì)每個(gè)請(qǐng)求都嚴(yán)格把關(guān),將合法的或者是獲得權(quán)限的請(qǐng)求進(jìn)入服務(wù)器
網(wǎng)關(guān)的功能:
- 身份驗(yàn)證和權(quán)限校驗(yàn)
- 服務(wù)路由、負(fù)載均衡
- 請(qǐng)求限流
?一般的常見的網(wǎng)關(guān)分別是:
Gateway:基于Spring5中提供的WebFlux,屬于響應(yīng)式編程的實(shí)現(xiàn),具有更好的性能
zuul:基于servlet的實(shí)現(xiàn),屬于阻塞式編程
搭建網(wǎng)關(guān)服務(wù)
1.創(chuàng)建新的module,引入SpringCloudGateway的依賴和nacos的服務(wù)發(fā)現(xiàn)依賴:
<!--nacos服務(wù)注冊(cè)發(fā)現(xiàn)依賴--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--網(wǎng)關(guān)gateway依賴--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
2.編寫路由配置即nacos地址:
server:port: 10010
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
spring:application:name: gatewaycloud:nacos:server-addr: nacos:8848 # nacos地址gateway:routes:- id: user-service # 路由標(biāo)示,必須唯一uri: lb://userservice # 路由的目標(biāo)地址predicates: # 路由斷言,判斷請(qǐng)求是否符合規(guī)則- Path=/user/** # 路徑斷言,判斷路徑是否是以/user開頭,如果是則符合
總結(jié):
網(wǎng)關(guān)搭建的步驟:
1.創(chuàng)建項(xiàng)目,引入nacos服務(wù)發(fā)現(xiàn)和gateway依賴
2.配置application.yml,包括服務(wù)基本信息、nacos地址、路由
路由配置包括:
1.理由id:路由的唯一標(biāo)識(shí)
2.路由目標(biāo):路由的目標(biāo)地址,http代表固定地址,lb代表根據(jù)服務(wù)名負(fù)載均衡
3路由斷言:判斷路由的規(guī)則
4.路由過(guò)濾器:對(duì)去請(qǐng)求或響應(yīng)做處理
路由斷言工廠(Route Predicate Factory)
網(wǎng)關(guān)路由可以配置的內(nèi)容為:
- 路由id:路由唯一標(biāo)示
- uri:路由目的地,支持lb和http兩種
- predicates:路由斷言,判斷請(qǐng)求是否符合要求,符合則轉(zhuǎn)發(fā)到路由目的地
? ? ? ?配置文件中的規(guī)則只是字符串,這些字符串會(huì)被Predicate Factory讀取并處理,轉(zhuǎn)變?yōu)槁酚膳袛嗟臈l件,例如“Path=/user/**”是按照路徑進(jìn)行匹配,只讓以/user開頭的就認(rèn)為是符合的
- filter:路由過(guò)濾器,處理請(qǐng)求或響應(yīng)
11種工廠:
?路由過(guò)濾器GatewayFilter
GatewayFilter是網(wǎng)關(guān)中提供的一種過(guò)濾器,可以對(duì)進(jìn)入網(wǎng)關(guān)的請(qǐng)求和微服務(wù)返回的響應(yīng)做處理
?下面列舉幾個(gè)Spring提供的不同的路由過(guò)濾器工廠:
現(xiàn)在要求給進(jìn)入A服務(wù)的所有請(qǐng)求添加一個(gè)請(qǐng)求頭,你會(huì)怎么實(shí)現(xiàn)?
給某個(gè)服務(wù)單獨(dú)添加請(qǐng)求頭:
spring:cloud:gateway:routes:#網(wǎng)關(guān)路由配置- id: order-serviceuri: lb://orderservicepredicates:- Path=/order/**filters: #過(guò)濾器- AddRequestHeader=Truth,Itcast is freaking awesome!#添加請(qǐng)求頭
如果要對(duì)所有的路由都生效,即可將過(guò)濾工廠寫到default下,如:
spring:application:name: gatewaycloud:nacos:server-addr: nacos:8848 # nacos地址gateway:routes:- id: user-service # 路由標(biāo)示,必須唯一uri: lb://userservice # 路由的目標(biāo)地址predicates: # 路由斷言,判斷請(qǐng)求是否符合規(guī)則- Path=/user/** # 路徑斷言,判斷路徑是否是以/user開頭,如果是則符合- id: order-serviceuri: lb://orderservicepredicates:- Path=/order/**default-filters:#對(duì)所有的路由都生效的過(guò)濾器- AddRequestHeader=Truth,Itcast is freaking awesome!
全局過(guò)濾器
? ? ? ?全局過(guò)濾器的作用也是處理一切網(wǎng)關(guān)的請(qǐng)求和微服務(wù)響應(yīng),與GatewayFilter的作用一樣,區(qū)別在GatewayFilter通過(guò)配置定義,處理邏輯時(shí)固定的,而GlobalFilter的邏輯需要自己寫代碼實(shí)現(xiàn),定義是實(shí)現(xiàn)GlobalFilter接口
//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.獲取請(qǐng)求參數(shù)ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> params = request.getQueryParams();// 2.獲取參數(shù)中的 authorization 參數(shù)String auth = params.getFirst("authorization");// 3.判斷參數(shù)值是否等于 adminif ("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();}@Overridepublic int getOrder() {return -1;}
步驟:
1.實(shí)現(xiàn)GlobalFilter接口
2.添加@Order注解或者實(shí)現(xiàn)Ordered接口
3.編寫處理邏輯
過(guò)濾器執(zhí)行順序
- ?每一個(gè)過(guò)濾器都必須指定一個(gè)int類型的order值,order值越小,優(yōu)先級(jí)越高,執(zhí)行順序越靠前
- GlobalFilter通過(guò)實(shí)現(xiàn)Ordered接口,或者添加@Order注解來(lái)指定order值
- 路由過(guò)濾器和defaultFilter的order由Spring指定,默認(rèn)是按照聲明順序從1遞增
- 當(dāng)過(guò)濾器的order值一樣時(shí),會(huì)按照defaultFilter>局部路由過(guò)濾器>GlobalFilter的順序執(zhí)行
跨域問(wèn)題
? ? ? ?跨域問(wèn)題:域名不一致就是跨域。瀏覽器禁止請(qǐng)求的發(fā)起者與服務(wù)器發(fā)生跨域ajax請(qǐng)求,請(qǐng)求被瀏覽器攔截的問(wèn)題
CORS:
spring:application:name: gatewaycloud:nacos:server-addr: nacos:8848 # nacos地址gateway:globalcors: #全年的跨域處理add-to-simple-url-handler-mapping: true #解決options請(qǐng)求被攔截問(wèn)題corsconfigurations: '[/**]':allowedOrigins: #允許哪些網(wǎng)站的跨域請(qǐng)求-"http://127.0.0.1:8090"allowedMethods: #允許的跨域ajax的請(qǐng)求方式-"GET"-"POST"-"DELETE"-"PUT"-"OPTIONS"allowedHeaders: "*" #允許在請(qǐng)求中攜帶的頭信息allowCredentials: true #是否允許攜帶cookiemaxAge: 360000 #這次跨域檢測(cè)的有效期