SpringCloud網(wǎng)關(guān)Gateway功能實現(xiàn)
摘要
本文介紹微服務(wù)中網(wǎng)關(guān)的功能,并通過代碼展示如何實現(xiàn)服務(wù)發(fā)現(xiàn)、路由轉(zhuǎn)發(fā)、統(tǒng)一認(rèn)證、日志監(jiān)控、跨域處理等功能。
認(rèn)識網(wǎng)關(guān)Gateway
網(wǎng)關(guān)Gateway是微服務(wù)項目的后端入口,負(fù)責(zé)請求路由、負(fù)載均衡、安全控制、協(xié)議轉(zhuǎn)換等功能,對整個微服務(wù)項目做出統(tǒng)一的請求前置處理功能。通過網(wǎng)關(guān)的轉(zhuǎn)發(fā),可避免直接暴露具體服務(wù)實例。
功能
- 路由轉(zhuǎn)發(fā):作為API網(wǎng)關(guān),核心功能之一是將請求路由到正確的后端服務(wù),可靈活地定義路由規(guī)則,將不同的請求路徑、主機或參數(shù)等映射到不同的服務(wù)。
- 過濾器:用于修改請求和響應(yīng),如添加請求頭、修改響應(yīng)體、限流、熔斷等。
- 服務(wù)發(fā)現(xiàn):與SpringCloud的服務(wù)發(fā)現(xiàn)組件nacos等集成,自動發(fā)現(xiàn)和路由到后端服務(wù)實例。
- 統(tǒng)一認(rèn)證:進(jìn)行統(tǒng)一的身份認(rèn)證和授權(quán),保護后端服務(wù)不受未授權(quán)訪問。
- 監(jiān)控與日志:方便統(tǒng)一收集和處理請求日志,監(jiān)控系統(tǒng)運行狀態(tài)。
- 負(fù)載均衡:與SpringCloudLoadBalancer集成,實現(xiàn)對后端服務(wù)的負(fù)載均衡,將請求分發(fā)到多個實例上。
- 限流與熔斷:支持Hystrix等組件,實現(xiàn)限流和熔斷功能,保護后端服務(wù)免受過載影響。
- 斷言功能:通過斷言工廠來實現(xiàn)對請求的靈活匹配,如根據(jù)請求路徑、方法、參數(shù)、頭信息等進(jìn)行路由決策。
代碼示例
導(dǎo)入依賴
<!--nacos 注冊中心 客戶端依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--網(wǎng)關(guān)依賴 路由轉(zhuǎn)發(fā)+請求限流+身份認(rèn)證+負(fù)載均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
1)路由轉(zhuǎn)發(fā)
配置application.yml
spring:
application:
name: springgateway-use #服務(wù)名
servlet:
context-path: /
cloud:
nacos:
server-addr: localhost:8848 #nacos服務(wù)端地址,默認(rèn)8848
discovery:
ephemeral: true #默認(rèn)是臨時實例
gateway:
discovery:
locator:
enabled: true # 啟用服務(wù)發(fā)現(xiàn)
lower-case-service-id: true # 服務(wù)名小寫
# 路由配置
routes:
-id: feign-producer-route #確保路由 ID 唯一,路徑匹配規(guī)則正確。
uri: lb://feign-producer # 負(fù)載均衡到服務(wù)名 feign-producere
predicates:
- Path=/producer/** # 匹配路徑 /producer/**
filters:
- StripPrefix=1 # 過濾器,去掉路徑前綴 去除路徑前綴 /producer
配置類
package org.coffeebeans.config;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GatewayConfig {
//配置自定義的路由規(guī)則
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("feign-producer", r -> r
.path("/producer/**") // 匹配 "/producer/**" 路徑的請求
.uri("lb://feign-producer")) // 轉(zhuǎn)發(fā)到名為 "feign-producer" 的微服務(wù)
.build();
}
}
2)過濾器 權(quán)限校驗
package org.coffeebeans.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.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
//統(tǒng)一認(rèn)證 自定義全局過濾器 應(yīng)用于所有請求 權(quán)限校驗
@Component
public class GlobalAuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 檢查請求頭中的 authorization
String authHeader = exchange.getRequest().getHeaders().getFirst("Authorization");
if (authHeader == null || !authHeader.equals("admin")) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -1; // 設(shè)置過濾器的優(yōu)先級
}
}
3)過濾器 日志監(jiān)控
package org.coffeebeans.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
//日志過濾
@Slf4j
@Component
public class GlobalLogFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
long startTime = System.currentTimeMillis(); // 記錄請求開始時間
String requestUri = exchange.getRequest().getURI().toString(); // 獲取請求地址
// 替換響應(yīng)對象并繼續(xù)過濾器鏈
return chain.filter(exchange.mutate().build())
.doOnSuccess(aVoid -> {
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
log.info("請求地址: {}, 耗時: {}ms", requestUri, duration);
});
}
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
}
緩存請求
package org.coffeebeans.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
//緩存請求正文 避免Stream closed 錯誤
@Component
public class GlobalCacheRequestFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (request) ->
chain.filter(exchange.mutate().request(request).build())
);
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
4)過濾器 跨域處理
package org.coffeebeans.filter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpMethod;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;
//過濾器 統(tǒng)一cors跨域策略
@Configuration
public class GlobalCorsFilter {
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public CorsWebFilter filter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod(HttpMethod.GET); // 允許GET請求
config.addAllowedMethod(HttpMethod.POST); // 允許POST請求
config.addAllowedMethod(HttpMethod.OPTIONS); // 允許OPTIONS預(yù)檢請求
config.addAllowedHeader(CorsConfiguration.ALL); // 允許所有請求頭
config.addAllowedOriginPattern(CorsConfiguration.ALL); // 允許所有來源
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(newPathPatternParser());
source.registerCorsConfiguration("/**", config); // 應(yīng)用到所有路徑
return new CorsWebFilter(source);
}
}
總結(jié)
以上我們了解了SpringCloudGateway的功能,并通過代碼展示了如何實現(xiàn)服務(wù)發(fā)現(xiàn)、路由轉(zhuǎn)發(fā)、統(tǒng)一認(rèn)證、日志監(jiān)控、跨域處理的基本功能。
到此這篇關(guān)于SpringCloud網(wǎng)關(guān)Gateway功能實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringCloud網(wǎng)關(guān)Gateway內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 解決SpringCloud gateway網(wǎng)關(guān)配置MVC攔截器報錯問題
- SpringCloud Gateway 權(quán)限認(rèn)證的實現(xiàn)
- SpringCloud Gateway中斷言路由和過濾器的使用詳解
- SpringCloud Zuul和Gateway的實例代碼(搭建方式)
- SpringCloudGateway路由失效問題
- SpringCloud GateWay動態(tài)路由用法
- SpringCloud Gateway路由核心原理解析
- SpringCloud-Gateway網(wǎng)關(guān)的使用實例教程
- 使用SpringCloud Gateway解決跨域問題
相關(guān)文章
java基本教程之常用的實現(xiàn)多線程的兩種方式 java多線程教程
下面開始學(xué)習(xí)“常用的實現(xiàn)多線程的2種方式”:Thread 和 Runnable。之所以說是常用的,是因為通過還可以通過java.util.concurrent包中的線程池來實現(xiàn)多線程2014-01-01
springboot如何通過接口實現(xiàn)動態(tài)二維碼的定時刷新
這篇文章主要為大家詳細(xì)介紹了springboot如何通過接口實現(xiàn)動態(tài)二維碼的定時刷新功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-05-05
SpringFox實現(xiàn)自動生成RESTful?API文檔
在開發(fā)?RESTful?API?時,編寫?API?文檔是一個重要的任務(wù),這篇文章為大家介紹了如何使用?SpringFox?自動生成?RESTful?API?文檔,并提供示例代碼,需要的可以參考一下2023-06-06
Java關(guān)于List集合去重方案詳細(xì)介紹
實際項目開發(fā)中,很多業(yè)務(wù)場景下都會遇見集合去重。在說到List集合去重之前,首先我們回顧下普通類型的list如何去重2021-09-09

