一文掌握spring cloud gateway(總結(jié)篇)
什么是gateway
在微服務(wù)架構(gòu)中,gateway網(wǎng)關(guān)是一個(gè)服務(wù),它作為系統(tǒng)的唯一入口點(diǎn),處理所有的客戶(hù)端請(qǐng)求,然后將這些請(qǐng)求路由到適當(dāng)?shù)姆?wù)。提供了幾個(gè)關(guān)鍵功能:
1.請(qǐng)求路由:根據(jù)請(qǐng)求的URL路徑和其他參數(shù),將請(qǐng)求路由到正確的后端服務(wù)。
2.負(fù)載均衡:在多個(gè)服務(wù)實(shí)例之間分配流量,以提高可用性和可擴(kuò)展性。
3.認(rèn)證和授權(quán):檢查用戶(hù)是否有權(quán)訪(fǎng)問(wèn)特定的服務(wù)。
4.限流:控制訪(fǎng)問(wèn)后端服務(wù)的請(qǐng)求速率,以防止過(guò)載。
5.監(jiān)控:收集關(guān)于A(yíng)PI使用情況的統(tǒng)計(jì)數(shù)據(jù),用于分析和計(jì)費(fèi)。
6.日志記錄:記錄所有通過(guò)網(wǎng)關(guān)的請(qǐng)求和響應(yīng),以便進(jìn)行問(wèn)題排查和性能監(jiān)控。
7.緩存:提高響應(yīng)速度和減少后端負(fù)載,通過(guò)緩存常見(jiàn)的響應(yīng)。
8.過(guò)濾:檢驗(yàn)當(dāng)前的請(qǐng)求是否符合請(qǐng)求的規(guī)則。

客戶(hù)端向 Spring Cloud Gateway 發(fā)出請(qǐng)求。如果 Gateway Handler Mapping 確定請(qǐng)求與路由匹配,則將其發(fā)送到 Gateway Web Handler。此處理程序通過(guò)特定于該請(qǐng)求的過(guò)濾器鏈運(yùn)行該請(qǐng)求。過(guò)濾器被虛線(xiàn)分開(kāi)的原因是過(guò)濾器可以在發(fā)送代理請(qǐng)求之前和之后運(yùn)行邏輯。所有“前”過(guò)濾器邏輯都??會(huì)執(zhí)行。然后發(fā)出代理請(qǐng)求。發(fā)出代理請(qǐng)求后,運(yùn)行“后”過(guò)濾器邏輯。
如何導(dǎo)入gateway依賴(lài)
1.導(dǎo)包
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>>2021.0.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.6.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>2.配置yaml文件
spring:
cloud:
gateway:
discovery:
locator:
lower-case-service-id: true
enabled: true
default-filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/fallback //默認(rèn)的兜底策略
routes:
- id: fee-service
uri: lb://fee-service //指定的服務(wù)
predicates:
- Path=/query //斷言路由配置
1.配置路由謂詞工廠(chǎng)和網(wǎng)關(guān)過(guò)濾器工廠(chǎng)
配置謂詞和過(guò)濾器有兩種方式:快捷方式和完全展開(kāi)參數(shù)。
名稱(chēng)和參數(shù)名稱(chēng)將列code在每個(gè)部分的第一句或第二句中。參數(shù)通常按快捷方式配置所需的順序列出。
快捷方式配置由過(guò)濾器名稱(chēng)識(shí)別,后跟等號(hào)(=),后跟用逗號(hào)分隔的參數(shù)值(,)。
配置文件實(shí)現(xiàn):
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- Cookie=mycookie,mycookievaluejava代碼實(shí)現(xiàn)過(guò)濾方式:
@Configuration
public class GateConfig {
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/check")
.filters(f -> f.filter(new IpWhitelistFilter())) // 注冊(cè)過(guò)濾器
.uri("lb://fee-service"))
.build();
}
}package com.umpay.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* @author zq
* data 2024-12-18
*/
@Configuration
@Slf4j
public class IpWhitelistFilter implements GatewayFilter, Ordered {
private static final String ALLOWED_IPS = "allowedIps";
private static final String DENIED_IPS = "deniedIps";
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String clientIp=exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
log.info("獲取到的ip:============:{}",clientIp);
String responseBody = "{\"error\": \"Custom error message\"}";
if(!"1111111".equals(clientIp)){
exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
exchange.getResponse().getHeaders().add("Content-Type", "application/json");
return exchange.getResponse()
.writeWith(Mono.just(exchange.getResponse()
.bufferFactory().wrap(responseBody.getBytes())));
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}gateway配置斷路器
導(dǎo)包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-feign</artifactId>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-reactor</artifactId>
</dependency>配置
spring:
cloud:
gateway:
discovery:
locator:
lower-case-service-id: true
enabled: true
default-filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/fallback
routes:
- id: fee-service
uri: lb://fee-service
predicates:
- Path=/query
filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/fallback
//斷路器配置
resilience4j:
circuitbreaker:
instances:
myCircuitBreaker:
slidingWindowSize: 10
failureRateThreshold: 50
minimumNumberOfCalls: 5
waitDurationInOpenState: 10s兜底接口
@RestController
@Slf4j
public class GateController {
@Autowired
private FeginClients feginClients;
@GetMapping("/fallback")
public Wrapper query(){
log.info("test:================");
return WrapperMapper.error();
}
}到此這篇關(guān)于spring cloud gateway 總結(jié)的文章就介紹到這了,更多相關(guān)spring cloud gateway內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring Cloud服務(wù)入口Gateway的介紹和使用問(wèn)題小結(jié)
- Spring Boot 3 整合 Spring Cloud Gateway實(shí)踐過(guò)程
- spring?cloud?gateway限流常見(jiàn)算法實(shí)現(xiàn)
- SpringCloud的網(wǎng)關(guān)Zuul和Gateway詳解
- SpringCloud Zuul和Gateway的實(shí)例代碼(搭建方式)
- SpringCloudGateway 網(wǎng)關(guān)登錄校驗(yàn)實(shí)現(xiàn)思路
- Spring?Cloud?Gateway服務(wù)網(wǎng)關(guān)限流問(wèn)題及解決
相關(guān)文章
Springboot 項(xiàng)目讀取Resources目錄下的文件(推薦)
java 計(jì)算中位數(shù)的實(shí)現(xiàn)方法
完美解決SpringCloud-OpenFeign使用okhttp替換不生效問(wèn)題
SpringBoot整合redis實(shí)現(xiàn)輸入密碼錯(cuò)誤限制登錄功能
spring?boot配置dubbo方式(properties)
Eclipse遠(yuǎn)程debug的步驟與注意事項(xiàng)
springBoot controller,service,dao,mapper,model層的作用說(shuō)明

