日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

如何為Spring Cloud Gateway加上全局過濾器

瀏覽:158日期:2023-07-20 08:43:47

既然是一個網關。那么全局過濾器肯定是少不了的一個存在。像是鑒權、認證啥的不可能每個服務都做一次,一般都是在網關處就搞定了。Zuul他就有很強大的過濾器體系來給人使用。Gateway當然也不會差這么點東西。對于SpringCloud體系來說,一切的實現都是那么的簡單。那么廢話不多說,直接開始寫起來。 Gateway內部有一個接口 名為GlobalFilter,這個就是Gateway的全局過濾器接口,只要在應用中實現此接口后注冊為Spring的Bean,背后就會幫你將這個實現注冊到全局過濾器鏈條里邊去。我這里就簡單的寫了個模擬鑒權的過濾器實現:

@Componentpublic class AuthFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String token = exchange.getRequest().getHeaders().getFirst('Authorization'); //不為空則通過 if (!StringUtils.isEmpty(token)) return chain.filter(exchange); ServerHttpResponse response = exchange.getResponse(); // 封裝錯誤信息 Map<String, Object> responseData = Maps.newHashMapWithExpectedSize(3); responseData.put('code', HttpStatus.UNAUTHORIZED.value()); responseData.put('message', 'Token is empty'); responseData.put('cause', 'Token is empty'); // 將信息轉換為 JSON ObjectMapper objectMapper = new ObjectMapper(); byte[] data = new byte[0]; try { data = objectMapper.writeValueAsBytes(responseData); } catch (JsonProcessingException e) { e.printStackTrace(); } // 返回錯誤信息json DataBuffer buffer = response.bufferFactory().wrap(data); response.setStatusCode(HttpStatus.UNAUTHORIZED); response.getHeaders().add('Content-Type', 'application/json;charset=UTF-8'); return response.writeWith(Mono.just(buffer)); } //最后執行 @Override public int getOrder() { return Ordered.LOWEST_PRECEDENCE; }}

雖說是鑒權,但實際上我這就是個簡單的demo而已。想知道真正的Spring Security鑒權/認證怎么寫?我以前寫的這個:https://github.com/skypyb/code_demo/tree/master/spring-security-demo 應該可以幫助你。 看我寫的這個過濾器內部實現哈,其實就是拿出Request Header中的 Authorization字段(token) 然后判斷是否存在。不存在就返回錯誤,存在就交給鏈條中的下一個過濾器。 過濾器其實也沒啥好說的,那么說說限流。關于限流這個東西,常見的算法就是漏桶和令牌桶了,對于一個應用單機限流來說也復雜不到哪兒去??恐鴊oogle guava包里的RateLimiter工具都能搞定大多數場景了。不過既然人家Gateway好心好意給你搞了個限流的實現。那么還是尊重他用一下。由于Gateway是用的Redis和lua腳本實現了令牌桶的算法,那么先導入幾個需要的依賴:

<!--Redis begin--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis-reactive</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <!--Redis end-->

既然是Redis,那還是先配一下Redis序列化先:

@Configurationpublic class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringRedisSerializer); redisTemplate.setHashKeySerializer(stringRedisSerializer); redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class)); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setConnectionFactory(connectionFactory); return redisTemplate; }}

萬事俱備,開始進行限流的具體實現了。 既然是限流,那么也得有個限流策略是根據用戶來限流呢?還是說根據請求路徑限流?或者是IP限流?不過這個都是由需求來決定了,我這就簡單的寫個根據IP來限流的。人家也給你封裝完畢了,只需要你自己實現KeyResolver這個接口就可以。由于實現這個一般來說也就一行代碼,所以我就不寫個單獨的類去實現了,而是直接寫在配置類里邊。

@Configurationpublic class GatewayRateLimiterConfig { /** * Gateway通過內置的RequestRateLimiter過濾器實現限流,用的是令牌桶算法,借助Redis保存中間數據 * 這里自定義一個KeyResolver * 作用是對來源ip進行限流 */ @Bean(value = 'ipKeyResolver') public KeyResolver ipKeyResolver() { return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()); }}

看,我其實只需要返回我需要限制的東西就可以了。我這里提取到用戶的IP將其返回,即可實現通過ip來進行限流的策略。不過限流相關的配置寫了,那也得用起來。這個怎么用起來? 其實直接在配置文件里配置就OK了

