您好,登錄后才能下訂單哦!
這篇文章主要介紹“SpringCloud Gateway路由組件怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SpringCloud Gateway路由組件怎么使用”文章能幫助大家解決問題。
Gateway是SpringCloud Alibaba中的路由組件(前身是Zuul),作為瀏覽器端請求的統一入口。當項目采用微服務模式時,若包含了路由模塊,瀏覽器端的請求都不會直接請求含有業務邏輯的各個業務模塊,而是請求這個路由模塊,然后再由它來轉發到各個業務模塊去。
Gateway中的三個核心概念:路由、斷言(Predicate)、過濾器。
路由:由唯一id、目的url、斷言和過濾組成
斷言:即路由規則,用來判斷哪些請求符合規則,符合的請求進行轉發
過濾器:分為GatewayFilter和GlobalFilter,前者作用于單一路由,后者作用于所有路由。過濾器可以對請求或者返回進行處理,如增加請求頭、刪除請求頭
配置文件如下:
spring:
cloud:
gateway:
# 網關路由配置
routes:
# 路由id,自定義,只要唯一即可
- id: user-service
# uri: http://127.0.0.1:8081 # 路由的目標地址 http就是固定地址
# 路由的目標地址 lb就是負載均衡,后面跟服務名稱,要和nacos的注冊中心結合
uri: lb://userservice
# 斷言
predicates:
# 這個是按照路徑匹配,只要以/user/開頭就符合要求
- Path=/user/**
# 過濾器
filters:
# 添加請求頭
- AddRequestHeader=sign, xn2001.com is eternal
上面寫到了根據路徑匹配的斷言,Gateway提供了十幾種內置的斷言:
名稱 | 說明 | 示例 |
---|---|---|
After | 是某個時間點之后的請求 | - After=2022-08-26T18:34:10.475+08:00[Asia/Shanghai] |
Before | 是某個時間點之前的請求 | - Before=2022-11-26T18:34:10.475+08:00[Asia/Shanghai] |
Between | 是某兩個時間點之前的請求 | - Between=2022-10-26T18:35:15.093+08:00[Asia/Shanghai], 2022-11-26T18:35:15.093+08:00[Asia/Shanghai] |
Cookie | 請求必須包含某些cookie | - Cookie=chocolate, ch.p |
Header | 請求必須包含某些header | - Header=sign, internal |
Host | 請求必須是訪問某個host(域名) | - Host=**.somehost.org, **.anotherhost.org |
Method | 請求方式必須是指定方式 | - Method=GET,POST |
Path | 請求路徑必須符合指定規則 | - Path=/blue/** |
Query | 請求參數必須包含指定參數 | - Query=name, Jack或- Query=name |
RemoteAddr | 請求者的ip必須是指定范圍 | - RemoteAddr=192.168.1.1/24 |
Weight | 權重處理 |
配置中的AddRequestHeader就是其中一種Gateway Filter,還有其余的內置的:
名稱 | 說明 |
---|---|
AddRequestHeader | 給當前請求添加一個請求頭 |
RemoveRequestHeader | 移除請求中的一個請求頭 |
AddResponseHeader | 給響應結果中添加一個響應頭 |
RemoveResponseHeader | 從響應結果中移除一個響應頭 |
RequestRateLimiter | 限制請求的流量 |
全局過濾器,后面的示例給出具體用法
這里新建2個模塊,路由模塊和用戶模塊
用戶模塊,引入依賴spring-boot-starter-web、spring-cloud-starter-alibaba-nacos-discovery,bootstrap.yml配置端口號、nacos注冊中心的地址,并提供接口:
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/user") public class UserController { @ResponseBody @RequestMapping("/sayHello") public String sayHello(@RequestHeader(value = "sign", required = false) String sign) { return "這是好吃的:" + sign; } }
路由模塊,引入依賴:
<dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config </artifactId> <version>2.2.0.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery </artifactId> <version>2.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> <version>2.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
bootstrap.yml的配置:
server:
port: 8086
servlet:
context-path: /gatewayspring:
application:
name: gateway
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yml
discovery:
server-addr: 127.0.0.1:8848
2個模塊都啟動后,nacos的服務列表顯示:
nacos中新建名為gateway-dev.yml的配置,內容為:
spring:
cloud:
gateway:
discovery:
locator:
# 通過服務名稱轉發,默認false
enabled: true
# 服務名稱不用大寫
lower-case-service-id: true
# routes:
# - id: user-service
# uri: lb://supplier
# predicates:
# - Path=/provider/**
# filters:
# - AddRequestHeader=sign, big JavaCoder
此時,請求路徑:http://localhost:8086/supplier/provider/user/sayHello
注:supplier是服務名稱,provider是模塊訪問路徑(server.servlet.context-path)
但這種配置不是很推薦
把spring.cloud.gateway.discovery及子配置注釋掉,把spring.cloud.gateway.routes及子配置取消注釋,重啟路由模塊,這時訪問路徑:
http://localhost:8086/provider/user/sayHello。
注:這是訪問的路徑,經過gateway處理后,實際訪問的是lb://supplier/provider/user/sayHello(見RouteToRequestUrlFilter的filter方法);provider是模塊訪問路徑(server.servlet.context-path),如果用戶模塊沒有設置的話,filters下添加- StripPrefix=1,這時訪問路徑不變,實際的訪問路徑是lb://supplier/user/sayHello。
處理一切進入網關的請求和響應,并且也是可以編寫代碼自定義邏輯;在執行順序上,GatewayFilter先執行,GlobalFilter后執行。
import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; import java.util.List; @Component public class AuthorizeFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); HttpHeaders headers = request.getHeaders(); List<String> sign = headers.get("sign"); if(sign.size() < 1) { ServerHttpResponse response = exchange.getResponse(); response.setStatusCode(HttpStatus.BAD_REQUEST); //被攔截,請求不到對應模塊了 return exchange.getResponse().setComplete(); } headers = HttpHeaders.writableHttpHeaders(headers); headers.set("sign1", "bigAAA"); //放行 return chain.filter(exchange); } }
關于“SpringCloud Gateway路由組件怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。