diff --git a/pom.xml b/pom.xml index d8e8eda..56bd2f7 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,7 @@ 1.17.5 1.6.3 2.12.6.1 + 1.7.1 @@ -163,7 +164,7 @@ io.github.resilience4j resilience4j-spring - 1.7.1 + ${resilience4j-spring.version} provided diff --git a/src/main/java/com/github/lianjiatech/retrofit/spring/boot/config/RetrofitAutoConfiguration.java b/src/main/java/com/github/lianjiatech/retrofit/spring/boot/config/RetrofitAutoConfiguration.java index a03f300..f8e9389 100644 --- a/src/main/java/com/github/lianjiatech/retrofit/spring/boot/config/RetrofitAutoConfiguration.java +++ b/src/main/java/com/github/lianjiatech/retrofit/spring/boot/config/RetrofitAutoConfiguration.java @@ -5,6 +5,7 @@ import java.util.concurrent.TimeUnit; import com.github.lianjiatech.retrofit.spring.boot.degrade.DegradeRuleRegister; +import com.github.lianjiatech.retrofit.spring.boot.degrade.SentinelDegradeRuleRegister; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -13,6 +14,7 @@ import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -128,6 +130,13 @@ public RetrofitConfigBean retrofitConfigBean(ObjectProvider return retrofitConfigBean; } + @Bean + @ConditionalOnMissingBean + @ConditionalOnClass(com.alibaba.csp.sentinel.SphU.class) + public DegradeRuleRegister sentinelDegradeRuleRegister(){ + return new SentinelDegradeRuleRegister(retrofitProperties.getDegrade()); + } + @Bean @ConditionalOnMissingBean diff --git a/src/test/java/com/github/lianjiatech/retrofit/spring/boot/test/RetrofitStarterTest.java b/src/test/java/com/github/lianjiatech/retrofit/spring/boot/test/RetrofitStarterTest.java index 8af32c7..5411f6c 100644 --- a/src/test/java/com/github/lianjiatech/retrofit/spring/boot/test/RetrofitStarterTest.java +++ b/src/test/java/com/github/lianjiatech/retrofit/spring/boot/test/RetrofitStarterTest.java @@ -8,7 +8,9 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import com.github.lianjiatech.retrofit.spring.boot.test.http.HttpApi4; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -56,6 +58,9 @@ public class RetrofitStarterTest { @Autowired private HttpApi3 httpApi3; + @Autowired + private HttpApi4 httpApi4; + private static final ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) .setSerializationInclusion(JsonInclude.Include.NON_NULL); @@ -417,4 +422,25 @@ public void testBoolean() { System.out.println(apiBoolean); } + @Test + public void testDegrade() { + for (int i = 0; i < 10; i++) { + try { + MockResponse response = new MockResponse() + .setResponseCode(400) + .addHeader("Content-Type", "application/text; charset=utf-8") + .addHeader("Cache-Control", "no-cache") + .setBody("false") + .setHeadersDelay(5, TimeUnit.SECONDS); + server.enqueue(response); + System.out.println(httpApi4.getPerson(2L).getCode()); + }catch (Exception e){ + System.out.println(e.getMessage()); + }finally { + System.out.println("当前请求轮次: "+ (i+1)); + } + } + + } + } diff --git a/src/test/java/com/github/lianjiatech/retrofit/spring/boot/test/http/HttpApi4.java b/src/test/java/com/github/lianjiatech/retrofit/spring/boot/test/http/HttpApi4.java new file mode 100644 index 0000000..3c98b72 --- /dev/null +++ b/src/test/java/com/github/lianjiatech/retrofit/spring/boot/test/http/HttpApi4.java @@ -0,0 +1,52 @@ +package com.github.lianjiatech.retrofit.spring.boot.test.http; + +import com.github.lianjiatech.retrofit.spring.boot.annotation.RetrofitClient; +import com.github.lianjiatech.retrofit.spring.boot.degrade.Degrade; +import com.github.lianjiatech.retrofit.spring.boot.degrade.FallbackFactory; +import com.github.lianjiatech.retrofit.spring.boot.test.entity.Person; +import com.github.lianjiatech.retrofit.spring.boot.test.entity.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import retrofit2.http.GET; +import retrofit2.http.Query; + +/** + * @author 陈添明 + */ +@RetrofitClient(baseUrl = "${test.baseUrl}", fallbackFactory = HttpApi4.HttpDegradeFallbackFactory.class) +@Degrade(count = 0.5) +public interface HttpApi4 { + + /** + * . + * + * @param id . + * @return . + */ + @GET("person") + Result getPerson(@Query("id") Long id); + + @Service + public class HttpDegradeFallbackFactory implements FallbackFactory { + Logger log = LoggerFactory.getLogger(HttpDegradeFallbackFactory.class); + /** + * Returns an instance of the fallback appropriate for the given cause + * + * @param cause fallback cause + * @return 实现了retrofit接口的实例。an instance that implements the retrofit interface. + */ + @Override + public HttpApi4 create(Throwable cause) { + log.error("触发熔断了! ", cause.getMessage(), cause); + return id -> { + Result fallback = new Result<>(); + fallback.setCode(100) + .setMsg("fallback") + .setData(new Person()); + return fallback; + }; + } + } + +}