From 2dd322f07fe462d965cefa47808fa811cef2ce14 Mon Sep 17 00:00:00 2001 From: DerekYRC <15521077528@163.com> Date: Sat, 9 Apr 2022 10:06:19 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90Feign=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=96=B9=E5=BC=8F(=E4=B8=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../pom.xml | 5 ++ .../cloud/examples/ConsumerApplication.java | 10 ++++ .../github/cloud/examples/EchoService.java | 15 ++++++ .../github/cloud/openfeign/FeignClient.java | 5 ++ .../openfeign/FeignClientFactoryBean.java | 6 ++- .../openfeign/support/SpringMvcContract.java | 46 +++++++++++++++++++ pom.xml | 6 +++ 8 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 mini-spring-cloud-examples/mini-spring-cloud-consumer-examples/src/main/java/com/github/cloud/examples/EchoService.java create mode 100644 mini-spring-cloud-openfeign/src/main/java/com/github/cloud/openfeign/support/SpringMvcContract.java diff --git a/README.md b/README.md index 871af07..81e6af0 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ * [服务注册](https://github.com/DerekYRC/mini-spring-cloud/blob/main/changelog.md#服务注册) * [服务发现](https://github.com/DerekYRC/mini-spring-cloud/blob/main/changelog.md#服务发现) * [负载均衡](https://github.com/DerekYRC/mini-spring-cloud/blob/main/changelog.md#集成ribbon实现客户端负载均衡) -* [集成Feign简化调用]() +* [集成Feign简化调用方式]() * [流量控制]() * [熔断降级]() * [API 网关]() diff --git a/mini-spring-cloud-examples/mini-spring-cloud-consumer-examples/pom.xml b/mini-spring-cloud-examples/mini-spring-cloud-consumer-examples/pom.xml index a545464..265f3ff 100644 --- a/mini-spring-cloud-examples/mini-spring-cloud-consumer-examples/pom.xml +++ b/mini-spring-cloud-examples/mini-spring-cloud-consumer-examples/pom.xml @@ -34,6 +34,11 @@ mini-spring-cloud-load-balancer + + com.github + mini-spring-cloud-openfeign + + org.springframework.cloud spring-cloud-starter-feign diff --git a/mini-spring-cloud-examples/mini-spring-cloud-consumer-examples/src/main/java/com/github/cloud/examples/ConsumerApplication.java b/mini-spring-cloud-examples/mini-spring-cloud-consumer-examples/src/main/java/com/github/cloud/examples/ConsumerApplication.java index cb07b8f..276cd77 100644 --- a/mini-spring-cloud-examples/mini-spring-cloud-consumer-examples/src/main/java/com/github/cloud/examples/ConsumerApplication.java +++ b/mini-spring-cloud-examples/mini-spring-cloud-consumer-examples/src/main/java/com/github/cloud/examples/ConsumerApplication.java @@ -1,5 +1,6 @@ package com.github.cloud.examples; +import com.github.cloud.openfeign.EnableFeignClients; import com.github.cloud.tutu.discovery.TutuDiscoveryClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; @@ -20,6 +21,7 @@ import java.util.List; * @author derek(易仁川) * @date 2022/3/20 */ +@EnableFeignClients @SpringBootApplication public class ConsumerApplication { @@ -54,6 +56,9 @@ public class ConsumerApplication { @Autowired private RestTemplate loadBalancedRestTemplate; + @Autowired + private EchoService echoService; + private RestTemplate restTemplate = new RestTemplate(); @GetMapping("/hello") @@ -85,6 +90,11 @@ public class ConsumerApplication { public String foo() { return loadBalancedRestTemplate.postForObject("http://provider-application/echo", null, String.class); } + + @GetMapping("/bar") + public String bar() { + return echoService.echo(); + } } } diff --git a/mini-spring-cloud-examples/mini-spring-cloud-consumer-examples/src/main/java/com/github/cloud/examples/EchoService.java b/mini-spring-cloud-examples/mini-spring-cloud-consumer-examples/src/main/java/com/github/cloud/examples/EchoService.java new file mode 100644 index 0000000..02c8cb0 --- /dev/null +++ b/mini-spring-cloud-examples/mini-spring-cloud-consumer-examples/src/main/java/com/github/cloud/examples/EchoService.java @@ -0,0 +1,15 @@ +package com.github.cloud.examples; + +import com.github.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; + +/** + * @author derek(易仁川) + * @date 2022/4/9 + */ +@FeignClient("provider-application") +public interface EchoService { + + @PostMapping("echo") + String echo(); +} diff --git a/mini-spring-cloud-openfeign/src/main/java/com/github/cloud/openfeign/FeignClient.java b/mini-spring-cloud-openfeign/src/main/java/com/github/cloud/openfeign/FeignClient.java index ffdaa7b..c4e8278 100644 --- a/mini-spring-cloud-openfeign/src/main/java/com/github/cloud/openfeign/FeignClient.java +++ b/mini-spring-cloud-openfeign/src/main/java/com/github/cloud/openfeign/FeignClient.java @@ -1,11 +1,16 @@ package com.github.cloud.openfeign; +import java.lang.annotation.*; + /** * Feign客户端注解 * * @author derek(易仁川) * @date 2022/4/7 */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented public @interface FeignClient { /** diff --git a/mini-spring-cloud-openfeign/src/main/java/com/github/cloud/openfeign/FeignClientFactoryBean.java b/mini-spring-cloud-openfeign/src/main/java/com/github/cloud/openfeign/FeignClientFactoryBean.java index 2141931..dd9a0a5 100644 --- a/mini-spring-cloud-openfeign/src/main/java/com/github/cloud/openfeign/FeignClientFactoryBean.java +++ b/mini-spring-cloud-openfeign/src/main/java/com/github/cloud/openfeign/FeignClientFactoryBean.java @@ -1,5 +1,7 @@ package com.github.cloud.openfeign; +import com.github.cloud.openfeign.support.SpringMvcContract; +import feign.Feign; import org.springframework.beans.BeansException; import org.springframework.beans.factory.FactoryBean; import org.springframework.context.ApplicationContext; @@ -21,7 +23,9 @@ public class FeignClientFactoryBean implements FactoryBean, ApplicationC @Override public Object getObject() throws Exception { - return null; + return Feign.builder() + .contract(new SpringMvcContract()) + .target(type, "http://localhost:1234"); } @Override diff --git a/mini-spring-cloud-openfeign/src/main/java/com/github/cloud/openfeign/support/SpringMvcContract.java b/mini-spring-cloud-openfeign/src/main/java/com/github/cloud/openfeign/support/SpringMvcContract.java new file mode 100644 index 0000000..fa570f6 --- /dev/null +++ b/mini-spring-cloud-openfeign/src/main/java/com/github/cloud/openfeign/support/SpringMvcContract.java @@ -0,0 +1,46 @@ +package com.github.cloud.openfeign.support; + +import feign.Contract; +import feign.MethodMetadata; +import feign.Request; +import org.springframework.web.bind.annotation.PostMapping; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; + +/** + * feign支持Spring MVC的注解 + * + * @author derek(易仁川) + * @date 2022/4/9 + */ +public class SpringMvcContract extends Contract.BaseContract { + + @Override + protected void processAnnotationOnClass(MethodMetadata data, Class clz) { + //TODO 解析接口注解 + } + + @Override + protected void processAnnotationOnMethod(MethodMetadata data, Annotation annotation, Method method) { + //解析方法注解 + //解析PostMapping注解 + if (annotation instanceof PostMapping) { + PostMapping postMapping = (PostMapping) annotation; + data.template().method(Request.HttpMethod.POST); + String path = postMapping.value()[0]; + if (!path.startsWith("/") && !data.template().path().endsWith("/")) { + path = "/" + path; + } + data.template().uri(path, true); + } + + //TODO 解析其他注解 + } + + @Override + protected boolean processAnnotationsOnParameter(MethodMetadata data, Annotation[] annotations, int paramIndex) { + //TODO 解析参数 + return true; + } +} diff --git a/pom.xml b/pom.xml index eb28a04..3495d09 100644 --- a/pom.xml +++ b/pom.xml @@ -63,6 +63,12 @@ 1.0.0-SNAPSHOT + + com.github + mini-spring-cloud-openfeign + 1.0.0-SNAPSHOT + + com.alibaba fastjson