Browse Source

Resilience4J 断路器

yufeng0528 4 years ago
parent
commit
7044bcf969

+ 2 - 1
README.md

@@ -31,7 +31,8 @@ spring5 -> webflux ->spring gateway
31 31
 13. RewriteResponseHeader
32 32
 14. SaveSession 
33 33
 15. RequestSize 为后端服务设置收到的最大请求包大小
34
-16. ...
34
+16. CircuitBreaker
35
+17. ...
35 36
 
36 37
 
37 38
 

+ 10 - 4
pom.xml

@@ -57,10 +57,16 @@
57 57
 		</dependency>
58 58
 	
59 59
 		<!-- hystrix -->
60
-		<dependency>
61
-			<groupId>org.springframework.cloud</groupId>
62
-			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
63
-		</dependency>
60
+<!-- 		<dependency> -->
61
+<!-- 			<groupId>org.springframework.cloud</groupId> -->
62
+<!-- 			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId> -->
63
+<!-- 		</dependency> -->
64
+		
65
+		<!-- 最新推荐的断路器 -->
66
+        <dependency>
67
+            <groupId>org.springframework.cloud</groupId>
68
+            <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
69
+        </dependency>
64 70
         
65 71
 		<!-- Spring Boot Web Flux 依赖 -->
66 72
 		<dependency>

+ 50 - 0
src/main/java/com/yaozhitech/spring5/config/Resilience4JConfiguration.java

@@ -0,0 +1,50 @@
1
+package com.yaozhitech.spring5.config;
2
+
3
+import java.time.Duration;
4
+
5
+import org.springframework.beans.factory.ObjectProvider;
6
+import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JCircuitBreakerFactory;
7
+import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder;
8
+import org.springframework.cloud.client.circuitbreaker.Customizer;
9
+import org.springframework.cloud.client.circuitbreaker.ReactiveCircuitBreakerFactory;
10
+import org.springframework.cloud.gateway.filter.factory.SpringCloudCircuitBreakerFilterFactory;
11
+import org.springframework.cloud.gateway.filter.factory.SpringCloudCircuitBreakerResilience4JFilterFactory;
12
+import org.springframework.context.annotation.Bean;
13
+import org.springframework.context.annotation.Configuration;
14
+import org.springframework.web.reactive.DispatcherHandler;
15
+
16
+import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
17
+import io.github.resilience4j.timelimiter.TimeLimiterConfig;
18
+
19
+@Configuration
20
+public class Resilience4JConfiguration {
21
+
22
+	public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
23
+	    return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
24
+                .circuitBreakerConfig(CircuitBreakerConfig.custom().slowCallDurationThreshold(Duration.ofSeconds(4L)).build())
25
+	            .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(2)).build()).build());
26
+	}
27
+
28
+	public Customizer<ReactiveResilience4JCircuitBreakerFactory> slowCustomizer() {
29
+	    return factory -> {
30
+	        factory.configure(builder -> builder
31
+	                .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build())
32
+	                .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()), "slow");
33
+	    };
34
+	}
35
+	
36
+	@Bean
37
+    public SpringCloudCircuitBreakerFilterFactory resilience4JCircuitBreakerFactory(
38
+            ReactiveCircuitBreakerFactory reactiveCircuitBreakerFactory,
39
+            ObjectProvider<DispatcherHandler> dispatcherHandlers) {
40
+		
41
+		// 参考自 ReactiveResilience4JCustomizerConfiguration
42
+		defaultCustomizer().customize((ReactiveResilience4JCircuitBreakerFactory) reactiveCircuitBreakerFactory);
43
+		slowCustomizer().customize((ReactiveResilience4JCircuitBreakerFactory) reactiveCircuitBreakerFactory);
44
+		
45
+//		reactiveCircuitBreakerFactory.configureDefault(id -> new Resilience4JConfigBuilder((String) id)
46
+//				.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(12)).build()).build());
47
+        return new SpringCloudCircuitBreakerResilience4JFilterFactory(reactiveCircuitBreakerFactory, 
48
+        		dispatcherHandlers);
49
+    }
50
+}

