亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

gateway基本配置教程

 更新時(shí)間:2023年05月13日 10:21:47   作者:零點(diǎn)冰.  
路由(Route)由一個(gè)ID,一個(gè)目標(biāo)URI(最終路由到的url地址),一組斷言(匹配條件判斷)和一組過(guò)濾器定義,這篇文章主要介紹了gateway基本配置,需要的朋友可以參考下

1、gateway簡(jiǎn)介

路由轉(zhuǎn)發(fā) + 執(zhí)行過(guò)濾器鏈。

網(wǎng)關(guān),旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的統(tǒng)一的API路由管理方式。同時(shí),基于Filter鏈的方式提供了網(wǎng)關(guān)的基本功能,比如:鑒權(quán)、流量控制、熔斷、路徑重寫(xiě)、黑白名單、日志監(jiān)控等。
基本功能如下:

  • 統(tǒng)一入口:暴露出網(wǎng)關(guān)地址,作為請(qǐng)求唯一入口,隔離內(nèi)部微服務(wù),保障了后臺(tái)服務(wù)的安全性
  • 鑒權(quán)校驗(yàn):識(shí)別每個(gè)請(qǐng)求的權(quán)限,拒絕不符合要求的請(qǐng)求
  • 動(dòng)態(tài)路由:動(dòng)態(tài)的將請(qǐng)求路由到不同的后端集群中

2、gateway核心概念

  • 路由(Route):由一個(gè)ID,一個(gè)目標(biāo)URI(最終路由到的url地址),一組斷言(匹配條件判斷)和一組過(guò)濾器定義。如果斷言為真,則路由匹配。
  • 斷言(Predicate):通過(guò)斷言匹配http請(qǐng)求中的任何內(nèi)容(請(qǐng)求頭、請(qǐng)求參數(shù)等),如果匹配成功,則匹配斷言所在路由。
  • 過(guò)濾器(Filter):在請(qǐng)求前后執(zhí)行業(yè)務(wù)邏輯,比如鑒權(quán)、日志監(jiān)控、流量控制、修改請(qǐng)求頭、修改響應(yīng)等。

3、路由

