Skip to content

Commit 45c16eb

Browse files
authored
[#1450] FeignClient support setting method read/connect timeout (#1452) (#1466)
1 parent 478e375 commit 45c16eb

File tree

14 files changed

+319
-0
lines changed

14 files changed

+319
-0
lines changed

integration-tests/discovery-nacos-tests/discovery-tests-client/src/test/java/com/huaweicloud/sample/GovernanceControllerIT.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,4 +381,18 @@ public void testServiceNameFaultInjectionConsumerFeign() {
381381
Assertions.assertEquals(null,
382382
template.getForObject(orderServiceUrl + "/govern/serviceNameFaultInjectionFeign", String.class));
383383
}
384+
385+
@Test
386+
public void testFeignRequestTimeoutWithAnnotation() {
387+
String result
388+
= template.getForObject(orderServiceUrl + "/govern/testFeignRequestTimeoutWithAnnotation", String.class);
389+
Assertions.assertTrue(result.contains("Read timed out"));
390+
}
391+
392+
@Test
393+
public void testFeignRequestTimeout() {
394+
String result
395+
= template.getForObject(orderServiceUrl + "/govern/testFeignRequestTimeout", String.class);
396+
Assertions.assertEquals("success", result);
397+
}
384398
}

integration-tests/discovery-nacos-tests/order-consumer/src/main/java/com/huaweicloud/sample/FeignService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import org.springframework.web.bind.annotation.RequestParam;
2626
import org.springframework.web.bind.annotation.ResponseBody;
2727

28+
import com.huaweicloud.governance.adapters.feign.options.FeignRequestOptions;
29+
2830
import feign.Headers;
2931
import feign.Param;
3032

@@ -75,4 +77,11 @@ public interface FeignService {
7577
@PostMapping("/testHeaderWithJson")
7678
@Headers("model: {model}")
7779
public String testHeaderWithJsonCorrect(@Param("model") String model);
80+
81+
@GetMapping("/testFeignRequestTimeoutWithAnnotation")
82+
@FeignRequestOptions(connectTimeout = 5L, readTimeout = 5L)
83+
String testFeignRequestTimeoutWithAnnotation();
84+
85+
@GetMapping("/testFeignRequestTimeout")
86+
String testFeignRequestTimeout();
7887
}

integration-tests/discovery-nacos-tests/order-consumer/src/main/java/com/huaweicloud/sample/GovernanceController.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,4 +232,22 @@ public String restTemplateInstanceBulkhead() throws Exception {
232232
public String loadbalance() {
233233
return feignService.loadbalabce();
234234
}
235+
236+
@GetMapping("/testFeignRequestTimeoutWithAnnotation")
237+
public String testFeignRequestTimeoutWithAnnotation() {
238+
try {
239+
return feignService.testFeignRequestTimeoutWithAnnotation();
240+
}catch (Exception e) {
241+
return e.getMessage();
242+
}
243+
}
244+
245+
@GetMapping("/testFeignRequestTimeout")
246+
public String testFeignRequestTimeout() {
247+
try {
248+
return feignService.testFeignRequestTimeout();
249+
}catch (Exception e) {
250+
return e.getMessage();
251+
}
252+
}
235253
}

integration-tests/discovery-nacos-tests/price-provider/src/main/java/com/huaweicloud/sample/GovernanceController.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,16 @@ public String restTemplateInstanceBulkhead() throws Exception {
148148
public String loadbalance() {
149149
return "I am price";
150150
}
151+
152+
@RequestMapping("/testFeignRequestTimeoutWithAnnotation")
153+
public String testFeignRequestTimeoutWithAnnotation() throws InterruptedException {
154+
Thread.sleep(6000);
155+
return "success";
156+
}
157+
158+
@RequestMapping("/testFeignRequestTimeout")
159+
public String testFeignRequestTimeout() throws InterruptedException {
160+
Thread.sleep(6000);
161+
return "success";
162+
}
151163
}

integration-tests/discovery-servicecomb-tests/discovery-tests-client/src/test/java/com/huaweicloud/sample/GovernanceControllerIT.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,4 +480,18 @@ public void testTemplateFaultInjection() {
480480
Assertions.assertEquals(null,
481481
template.getForObject(orderServiceUrl + "/govern/testTemplateFaultInjection?name=tom", String.class));
482482
}
483+
484+
@Test
485+
public void testFeignRequestTimeoutWithAnnotation() {
486+
String result
487+
= template.getForObject(orderServiceUrl + "/govern/testFeignRequestTimeoutWithAnnotation", String.class);
488+
Assertions.assertTrue(result.contains("Read timed out"));
489+
}
490+
491+
@Test
492+
public void testFeignRequestTimeout() {
493+
String result
494+
= template.getForObject(orderServiceUrl + "/govern/testFeignRequestTimeout", String.class);
495+
Assertions.assertEquals("success", result);
496+
}
483497
}