+ 15 - 13
src/main/java/com/yaozhitech/spring5/config/RouterConfig.java

@@ -11,7 +11,7 @@ import reactor.core.publisher.Mono;
11 11
 
12 12
 @Configuration
13 13
 public class RouterConfig {
14
-
14
+	
15 15
 	@Bean
16 16
 	public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
17 17
 		//@formatter:off
@@ -25,18 +25,19 @@ public class RouterConfig {
25 25
 						.filters(f -> f.rewritePath("city_list",  // rewritePath方法会使用内建的过滤器重写路径
26 26
 								"city_list.do"))
27 27
 						.uri("https://api.bbztx.com"))
28
-				.route("hystrix_fallback_route", r -> r.path("/slow_query.do")
29
-						.filters(f -> f
30
-										.rewritePath("_query.do", "")
31
-										.hystrix(c -> c.setName("slowcmd").setFallbackUri("forward:/hystrixfallback"))
32
-							    )
33
-						.uri("http://127.0.0.1:8080"))
34
-//				.route("hystrix_route", r -> r.host("*.hystrix.org")
35
-//						.filters(f -> f.hystrix(c -> c.setName("slowcmd")))
36
-//								.uri("http://httpbin.org"))
37
-//				.route("hystrix_fallback_route", r -> r.host("*.hystrixfallback.org")
38
-//						.filters(f -> f.hystrix(c -> c.setName("slowcmd").setFallbackUri("forward:/hystrixfallback")))
39
-//								.uri("http://httpbin.org"))
28
+//				.route("hystrix_fallback_route", r -> r.path("/slow_query.do")
29
+//						.filters(f -> f
30
+//										.rewritePath("_query.do", "")
31
+//										.hystrix(c -> c.setName("slowcmd").setFallbackUri("forward:/hystrixfallback"))
32
+//							    )
33
+//						.uri("http://127.0.0.1:8080"))
34
+				.route("circuitbreaker_route", r -> r.path("/slow1_query.do")
35
+			            .filters(f -> f
36
+			            		.rewritePath("_query.do", "")
37
+			            		.circuitBreaker(c -> c.setName("slow").setFallbackUri("forward:/hystrixfallback"))
38
+			                )
39
+			            .uri("http://127.0.0.1:8080"))
40
+
40 41
 //				.route("websocket_route", r -> r.path("/echo")
41 42
 //					.uri("ws://localhost:9000"))
42 43
 				.build();
@@ -62,4 +63,5 @@ public class RouterConfig {
62 63
 	KeyResolver ipKeyResolver() {
63 64
 	    return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostString());
64 65
 	}
66
+	
65 67
 }

+ 12 - 0
src/main/java/com/yaozhitech/spring5/controller/HystrixfallbackController.java

@@ -26,4 +26,16 @@ public class HystrixfallbackController {
26 26
 		}
27 27
 		return Mono.create(monoSink -> monoSink.success("slow"));
28 28
 	}
29
+	
30
+	@GetMapping(value = "/slow1")
31
+	public Mono<String> slow1() {
32
+		log.info("slow1 ing");
33
+		try {
34
+			Thread.sleep(4700);
35
+		} catch (InterruptedException e) {
36
+			// TODO Auto-generated catch block
37
+			e.printStackTrace();
38
+		}
39
+		return Mono.create(monoSink -> monoSink.success("slow1"));
40
+	}
29 41
 }

+ 2 - 1
src/main/resources/application.properties

@@ -10,4 +10,5 @@ spring.redis.timeout=5000
10 10
 #日志
11 11
 logging.level.org.springframework.cloud=debug
12 12
 #hystrix
13
-hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 4000
13
+hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 4000
14
+# hystrix.command.apiTimeOut.execution.isolation.thread.timeoutInMilliseconds: 2000