您好,登錄后才能下訂單哦!
這篇文章主要講解了“SpringCloud服務網關Gateway如何使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“SpringCloud服務網關Gateway如何使用”吧!
  由于Netflix的zuul發生問題,spring公司自己研發了一套網關框架Gateway用于取代zuul的使用。什么是gateway呢?spring cloud Gateway是使用Webflux中的reactor-netty響應式編程組件,底層使用的是netty通訊框架。
  API gateway 處于客戶端與各個微服務之間,它擔任了反向代理的角色,將不同的請求路由到相對應的微服務中去。與此同時,它還有以下功能:安全,限流,緩存,日志,監控,重試,熔斷等。網關就是所有項目的一個統一入口,也可以說是進入系統的唯一節點。
  路由是構建網關的基本模塊,它由ID、目標URI、一系列的斷言和過濾器組成,如果斷言為真則匹配該路由。就是根據斷言和過濾器提供的某些規則,將請求發送到指定服務上
  開發人員可以匹配HTTP請求中的所有內容(例如請求頭或請求參數),如果請求與斷言相匹配則進行路由,就是定義匹配規則,只有滿足斷言的請求才會繼續進行路由
  指的是Spring框架中GatewayFilter的實例,使用過濾器,可以在請求被路由前或者之后對請求進行修改。當請求進行斷言之前,或者滿足斷言后會繼續進行路由,但是由于過濾的存在請求會再次被過濾條件進行指定的修改操作
  客戶端向Spring Cloud Gateway發出請求。然后在Gateway Handler Mapping 中找到與請求相匹配的路由,將其發送到GatewayWeb Handler。Handler再通過指定的過濾器鏈來將請求發送到我們實際的服務執行業務邏輯,然后返回。
  過濾器之間用虛線分開是因為過濾器可能會在發送代理請求之前(“pre”)或之后(“post”)執行業務邏輯。Filter在“pre”類型的過濾器可以做參數校驗、權限校驗、流量監控、日志輸出、協議轉換等,在“post”類型的過濾器中可以做響應內容、響應頭的修改,日志的輸出,流量監控等有著非常重要的作用。
  第一步: 創建一個子模塊用于配置gateway,導入相關依賴,其中最重要的就是gateway的啟動器。一定不能引入web場景啟動器依賴,否則gateway模塊將無法啟動
<!--gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
  第二步: 配置文件
server:
port: 9527spring:
application:
name: cloud-gatewayeureka:
instance:
hostname: cloud-gateway-service
client: #服務提供者provider注冊進eureka服務列表內
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://localhost:7001/eureka
  第三步: 現在我們想在支付微服務8001之前使用gateway網關,讓請求在訪問8001微服務之前先經過gateway網關。于是我們需要先配置配置文件
spring:
cloud:
gateway:
routes:
- id: payment_routh #payment_route #路由的ID,沒有固定規則但要求唯一,建議配合服務名
#uri: http://localhost:8001 #匹配后提供服務的路由地址
uri: lb://cloud-payment-service #匹配后提供服務的路由地址
predicates:
- Path=/payment/get/** # 斷言,路徑相匹配的進行路由- id: payment_routh3 #payment_route #路由的ID,沒有固定規則但要求唯一,建議配合服務名
#uri: http://localhost:8001 #匹配后提供服務的路由地址
uri: lb://cloud-payment-service #匹配后提供服務的路由地址
predicates:
- Path=/payment/create/** # 斷言,路徑相匹配的進行路由
- After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
  經過如上操作,即可實現如果通過9527端口也可以訪問8001的接口,也就是說請求先是通過9527網關,將符合yml配置文件中配置的請求進行路由轉發至8001端口
  使用代碼配置的話就需要使用到自定義配置類了,將上面的第三步由配置文件配置修改為自定義配置類,前兩步要保持一致。其中route方法的第一個參數相當于id配置,r.path相當于predicates斷言,r.path.uri就是請求將要路由到的地址
@Configuration public class GateWayConfig { @Bean public RouteLocator customRouteLocatorBuilder(RouteLocatorBuilder routeLocatorBuilder) { RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes(); routes.route("path_route_atguigu", r -> r.path("/guonei") .uri("http://news.baidu.com/guonei")) .build(); return routes.build(); } }
  之前都是通過ribbon來實現請求的負載均衡,其實gateway網關也可以通過注冊中心的微服務名來實現負載均衡,也就是動態路由的功能。這里我們先通過以下配置開啟從注冊中心動態創建路由的功能
spring:
cloud:
gateway:
discovery:
locator:
enabled: true #開啟從注冊中心動態創建路由的功能,利用微服務名進行路由
然后將原先寫死的路徑改為微服務名,通過這個實現對微服務的輪詢
spring:
cloud:
gateway:
routes:
- id: payment_routh #payment_route #路由的ID,沒有固定規則但要求唯一,建議配合服務名
#uri: http://localhost:8001 #匹配后提供服務的路由地址
uri: lb://cloud-payment-service #匹配后提供服務的路由地址
predicates:
- Path=/payment/get/** # 斷言,路徑相匹配的進行路由- id: payment_routh3 #payment_route #路由的ID,沒有固定規則但要求唯一,建議配合服務名
#uri: http://localhost:8001 #匹配后提供服務的路由地址
uri: lb://cloud-payment-service #匹配后提供服務的路由地址
predicates:
- Path=/payment/create/** # 斷言,路徑相匹配的進行路由
  gateway的斷言實際上就是配置文件中的predicates配置項,既然這個單詞是復數,那就意味著它不僅僅可以配置一種斷言,實際上斷言的類型有九種,它們的意思以及使用方式我都寫在了下面
predicates:
- Path=/payment/create/** # 路徑斷言,路徑相匹配的進行路由
- Before=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] # 時間斷言,時間Before、After、Between指定時間的請求進行路由
- After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
- Between=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] , 2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
- Cookie=username,zzyy # cookie斷言,攜帶名為username且值為zzyy的請求進行路由(zzyy可以替換為正則)
- Header=X-Request-Id, \d+ # header斷言,請求頭攜帶X-Request-Id且值滿足正則"\d+"的請求進行路由
- Host=**.atguigu.com, **.atg.com # host斷言,請求格式符合的請求進行路由
- Method=GET # method斷言,請求方式為get的請求進行路由
- Query=username, \d+ # query斷言,有參數名為username且值滿足正則"\d+"的請求進行路由
  使用配置文件實現filter過濾修改很簡單,類似于斷言的使用,在配置文件直接配置即可
filters:
- AddRequestParameter=X-Request-Id,1024
  但是一般不這么使用filter,我們都是自定義一個全局GlobalFilter,重點就是@Component注解,類實現GlobalFilter, Ordered接口重寫方法,設置過濾規則和優先級
@Component @Slf4j public class MyLogGateWayFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { /** * 判斷請求中包含uname參數且它的值不為空,否則拒絕請求 */ String uname = exchange.getRequest().getQueryParams().getFirst("uname"); if (uname == null) { log.info("*******用戶名為null,非法用戶,o(╥﹏╥)o"); exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } /** * 加載過濾器順序,數字越小優先級越高 * @return */ @Override public int getOrder() { return 0; } }
感謝各位的閱讀,以上就是“SpringCloud服務網關Gateway如何使用”的內容了,經過本文的學習后,相信大家對SpringCloud服務網關Gateway如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。