1、SpringCloudGateWay是什么
該項(xiàng)目提供了一個(gè)在Spring生態(tài)系統(tǒng)之上構(gòu)建的API網(wǎng)關(guān),包括:Spring 5,Spring Boot 2和Project Reactor。 Spring Cloud Gateway旨在提供一種簡單而有效的方法來路由到API,并為它們提供跨領(lǐng)域的關(guān)注點(diǎn),例如:安全性,監(jiān)視/指標(biāo)和限流。
SpringCloudGataway是基于WebFlux框架實(shí)現(xiàn)的,而WebFlux框架底層采用了非阻塞響應(yīng)式高性能的Reactor模式通信框架Netty。
1.1 特征
- 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.x
- 動(dòng)態(tài)路由
- Predicates 和 Filters 作用于特定路由
- 集成 Hystrix 斷路器
- 集成 Spring Cloud DiscoveryClient
- 易于編寫的 Predicates 和 Filters
- 限流
- 路徑重寫
1.2 核心概念
- Route(路由): 網(wǎng)關(guān)的基本構(gòu)建塊。 它由ID,目標(biāo)URI,一系列的斷言和過濾器集合定義。 如果斷言為true,則匹配路由。
-
Predicate(斷言): 這一個(gè) Java 8 Function Predicate。輸入類型是Spring Framework
ServerWebExchange。我們可以使用它來匹配HTTP的任何請求,包括headers或者parameters。 -
Filter(過濾): 這些是使用特定工廠構(gòu)造的Spring Framework
GatewayFilter實(shí)例。 在這里,可以在發(fā)送下游請求之前或之后修改請求和響應(yīng)。
Web請求,就是通過一些匹配條件,定位到真正服務(wù)的節(jié)點(diǎn)。并在轉(zhuǎn)發(fā)過程的前后,做一些精細(xì)化的控制。
Predicate就是匹配條件,而Filter可以理解為一些無所不能的攔截器,再加一個(gè)url,構(gòu)成一個(gè)完整的路由。
2、微服務(wù)架構(gòu)網(wǎng)關(guān)在哪里

-
工作流程
流程
客戶端向Spring Cloud Gateway發(fā)出請求。 如果網(wǎng)關(guān)處理程序映射確定請求與路由匹配,則將其發(fā)送到網(wǎng)關(guān)Web處理程序。Handler再通過指定的過濾器來將請求發(fā)送到我們實(shí)際服務(wù)執(zhí)行業(yè)務(wù)邏輯,然后返回。過濾器之間用虛線分開是因?yàn)檫^濾器可能再代理請求之前或之后執(zhí)行業(yè)務(wù)邏輯。Filter在
pre類型的過濾器可以做參數(shù)校驗(yàn)、權(quán)限校驗(yàn)、流量監(jiān)控和日志輸出等;在post類型的過濾器可以做響應(yīng)內(nèi)容、響應(yīng)頭的修改等。
3、入門配置
網(wǎng)關(guān)路由有兩種配置方式:
1)通過application.yml配置文件
server:
port: 9200
spring:
application:
name: Cloud-Gateway
cloud:
gateway:
routes:
-id: test_route #路由ID要求唯一
url: http://localhost:8080 #匹配后轉(zhuǎn)發(fā)至提供服務(wù)的路由地址
predicates:
-Path:/user/get/** #斷言,路徑相匹配的進(jìn)行路由
-id: test_route2
url: http://localhost:8080
predicates:
-Path:/order/get/**
eureka:
instance:
hostname: cloud-gateway-service
lease-expiration-duration-in-seconds: 30
lease-renewal-interval-in-seconds: 10
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
解釋:客戶端請求http://localhost:9200/user/get/**,經(jīng)網(wǎng)關(guān)微服務(wù)轉(zhuǎn)發(fā)至http://localhost:8080/user/get/** 去處理
2)代碼中注入@Bean自定義 RouteLocator,
配置該Bean有兩種方式:1)在啟動(dòng)類中添加;2)自定義配置@Configuration
@Configuration
public class CloudGateWayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
RouteLocatorBuilder.builder routes = routeLocatorBuilder.routes();
routes.route("test_route", r -> r.path("/news").url("http://baidu.com/news")).builder();
return routes.build();
}
}
解釋:客戶端請求http://localhost:9200/news,經(jīng)網(wǎng)關(guān)微服務(wù)轉(zhuǎn)發(fā)至http://baidu.com/news 去處理
