Skip to content

Commit 2e7d1d0

Browse files
committed
feat(springboot openfeign): An OpenFeign Client for Dapr Invokes
A OpenFeign Client and it's AutoConfiguration using Dapr Invoke APIs. Splited into two librarys, dapr-openfeign-client is the pure client of OpenFeign, and dapr-spring-openfeign is the plugin of Spring Cloud OpenFeign. Currently only HTTP Invoke Method and Invoke Binding supported, and Invoke Binding is not always recommend to use this client, depends on what binding component is. Signed-off-by: lony2003 <zhangke200377@outlook.com>
1 parent 5e0e110 commit 2e7d1d0

File tree

5 files changed

+53
-33
lines changed

5 files changed

+53
-33
lines changed

dapr-spring/dapr-openfeign-client/src/main/java/io/dapr/feign/DaprInvokeFeignClient.java

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,40 @@
8080
*/
8181
public class DaprInvokeFeignClient implements Client {
8282

83+
private static final Map<String, HttpExtension> httpExtensionMap = generateHttpExtensionMap();
84+
8385
private static final String DOT = "\\.";
8486

8587
private final int retry;
8688
private final int timeout;
8789

8890
private final DaprClient daprClient;
8991

92+
private static Map<String, HttpExtension> generateHttpExtensionMap() {
93+
Map<String, HttpExtension> tempHttpExtensionMap = new HashMap<>();
94+
95+
tempHttpExtensionMap.put("none",
96+
HttpExtension.NONE);
97+
tempHttpExtensionMap.put("put",
98+
HttpExtension.PUT);
99+
tempHttpExtensionMap.put("post",
100+
HttpExtension.POST);
101+
tempHttpExtensionMap.put("delete",
102+
HttpExtension.DELETE);
103+
tempHttpExtensionMap.put("head",
104+
HttpExtension.HEAD);
105+
tempHttpExtensionMap.put("connect",
106+
HttpExtension.CONNECT);
107+
tempHttpExtensionMap.put("options",
108+
HttpExtension.OPTIONS);
109+
tempHttpExtensionMap.put("trace",
110+
HttpExtension.TRACE);
111+
tempHttpExtensionMap.put("get",
112+
HttpExtension.GET);
113+
114+
return tempHttpExtensionMap;
115+
}
116+
90117
/**
91118
* Default Client creation with no arguments.
92119
*
@@ -119,8 +146,8 @@ public DaprInvokeFeignClient(DaprClient daprClient) {
119146
* Client creation with DaprClient, wait time, retry time Specified.
120147
*
121148
* @param daprClient client sepcified
122-
* @param timeout wait time (ms)
123-
* @param retry retry times
149+
* @param timeout wait time (ms)
150+
* @param retry retry times
124151
*/
125152
public DaprInvokeFeignClient(DaprClient daprClient, int timeout, int retry) {
126153
this.daprClient = daprClient;
@@ -250,28 +277,10 @@ private InvokeMethodRequest toInvokeMethodHTTPRequest(URI uri, Request request)
250277
}
251278

252279
private HttpExtension toHttpExtension(String method) throws IOException {
253-
switch (method) {
254-
case "none":
255-
return HttpExtension.NONE;
256-
case "put":
257-
return HttpExtension.PUT;
258-
case "post":
259-
return HttpExtension.POST;
260-
case "delete":
261-
return HttpExtension.DELETE;
262-
case "head":
263-
return HttpExtension.HEAD;
264-
case "connect":
265-
return HttpExtension.CONNECT;
266-
case "options":
267-
return HttpExtension.OPTIONS;
268-
case "trace":
269-
return HttpExtension.TRACE;
270-
case "get":
271-
return HttpExtension.GET;
272-
default:
273-
throw new IOException("Method '" + method + "' is not supported");
280+
if (!httpExtensionMap.containsKey(method)) {
281+
throw new IOException("Method '" + method + "' is not supported");
274282
}
283+
return httpExtensionMap.get(method);
275284
}
276285

277286
private String getContentType(Request request) {

dapr-spring/dapr-openfeign-client/src/test/java/io/dapr/feign/DaprFeignClientBindingTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import static org.junit.jupiter.api.Assertions.assertEquals;
1818

19+
import feign.Body;
1920
import org.junit.jupiter.api.Test;
2021
import org.junit.jupiter.api.extension.ExtendWith;
2122
import org.mockito.Mock;
@@ -43,7 +44,7 @@ void DaprFeignClient_testMockBindingInvoke() {
4344
newBuilder().target(DaprFeignClientTestInterface.class, "http://binding.myBinding");
4445

4546
assertEquals(200, repository.getWithContentType().status());
46-
assertEquals(0, repository.get().body().length());
47+
assertEquals(0, repository.post().body().length());
4748
}
4849

4950
public Feign.Builder newBuilder() {
@@ -59,7 +60,8 @@ public interface DaprFeignClientTestInterface {
5960
@Headers({"Accept: text/plain", "Content-Type: text/plain"})
6061
Response getWithContentType();
6162

62-
@RequestLine("GET /get")
63-
Response get();
63+
@RequestLine("POST /get")
64+
@Body("test")
65+
Response post();
6466
}
6567
}

dapr-spring/dapr-openfeign-client/src/test/java/io/dapr/feign/DaprFeignClientMethodTest.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.nio.charset.StandardCharsets;
2020

21+
import feign.Body;
2122
import org.junit.jupiter.api.Test;
2223
import org.junit.jupiter.api.extension.ExtendWith;
2324
import org.mockito.Mock;
@@ -45,6 +46,7 @@ void DaprFeignClient_testMockMethodInvoke() {
4546
newBuilder().target(DaprFeignClientTestInterface.class, "http://method.myApp/");
4647

4748
assertEquals(12, repository.getWithContentType().body().length());
49+
assertEquals(200, repository.post().status());
4850
}
4951

5052
public Feign.Builder newBuilder() {
@@ -60,7 +62,8 @@ public interface DaprFeignClientTestInterface {
6062
@Headers({"Accept: text/plain", "Content-Type: text/plain"})
6163
Response getWithContentType();
6264

63-
@RequestLine("GET /abc")
64-
Response get();
65+
@RequestLine("POST /abc/")
66+
@Body("test")
67+
Response post();
6568
}
6669
}

dapr-spring/dapr-spring-openfeign/src/main/java/io/dapr/spring/openfeign/autoconfigure/DaprFeignClientAutoConfiguration.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,15 @@ public Targeter targeter(DaprInvokeFeignClient daprInvokeFeignClient) {
3636
return new DaprClientTargeter(daprInvokeFeignClient);
3737
}
3838

39+
@SuppressWarnings("checkstyle:MissingJavadocMethod")
3940
@Bean
4041
@ConditionalOnMissingBean
41-
public DaprInvokeFeignClient daprInvokeFeignClient(DaprClient daprClient) {
42-
return new DaprInvokeFeignClient(daprClient);
42+
public DaprInvokeFeignClient daprInvokeFeignClient(DaprClient daprClient,
43+
DaprFeignClientProperties daprFeignClientProperties) {
44+
return new DaprInvokeFeignClient(
45+
daprClient,
46+
daprFeignClientProperties.getTimeout(),
47+
daprFeignClientProperties.getRetries()
48+
);
4349
}
4450
}

dapr-spring/dapr-spring-openfeign/src/main/java/io/dapr/spring/openfeign/autoconfigure/DaprFeignClientProperties.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ public class DaprFeignClientProperties {
77

88
public static final String PROPERTY_PREFIX = "dapr.feign";
99

10-
private boolean enabled;
11-
private Integer timeout;
12-
private Integer retries;
10+
private boolean enabled = true;
11+
private Integer timeout = 2000;
12+
private Integer retries = 3;
1313

1414
public boolean isEnabled() {
1515
return enabled;

0 commit comments

Comments
 (0)