spring: application: # 應用名稱 name: sc-demo-alibaba-gateway cloud: nacos: discovery: server-addr: 192.168.3.105:8848 #注冊進nacos # 使用 Sentinel 作為熔斷器 sentinel: transport: port: 18102 dashboard: 192.168.3.105:8858 # 路由網關配置 gateway: # 這里是設置與服務注冊發現組件結合,這樣可以采用服務名的路由策略 discovery: locator: enabled: true # 配置路由規則 routes: - id: ROUTER#sc-demo-alibaba-consumer #這個是路由ID,需要保證在所有路由定義中唯一,值隨便寫就是了 # 采用 LoadBalanceClient 方式請求,以 lb:// 開頭,后面的是注冊在 Nacos 上的服務名 uri: lb://sc-demo-alibaba-consumer predicates: # Method ,這里是匹配 GET 和 POST 請求 - Method=GET,POST filters: - name: RequestRateLimiter args:redis-rate-limiter.burstCapacity: 20redis-rate-limiter.replenishRate: 5key-resolver: ’#{@ipKeyResolver}’ - id: ROUTER#sc-demo-alibaba-provider uri: lb://sc-demo-alibaba-provider predicates: - Method=GET,POST #Redis配置 redis: host: 192.168.3.105 port: 6379 #Redis連接池配置 jedis: pool: min-idle: 0 max-idle: 8 max-active: 8 max-wait: -1msserver: port: 8888feign: sentinel: enabled: truemanagement: endpoints: web: exposure: include: '*'# 配置日志級別,方別調試logging: level: org.springframework.cloud.gateway: debug

這里可以看到,除了Redis配置 ( spring.redis.** )以外。主要就是對于Getway的配置。在Gateway路由配置中,設置了一個filters參數。這個是為了指定路由的各種過濾器的。這個參數也有很多種,可以參考官方講解: https://cloud.spring.io/spring-cloud-gateway/2.0.x/single/spring-cloud-gateway.html#gateway-route-filters

我這就是指定了一個RequestRateLimiter,請求限流。

redis-rate-limiter.burstCapacity: 20

這個參數表示突發容量,即每秒可以最大通過多少次請求

redis-rate-limiter.replenishRate: 5

這個是令牌桶的補充速度,每秒往桶里邊放幾個令牌

key-resolver: ‘#{@ipKeyResolver}’

這個就是用上KeyResolver的具體實現了,這里用spel表達式指定我寫的那個ip限制類

準備好之后將應用啟動就完事了,想測的話可以用jmeter測測看,或者將請求限制寫的更小一點,在網頁上狂按f5也行。

