外包建站的公司怎么做seo網(wǎng)站做優(yōu)化
一. 網(wǎng)關(guān)的作用及背景
1.API網(wǎng)關(guān)的作用
- 請(qǐng)求路由
在我們的系統(tǒng)中由于同一個(gè)接口新老兩套系統(tǒng)都在使用,我們需要根據(jù)請(qǐng)求上下文將請(qǐng)求路由到對(duì)應(yīng)的接口。
- 統(tǒng)一鑒權(quán)
對(duì)于鑒權(quán)操作不涉及到業(yè)務(wù)邏輯,那么可以在網(wǎng)關(guān)層進(jìn)行處理,不用下層到業(yè)務(wù)邏輯。
- 統(tǒng)一監(jiān)控
由于網(wǎng)關(guān)是外部服務(wù)的入口,所以我們可以在這里監(jiān)控我們想要的數(shù)據(jù),比如入?yún)⒊鰠?#xff0c;鏈路時(shí)間。
- 流量控制,熔斷降級(jí)
對(duì)于流量控制,熔斷降級(jí)非業(yè)務(wù)邏輯可以統(tǒng)一放到網(wǎng)關(guān)層。
2.GateWay產(chǎn)生的背景
Cloud全家桶中有個(gè)很重要的組件就是網(wǎng)關(guān),在1.x版本中都是采用的Zuul網(wǎng)關(guān); 但在2.x版本中,zuul的升級(jí)一直跳票,SpringCloud最后自己研發(fā)了一個(gè)網(wǎng)關(guān)替代Zuul, 那就是SpringCloud Gateway一句話:gateway是原zuul1.x版的替代 。SpringCloud Gateway 是 Spring Cloud 的一個(gè)全新項(xiàng)目,基于 Spring 5.0+Spring Boot 2.0 和 Project Reactor 等技術(shù)開發(fā)的網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的統(tǒng)一的 API 路由管理方式。 為了提升網(wǎng)關(guān)的性能,SpringCloud Gateway是基于WebFlux框架實(shí)現(xiàn)的,而WebFlux框架底層則使用了高性能的Reactor模式通信框架Netty。 zuul是基于Servlet的實(shí)現(xiàn),屬于阻塞式編程。而SpringCloudGateway則是基于Spring5中提供的WebFlux,屬于響應(yīng)式編程的實(shí)現(xiàn),具備更好的性能
二.GateWay配置介紹
1.GateWay三大概念
- Route(路由):路由是構(gòu)建網(wǎng)關(guān)的基本模塊,它由 ID、目標(biāo) URI、一系列的斷言和過(guò)濾器組成,如果斷言為 true 則匹配該路由
- Predicate(斷言):參考的是 Java8 中的 java.util.function.Predicate。開發(fā)人員可以匹配 HTTP 請(qǐng)求中的所有內(nèi)容(例如請(qǐng)求頭或請(qǐng)求參數(shù)),如果請(qǐng)求與斷言相匹配則進(jìn)行路由
- Filter(過(guò)濾):指的是 Spring 框架中 GatewayFilter 的實(shí)例,使用過(guò)濾器,可以在請(qǐng)求被路由之前或之后對(duì)請(qǐng)求進(jìn)行修改。
spring:cloud:gateway:discovery:locator:enabled: true #開啟從注冊(cè)中心動(dòng)態(tài)創(chuàng)建路由的功能,利用微服務(wù)名進(jìn)行路由routes:- id: service-provider # 路由標(biāo)示,必須唯一uri: lb://SERVICE-PROVIDER # 路由的目標(biāo)地址;動(dòng)態(tài)路由使用,lb://微服務(wù)名predicates: # 路由斷言,判斷請(qǐng)求是否符合規(guī)則- Path=/provider/** # 路徑斷言,判斷路徑是否是以/provider開頭,如果是則符合- id: service-consumeruri: lb://SERVICE-CONSUMERpredicates:- Path=/consumer/**
1.1 Route(路由)
gateway 中可以配置多個(gè) Route
。一個(gè) Route
由路由 id,轉(zhuǎn)發(fā)的 uri,多個(gè) Predicates
以及多個(gè) Filters
構(gòu)成。處理請(qǐng)求時(shí)會(huì)按優(yōu)先級(jí)排序,找到第一個(gè)滿足所有 Predicates
的 Route。
1.2 Predicate(斷言)
Gateway中predicates配置除了Path斷言工廠,還有十幾個(gè):
名稱 | 說(shuō)明 | 示例 |
---|---|---|
After | 是某個(gè)時(shí)間點(diǎn)后的請(qǐng)求 | – After=2037-01-20T17:42:47.789-07:00[America/Denver] |
Before | 是某個(gè)時(shí)間點(diǎn)之前的請(qǐng)求 | – Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai] |
Between | 是某兩個(gè)時(shí)間點(diǎn)之前的請(qǐng)求 | – Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver] |
Cookie | 請(qǐng)求必須包含某些cookie | – Cookie=chocolate, ch.p |
Header | 請(qǐng)求必須包含某些header | – Header=X-Request-Id, \d+ |
Host | 請(qǐng)求必須是訪問(wèn)某個(gè)host(域名) | – Host=.somehost.org,.anotherhost.org |
Method | 請(qǐng)求方式必須是指定方式 | – Method=GET,POST |
Path | 請(qǐng)求路徑必須符合指定規(guī)則 | – Path=/red/{segment},/blue/** |
Query | 請(qǐng)求參數(shù)必須包含指定參數(shù) | – Query=name, Jack或者- Query=name |
RemoteAddr | 請(qǐng)求者的ip必須是指定范圍 | – RemoteAddr=192.168.1.1/24 |
Weight | 權(quán)重處理 |
1.3 Filter(過(guò)濾)
gateway提供了31種不同的內(nèi)置路由過(guò)濾器工廠。常用的如:
名稱 | 說(shuō)明 |
---|---|
AddRequestHeader | 給當(dāng)前請(qǐng)求添加一個(gè)請(qǐng)求頭 |
RemoveRequestHeader | 移除請(qǐng)求中的一個(gè)請(qǐng)求頭 |
AddResponseHeader | 給響應(yīng)結(jié)果中添加一個(gè)響應(yīng)頭 |
RemoveResponseHeader | 從響應(yīng)結(jié)果中移除有一個(gè)響應(yīng)頭 |
RequestRateLimiter | 限制請(qǐng)求的流量 |
1.2.1 添加過(guò)濾器
spring:cloud:gateway:discovery:locator:enabled: true #開啟從注冊(cè)中心動(dòng)態(tài)創(chuàng)建路由的功能,利用微服務(wù)名進(jìn)行路由routes:- id: service-provider # 路由標(biāo)示,必須唯一uri: lb://SERVICE-PROVIDER # 路由的目標(biāo)地址;動(dòng)態(tài)路由使用,lb://微服務(wù)名predicates: # 路由斷言,判斷請(qǐng)求是否符合規(guī)則- Path=/provider/** # 路徑斷言,判斷路徑是否是以/provider開頭,如果是則符合- id: service-consumeruri: lb://SERVICE-CONSUMERpredicates:- Path=/consumer/**filters: # 針對(duì)某個(gè)服務(wù)添加過(guò)濾器- AddRequestHeader=name,zhangsan default-filters: # 全局過(guò)濾器給請(qǐng)求添加請(qǐng)求頭信息- AddRequestHeader=name,zhangsan - AddRequestHeader=age,10
1.2.2 自定義全局過(guò)濾器(鑒權(quán))
1.2.3 gateway中過(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由gateway指定,默認(rèn)是按照聲明順序從1遞增。
- 當(dāng)過(guò)濾器的order值一樣時(shí),會(huì)按照 defaultFilter > 路由過(guò)濾器 > GlobalFilter的順序執(zhí)行。
三.GateWay工作原理
1.GateWay架構(gòu)原理
1.拉取注冊(cè)中心的服務(wù)列表
2.獲取請(qǐng)求地址,根據(jù)routes路由規(guī)則判斷匹配所拉取的服務(wù)列表
3.路由規(guī)則匹配上了某個(gè)服務(wù)列表中的服務(wù),負(fù)載均衡轉(zhuǎn)發(fā)個(gè)對(duì)應(yīng)的服務(wù)
2.GateWay的內(nèi)部流程
1)服務(wù)啟動(dòng)時(shí):
1.服務(wù)啟動(dòng)時(shí),加載配置文件中的路由配置
2.將路由配置轉(zhuǎn)化為RouteDefinition (封裝gateway路由屬性信息的bean,即Route的bean定義)
3.RouteLocator讀取RouteDefinition并將RouteDefinition 轉(zhuǎn)換成Route對(duì)象( Route對(duì)象中定義并實(shí)例化了路由斷言、過(guò)濾器、路由地址及路由優(yōu)先級(jí)等信息 ),并提供了獲取Route對(duì)象的方法
2)客戶端請(qǐng)求到達(dá)時(shí):
1.Netty Server監(jiān)聽到客戶端請(qǐng)求,通過(guò)所有路由的路由斷言,看是否匹配上路由
2.匹配上路由,封裝具體路由的Handler(將路由的一些信息封裝到ServerWebExchange對(duì)象中),并將對(duì)應(yīng)的過(guò)濾器鏈加入到Handler中
3.拿到具體路由的執(zhí)行Handler后,執(zhí)行過(guò)濾器鏈,并通過(guò)路由信息轉(zhuǎn)發(fā)請(qǐng)求到對(duì)應(yīng)的服務(wù)
RoutePredicateHandlerMapping的執(zhí)行順序通過(guò)路由定位器獲取全部路由(RouteLocator)
通過(guò)路由的謂語(yǔ)(Predicate)過(guò)濾掉不可用的路由信息
查找到路由信息后將路由信息設(shè)置當(dāng)上下文環(huán)境中(GATEWAY_ROUTE_ATTR)
返回gatway自定的webhandler(FilteringWebHandler)