diff --git a/feiginclientdemo/.idea/.gitignore b/feiginclientdemo/.idea/.gitignore
new file mode 100644
index 0000000..634e5de
--- /dev/null
+++ b/feiginclientdemo/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/../../../:\feiginclientdemo\.idea/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/feiginclientdemo/.idea/compiler.xml b/feiginclientdemo/.idea/compiler.xml
new file mode 100644
index 0000000..26650e0
--- /dev/null
+++ b/feiginclientdemo/.idea/compiler.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feiginclientdemo/.idea/encodings.xml b/feiginclientdemo/.idea/encodings.xml
new file mode 100644
index 0000000..63e9001
--- /dev/null
+++ b/feiginclientdemo/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feiginclientdemo/.idea/jarRepositories.xml b/feiginclientdemo/.idea/jarRepositories.xml
new file mode 100644
index 0000000..40a2eee
--- /dev/null
+++ b/feiginclientdemo/.idea/jarRepositories.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feiginclientdemo/.idea/misc.xml b/feiginclientdemo/.idea/misc.xml
new file mode 100644
index 0000000..4b661a5
--- /dev/null
+++ b/feiginclientdemo/.idea/misc.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/feiginclientdemo/.idea/uiDesigner.xml b/feiginclientdemo/.idea/uiDesigner.xml
new file mode 100644
index 0000000..e96534f
--- /dev/null
+++ b/feiginclientdemo/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/feiginclientdemo/feiginclientdemo.iml b/feiginclientdemo/feiginclientdemo.iml
new file mode 100644
index 0000000..78b2cc5
--- /dev/null
+++ b/feiginclientdemo/feiginclientdemo.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feiginclientdemo/pom.xml b/feiginclientdemo/pom.xml
new file mode 100644
index 0000000..0bd5e29
--- /dev/null
+++ b/feiginclientdemo/pom.xml
@@ -0,0 +1,81 @@
+
+
+ 4.0.0
+
+ com.woniu.demo
+ feiginclientdemo
+ 1.0-SNAPSHOT
+
+
+ 8
+ 8
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.6.RELEASE
+
+
+
+
+
+
+
+ com.alibaba
+ druid-spring-boot-starter
+ 1.1.13
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ cn.hutool
+ hutool-all
+ 5.8.10
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.24
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ junit
+ junit
+ 4.13.1
+ test
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+ 3.1.3
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
\ No newline at end of file
diff --git a/feiginclientdemo/src/main/java/com/woniu/demo/MainApplication.java b/feiginclientdemo/src/main/java/com/woniu/demo/MainApplication.java
new file mode 100644
index 0000000..30c8e1f
--- /dev/null
+++ b/feiginclientdemo/src/main/java/com/woniu/demo/MainApplication.java
@@ -0,0 +1,13 @@
+package com.woniu.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+@SpringBootApplication
+@EnableFeignClients
+public class MainApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(MainApplication.class, args);
+ }
+}
diff --git a/feiginclientdemo/src/main/java/com/woniu/demo/entity/R.java b/feiginclientdemo/src/main/java/com/woniu/demo/entity/R.java
new file mode 100644
index 0000000..cdbd29a
--- /dev/null
+++ b/feiginclientdemo/src/main/java/com/woniu/demo/entity/R.java
@@ -0,0 +1,12 @@
+package com.woniu.demo.entity;
+
+import lombok.Data;
+
+@Data
+public class R {
+
+ private Integer code;
+ private String message;
+ private T data;
+
+}
diff --git a/feiginclientdemo/src/main/java/com/woniu/demo/feign/DynamicClient.java b/feiginclientdemo/src/main/java/com/woniu/demo/feign/DynamicClient.java
new file mode 100644
index 0000000..f29b34a
--- /dev/null
+++ b/feiginclientdemo/src/main/java/com/woniu/demo/feign/DynamicClient.java
@@ -0,0 +1,22 @@
+package com.woniu.demo.feign;
+
+import com.woniu.demo.inter.DynamicService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DynamicClient {
+
+ @Autowired
+ private DynamicFeignClientFactory dynamicFeignClientFactory;
+
+ public Object executePostApi(String feignName, String url, Object params) {
+ DynamicService dynamicService = dynamicFeignClientFactory.getFeignClient(DynamicService.class, feignName);
+ return dynamicService.executePostApi(url, params);
+ }
+
+ public Object executeGetApi(String feignName, String url, Object params) {
+ DynamicService dynamicService = dynamicFeignClientFactory.getFeignClient(DynamicService.class, feignName);
+ return dynamicService.executeGetApi(url, params);
+ }
+}
\ No newline at end of file
diff --git a/feiginclientdemo/src/main/java/com/woniu/demo/feign/DynamicFeignClientFactory.java b/feiginclientdemo/src/main/java/com/woniu/demo/feign/DynamicFeignClientFactory.java
new file mode 100644
index 0000000..7d237d1
--- /dev/null
+++ b/feiginclientdemo/src/main/java/com/woniu/demo/feign/DynamicFeignClientFactory.java
@@ -0,0 +1,19 @@
+package com.woniu.demo.feign;
+
+import org.springframework.cloud.openfeign.FeignClientBuilder;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DynamicFeignClientFactory {
+
+ private FeignClientBuilder feignClientBuilder;
+
+ public DynamicFeignClientFactory(ApplicationContext appContext) {
+ this.feignClientBuilder = new FeignClientBuilder(appContext);
+ }
+
+ public T getFeignClient(final Class type, String serviceId) {
+ return this.feignClientBuilder.forType(type, serviceId).build();
+ }
+}
diff --git a/feiginclientdemo/src/main/java/com/woniu/demo/feignclient/ProductClient.java b/feiginclientdemo/src/main/java/com/woniu/demo/feignclient/ProductClient.java
new file mode 100644
index 0000000..6556766
--- /dev/null
+++ b/feiginclientdemo/src/main/java/com/woniu/demo/feignclient/ProductClient.java
@@ -0,0 +1,19 @@
+package com.woniu.demo.feignclient;
+
+import com.woniu.demo.entity.R;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+
+/**
+ * 手写一个动态Feign,
+ * 实现一个“万能”接口调用
+ *
+ */
+@FeignClient(name = "product")
+public interface ProductClient {
+ @GetMapping("/product/test1")
+ R test1(String test1);
+
+ @GetMapping("/product/test2")
+ R test2(String test2);
+}
diff --git a/feiginclientdemo/src/main/java/com/woniu/demo/feignclient/UserClient.java b/feiginclientdemo/src/main/java/com/woniu/demo/feignclient/UserClient.java
new file mode 100644
index 0000000..5b171da
--- /dev/null
+++ b/feiginclientdemo/src/main/java/com/woniu/demo/feignclient/UserClient.java
@@ -0,0 +1,14 @@
+package com.woniu.demo.feignclient;
+
+import com.woniu.demo.entity.R;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@FeignClient(name = "user")
+public interface UserClient {
+ @GetMapping("/user/test1")
+ R test1(String test1);
+
+ @GetMapping("/user/test2")
+ R test2(String test2);
+}
diff --git a/feiginclientdemo/src/main/java/com/woniu/demo/inter/DynamicService.java b/feiginclientdemo/src/main/java/com/woniu/demo/inter/DynamicService.java
new file mode 100644
index 0000000..6fca197
--- /dev/null
+++ b/feiginclientdemo/src/main/java/com/woniu/demo/inter/DynamicService.java
@@ -0,0 +1,16 @@
+package com.woniu.demo.inter;
+
+import org.springframework.cloud.openfeign.SpringQueryMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+public interface DynamicService {
+ @PostMapping("{url}")
+ Object executePostApi(@PathVariable("url") String url, @RequestBody Object params);
+
+ @GetMapping("{url}")
+ Object executeGetApi(@PathVariable("url") String url, @SpringQueryMap Object params);
+
+}
diff --git a/feiginclientdemo/src/main/java/com/woniu/demo/test/DemoC.java b/feiginclientdemo/src/main/java/com/woniu/demo/test/DemoC.java
new file mode 100644
index 0000000..7bcbe65
--- /dev/null
+++ b/feiginclientdemo/src/main/java/com/woniu/demo/test/DemoC.java
@@ -0,0 +1,15 @@
+package com.woniu.demo.test;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.woniu.demo.feign.DynamicClient;
+
+import java.util.HashMap;
+
+
+public class DemoC {
+ public static void main(String[] args) {
+ DynamicClient dynamicClient = SpringUtil.getBean(DynamicClient.class);
+ Object user = dynamicClient.executePostApi("user", "/system/test", new HashMap<>());
+
+ }
+}
diff --git a/feiginclientdemo/src/main/resources/application.yml b/feiginclientdemo/src/main/resources/application.yml
new file mode 100644
index 0000000..6e32bd5
--- /dev/null
+++ b/feiginclientdemo/src/main/resources/application.yml
@@ -0,0 +1,6 @@
+server:
+ port: 8080
+
+spring:
+ application:
+ name: feiginclientdemo
\ No newline at end of file