gateway - 流程及組件

流程

咱們用官方的圖片來講明gateway的流程。當客戶端訪問gateway的時候,首先會經過DispatcherHandler#handle調用RoutePredicateHandlerMapping,也就是圖中的Gateway Handler Mapping,而後再調用FilteringWebHandler,也就是圖中的Gateway Web Handler。
咱們從java8系列知道,java8的Predicate函數,用來表示一個涉及類型T的布爾表達式,RoutePredicateHandlerMapping也是相似的,當返回false的時候,說明不符合要求,因此他主要是用來判斷路由是否匹配,不匹配就返回false。
FilteringWebHandler從名字上看就知道是用來處理過濾器的,從圖上能夠看出,他會有一個filter鏈,用來處理請求前和請求後的操做,相似zuul的pre和post。
image.pngjava

Route

上面咱們已經知道了gateway的流程,這個時候假設咱們有多個URL,好比example.com/testA和example.com/testB過來,咱們怎麼知道哪些請求能夠哪些請求不能夠呢?咱們能夠用一個大的map來存儲這些URL,可是咱們如何針對某個URL進行特定的過濾請求呢,因此這樣粗粒度控制是不行的。因此gateway是這樣設計的:他爲每一個URL都配置了相應的規則和路由。以下圖所示,每一個路由Route都有本身的id,url,predicate以及gatewayFilters。
image.png
咱們看到gatewayFilters是s結尾的,就猜到了他是集合,那predicate沒有s,說明他只能帶一個Predicate嗎,其實不是的,java8的Predicate有or、and、negate的方法,他也是有的,因此他是這樣設計的,當咱們只有一個Predicate的時候:
image.png
當調用and方法,這樣就有了兩個Predicate,他的結構以下,他會把已有的Predicate放入left,再把新增的Predicate放入right。
image.png
當再調用and方法的時候,這個時候就有了3個Predicate,他的結構以下:
image.png
固然調用or也是相似的,他經過這樣的結構,就能夠實現和java8的Predicate同樣的方法了。spring

RouteDefinition

上面已經知道了Route的結構,可是咱們卻不能直接在application.yml文件裏配置,緣由就是Predicate的複雜的結構,因此咱們經過RouteDefinition來簡化配置,RouteDefinition的結構以下:
image.png
能夠看到,和Route的差異就是predicates和predicate的區別。每一個集合的對象,都有一個name和map,map用來存放各類鍵值對用於判斷是否符合以及過濾條件。好比咱們的配置文件能夠這樣寫:segmentfault

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: route1
          uri: https://www.examplea.com
          predicates:
            - After=2017-01-20T17:42:47.789-07:00[America/Denver]
            - Cookie=chocolate, ch.p
          filters:
            - AddRequestHeader=X-Request-red, blue
            - AddRequestParameter=red, blue
        - id: route2
          uri: https://www.exampleb.com
          predicates:
            - Path=/red/{segment},/blue/{segment}
            - Query=green
          filters:
            - AddResponseHeader=X-Response-Red, Blue
            - RewritePath=/consumingserviceendpoint, /backingserviceendpoint

RoutePredicateFactory

咱們已經經過RouteDefinition去對應配置文件的配置信息,這些RouteDefinition最終仍是要變成Route吧,配置的predicates、filters等最終也要變成Route的屬性吧。在gateway中,用RoutePredicateFactory這個工廠類,經過配置信息,生成一個個Predicate。
系統中已經定義了十幾個RoutePredicateFactory,而後放入map緩存中,他的key就是把類名中的RoutePredicateFactory去掉,好比咱們上面配置的Path,能夠知道他的工廠類就是PathRoutePredicateFactory。
因此咱們在上面配置了多少個predicate,就有對應的工廠類給咱們建立predicate,最後再組裝成Route的Predicate結構,Predicate結構上面已經有圖示了。緩存

GatewayFilterFactory

既然Predicate有他的工廠類,根據配置信息生成不一樣的Predicate,Filter其實也是同樣的。
系統也定義了不少個GatewayFilterFactory,放入map緩存中,他的key就是把類名中的GatewayFilterFactory去掉。好比咱們上面配置的AddResponseHeader,能夠知道他的工廠類就是AddResponseHeaderGatewayFilterFactory。這個設計方式和RoutePredicateFactory是同樣的。app

Locator

Locator是定位的意思,這裏主要有兩個Locator,一個是RouteLocator,一個是RouteDefinitionLocator,分別對應着上面的Route和RouteDefinition,也就是說他們是用來定位具體的Route和RouteDefinition的。函數

相關文章
相關標籤/搜索