integration-tests/discovery-servicecomb-tests/order-consumer/src/main/java/com/huaweicloud/sample/FeignService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import org.springframework.web.bind.annotation.RequestParam;
2929
import org.springframework.web.bind.annotation.ResponseBody;
3030

31+
import com.huaweicloud.governance.adapters.feign.options.FeignRequestOptions;
32+
3133
import feign.Headers;
3234
import feign.Param;
3335

@@ -89,4 +91,11 @@ public interface FeignService {
8991
@GetMapping("/testDateRequestParam")
9092
public String testDateRequestParam(@RequestParam(required = false, value = "currentDate")
9193
Date currentDate);
94+
95+
@GetMapping("/testFeignRequestTimeoutWithAnnotation")
96+
@FeignRequestOptions(connectTimeout = 5L, readTimeout = 5L)
97+
String testFeignRequestTimeoutWithAnnotation();
98+
99+
@GetMapping("/testFeignRequestTimeout")
100+
String testFeignRequestTimeout();
92101
}

integration-tests/discovery-servicecomb-tests/order-consumer/src/main/java/com/huaweicloud/sample/GovernanceController.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,4 +266,22 @@ public String testTemplateFaultInjection(@RequestParam String name) {
266266
restTemplate.getForObject("http://webflux/sayHello?name=tom", String.class);
267267
return restTemplate.getForObject("http://price/faultInjection", String.class);
268268
}
269+
270+
@GetMapping("/testFeignRequestTimeoutWithAnnotation")
271+
public String testFeignRequestTimeoutWithAnnotation() {
272+
try {
273+
return feignService.testFeignRequestTimeoutWithAnnotation();
274+
}catch (Exception e) {
275+
return e.getMessage();
276+
}
277+
}
278+
279+
@GetMapping("/testFeignRequestTimeout")
280+
public String testFeignRequestTimeout() {
281+
try {
282+
return feignService.testFeignRequestTimeout();
283+
}catch (Exception e) {
284+
return e.getMessage();
285+
}
286+
}
269287
}

integration-tests/discovery-servicecomb-tests/price-provider/src/main/java/com/huaweicloud/sample/GovernanceController.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,16 @@ public String restTemplateInstanceBulkhead() throws Exception {
154154
public String loadbalance() {
155155
return "I am price";
156156
}
157+
158+
@RequestMapping("/testFeignRequestTimeoutWithAnnotation")
159+
public String testFeignRequestTimeoutWithAnnotation() throws InterruptedException {
160+
Thread.sleep(6000);
161+
return "success";
162+
}
163+
164+
@RequestMapping("/testFeignRequestTimeout")
165+
public String testFeignRequestTimeout() throws InterruptedException {
166+
Thread.sleep(6000);
167+
return "success";
168+
}
157169
}

spring-cloud-huawei-governance/src/main/java/com/huaweicloud/governance/GovernanceConst.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,6 @@ public class GovernanceConst {
3535
public static final String AUTH_API_PATH_EXCLUDE = "spring.cloud.servicecomb.webmvc.publicKey.excludePathPatterns";
3636

3737
public static final String CONTEXT_CURRENT_INSTANCE = "x-current-instance";
38+
39+
public static final String FEIGN_METHOD_OPTIONS_ENABLED = "feign.client.method.request.options.enabled";
3840
}

spring-cloud-huawei-governance/src/main/java/com/huaweicloud/governance/adapters/feign/FeignConfiguration.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
import org.springframework.context.annotation.Configuration;
3131
import org.springframework.core.env.Environment;
3232

33+
import com.huaweicloud.governance.GovernanceConst;
34+
import com.huaweicloud.governance.adapters.feign.options.FeignMethodRequestOptionsFactoryBuilder;
35+
3336
import feign.Client;
3437
import feign.httpclient.ApacheHttpClient;
3538

@@ -57,4 +60,11 @@ public Client feignClient(RetryHandler retryHandler,
5760
public ResponseStatusCodeExtractor responseStatusCodeExtractor(Environment environment) {
5861
return new ResponseStatusCodeExtractor(environment);
5962
}
63+
64+
@Bean
65+
@ConditionalOnProperty(value = GovernanceConst.FEIGN_METHOD_OPTIONS_ENABLED, havingValue = "true",
66+
matchIfMissing = true)
67+
public FeignMethodRequestOptionsFactoryBuilder feignMethodOptionsFactoryBuilder() {
68+
return new FeignMethodRequestOptionsFactoryBuilder();
69+
}
6070
}

0 commit comments

Comments
 (0)