spring:
  cloud:
	gateway:
	  routes:
	  - id: manager						# 路由唯一標(biāo)識(shí)
		uri: lb://manager_server		# 路由指向目的地URL或服務(wù)名,客戶(hù)端請(qǐng)求最終被轉(zhuǎn)發(fā)到的微服務(wù)
		predicates:
		- Path=/manager/** 				# 斷言:以manager開(kāi)頭的請(qǐng)求都負(fù)載到manager_server服務(wù)
		filters:
		- RewritePath=/manager/(?<segment>.*), /$\{segment} # 過(guò)濾器:過(guò)濾掉url里的manager,例如http://ip:port/manager/test -> http://ip:port/test
		order: 5						# 用于多個(gè)Route之間的排序,數(shù)值越小越靠前,匹配優(yōu)先級(jí)越高

4、斷言

spring:
  cloud:
    gateway:
      routes:
      - id: manager
        uri: https://manager_server
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]	# 時(shí)間點(diǎn)后匹配
		- Before=2017-01-20T17:42:47.789-07:00[America/Denver]	# 時(shí)間點(diǎn)前匹配
		- Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01-21T17:42:47.789-07:00[America/Denver]	# 時(shí)間區(qū)間匹配
		- Cookie=chocolate, ch.p						# 指定cookie正則匹配
		- Header=X-Request-Id, \d+						# 指定Header正則匹配
		- Host=**.somehost.org,**.anotherhost.org		# 請(qǐng)求Host匹配
		- Method=GET,POST								# 請(qǐng)求Method匹配指定請(qǐng)求方式
		- Path=/red/{segment},/blue/{segment}			# 請(qǐng)求路徑正則匹配
		- Query=green									# 請(qǐng)求包含某參數(shù)
		- Query=red, gree.								# 請(qǐng)求包含某參數(shù)并且參數(shù)值匹配正則表達(dá)式(匹配red;green,greet,gree...)
		- RemoteAddr=192.168.1.1/24						# 遠(yuǎn)程地址匹配
		# 設(shè)置分組和權(quán)重,按照路由權(quán)重選擇同一個(gè)分組中的路由
      - id: preManager1
        uri: https://preManager1
        predicates:
		- Weight=group1, 2
      - id: preManager2
        uri: https://preManager2
        predicates:
		- Weight=group1, 8

5、過(guò)濾器

5.1、過(guò)濾器介紹

按生命周期分類(lèi)

  • 前置(pre)過(guò)濾器: 在請(qǐng)求被路由之前調(diào)用:在chain.filter(exchange)前編寫(xiě)過(guò)濾器邏輯
  • 后置(post)過(guò)濾器: 在路由到微服務(wù)之后調(diào)用:通過(guò)chain.filter(exchange).then(Mono.fromRunnable(() -> {過(guò)濾器邏輯})實(shí)現(xiàn)

按類(lèi)型分類(lèi)

  • 局部(GatewayFilter)過(guò)濾器:作用在某一個(gè)路由上,使用時(shí)需要關(guān)聯(lián)指定的路由
  • 全局(GlobalFilter)過(guò)濾器:作用在所有路由上,不需要在配置文件中配置

5.2、內(nèi)置局部過(guò)濾器與使用

spring:
  cloud:
    gateway:
      routes:
      - id: gateway_filter
        uri: https://example.org
		predicates:
        - Path=/red/{segment}
        filters:
		# 1、為原始請(qǐng)求添加Header。headerName:X-Request-red,headerValue:blue。
        - AddRequestHeader=X-Request-red, blue		
		- AddRequestHeadersIfNotPresent=X-Request-Color-1:blue,X-Request-Color-2:green
		# 2、為原始請(qǐng)求添加參數(shù)。參數(shù)名,參數(shù)值
		- AddRequestParameter=red, blue
		# 3、為原始響應(yīng)添加Header
		- AddResponseHeader=X-Response-Red, Blue
		# 4、剔除響應(yīng)頭中重復(fù)的值
		- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
		# 5、為原始請(qǐng)求路徑添加前綴
		- PrefixPath=/mypath
		# 6、配置該過(guò)濾器后,會(huì)原始請(qǐng)求的host頭信息,并原封不動(dòng)的轉(zhuǎn)發(fā)出去,而不是被gateway的http客戶(hù)端重置。
		- PreserveHostHeader
		# 7、將原始請(qǐng)求重定向到指定的URL,參數(shù)為http狀態(tài)碼及重定向的url
		- RedirectTo=302, https://acme.org
		# 8、移除響應(yīng)Body中的指定key
		- RemoveJsonAttributesResponseBody=id,color
		# 9、移除原始請(qǐng)求中的指定Header
		- RemoveRequestHeader=X-Request-Foo
		# 10、移除原始請(qǐng)求中的指定參數(shù)
		- RemoveRequestParameter=red
		# 11、移除響應(yīng)中的指定Header
		- RemoveResponseHeader=X-Response-Foo
spring:
  cloud:
    gateway:
      routes:
      - id: gateway_filter
        uri: https://example.org
		predicates:
        - Path=/red/{segment}
        filters:
		# 12、請(qǐng)求限流,限流算法為令牌桶,以下示例為根據(jù)用戶(hù)id做限流
		# @Configuration
		# public class RateLimiterConfig {
		#	  @Bean
		#	  public KeyResolver userKeyResolver() {
		#		  return exchange -> Mono.just(Objects.requireNonNull(exchange.getRequest().getQueryParams().getFirst("userId")));
		#     }
		# }
		- name: RequestRateLimiter
          args:
            redis-rate-limiter.replenishRate: 10	# 允許用戶(hù)每秒處理的請(qǐng)求數(shù)
            redis-rate-limiter.burstCapacity: 20	# 令牌桶的容量,即允許在 1 秒內(nèi)完成的最大請(qǐng)求數(shù)。設(shè)置為 0 則表示拒絕所有請(qǐng)求。
            key-resolver: "#{@userKeyResolver}"		# 一個(gè)引用名為 userKeyResolver 的 bean 的 SpEL 表達(dá)式
		# 13、重寫(xiě)原始的請(qǐng)求路徑
		- RewritePath=/red/?(?<segment>.*), /$\{segment}
		# 14、重寫(xiě)響應(yīng)中的某個(gè)Header
		- RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***
		# 15、在轉(zhuǎn)發(fā)請(qǐng)求之前,強(qiáng)制執(zhí)行websession::save操作,保存會(huì)話(huà)狀態(tài)
		- SaveSession
		# 16、修改原始的請(qǐng)求路徑
		- SetPath=/{segment}
		# 17、修改原始請(qǐng)求中的指定Header值
		- SetRequestHeader=X-Request-Red, Blue
		# 18、修改原始響應(yīng)中的指定Header值
		- SetResponseHeader=X-Response-Red, Blue
		# 19、修改原始響應(yīng)的響應(yīng)碼
		- SetStatus=401
		# 20、剝離原始請(qǐng)求路徑
		- StripPrefix=2
		# 21、請(qǐng)求重試
		- name: Retry
          args:
            retries: 3						# 重試次數(shù)
            statuses: BAD_GATEWAY			# 應(yīng)被重試的 HTTP Status Codes
            methods: GET,POST				# 應(yīng)被重試的 HTTP Methods
            backoff:						# 為重試配置指數(shù)級(jí)的 backoff。重試時(shí)間間隔的計(jì)算公式為 firstBackoff * (factor ^ n),n 是重試的次數(shù);如果設(shè)置了 maxBackoff,最大的 backoff 限制為 maxBackoff. 如果 basedOnPreviousValue 設(shè)置為 true, backoff 計(jì)算公式為 prevBackoff * factor.
              firstBackoff: 10ms
              maxBackoff: 50ms
              factor: 2
              basedOnPreviousValue: false
		# 22、設(shè)置允許接收最大請(qǐng)求包的大小。如果請(qǐng)求包大小超過(guò)設(shè)置的值,則返413Payload Too Large
		- name: RequestSize
          args:
            maxSize: 5000000

5.3、內(nèi)置全局過(guò)濾器

  • GatewayMetricsFilter(0):統(tǒng)計(jì)一些網(wǎng)關(guān)的性能指標(biāo)
  • RouteToRequestUrlFilter(10000):把瀏覽器的URL請(qǐng)求的Path路徑添加到路由的URI之中。
  • NettyRoutingFilter(2147483647):通過(guò)HttpClient客戶(hù)端轉(zhuǎn)發(fā)真實(shí)的URL,并存儲(chǔ)返回的結(jié)果。
  • NettyWriteResponseFilter(-1):在所有的其它的過(guò)濾器執(zhí)行完成之后運(yùn)行,將響應(yīng)的數(shù)據(jù)發(fā)送給網(wǎng)關(guān)的客戶(hù)端。
  • ForwardRoutingFilter(2147483647):轉(zhuǎn)發(fā)路由過(guò)濾器,若URI是forward模式,過(guò)濾器會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到DispatcherHandler來(lái)處理請(qǐng)求。
  • ForwardPathFilter(0):解析路徑,并將路徑轉(zhuǎn)發(fā)。
  • LoadBalancerClientFilter(10100):負(fù)載均衡,解析服務(wù)名,獲取真實(shí)服務(wù)地址。
  • RemoveCachedBodyFilter(-2147483648):清除網(wǎng)關(guān)上下文中的緩存的請(qǐng)求Body。
  • WebsocketRoutingFilter(2147483646):如果請(qǐng)求中的ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR 屬性對(duì)應(yīng)的URL前綴為 ws 或 wss,會(huì)使用Spring Web Socket 模塊轉(zhuǎn)發(fā)WebSocket請(qǐng)求。WebSockets可以使用路由進(jìn)行負(fù)載均衡。
  • AdaptCachedBodyGlobalFilter(-2147482648):從請(qǐng)求中獲取body緩存到網(wǎng)關(guān)上下文。

5.4、自定義全局過(guò)濾器

創(chuàng)建自定義全局過(guò)濾器類(lèi) ,實(shí)現(xiàn)GlobalFilter和Ordered兩個(gè)接口。

  • GlobalFilter:全局過(guò)濾攔截器
  • Ordered:攔截器的順序,數(shù)字越低,優(yōu)先級(jí)越高

5.4.1、黑名單校驗(yàn)

/**
* 定義全局過(guò)濾器,會(huì)對(duì)所有路由生效
*/
@Slf4j
@Component // 讓容器掃描到,等同于注冊(cè)了
public class BlackListFilter implements GlobalFilter, Ordered {
	// 模擬黑名單(實(shí)際可以去數(shù)據(jù)庫(kù)或者redis中查詢(xún))
	private static List<String> blackList = new ArrayList<>();
	static {
		blackList.add("0:0:0:0:0:0:0:1"); // 模擬本機(jī)地址
	}
	/**
	* 過(guò)濾器核心方法
	* @param exchange 封裝了request和response對(duì)象的上下文
	* @param chain 網(wǎng)關(guān)過(guò)濾器鏈(包含全局過(guò)濾器和單路由過(guò)濾器)
	* @return
	*/
	@Override
	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
		// 思路:獲取客戶(hù)端ip,判斷是否在黑名單中,在的話(huà)就拒絕訪(fǎng)問(wèn),不在的話(huà)就放行
		ServerHttpRequest request = exchange.getRequest();
		ServerHttpResponse response = exchange.getResponse();
		// 從request對(duì)象中獲取客戶(hù)端ip
		String clientIp = request.getRemoteAddress().getHostString();
		// 拿著clientIp去黑名單中查詢(xún),存在的話(huà)就決絕訪(fǎng)問(wèn)
		if(blackList.contains(clientIp)) {
			// 拒絕訪(fǎng)問(wèn),返回
			response.setStatusCode(HttpStatus.UNAUTHORIZED); // 狀態(tài)碼
			log.debug("=====>IP:" + clientIp + " 在?名單中,將被拒絕訪(fǎng)問(wèn)!");
			String data = "Request be denied!";
			DataBuffer wrap = response.bufferFactory().wrap(data.getBytes());
			return response.writeWith(Mono.just(wrap));
		}
		// 合法請(qǐng)求,放行,執(zhí)行后續(xù)的過(guò)濾器
		return chain.filter(exchange);
	}
	/**
	* @return 過(guò)濾器的順序(優(yōu)先級(jí)),數(shù)值越小,優(yōu)先級(jí)越高
	*/
	@Override
	public int getOrder() {
		return 0;
	}
}