以上就是如何為Spring Cloud Gateway加上全局過濾器的詳細內容,更多關于Spring Cloud Gateway添加全局過濾器的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品国产免费| 久久青草久久| 综合亚洲视频| 日本欧美在线| 国产福利91精品一区二区| 国产不卡人人| 日韩一级网站| 日韩高清欧美激情| 精品国产亚洲一区二区三区大结局| 久久精品三级| 国产91精品对白在线播放| 美女尤物久久精品| 国产日本精品| 电影亚洲精品噜噜在线观看| aa亚洲婷婷| 国产亚洲高清在线观看| 三级小说欧洲区亚洲区| 日韩在线一区二区| 精品国产欧美日韩| 欧美日韩国产在线一区| 欧美午夜网站| 亚洲精品在线影院| 日欧美一区二区| 韩国久久久久久| 亚洲啊v在线免费视频| 日韩av二区| 蜜臀av亚洲一区中文字幕| 国产精品xxxav免费视频| 99久久激情| 国产精品入口久久| 欧美在线影院| 欧美激情精品| 蜜芽一区二区三区| 97精品国产| 91精品国产自产精品男人的天堂| 在线手机中文字幕| 日韩av一区二| 国产一区日韩一区| 久久99久久久精品欧美| 亚洲欧美日韩一区在线观看| 国产999精品在线观看| 亚洲资源在线| 色爱综合av| 久久精品资源| 日韩免费精品| 欧美日韩中文字幕一区二区三区| 麻豆精品在线| 精品不卡一区| 久久久久99| 亚洲2区在线| 久久久91麻豆精品国产一区| 不卡中文字幕| 久久久久黄色| 亚洲开心激情| 中日韩男男gay无套| av中文资源在线资源免费观看| 亚洲色图网站| 99久精品视频在线观看视频| 精品美女在线视频| 91亚洲精品视频在线观看| 欧美综合国产| 在线日韩中文| 日韩免费看片| 久久中文精品| 国产日韩一区二区三免费高清| 女主播福利一区| 久久久国产精品一区二区中文| 国产在线一区不卡| 欧美激情日韩| 欧美精品影院| 日韩欧美久久| 亚洲有吗中文字幕| 性色av一区二区怡红| 啪啪国产精品| 欧美aa在线观看| 手机在线电影一区| 精品亚洲二区| 国产精品4hu.www| 国产精品一区二区av交换| 亚洲欧洲美洲国产香蕉| 日韩精品一级二级| 免费观看日韩电影| 亚洲精品在线国产| 少妇精品久久久一区二区三区| 日韩专区欧美专区| 久久福利一区| 老司机精品久久| 亚洲激情社区| 尹人成人综合网| 亚洲少妇自拍| 亚洲欧美网站| 中文字幕免费一区二区| 亚洲三级国产| 日韩国产欧美在线视频| 奇米亚洲欧美| 国产剧情一区二区在线观看| 国产免费久久| 精品视频一二| 欧美天堂视频| 欧美手机在线| 亚洲一卡久久| 日韩中文字幕在线一区| 欧美自拍一区| 精品91福利视频| 国产在线|日韩| 国产精品日韩久久久| 亚洲精品欧美| 国产精品白丝一区二区三区| 97人人精品| 激情综合在线| 亚洲深深色噜噜狠狠爱网站| 日本va欧美va精品| 精品国产乱码久久久久久樱花| 国产精品久久久久久久久妇女| 久久免费高清| 日韩在线一二三区| 欧美日韩中出| 三上亚洲一区二区| 激情五月综合| 亚洲精品黄色| 久久精品一区二区国产| 中文字幕成在线观看| 亚洲免费精品| 国产欧美丝祙| 日韩精品一区二区三区免费观影 | 樱桃成人精品视频在线播放| 亚洲区欧美区| 久久福利在线| 久久视频精品| 日本伊人午夜精品| 成人午夜在线| 亚洲一区二区av| 国产精品极品在线观看| 午夜精品成人av| 免播放器亚洲一区| 国产成人久久精品一区二区三区| 伊人影院久久| 国产精品xxx在线观看| 欧美精品一二| 国产欧美日韩精品一区二区三区| 成人免费电影网址| 日韩1区2区日韩1区2区| 五月天av在线| 日韩精品中文字幕一区二区| 亚洲三级欧美| 亚洲a级精品| 久久天堂成人| 青青草国产精品亚洲专区无| 欧美日韩免费看片| 日韩高清在线不卡| 日韩精品久久久久久久电影99爱| 亚洲涩涩av| 日本不良网站在线观看| 亚洲欧洲美洲国产香蕉| 韩国精品主播一区二区在线观看| 最新国产精品| 亚洲va在线| 国产伦一区二区三区| 欧美精品九九| 欧美国产偷国产精品三区| 亚洲精品一区二区在线播放∴| 国产在线观看www| 日韩精品一区二区三区中文在线| а√天堂8资源中文在线| 日韩中文字幕无砖| 成人av二区| 高清av一区| 国产日韩视频| 蜜臀va亚洲va欧美va天堂| 久久久精品五月天| 久久三级中文| 日本精品久久| 国产精品毛片| 欧美羞羞视频| 美女精品视频在线| 亚洲三级毛片| 日韩视频一区| 久久国产直播| 日韩成人免费| 久久99精品久久久野外观看| 免费黄网站欧美| 国产综合欧美| 成人亚洲欧美| 麻豆精品视频在线观看免费| 日本在线不卡视频| 日韩影院在线观看| 99香蕉国产精品偷在线观看| 蜜桃成人精品| 精品国产乱码久久久| 国产精品久久国产愉拍| 97久久中文字幕| 日本中文字幕不卡| 亚洲专区一区| 一本一道久久a久久精品蜜桃| 亚洲精品永久免费视频| 精品国产aⅴ| 美腿丝袜亚洲一区| 久久爱www成人| 国产探花在线精品一区二区| 亚洲不卡视频|