什么是網(wǎng)關(guān)
網(wǎng)關(guān)是一種充當(dāng)轉(zhuǎn)換重任的計算機(jī)系統(tǒng)或設(shè)備,使用在不同的通信協(xié)議、數(shù)據(jù)格式或語言,甚至網(wǎng)關(guān)是一種充當(dāng)轉(zhuǎn)換重任的計算機(jī)系統(tǒng)或設(shè)備,使用在不同的通信協(xié)議、數(shù)據(jù)格式或語言,甚至體系結(jié)構(gòu)完全不同的兩種系統(tǒng)之間進(jìn)行數(shù)據(jù)傳輸.
網(wǎng)關(guān)具備轉(zhuǎn)發(fā), 路由和數(shù)據(jù)過濾的功能, 它能夠識別不同網(wǎng)絡(luò)中的數(shù)據(jù)包, 并根據(jù)器目的地址和源地址決定如何轉(zhuǎn)發(fā)數(shù)據(jù). 同時, 網(wǎng)關(guān)還可以實施網(wǎng)絡(luò)安全策略, 對進(jìn)出的數(shù)據(jù)包進(jìn)行檢查和過濾, 保護(hù)網(wǎng)絡(luò)安全.
網(wǎng)關(guān)在互聯(lián)網(wǎng)中起到重要作用, 它連接了內(nèi)部局域網(wǎng)好外部互聯(lián)網(wǎng), 使得數(shù)據(jù)能夠在不同網(wǎng)絡(luò)之間傳遞和交換.
網(wǎng)關(guān)有什么作用
- 路由功能: 根據(jù)目標(biāo)地址的不同選擇最佳的路徑
- 安全控制(統(tǒng)一認(rèn)證授權(quán)): 對進(jìn)出的數(shù)據(jù)包進(jìn)行檢查和過濾, 它可以授權(quán)來自源網(wǎng)絡(luò)的數(shù)據(jù)包, 并且阻止未授權(quán)的訪問.
- 協(xié)議轉(zhuǎn)換: 網(wǎng)關(guān)可以進(jìn)行協(xié)議轉(zhuǎn)換, 使得不同的網(wǎng)絡(luò)設(shè)備可以進(jìn)行通信, 例如: 將 HTTPS 轉(zhuǎn)換成 HTTP.
- 網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT): 將內(nèi)部網(wǎng)絡(luò)使用的私有 IP 地址轉(zhuǎn)換成外部網(wǎng)絡(luò)使用的公共 IP 地址.
Spring Cloud GateWay 組成
- 路由(Route): 定義了請求應(yīng)該被轉(zhuǎn)發(fā)到哪個目標(biāo)地址. 路由由 ID, 目標(biāo)URI, 斷言好過濾器組成. 通過配置多個路由, 可以實現(xiàn)不同請求的路由規(guī)則.
- 斷言(Predicate): 用于匹配請求的條件, 如果請求匹配斷言條件, 則會被路由轉(zhuǎn)發(fā)到對應(yīng)的目標(biāo)地址.
- 過濾器(Filter): 用于請求路由前或請求后進(jìn)行一些處理, 如添加頭部信息, 修改請求體等.
Spring Cloud GateWay 基礎(chǔ)使用
添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
注意: Spring Cloud GateWay 底層是基于響應(yīng)式 Reactor Web 實現(xiàn)的已經(jīng)包含了 Web 所以這兩個依賴同時引入就會報錯
設(shè)置路由規(guī)則
server:
port: 10086
spring:
cloud:
gateway:
routes:
- id: user-service
uri: http://localhost:9090
predicates:
- Path=/user/**, /userlog/**
# 匹配多個路徑時可以用英文逗號隔開
- id: order-service
uri: http://localhost:9091
predicates:
- Path=/order/**
斷言類型
Spring Cloud GateWay 目前支持 12 種斷言類型
- After: 請求在指定時間之后才能匹配
- Before: 請求在指定時間之前才能匹配
- Between: 請求在指定時間中才能匹配
- Cookie: 匹配請求中的 Cookie 值
- Header: 匹配請求中的 Header 值
- Host: 匹配請求頭中的 Host 值
- Method: 匹配請求頭中的 Method 值
- Path: 匹配請求路徑
- Query: 匹配請求參數(shù)
- RemoteAddr: 匹配請求的 IP 地址
- Weight: 根據(jù)權(quán)重分發(fā)請求
- XDorwardedRemoteAddr: 根據(jù) X-Forwarded-For匹配
過濾器
過濾器主要有以下幾個功能:
- 功能擴(kuò)展和定制: 通過攔截和處理數(shù)據(jù)流或事件流, 可以修改數(shù)據(jù), 增加額外的功能邏輯, 實現(xiàn)特點的業(yè)務(wù)需求
- 數(shù)據(jù)校驗和過濾: 在接收到數(shù)據(jù)之后, 可以使用過濾器對數(shù)據(jù)進(jìn)行檢查, 嚴(yán)重數(shù)據(jù)的合法性, 過濾掉無效或不符合要求的數(shù)據(jù)
- 安全保護(hù): 可以控制訪問, 驗證權(quán)限, 對輸入的請求進(jìn)行檢查和清洗
- 性能優(yōu)化: 可以對數(shù)據(jù)進(jìn)行轉(zhuǎn)換, 過濾或者緩存, 以提高處理速度和效率,. 還可以用于數(shù)據(jù)壓縮, 緩存預(yù)熱等場景, 減少數(shù)據(jù)傳輸和處理的成本
- 統(tǒng)一處理和邏輯復(fù)用: 可以在不同組件或模塊上應(yīng)用相同的邏輯或處理方式
內(nèi)置過濾器
內(nèi)置過濾器分為局部過濾器和全局過濾器
局部過濾器和全局過濾器用法相同只是一個只適用于當(dāng)前匹配的服務(wù)一個適用于全局
gateway:
routes:
- id: user-service
uri: lb://user-service-demo
predicates:
- Path=/user/**
filters: # 局部過濾器
- AddResponseHeader=My-Resp-Header,javacn
- id : order-service
uri: lb://order-service-demo
predicates:
- Path=/order/**
default-filters: # 全局過濾器
- AddResponseHeader=My-Resp-Header2,javacn2
- AddRequestHeader=My-Req, javacn
Retry
GateWay中也可以和OpenFeign一樣配置重試機(jī)制
spring:
application:
name: gateway-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
username: nacos
password: nacos
register-enabled: false
gateway:
routes:
- id: user-service
uri: lb://user-service-demo
predicates:
- Path=/user/**
filters:
- AddResponseHeader=My-Resp-Header,javacn
- name: Retry
args:
retries: 3 # 重試次數(shù)
statuses: GATEWAY_TIMEOUT # 重試的 HTTP 狀態(tài)代碼=504
methods: GET # 重試的 HTTP 方法
series: SERVER_ERROR # 重試狀態(tài)碼段 5xx 狀態(tài)
backoff: # 重試指數(shù)配置策略
firstBackoff: 10ms # 第一次重試間隔
maxBackoff: 50ms # 最大重試間隔
factor: 2 # firstBackoff * (factor ^ n)
basedOnPreviousValue: false # 基于上次值
注意: name必須是Retry, 否則識別不了文章來源:http://www.zghlxwxcb.cn/news/detail-754700.html
自定義全局過濾器
Spring Cloud GateWay 中也提供了自定義全局過濾器, 我們可以通過它來實現(xiàn)統(tǒng)一認(rèn)證授權(quán)等功能文章來源地址http://www.zghlxwxcb.cn/news/detail-754700.html
package com.example.gatewayservice.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
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;
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 獲取request對象
ServerHttpRequest request = exchange.getRequest();
// 獲取response對象
ServerHttpResponse response = exchange.getResponse();
// 獲取參數(shù)
String username = request.getQueryParams().getFirst("username");
String password = request.getQueryParams().getFirst("password");
if (username != null && username.equals("admin") && password != null && password.equals("admin")) {
return chain.filter(exchange);
}else {
// 設(shè)置無權(quán)限 401
response.setStatusCode(HttpStatus.UNAUTHORIZED);
// 執(zhí)行完成不在往下執(zhí)行
return response.setComplete();
}
}
@Override
public int getOrder() {
// 值越小越早執(zhí)行
return 1;
}
}
到了這里,關(guān)于Spring Cloud GateWay簡介的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!