Resilience4j_服务端限流、并发控制_RateLimiter

一、背景描述

由于Hystrix官方已经停止更新,Spring 官网推荐使用Resilience4j作为服务的熔断保护中间件,可见Resilience4j的重要性。
为了探究Resilience4j实现服务熔断功能, 我们选用了 consul 作为注册中心,启动了一个服务端(waiter),验证其服务端限流、并发控制熔断。我们在极端的时间内访问较多次数指定接口,观察接口是否会进行熔断处理。 consul 启动及运行状态监控,不在这里描述, 我们默认 consul 已经正常运行。
本地安装运行consul 参考:https://jingyan.baidu.com/article/ca41422f732f961eaf99ed5f.html
在RateLimiter中有两种使用方式:基于注解,或熔断对象注入两种方式,下面会分别进行演示。

二、代码演示

2.1 pom主要依赖


		1.8
		Greenwich.SR1

	

		
			
				org.springframework.cloud
				spring-cloud-dependencies
				${spring-cloud.version}
				pom
				import
			
		


    	
 			org.springframework.boot
			spring-boot-starter-web
		
		
			org.springframework.boot
			spring-boot-starter-actuator
		
		
		
			org.springframework.cloud
			spring-cloud-starter-consul-discovery
		
		
		
			io.github.resilience4j
			resilience4j-spring-boot2
			0.14.1
		

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;
    }
}

三、熔断结果演示

  1. 基于注解熔断情况
    接口:http://localhost:8080/annotation/value
    步骤:连续请接口5次

正常返回
Resilience4j_服务端限流、并发控制_RateLimiter_第1张图片
返回报错
Resilience4j_服务端限流、并发控制_RateLimiter_第2张图片
后端报错
在这里插入图片描述

  1. 基于注册熔断器方式熔断情况
    接口:http://localhost:8080/registry/resut
    步骤:连续请接口3次
    正常返回
    Resilience4j_服务端限流、并发控制_RateLimiter_第3张图片
    返回报错(空)
    Resilience4j_服务端限流、并发控制_RateLimiter_第4张图片
    后端报错
    在这里插入图片描述
  2. 熔断监控
    可以通过actuator 查看当前服务熔断情况
    请求熔断情况: http://localhost:8080/actuator/ratelimiters
    有哪些熔断器策略:http://localhost:8080/actuator/ratelimiters

你可能感兴趣的:(resilience4j)