✨ 添加新特性。 添加 feign endpoint

This commit is contained in:
冷冷 committed 2020-03-25 12:10:53 +08:00
1 parent d06618ae36
commit 611596506d
2 files changed
+127

No files matched your search

@@ -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);
}
}
@@ -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<FeignClientInfo> clientList;
public FeignClientEndpoint(ApplicationContext context) {
this.context = context;
this.clientList = new ArrayList<>();
}
@ReadOperation
public List<FeignClientInfo> invoke() {
return clientList;
}
@Override
public void afterSingletonsInstantiated() {
clientList.addAll(getClientList(context));
}
private static List<FeignClientInfo> getClientList(ApplicationContext context) {
Map<String, Object> feignClientMap = context.getBeansWithAnnotation(FeignClient.class);
// 1. 解析注解
List<FeignClientInfo> feignClientInfoList = new ArrayList<>();
Set<Map.Entry<String, Object>> feignClientEntrySet = feignClientMap.entrySet();
for (Map.Entry<String, Object> 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<ClientInfo> 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<ClientInfo> clientList;
}
@Getter
@AllArgsConstructor
public static class ClientInfo {
private final RequestMethod[] methods;
private final String[] mappings;
}
}