91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

spring cloud 2.x版本 Gateway熔斷、限流教程

發布時間:2020-05-18 19:55:29 來源:網絡 閱讀:512 作者:wx5d6cccb1cb158 欄目:編程語言

前言

本文采用Spring cloud本文為2.1.8RELEASE,version=Greenwich.SR3
spring cloud 2.x版本 Gateway熔斷、限流教程

概術

在高并發應用中,緩存、限流、降級,是我們保護系統應用的三大利器。在開發一些api接口的時候,通常也會在網關層做限流控制,一方面是為了防止大量的請求是服務器過載,導致服務器不可用,另一方面也是防止其他人的惡習網絡***。

常見的限流方式,如Hystrix的使用線程池隔離,超過線程池的負載走熔斷的邏輯;也有通過滑動的時間窗口來控制流量。

常用的限流算法有,計數器算法、漏桶算法、令牌桶算法,這里就不對相關算法進行描述。

熔斷

Spring Cloud Gateway的熔斷可以基于Hystrix實現。

1.1 增加pom相關依賴**

<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

1.2 修改application.yml**

server:
 port: 8100
spring:
 redis:
 host: localhost
 port: 6379
 application:
 name: spring-gateway
 cloud:
 gateway:
 discovery:
 locator:
 enabled: true # 開啟通過服務中心的自動根據 serviceId 創建路由的功能
 default-filters:
 - My=true
 routes:
 - id: ribbon-route
 uri: lb://EUREKA-RIBBON
 order: 0
 predicates:
 - Path=/ribbon/**
 filters:
 - name: Hystrix
 args:
 name: fallback
 fallbackUri: forward:/fallback
 - StripPrefix=1 #去掉前綴,具體實現參考StripPrefixGatewayFilterFactory
 - AddResponseHeader=X-Response-Default-Foo, Default-Bar
 - id: feign-route
 uri: lb://EUREKA-FEIGN
 order: 0
 predicates:
 - Path=/feign/**
 filters:
 - StripPrefix=1
 - AddResponseHeader=X-Response-Default-Foo, Default-Bar
eureka:
 instance:
 hostname: eureka1.server.com
 lease-renewal-interval-in-seconds: 5
 lease-expiration-duration-in-seconds: 10
 client:
 service-url:
 defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/

只設置ribbon的路由熔斷,feign設置和ribbon相同。

Hystrix支持兩個參數:

name:即HystrixCommand的名字

fallbackUri:fallback對應的uri,這里的uri僅支持forward:schemed

1.3 創建FallBackController

package spring.cloud.demo.spring.gateway.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FallBackController {
 @GetMapping("/fallback")
 public String fallback() {
 return "Error:fallback";
 }

}

1.4 啟動相關服務

啟動eureka-server、eureka-client、eureka-ribbon、spring-gateway相關服務,訪問 http://localhost :8100/ribbon/sayHello地址,頁面顯示結果如下:

spring cloud 2.x版本 Gateway熔斷、限流教程
然后我們將eureka-ribbon服務停掉,刷新頁面,返回結果如下:
spring cloud 2.x版本 Gateway熔斷、限流教程
至此:熔斷的簡單配置實現就完成了,如需自定義熔斷策略可以參考HystrixGatewayFilter的內容。

限流

Spring Cloud Gateway官方提供了RequestRateLimiterGatewayFilterFactory類,使用redis和lua腳本來實現令牌桶的方式。我們也可以基于Google Guava中的RateLimiter、Bucket4j、RateLimitJ來實現。本文將采用官方提供的方式來實現。

1.1 增加pom相關依賴

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

1.2 修改application.yml配置

server:
 port: 8100
spring:
 redis:
 host: localhost
 port: 6379
 application:
 name: spring-gateway
 cloud:
 gateway:
 discovery:
 locator:
 enabled: true # 開啟通過服務中心的自動根據 serviceId 創建路由的功能
 default-filters:
 - My=true
 routes:
 - id: ribbon-route
 uri: lb://EUREKA-RIBBON
 order: 0
 predicates:
 - Path=/ribbon/**
 filters:
 - name: RequestRateLimiter
 args:
 key-resolver: '#{@ipKeyResolver}'
 redis-rate-limiter.replenishRate: 200
 redis-rate-limiter.burstCapacity: 400
 - name: Hystrix
 args:
 name: fallback
 fallbackUri: forward:/fallback
 - StripPrefix=1 #去掉前綴,具體實現參考StripPrefixGatewayFilterFactory
 - AddResponseHeader=X-Response-Default-Foo, Default-Bar
 - id: feign-route
 uri: lb://EUREKA-FEIGN
 order: 0
 predicates:
 - Path=/feign/**
 filters:
 - StripPrefix=1
 - AddResponseHeader=X-Response-Default-Foo, Default-Bar
eureka:
 instance:
 hostname: eureka1.server.com
 lease-renewal-interval-in-seconds: 5
 lease-expiration-duration-in-seconds: 10
 client:
 service-url:
 defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/

說明:

1 增加redis相關配置

2.1 -name: RequestRateLimiter, filter的名稱,必須是RequestRateLimiter

2.2 redis-rate-limiter.replenishRate: 允許用戶每秒處理的請求個數

2.3 redis-rate-limiter.burstCapacity: 令牌桶的容量,允許在一秒內完成的最大請求數

2.4 key-resolver: 使用的Bean名稱,規則為按名稱引用Bean

1.3 增加限流Bean

package spring.cloud.demo.spring.gateway.config;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;
@Configuration
public class BeanConfig {
 @Bean
 public KeyResolver ipKeyResolver() {
 return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
 }
}

這里設置的是ip的限流。

1.4 啟動相關服務

首先啟動redis服務,然后順序啟動eureka-server、eureka-client、eureka-ribbon、spring-gateway相關服務,訪問 http://localhost:8100/ribbon/sayHello。為了演示方便可以將redis-rate-limiter.replenishRate和redis-rate-limiter.burstCapacity參數設置成1和3,然后瘋狂刷新頁面可以看到有請求失敗的情況(最好使用壓測工具來演示)。同時我們還要打開redis的監控(monitor命令),可以看到redis的監控,如下:
spring cloud 2.x版本 Gateway熔斷、限流教程
說明:redis中會有2個key,request_rate_limiter.{xxx}.timestamp和request_rate_limiter.{xxx}.tokens

總結

本文簡單的實現了Gateway的熔斷和限流。總體來說Spring Cloud Gateway提供的路由網關、過濾器、熔斷、限流還是都比較簡單,也非常靈活,可以根據自己的需求來自定義。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

边坝县| 岳西县| 淳安县| 麻江县| 石嘴山市| 乌兰浩特市| 龙南县| 罗田县| 九江市| 手游| 琼结县| 义乌市| 都安| 清新县| 涟水县| 聂荣县| 漳州市| 金川县| 台东县| 通河县| 汨罗市| 云南省| 彩票| 平潭县| 浦城县| 平南县| 柳州市| 西安市| 堆龙德庆县| 门头沟区| 伊春市| 始兴县| 伊川县| 台州市| 宁海县| 军事| 东源县| 肇东市| 安西县| 汕尾市| 冀州市|