mirror of
http://git.pig4cloud.com/pig/pigx.git
synced 2026-11-11 13:19:01 +08:00
✨ 添加新特性。 添加 feign endpoint
This commit is contained in:
1 parent
d06618ae36
commit
611596506d
2 files changed
+127
No files matched your search
+13
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
+114
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user