海南網(wǎng)站建設推廣線上營銷渠道有哪些
目錄
API網(wǎng)關
好處
解決方案
Gateway
簡介
特征
核心概念
Route(路由)
Predicate(斷言)
Filter(過濾器)
工作流程
Route(路由)
路由配置方式
1.yml配置文件路由
2.bean進行配置
3.動態(tài)路由
動態(tài)路由
Predicate(斷言)
特點
常見斷言
示例
Filter(過濾器)
filter分類
Pre 類型
Post 類型
網(wǎng)關過濾器
格式
示例
全局過濾器
示例
在微服務架構中,一個系統(tǒng)由多個微服務組成,而這些服務可能部署在不同的地區(qū)、不同的機房,客戶端想要連接,就需要知道它們具體的地址信息;
存在問題:
1.當服務數(shù)量眾多時,客戶端需要維護大量的服務地址,這對于客戶端來說,是非常繁瑣的
2.某些情況下存在跨域請求問題
3.認證難度大,每個微服務需要獨立認證
API網(wǎng)關
????????網(wǎng)關是一個搭建在客戶端和微服務之間的服務,我們可以在 API 網(wǎng)關中處理一些非業(yè)務功能的邏輯,例如權限驗證、監(jiān)控、緩存、請求路由等
????????網(wǎng)關就像整個微服務系統(tǒng)的門面一樣,是系統(tǒng)對外的唯一入口。有了它,客戶端會先將請求發(fā)送到 API 網(wǎng)關,然后由 API 網(wǎng)關根據(jù)請求的標識信息將請求轉發(fā)到微服務實例
好處
1.網(wǎng)關與微服務交互時,客戶端只需要知道網(wǎng)關地址即可,而不需要維護大量的服務地址,簡化了客戶端的開發(fā)
2.客戶端直接與網(wǎng)關通信,能夠減少客戶端與各個服務的交互次數(shù)
3.客戶端與后端的服務耦合度降低
4.節(jié)省流量,提高性能,提升用戶體驗
5.網(wǎng)關還提供了安全、流控、過濾、緩存、計費以及監(jiān)控等 API 管理功能
解決方案
1.gateway
2.zuul
3.kong
4.Nginx+Lua
Gateway
簡介
????????Spring Cloud 團隊基于 Spring 5.0、Spring Boot 2.0 和 Project Reactor 等技術開發(fā)的高性能 API 網(wǎng)關組件;旨在提供一種簡單而有效的途徑來發(fā)送 API,并為它們提供橫切關注點,例如:安全性,監(jiān)控/指標和彈性
特征
1.基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.0 構建
2.任意請求屬性上匹配路由
3.斷言 和過濾器是特定于路由的
4.集成了 Hystrix 熔斷器
5.集成了 Spring Cloud DiscoveryClient(服務發(fā)現(xiàn)客戶端)
6.易于編寫斷言和過濾器
7.能夠限制請求頻率
8.能夠重寫請求路徑
核心概念
gateway最主要的功能就是路由轉發(fā),而在定義轉發(fā)規(guī)則時主要涉及到三個核心概念
Route(路由)
????????網(wǎng)關最基本的模塊。它由一個 ID、一個目標 URI、一組斷言(Predicate)和一組過濾器(Filter)組成
Predicate(斷言)
????????路由轉發(fā)的判斷條件,我們可以通過 Predicate 對?HTTP 請求進行匹配,例如請求方式、請求路徑、請求頭、參數(shù)等,如果請求與斷言匹配成功,則將請求轉發(fā)到相應的服務。
Filter(過濾器)
????????我們可以使用它對請求進行攔截和修改,還可以使用它對上文的響應進行再處理
工作流程
說明:
1.客戶端將請求發(fā)送到gateway
2.gateway通過gateway Handler Mapping找到相匹配得到路由,將其發(fā)送給gateway web Handler
3.gateway web Handler通過指定的過濾器鏈,將請求轉發(fā)到實際的服務節(jié)點中,執(zhí)行業(yè)務返回響應結果
注意:
1.過濾器之間用虛線分開是因為過濾器可能會在轉發(fā)請求之前(pre)或之后(post)執(zhí)行業(yè)務邏輯
2.過濾器(Filter)可以在請求被轉發(fā)到服務端前,對請求進行攔截和修改,例如參數(shù)校驗、權限校驗、流量監(jiān)控、日志輸出以及協(xié)議轉換等
3.過濾器可以在響應返回客戶端之前,對響應進行攔截和再處理,例如修改響應內(nèi)容或響應頭、日志輸出、流量監(jiān)控等。
????????Gateway 的請求需要通過一定的匹配條件,才能定位到真正的服務節(jié)點。在將請求轉發(fā)到服務進行處理的過程前后(pre 和 post),我們還可以對請求和響應進行一些精細化控制。
Route(路由)
????????路由是網(wǎng)關最基礎的部分,路由信息由一個ID、一個目的URL、一組斷言工廠和一組Filter組成。如果斷言為真,則說明請求URL和配置的路由匹配。
格式:
id:我們自定義的路由 ID,保持唯一
uri:目標服務地址
路由配置方式
1.yml配置文件路由
#第一種:ws(websocket)方式: uri: ws://localhost:8888
#第二種:http方式: uri: http://localhost:8888/
#第三種:lb(注冊中心中服務名字)方式: uri: lb://consumer
spring:cloud:gateway:routes:# 路由id,沒有固定規(guī)則,建議配合服務名- id: consumer# 匹配后提供服務的路由地址# 需要注意的是uri的協(xié)議為lb,表示啟用Gateway的負載均衡功能。lb://serviceName是spring cloud gateway在微服務中自動為我們創(chuàng)建的負載均衡uri。uri: lb://consumerpredicates:# 斷言:路徑相匹配的進行路由- Path=/**
2.bean進行配置
@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customerRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();// 第一個參數(shù)是路由的唯一idroutes.route("consumer",r -> r.path("/hello").uri("http://localhost:8888/hello")).build();return routes.build();}
}
3.動態(tài)路由
可以通過服務名進行轉發(fā),無需配置routes也可以轉發(fā)
spring:application:name: gatewaycloud:gateway:discovery:locator:#開啟根據(jù)微服務名稱自動轉發(fā)enabled: true#小寫lower-case-service-id: true
動態(tài)路由
????????默認情況下,Gateway 會根據(jù)服務注冊中心中維護的服務列表,以服務名作為路徑創(chuàng)建動態(tài)路由進行轉發(fā),從而實現(xiàn)動態(tài)路由功能。
形式:
lb://service-name
lb:uri 的協(xié)議,表示開啟 Spring Cloud Gateway 的負載均衡功能。
service-name:服務名,Spring Cloud Gateway 會根據(jù)它獲取到具體的微服務地址。
Predicate(斷言)
????????Predicate 斷言來實現(xiàn) Route 路由的匹配規(guī)則。Predicate 是路由轉發(fā)的判斷條件,請求只有滿足了 Predicate 的條件,才會被轉發(fā)到指定的服務上進行處理;
特點
1.路由與斷言的關系為:一對多,一個路由可以包含多個不同斷言
2.一個請求想轉發(fā)到指定的路由上,就必須同時匹配路由上的所有斷言
3.當一個請求同時滿足多個路由的斷言條件時,請求只會被首個成功匹配的路由轉發(fā)
常見斷言
示例
配置文件 application.yml中添加配置內(nèi)容
server:port: 9527 #端口號
spring:application:name: microServiceCloudGatewaycloud:gateway: #網(wǎng)關路由配置routes:#將 micro-service-cloud-provider-dept-8001 提供的服務隱藏起來,不暴露給客戶端,只給客戶端暴露 API 網(wǎng)關的地址 9527- id: provider_dept_list_routh #路由 id,沒有固定規(guī)則,但唯一,建議與服務名對應uri: http://localhost:8001 #匹配后提供服務的路由地址predicates:#以下是斷言條件,必選全部符合條件- Path=/dept/list/** #斷言,路徑匹配 注意:Path 中 P 為大寫- Method=GET #只能時 GET 請求時,才能訪問
配置中在 spring.cloud.gateway.routes 下使用 predicates 屬性,定義了以下兩個斷言條件:
- Path=/dept/list/*
-Method=GET
HTTP 請求同時滿足以上所有的斷言時,該請求才會被轉發(fā)到指定的服務端中
?
Filter(過濾器)
????????出于安全方面的考慮,服務端提供的服務往往都會有一定的校驗邏輯,例如用戶登陸狀態(tài)校驗、簽名校驗等;微服務架構中,系統(tǒng)由多個微服務組成,所有這些服務都需要這些校驗邏輯,此時我們就可以將這些校驗邏輯寫到Gateway的 Filter 過濾器中。
filter分類
Gateway 提供了以下兩種類型的過濾器,可以對請求和響應進行精細化控制:
Pre 類型
????????這種過濾器在請求被轉發(fā)到微服務之前可以對請求進行攔截和修改,例如參數(shù)校驗、權限校驗、流量監(jiān)控、日志輸出以及協(xié)議轉換等操作。
Post 類型
????????這種過濾器在微服務對請求做出響應后可以對響應進行攔截和再處理,例如修改響應內(nèi)容或響應頭、日志輸出、流量監(jiān)控等。
網(wǎng)關過濾器
GatewayFilter 是 Gateway 網(wǎng)關中提供的一種應用在單個或一組路由上的過濾器。它可以對單個路由或者一組路由上傳入的請求和傳出響應進行攔截,并實現(xiàn)一些與業(yè)務無關的功能,比如登陸狀態(tài)校驗、簽名校驗、權限校驗、日志輸出、流量監(jiān)控等
格式
spring:cloud:gateway: routes:- id: xxxxuri: xxxxpredicates:- Path=xxxxfilters:- AddRequestParameter=X-Request-Id,1024 #過濾器工廠會在匹配的請求頭加上一對請求頭,名稱為 X-Request-Id 值為 1024- PrefixPath=/dept #在請求路徑前面加上 /dept……
Gateway 內(nèi)置了多達 31 種 GatewayFilter,下表中列舉了幾種常用的網(wǎng)關過濾器及其使用示例:
示例
application.yml 中在添加一個動態(tài)路由:
- id: provider_dept_get_routh
????????uri: lb://MICROSERVICECLOUDPROVIDERDEPT #使用服務名代替上面的具體帶端口 ????????predicates:
????????????????- Path=/get/**
????????filters:
????????????????- PrefixPath=/dept #在請求路徑上增加一個前綴 /dept
全局過濾器
????????GlobalFilter 是一種作用于所有的路由上的全局過濾器,通過它,我們可以實現(xiàn)一些統(tǒng)一化的業(yè)務功能,例如權限認證、IP 訪問限制等。當某個請求被路由匹配時,那么所有的 GlobalFilter 會和該路由自身配置的 GatewayFilter 組合成一個過濾器鏈;
示例
1.新建一個名為?MyGlobalFilter 全局過濾器配置類
/**
* 自定義全局網(wǎng)關過濾器(GlobalFilter)
*/
@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("進入自定義的全局過濾器 MyGlobalFilter" + new Date());String uname = exchange.getRequest().getQueryParams().getFirst("uname");if (uname == null) {log.info("參數(shù) uname 不能為 null!");exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {//過濾器的順序,0 表示第一個return 0;}
}
2.使用瀏覽器訪問“http://eureka7001.com:9527/dept/list”,我們會發(fā)現(xiàn)訪問報 406 錯誤
3.瀏覽器訪問“http://eureka7001.com:9527/dept/list?uname=123”