5.4.2、模擬登錄校驗(yàn)

在過(guò)濾器中檢查請(qǐng)求中是否攜帶token請(qǐng)求頭。如果token請(qǐng)求頭存在則放行;如果token為空或者不存在則返回認(rèn)證失敗狀態(tài)碼。

@Component
public class MyGlobalFilter implements GlobalFilter,Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        boolean token = exchange.getRequest().getHeaders().containsKey("token");
        System.out.println("----全局過(guò)濾器token----"+token);
        if (!token){
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            ServerHttpResponse response = exchange.getResponse();
            return response.setComplete();
        }
        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        return 1;
    }
}

6、一個(gè)簡(jiǎn)單的gateway配置實(shí)例

spring:
  cloud:
    gateway:
      discovery:
        locator:
          # 表明Gateway開(kāi)啟服務(wù)注冊(cè)和發(fā)現(xiàn)的功能,并且Spring Cloud Gateway自動(dòng)根據(jù)服務(wù)發(fā)現(xiàn)為每一個(gè)服務(wù)創(chuàng)建了一個(gè)router,這個(gè)router將以服務(wù)名開(kāi)頭的請(qǐng)求路徑轉(zhuǎn)發(fā)到對(duì)應(yīng)的服務(wù)
          enabled: true
          # 將請(qǐng)求路徑上的服務(wù)名配置為小寫(xiě)(因?yàn)榉?wù)注冊(cè)的時(shí)候,向注冊(cè)中心注冊(cè)時(shí)將服務(wù)名轉(zhuǎn)成大寫(xiě)的了)
          lower-case-service-id: true
      routes:
	  # 系統(tǒng)管理
      - id: sys-mgt
        uri: lb://sysmgt
        predicates:
        - Path=/sys-mgt/** 	#以sys-mgt開(kāi)頭的請(qǐng)求都負(fù)載到sysmgt服務(wù)
		- Method=GET		#只匹配GET請(qǐng)求
        filters:
        - RewritePath=/sys-mgt/(?<segment>.*), /$\{segment} #過(guò)濾掉url里的sys-mgt,例如http://ip:port/sys-mgt/test -> http://ip:port/test
		- PrefixPath=/mgt									#為請(qǐng)求添加/mgt前綴,再結(jié)合RewritePath過(guò)濾器,http://ip:port/sys-mgt/test -> http://ip:port/mgt/test

到此這篇關(guān)于gateway基本配置的文章就介紹到這了,更多相關(guān)gateway基本配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot添加多數(shù)據(jù)源的方法實(shí)例教程

    springboot添加多數(shù)據(jù)源的方法實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于springboot添加多數(shù)據(jù)源方法的相關(guān)資料,在實(shí)際開(kāi)發(fā)中經(jīng)??赡苡龅皆谝粋€(gè)應(yīng)用中可能要訪(fǎng)問(wèn)多個(gè)數(shù)據(jù)庫(kù)多的情況,需要的朋友可以參考下
    2023-09-09
  • java連接MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)代碼

    java連接MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java連接MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)代碼,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 理解Java注解及Spring的@Autowired是如何實(shí)現(xiàn)的

    理解Java注解及Spring的@Autowired是如何實(shí)現(xiàn)的

    今天通過(guò)本文帶領(lǐng)大家學(xué)習(xí)注解的基礎(chǔ)知識(shí),學(xué)習(xí)Spring的@Autowired是怎么實(shí)現(xiàn)的,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-07-07
  • 基于Java實(shí)現(xiàn)中文分詞系統(tǒng)的示例代碼

    基于Java實(shí)現(xiàn)中文分詞系統(tǒng)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)易的中文分詞系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-07-07
  • JAVA中的函數(shù)接口示例詳解

    JAVA中的函數(shù)接口示例詳解

    創(chuàng)建一個(gè)自定義的Sayable接口,這是一個(gè)使用@FunctionalInterface注解的函數(shù)式接口,這篇文章主要介紹了JAVA中的函數(shù)接口,你都用過(guò)嗎,需要的朋友可以參考下
    2023-11-11
  • SpringMVC上傳圖片與訪(fǎng)問(wèn)

    SpringMVC上傳圖片與訪(fǎng)問(wèn)

    這篇文章主要介紹了SpringMVC上傳圖片與訪(fǎng)問(wèn)的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • java設(shè)計(jì)模式之適配器模式

    java設(shè)計(jì)模式之適配器模式

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之適配器模式,介紹了什么是適配器模式,適配器模式的種類(lèi),感興趣的小伙伴們可以參考一下
    2016-08-08
  • SpringMVC打印請(qǐng)求參數(shù)和響應(yīng)數(shù)據(jù)最優(yōu)方案

    SpringMVC打印請(qǐng)求參數(shù)和響應(yīng)數(shù)據(jù)最優(yōu)方案

    項(xiàng)目中經(jīng)常需要打印http請(qǐng)求的參數(shù)和響應(yīng)數(shù)據(jù),本文給大家講解如何在SpringMVC打印請(qǐng)求參數(shù)和響應(yīng)數(shù)據(jù)最優(yōu)方案,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • Springboot @Import 詳解

    Springboot @Import 詳解

    這篇文章主要介紹了Springboot @Import 詳解,仔細(xì)看了下Springboot關(guān)于@Import的處理過(guò)程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • java異常級(jí)別與捕獲的示例代碼

    java異常級(jí)別與捕獲的示例代碼

    本次模擬一個(gè)異常實(shí)例,驗(yàn)證一下異常的捕獲,通過(guò)實(shí)例代碼給大家解析java異常級(jí)別與捕獲的操作方法,感興趣的朋友跟隨小編一起看看吧
    2021-07-07

最新評(píng)論