簡介
Spring Cloud Gateway是Spring Cloud大家族的一個新進成員,在Spring Cloud 2.0之后用于取代非官方的Zuul。Getaway基于Spring 5.0與Spring WebFlux開發(fā),采用Reactor響應(yīng)式設(shè)計。
為什么需要網(wǎng)關(guān)
微服務(wù)架構(gòu)的系統(tǒng)由各個相互獨立的程序組成,對于服務(wù)之間的調(diào)用可以通過Consul等注冊中心提供的服務(wù)注冊與發(fā)現(xiàn)實現(xiàn)。但是對外暴露給客戶端的接口不能要求客戶端通過Consul等注冊中心發(fā)現(xiàn)服務(wù)。網(wǎng)關(guān)的常見作用為隱藏后端服務(wù)、路由轉(zhuǎn)發(fā)、限流(黑名單)控制、權(quán)限校驗、也可以作為鏈路跟蹤的起點。
原理
這是官方文檔中提供的圖,客戶端發(fā)起請求到達Gateway,根據(jù)HandlerMapping到路由處理
術(shù)語
路由(Route):路由為一組斷言與一組過濾器的集合,他是網(wǎng)關(guān)的一個基本組件。
斷言(Predicate):匹配路由的判斷條件,例如Path=/demo,匹配后應(yīng)用路由。
過濾器(Filter):過濾器可以對請求和返回進行修改,比如增加頭信息等。
地址(Uri):匹配路由后轉(zhuǎn)發(fā)的地址。
官方提供了許多默認的斷言與過濾器,基本能覆蓋常用到的操作,更多詳細的內(nèi)容參考官方文檔。
使用
快速搭建Spring系列的應(yīng)用可以使用官方的工具生成項目代碼:https://start.spring.io/
idea中也集成了該方式的使用
基于代碼方式的路由配置:
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("baidu_route", r -> r.path("/baidu")
.filters(f -> f.addResponseHeader("hello", "Gateway"))
.uri("http://baidu.com")
.order(1))
.build();
}
基于配置文件的路由配置
spring:
cloud:
gateway:
routes:
- id: qq_route
uri: http://qq.com
order: 2
predicates:
- Path=/qq
filters:
- AddResponseHeader=hello, Gateway
測試
請求http://127.0.0.1/baidu跳轉(zhuǎn)到baidu.com
使用命令請求得到增加的返回頭