Resilience4j_服务端限流、并发控制_RateLimiter
·
一、背景描述
由于Hystrix官方已经停止更新,Spring 官网推荐使用Resilience4j作为服务的熔断保护中间件,可见Resilience4j的重要性。
为了探究Resilience4j实现服务熔断功能, 我们选用了 consul 作为注册中心,启动了一个服务端(waiter),验证其服务端限流、并发控制熔断。我们在极端的时间内访问较多次数指定接口,观察接口是否会进行熔断处理。 consul 启动及运行状态监控,不在这里描述, 我们默认 consul 已经正常运行。
本地安装运行consul 参考:https://jingyan.baidu.com/article/ca41422f732f961eaf99ed5f.html
在RateLimiter中有两种使用方式:基于注解,或熔断对象注入两种方式,下面会分别进行演示。
二、代码演示
2.1 pom主要依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>0.14.1</version>
</dependency>
2.2 配置文件
application.properties
#0表示服务器随机端口
server.port=0
#consul 地址
spring.cloud.consul.host=localhost
#consul 端口
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.prefer-ip-address=true
#限流熔断组annotation策略设置如下:
#限制连续请求5次
resilience4j.ratelimiter.limiters.annotation.limit-for-period=5
#30s刷新统计值
resilience4j.ratelimiter.limiters.annotation.limit-refresh-period-in-millis=30000
#5s超时
resilience4j.ratelimiter.limiters.annotation.timeout-in-millis=5000
#actuator 订阅endpoint
resilience4j.ratelimiter.limiters.annotation.subscribe-for-events=true
#Metrics endpoint监控指标
resilience4j.ratelimiter.limiters.annotation.register-health-indicator=true
#限流熔断组registry策略设置如下:
#限制连续请求3次
resilience4j.ratelimiter.limiters.registry.limit-for-period=3
#30s刷新统计值
resilience4j.ratelimiter.limiters.registry.limit-refresh-period-in-millis=30000
#5s超时
resilience4j.ratelimiter.limiters.registry.timeout-in-millis=1000
#actuator 订阅endpoint
resilience4j.ratelimiter.limiters.registry.subscribe-for-events=true
#Metrics endpoint监控指标
resilience4j.ratelimiter.limiters.registry.register-health-indicator=true
bootstrap.properties
#服务名称
spring.application.name=waiter-service
2.3 代码
1)AnnotationController 基于注解实现
@RestController
@RequestMapping("/annotation")
@Slf4j
@RateLimiter(name = "annotation")
public class AnnotationController {
@PostMapping("/value")
public Object gotoValue(){
String result = "hello ! this is return annotation ratelimiter";
return result ;
}
2)RegistryController 基于注入类方式实现
@RestController
@RequestMapping("registry")
@Slf4j
public class RegistryController {
private RateLimiter rateLimiter;
public RegistryController(RateLimiterRegistry rateLimiterRegistry) {
rateLimiter = rateLimiterRegistry.rateLimiter("registry");
}
@RequestMapping("/resut")
public Object gotoRegistry(HttpServletRequest request){
String resut = null;
try {
resut = rateLimiter.executeSupplier(() -> "hello ! this is return registry ratelimiter ! haha! ");
} catch(RequestNotPermitted e) {
log.warn("Request Not Permitted! {}", e.getMessage());
}
return resut;
}
}
三、熔断结果演示
- 基于注解熔断情况
接口:http://localhost:8080/annotation/value
步骤:连续请接口5次
正常返回

返回报错

后端报错

- 基于注册熔断器方式熔断情况
接口:http://localhost:8080/registry/resut
步骤:连续请接口3次
正常返回

返回报错(空)

后端报错

- 熔断监控
可以通过actuator 查看当前服务熔断情况
请求熔断情况: http://localhost:8080/actuator/ratelimiters
有哪些熔断器策略:http://localhost:8080/actuator/ratelimiters
更多推荐

所有评论(0)