mirror of
https://gitee.com/durcframework/SOP.git
synced 2025-08-11 12:56:28 +08:00
修复admin后台发布文档不生效问题;业务服务启动不用依赖网关
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
package com.gitee.sop.support.register;
|
||||
|
||||
import com.gitee.sop.support.service.dto.RegisterDTO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author 六如
|
||||
*/
|
||||
public class ApiRegException extends Exception {
|
||||
|
||||
private static final long serialVersionUID = 241480223796854916L;
|
||||
private final List<RegisterDTO> registerDTOS;
|
||||
|
||||
public ApiRegException(Exception e, List<RegisterDTO> registerDTOS) {
|
||||
super(e);
|
||||
this.registerDTOS = registerDTOS;
|
||||
}
|
||||
|
||||
public List<RegisterDTO> getRegisterDTOS() {
|
||||
return registerDTOS;
|
||||
}
|
||||
}
|
@@ -4,7 +4,6 @@ import com.alibaba.fastjson2.JSON;
|
||||
import com.gitee.sop.support.annotation.Open;
|
||||
import com.gitee.sop.support.annotation.OpenGroup;
|
||||
import com.gitee.sop.support.enums.ApiModeEnum;
|
||||
import com.gitee.sop.support.message.OpenMessageFactory;
|
||||
import com.gitee.sop.support.service.ApiRegisterService;
|
||||
import com.gitee.sop.support.service.dto.RegisterDTO;
|
||||
import com.gitee.sop.support.service.dto.RegisterResult;
|
||||
@@ -12,7 +11,6 @@ import lombok.Data;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.dubbo.config.annotation.DubboService;
|
||||
import org.springframework.core.DefaultParameterNameDiscoverer;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
@@ -20,6 +18,7 @@ import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Parameter;
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
@@ -37,11 +36,6 @@ public class ApiRegister {
|
||||
|
||||
private static final Log LOG = LogFactory.getLog(ApiRegister.class);
|
||||
|
||||
/**
|
||||
* Spring自带的参数提取工具类
|
||||
*/
|
||||
private static final DefaultParameterNameDiscoverer DISCOVERER = new DefaultParameterNameDiscoverer();
|
||||
|
||||
|
||||
private final ApiRegisterService apiRegisterService;
|
||||
|
||||
@@ -49,18 +43,43 @@ public class ApiRegister {
|
||||
this.apiRegisterService = apiRegisterService;
|
||||
}
|
||||
|
||||
public void reg(String appName, Collection<Object> objects) {
|
||||
public void reg(String appName, Collection<Object> objects) throws ApiRegException {
|
||||
if (objects == null || objects.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<RegisterDTO> registerDTOS = new ArrayList<>();
|
||||
for (Object serviceObj : objects) {
|
||||
Class<?> objClass = serviceObj.getClass();
|
||||
doWithMethod(objClass, (interfaceClass, method, open) ->
|
||||
this.regApi(appName, interfaceClass, method, open));
|
||||
{
|
||||
RegisterDTO registerDTO = this.buildRegisterDTO(appName, interfaceClass, method, open);
|
||||
registerDTOS.add(registerDTO);
|
||||
});
|
||||
}
|
||||
|
||||
OpenMessageFactory.initMessage();
|
||||
reg(registerDTOS);
|
||||
}
|
||||
|
||||
public void reg(List<RegisterDTO> registerDTOS) throws ApiRegException {
|
||||
if (registerDTOS.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
LOG.info(">>> 开始注册开放接口");
|
||||
try {
|
||||
RegisterResult result = apiRegisterService.register(registerDTOS);
|
||||
if (result.getSuccess()) {
|
||||
LOG.info(">>> 开放接口注册成功,接口数量:" + registerDTOS.size());
|
||||
for (RegisterDTO registerDTO : registerDTOS) {
|
||||
LOG.info(registerDTO);
|
||||
}
|
||||
} else {
|
||||
LOG.error(">>> 开放接口注册失败,网关处理异常:" + result.getMsg());
|
||||
throw new RuntimeException(result.getMsg());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new ApiRegException(e, registerDTOS);
|
||||
}
|
||||
}
|
||||
|
||||
protected void doWithMethod(Class<?> objClass, RegisterCallback callback) {
|
||||
@@ -110,6 +129,23 @@ public class ApiRegister {
|
||||
cache.clear();
|
||||
}
|
||||
|
||||
private RegisterDTO buildRegisterDTO(String appName, Class<?> interfaceClass, Method method, Open open) {
|
||||
List<ParamInfo> paramInfos = buildParamInfo(method);
|
||||
RegisterDTO registerDTO = new RegisterDTO();
|
||||
registerDTO.setApplication(appName);
|
||||
registerDTO.setApiName(getApiName(interfaceClass, open));
|
||||
registerDTO.setApiVersion(open.version());
|
||||
registerDTO.setInterfaceClassName(interfaceClass.getName());
|
||||
registerDTO.setMethodName(method.getName());
|
||||
registerDTO.setParamInfo(JSON.toJSONString(paramInfos));
|
||||
registerDTO.setIsPermission(parseBoolean(open.permission()));
|
||||
registerDTO.setIsNeedToken(parseBoolean(open.needToken()));
|
||||
registerDTO.setHasCommonResponse(parseBoolean(open.hasCommonResponse()));
|
||||
OpenGroup openGroup = interfaceClass.getAnnotation(OpenGroup.class);
|
||||
ApiModeEnum apiMode = openGroup == null ? ApiModeEnum.OPEN : ApiModeEnum.RESTFUL;
|
||||
registerDTO.setApiMode(apiMode.getValue());
|
||||
return registerDTO;
|
||||
}
|
||||
|
||||
private void regApi(String appName, Class<?> interfaceClass, Method method, Open open) {
|
||||
List<ParamInfo> paramInfos = buildParamInfo(method);
|
||||
|
@@ -0,0 +1,60 @@
|
||||
package com.gitee.sop.support.register;
|
||||
|
||||
import com.gitee.sop.support.service.ApiRegisterService;
|
||||
import com.gitee.sop.support.service.dto.RegisterDTO;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @author 六如
|
||||
*/
|
||||
@Slf4j
|
||||
public class ApiRegisterRunner {
|
||||
|
||||
private static ApiRegister apiRegister = null;
|
||||
|
||||
private static ScheduledExecutorService scheduledExecutorService;
|
||||
|
||||
private static final int PERIOD = 5;
|
||||
|
||||
public static void reg(
|
||||
String appName,
|
||||
ApiRegisterService apiRegisterService,
|
||||
Collection<Object> objects
|
||||
) {
|
||||
if (apiRegister == null) {
|
||||
apiRegister = new ApiRegister(apiRegisterService);
|
||||
}
|
||||
try {
|
||||
apiRegister.reg(appName, objects);
|
||||
} catch (ApiRegException e) {
|
||||
log.warn("注册接口失败,{}秒后进行重试", PERIOD, e);
|
||||
scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
|
||||
scheduledExecutorService.scheduleAtFixedRate(() -> retry(e.getRegisterDTOS()), PERIOD, PERIOD, TimeUnit.SECONDS);
|
||||
}
|
||||
}
|
||||
|
||||
private static void retry(List<RegisterDTO> registerDTOS) {
|
||||
try {
|
||||
apiRegister.reg(registerDTOS);
|
||||
// 注册成功
|
||||
scheduledExecutorService.shutdown();
|
||||
} catch (Exception e) {
|
||||
log.warn("注册接口失败,{}秒后进行重试", PERIOD, e);
|
||||
}
|
||||
}
|
||||
|
||||
@AllArgsConstructor
|
||||
@Data
|
||||
static class RetryContext {
|
||||
String appName;
|
||||
Collection<Object> objects;
|
||||
}
|
||||
}
|
@@ -3,6 +3,9 @@ package com.gitee.sop.support.service;
|
||||
import com.gitee.sop.support.service.dto.RegisterDTO;
|
||||
import com.gitee.sop.support.service.dto.RegisterResult;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
||||
/**
|
||||
* @author 六如
|
||||
*/
|
||||
@@ -12,5 +15,14 @@ public interface ApiRegisterService {
|
||||
*
|
||||
* @param registerDTO 接口信息
|
||||
*/
|
||||
RegisterResult register(RegisterDTO registerDTO);
|
||||
default RegisterResult register(RegisterDTO registerDTO) {
|
||||
return register(Collections.singletonList(registerDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
* 接口注册批量
|
||||
*
|
||||
* @param registerDTOS 接口信息
|
||||
*/
|
||||
RegisterResult register(Collection<RegisterDTO> registerDTOS);
|
||||
}
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package com.gitee.sop.support.springboot.config;
|
||||
|
||||
import com.gitee.sop.support.register.ApiRegister;
|
||||
import com.gitee.sop.support.message.OpenMessageFactory;
|
||||
import com.gitee.sop.support.register.ApiRegisterRunner;
|
||||
import com.gitee.sop.support.service.ApiRegisterService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.dubbo.config.annotation.DubboReference;
|
||||
@@ -34,7 +35,10 @@ public class SopAutoConfiguration implements InitializingBean {
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
String appName = environment.getProperty("spring.application.name");
|
||||
Map<String, Object> beanMap = applicationContext.getBeansWithAnnotation(DubboService.class);
|
||||
new ApiRegister(apiRegisterService).reg(appName, beanMap.values());
|
||||
// 注册接口
|
||||
ApiRegisterRunner.reg(appName, apiRegisterService, beanMap.values());
|
||||
// 初始化国际化
|
||||
OpenMessageFactory.initMessage();
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user