From 611596506de9e0a16e8528b23d39d28ce52ea054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= Date: Wed, 25 Mar 2020 12:10:53 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E6=B7=BB=E5=8A=A0=E6=96=B0?= =?UTF-8?q?=E7=89=B9=E6=80=A7=E3=80=82=20=E6=B7=BB=E5=8A=A0=20feign=20endp?= =?UTF-8?q?oint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feign/PigxFeignAutoConfiguration.java | 13 ++ .../feign/endpoint/FeignClientEndpoint.java | 114 ++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/endpoint/FeignClientEndpoint.java diff --git a/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/PigxFeignAutoConfiguration.java b/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/PigxFeignAutoConfiguration.java index 46ec3b360..b722878eb 100644 --- a/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/PigxFeignAutoConfiguration.java +++ b/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/PigxFeignAutoConfiguration.java @@ -17,11 +17,17 @@ package com.pig4cloud.pigx.common.feign; +import com.pig4cloud.pigx.common.feign.endpoint.FeignClientEndpoint; import feign.Feign; +import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint; +import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.PigxFeignClientsRegistrar; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -37,4 +43,11 @@ import org.springframework.context.annotation.Import; @AutoConfigureAfter(EnableFeignClients.class) public class PigxFeignAutoConfiguration { + @Bean + @ConditionalOnMissingBean + @ConditionalOnAvailableEndpoint + public FeignClientEndpoint feignClientEndpoint(ApplicationContext context) { + return new FeignClientEndpoint(context); + } + } diff --git a/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/endpoint/FeignClientEndpoint.java b/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/endpoint/FeignClientEndpoint.java new file mode 100644 index 000000000..60d6f0986 --- /dev/null +++ b/pigx-common/pigx-common-feign/src/main/java/com/pig4cloud/pigx/common/feign/endpoint/FeignClientEndpoint.java @@ -0,0 +1,114 @@ +package com.pig4cloud.pigx.common.feign.endpoint; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.springframework.beans.factory.SmartInitializingSingleton; +import org.springframework.boot.actuate.endpoint.annotation.Endpoint; +import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.context.ApplicationContext; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Feign client 端点 + * + * @author L.cm + */ +@Endpoint(id = "feign") +public class FeignClientEndpoint implements SmartInitializingSingleton { + private final ApplicationContext context; + private final List clientList; + + public FeignClientEndpoint(ApplicationContext context) { + this.context = context; + this.clientList = new ArrayList<>(); + } + + @ReadOperation + public List invoke() { + return clientList; + } + + @Override + public void afterSingletonsInstantiated() { + clientList.addAll(getClientList(context)); + } + + private static List getClientList(ApplicationContext context) { + Map feignClientMap = context.getBeansWithAnnotation(FeignClient.class); + // 1. 解析注解 + List feignClientInfoList = new ArrayList<>(); + Set> feignClientEntrySet = feignClientMap.entrySet(); + for (Map.Entry feignClientEntry : feignClientEntrySet) { + String beanName = feignClientEntry.getKey(); + Object feignClientBean = feignClientEntry.getValue(); + if (feignClientBean == null) { + continue; + } + // 解析注解 + Class feignClientClass = feignClientBean.getClass(); + FeignClient feignClientAnn = AnnotationUtils.findAnnotation(feignClientClass, FeignClient.class); + if (feignClientAnn == null) { + continue; + } + FeignClientInfo feignClientInfo = new FeignClientInfo(); + feignClientInfo.setBeanName(beanName); + String serviceId = feignClientAnn.value(); + String contextId = feignClientAnn.contextId(); + String url = feignClientAnn.url(); + String path = feignClientAnn.path(); + feignClientInfo.setServiceId(serviceId); + feignClientInfo.setContextId(contextId); + feignClientInfo.setUrl(url); + feignClientInfo.setPath(path); + // 组装客户端信息 + List clientInfoList = new ArrayList<>(); + Class[] interfaces = feignClientClass.getInterfaces(); + for (Class clientInterface : interfaces) { + Method[] methods = clientInterface.getDeclaredMethods(); + for (Method method : methods) { + if (method.isDefault()) { + continue; + } + RequestMapping requestMapping = AnnotatedElementUtils.getMergedAnnotation(method, RequestMapping.class); + if (requestMapping == null) { + continue; + } + clientInfoList.add(new ClientInfo(requestMapping.method(), requestMapping.value())); + } + } + feignClientInfo.setClientList(clientInfoList); + feignClientInfoList.add(feignClientInfo); + } + return feignClientInfoList; + } + + @Getter + @Setter + public static class FeignClientInfo { + private String beanName; + private String serviceId; + private String contextId; + private String url; + private String path; + private List clientList; + } + + @Getter + @AllArgsConstructor + public static class ClientInfo { + private final RequestMethod[] methods; + private final String[] mappings; + } + +} \ No newline at end of file