From d4823ae473df0f1439efb9f6d5a26916128ad269 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=85=AD=E5=A6=82?= <8775@163.com>
Date: Tue, 10 Sep 2024 21:01:57 +0800
Subject: [PATCH] 5.0
---
pom.xml | 55 +--
.../gitee/sop/storyweb/open/StoryService.java | 8 +
.../com/gitee/sop/index/api/RegisterDTO.java | 9 +-
sop-index/sop-index-service/pom.xml | 8 +-
.../gitee/sop/index/common/ApiInfoDTO.java | 6 +-
.../gitee/sop/index/common/ApiResponse.java | 6 +-
.../gitee/sop/index/common/ParamInfoDTO.java | 9 +
.../gitee/sop/index/common/StatusEnum.java | 2 +-
.../gitee/sop/index/config/IndexConfig.java | 14 +
.../sop/index/controller/IndexController.java | 5 +-
.../gitee/sop/index/dao/entity/ApiInfo.java | 11 +-
.../gitee/sop/index/dao/entity/IsvInfo.java | 45 +++
.../gitee/sop/index/dao/entity/IsvKeys.java | 57 +++
.../sop/index/dao/mapper/IsvInfoMapper.java | 15 +
.../sop/index/dao/mapper/IsvKeysMapper.java | 11 +
.../{ApiService.java => ApiInfoService.java} | 10 +-
.../index/service/GenericServiceInvoker.java | 32 +-
.../gitee/sop/index/service/RouteService.java | 86 +----
.../sop/index/service/RouteServiceImpl.java | 108 ++++++
.../service/dubbo/ApiRegisterServiceImpl.java | 15 +-
.../sop/index/service/manager/dto/IsvDTO.java | 5 +-
.../manager/impl/LocalIsvManagerImpl.java | 18 +-
.../manager/impl/LocalSecretManagerImpl.java | 16 +-
.../manager/impl/RedisSecretManager.java | 13 +
.../index/service/validate/ApiValidator.java | 33 +-
.../com/gitee/sop/index/util/CopyUtil.java | 344 ++++++++++++++++++
.../main/resources/application-dev.properties | 9 +-
.../src/main/resources/application.properties | 17 +-
.../main/resources/mybatis/mybatisConfig.xml | 26 ++
.../src/main/resources/schema.sql | 16 -
.../support/config/SopAutoConfiguration.java | 40 +-
.../gitee/sop/test/AlipayClientPostTest.java | 35 ++
32 files changed, 812 insertions(+), 272 deletions(-)
create mode 100644 sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ParamInfoDTO.java
create mode 100644 sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/entity/IsvInfo.java
create mode 100644 sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/entity/IsvKeys.java
create mode 100644 sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/mapper/IsvInfoMapper.java
create mode 100644 sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/mapper/IsvKeysMapper.java
rename sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/{ApiService.java => ApiInfoService.java} (73%)
create mode 100644 sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteServiceImpl.java
create mode 100644 sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/manager/impl/RedisSecretManager.java
create mode 100644 sop-index/sop-index-service/src/main/java/com/gitee/sop/index/util/CopyUtil.java
create mode 100644 sop-index/sop-index-service/src/main/resources/mybatis/mybatisConfig.xml
delete mode 100644 sop-index/sop-index-service/src/main/resources/schema.sql
diff --git a/pom.xml b/pom.xml
index 7328c53d..88f676fc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,7 @@
sop-example
- sop-admin
+
sop-test
sop-sdk
@@ -47,8 +47,6 @@
3.2.10
-
- 1.2.3
4.11
1.2.83
2.5
@@ -60,11 +58,7 @@
2.0.1.Final
6.0.13.Final
3.0.10
- 3.5.3.1
29.0-jre
- 3.0.2
- 1.5.21
- 3.0.0
1.16.9
6.2
5.2.0
@@ -125,51 +119,12 @@
${fastmybatis.version}
-
- io.springfox
- springfox-swagger2
- ${springfox.version}
-
-
- io.springfox
- springfox-spring-web
- ${springfox.version}
-
-
- io.springfox
- springfox-swagger-ui
- ${springfox.version}
-
-
- io.springfox
- springfox-boot-starter
- ${springfox.version}
-
-
-
- com.github.xiaoymin
- knife4j-spring-boot-starter
- ${knife4j.version}
-
-
-
- net.oschina.durcframework
- easyopen
- ${easyopen.version}
-
-
com.squareup.okhttp3
okhttp
3.14.7
-
- net.oschina.durcframework
- easyopen-spring-boot-starter
- ${easyopen.version}
-
-
javax.validation
validation-api
@@ -181,12 +136,6 @@
${hibernate-validator.version}
-
- ch.qos.logback
- logback-classic
- ${logback.version}
-
-
org.apache.commons
@@ -234,7 +183,7 @@
org.projectlombok
lombok
- 1.18.4
+ 1.18.30
javax.servlet
diff --git a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/open/StoryService.java b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/open/StoryService.java
index 556f885e..7a68f65c 100644
--- a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/open/StoryService.java
+++ b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/open/StoryService.java
@@ -15,4 +15,12 @@ public interface StoryService {
@Open("story.get")
StoryResponse getById(Integer id);
+ @Open("story.find")
+ default StoryResponse getById(Integer id, String name) {
+ StoryResponse storyResponse = new StoryResponse();
+ storyResponse.setId(id);
+ storyResponse.setName(name);
+ return storyResponse;
+ }
+
}
diff --git a/sop-index/sop-index-api/src/main/java/com/gitee/sop/index/api/RegisterDTO.java b/sop-index/sop-index-api/src/main/java/com/gitee/sop/index/api/RegisterDTO.java
index 7cb03023..59fbef6e 100644
--- a/sop-index/sop-index-api/src/main/java/com/gitee/sop/index/api/RegisterDTO.java
+++ b/sop-index/sop-index-api/src/main/java/com/gitee/sop/index/api/RegisterDTO.java
@@ -21,9 +21,12 @@ public class RegisterDTO implements Serializable {
private String methodName;
- private String paramName;
-
- private String paramTypeName;
+ /**
+ * 字段信息
+ *
+ * [{"name":"id": "type":"java.lang.Integer"}]
+ */
+ private String paramInfo;
private Integer isPermission;
diff --git a/sop-index/sop-index-service/pom.xml b/sop-index/sop-index-service/pom.xml
index 4adf9f15..3cc1a793 100644
--- a/sop-index/sop-index-service/pom.xml
+++ b/sop-index/sop-index-service/pom.xml
@@ -48,6 +48,7 @@
io.gitee.durcframework
fastmybatis-spring-boot-starter
+
mysql
mysql-connector-java
@@ -80,13 +81,6 @@
-
-
- com.h2database
- h2
- provided
-
-
org.apache.dubbo
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiInfoDTO.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiInfoDTO.java
index 7d091520..0d4d1ee7 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiInfoDTO.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiInfoDTO.java
@@ -21,11 +21,7 @@ public class ApiInfoDTO implements Serializable {
private String methodName;
- private String paramName;
-
- private String paramTypeName;
-
- private Integer isIgnoreValidate;
+ private String paramInfo;
private Integer isPermission;
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiResponse.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiResponse.java
index 5a3955fd..6448069b 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiResponse.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ApiResponse.java
@@ -67,17 +67,17 @@ public class ApiResponse {
/**
* 网关异常信息
*/
- private String msg;
+ private String msg = "";
/**
* 业务异常码
*/
- private String sub_code;
+ private String sub_code = "";
/**
* 业务异常信息
*/
- private String sub_msg;
+ private String sub_msg = "";
/**
* 返回对象
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ParamInfoDTO.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ParamInfoDTO.java
new file mode 100644
index 00000000..f15631a4
--- /dev/null
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/ParamInfoDTO.java
@@ -0,0 +1,9 @@
+package com.gitee.sop.index.common;
+
+import lombok.Data;
+
+@Data
+public class ParamInfoDTO {
+ private String name;
+ private String type;
+}
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/StatusEnum.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/StatusEnum.java
index 75a03b20..3bb4e71c 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/StatusEnum.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/common/StatusEnum.java
@@ -10,7 +10,7 @@ import lombok.Getter;
@Getter
public enum StatusEnum {
ENABLE(1),
- DISABLE(0);
+ DISABLE(2);
private final int value;
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/config/IndexConfig.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/config/IndexConfig.java
index 52c2b3a5..9200ea23 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/config/IndexConfig.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/config/IndexConfig.java
@@ -3,8 +3,10 @@ package com.gitee.sop.index.config;
import com.gitee.sop.index.message.ErrorFactory;
import com.gitee.sop.index.service.manager.impl.LocalApiCacheManagerImpl;
import com.gitee.sop.index.service.manager.impl.LocalIsvManagerImpl;
+import com.gitee.sop.index.service.manager.impl.LocalSecretManagerImpl;
import com.gitee.sop.index.service.manager.impl.RedisApiCacheManagerImpl;
import com.gitee.sop.index.service.manager.impl.RedisIsvManagerImpl;
+import com.gitee.sop.index.service.manager.impl.RedisSecretManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
@@ -43,6 +45,18 @@ public class IndexConfig {
return new RedisIsvManagerImpl();
}
+ @Bean
+ @ConditionalOnProperty(value = "manager.secret", havingValue = "local", matchIfMissing = true)
+ public LocalSecretManagerImpl localSecretManager() {
+ return new LocalSecretManagerImpl();
+ }
+
+ @Bean
+ @ConditionalOnProperty(value = "manager.secret", havingValue = "redis")
+ public RedisSecretManager redisSecretManager() {
+ return new RedisSecretManager();
+ }
+
@PostConstruct
public void init() {
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/controller/IndexController.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/controller/IndexController.java
index c8aa0a32..dc7f12f2 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/controller/IndexController.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/controller/IndexController.java
@@ -5,13 +5,12 @@ import com.gitee.sop.index.common.ApiRequestContext;
import com.gitee.sop.index.common.ApiResponse;
import com.gitee.sop.index.service.RouteService;
import com.gitee.sop.index.util.RequestUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
/**
@@ -22,7 +21,7 @@ import javax.servlet.http.HttpServletRequest;
@RestController
public class IndexController {
- @Autowired
+ @Resource
private RouteService routeService;
@GetMapping("/")
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/entity/ApiInfo.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/entity/ApiInfo.java
index 82674b4f..c2f6018f 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/entity/ApiInfo.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/entity/ApiInfo.java
@@ -48,14 +48,9 @@ public class ApiInfo {
private String methodName;
/**
- * 参数名称
+ * 参数信息
*/
- private String paramName;
-
- /**
- * 参数类型名称
- */
- private String paramTypeName;
+ private String paramInfo;
/**
* 接口是否需要授权访问
@@ -70,7 +65,7 @@ public class ApiInfo {
/**
* 状态,1-启用,0-禁用
*/
- private Integer apiStatus;
+ private Integer status;
private LocalDateTime addTime;
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/entity/IsvInfo.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/entity/IsvInfo.java
new file mode 100644
index 00000000..8cb81797
--- /dev/null
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/entity/IsvInfo.java
@@ -0,0 +1,45 @@
+package com.gitee.sop.index.dao.entity;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import com.gitee.fastmybatis.annotation.Pk;
+import com.gitee.fastmybatis.annotation.PkStrategy;
+import com.gitee.fastmybatis.annotation.Table;
+
+import lombok.Data;
+
+
+/**
+ * 表名:isv_info
+ * 备注:isv信息表
+ *
+ * @author tanghc
+ */
+@Table(name = "isv_info", pk = @Pk(name = "id", strategy = PkStrategy.INCREMENT))
+@Data
+public class IsvInfo {
+
+ private Long id;
+
+ /**
+ * appKey
+ */
+ private String appId;
+
+ /**
+ * 1启用,2禁用
+ */
+ private Integer status;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ private LocalDateTime addTime;
+
+ private LocalDateTime updateTime;
+
+
+}
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/entity/IsvKeys.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/entity/IsvKeys.java
new file mode 100644
index 00000000..ea0870fd
--- /dev/null
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/entity/IsvKeys.java
@@ -0,0 +1,57 @@
+package com.gitee.sop.index.dao.entity;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import com.gitee.fastmybatis.annotation.Pk;
+import com.gitee.fastmybatis.annotation.PkStrategy;
+import com.gitee.fastmybatis.annotation.Table;
+
+import lombok.Data;
+
+
+/**
+ * 表名:isv_keys
+ * 备注:ISV秘钥管理
+ *
+ * @author tanghc
+ */
+@Table(name = "isv_keys", pk = @Pk(name = "id", strategy = PkStrategy.INCREMENT))
+@Data
+public class IsvKeys {
+
+ private Long id;
+
+ private String appId;
+
+ /**
+ * 秘钥格式,1:PKCS8(JAVA适用),2:PKCS1(非JAVA适用)
+ */
+ private Integer keyFormat;
+
+ /**
+ * 开发者生成的公钥
+ */
+ private String publicKeyIsv;
+
+ /**
+ * 开发者生成的私钥(交给开发者)
+ */
+ private String privateKeyIsv;
+
+ /**
+ * 平台生成的公钥(交给开发者)
+ */
+ private String publicKeyPlatform;
+
+ /**
+ * 平台生成的私钥
+ */
+ private String privateKeyPlatform;
+
+ private LocalDateTime addTime;
+
+ private LocalDateTime updateTime;
+
+
+}
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/mapper/IsvInfoMapper.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/mapper/IsvInfoMapper.java
new file mode 100644
index 00000000..b0ba24a3
--- /dev/null
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/mapper/IsvInfoMapper.java
@@ -0,0 +1,15 @@
+package com.gitee.sop.index.dao.mapper;
+
+import com.gitee.fastmybatis.core.mapper.BaseMapper;
+import com.gitee.sop.index.dao.entity.IsvInfo;
+
+/**
+ * @author tanghc
+ */
+public interface IsvInfoMapper extends BaseMapper {
+
+ default IsvInfo getByAppId(String appId) {
+ return this.get(IsvInfo::getAppId, appId);
+ }
+
+}
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/mapper/IsvKeysMapper.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/mapper/IsvKeysMapper.java
new file mode 100644
index 00000000..99d169e1
--- /dev/null
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/dao/mapper/IsvKeysMapper.java
@@ -0,0 +1,11 @@
+package com.gitee.sop.index.dao.mapper;
+
+import com.gitee.fastmybatis.core.mapper.BaseMapper;
+import com.gitee.sop.index.dao.entity.IsvKeys;
+
+/**
+ * @author tanghc
+ */
+public interface IsvKeysMapper extends BaseMapper {
+
+}
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/ApiService.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/ApiInfoService.java
similarity index 73%
rename from sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/ApiService.java
rename to sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/ApiInfoService.java
index 6338ba14..351246d9 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/ApiService.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/ApiInfoService.java
@@ -4,7 +4,7 @@ import com.gitee.sop.index.common.ApiInfoDTO;
import com.gitee.sop.index.dao.entity.ApiInfo;
import com.gitee.sop.index.dao.mapper.ApiInfoMapper;
import com.gitee.sop.index.service.manager.ApiCacheManager;
-import org.springframework.beans.BeanUtils;
+import com.gitee.sop.index.util.CopyUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -13,7 +13,7 @@ import javax.annotation.Resource;
* @author 六如
*/
@Service
-public class ApiService {
+public class ApiInfoService {
@Resource
private ApiCacheManager apiCacheManager;
@@ -23,12 +23,8 @@ public class ApiService {
public ApiInfoDTO getApi(String apiName, String apiVersion) {
return apiCacheManager.getOrElse(apiName, apiVersion, () -> {
- ApiInfoDTO record = new ApiInfoDTO();
ApiInfo apiInfo = apiInfoMapper.getByNameVersion(apiName, apiVersion);
- if (apiInfo != null) {
- BeanUtils.copyProperties(apiInfo, record);
- }
- return record;
+ return CopyUtil.copyBean(apiInfo, ApiInfoDTO::new);
});
}
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/GenericServiceInvoker.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/GenericServiceInvoker.java
index b0fede74..4460cd5b 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/GenericServiceInvoker.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/GenericServiceInvoker.java
@@ -1,8 +1,10 @@
package com.gitee.sop.index.service;
+import org.apache.dubbo.common.config.ReferenceCache;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.utils.SimpleReferenceCache;
import org.apache.dubbo.rpc.service.GenericService;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
@@ -16,10 +18,8 @@ import org.springframework.stereotype.Service;
@Service
public class GenericServiceInvoker implements InitializingBean {
private static final String TRUE = "true";
- private ApplicationConfig applicationConfig;
- @Value("${nacos.host:localhost:8848}")
- private String nacosHost;
+ private ApplicationConfig applicationConfig;
@Value("${register.address:${register.type}://${register.host}")
private String registerAddress;
@@ -32,13 +32,13 @@ public class GenericServiceInvoker implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
- RegistryConfig registryConfig = buildRegistryConfig(nacosHost);
+ RegistryConfig registryConfig = buildRegistryConfig();
applicationConfig = new ApplicationConfig();
applicationConfig.setName(appName + "-generic");
applicationConfig.setRegistry(registryConfig);
}
- private RegistryConfig buildRegistryConfig(String nacosHost) {
+ private RegistryConfig buildRegistryConfig() {
RegistryConfig config = new RegistryConfig();
config.setAddress(registerAddress);
return config;
@@ -50,25 +50,9 @@ public class GenericServiceInvoker implements InitializingBean {
reference.setApplication(applicationConfig);
reference.setInterface(interfaceName);
reference.setTimeout(timeout);
- try {
- removeGenericSymbol(parameterTypes);
- GenericService genericService = reference.get();
- return genericService.$invoke(method, parameterTypes, params);
- } finally {
- reference.destroy();
- }
+ ReferenceCache referenceCache = SimpleReferenceCache.getCache();
+ GenericService genericService = referenceCache.get(reference);
+ return genericService.$invoke(method, parameterTypes, params);
}
-
- /**
- * remove generic from parameterTypes
- */
- private void removeGenericSymbol(String[] parameterTypes) {
- for (int i = 0; i < parameterTypes.length; i++) {
- int index = parameterTypes[i].indexOf('<');
- if (index > -1) {
- parameterTypes[i] = parameterTypes[i].substring(0, index);
- }
- }
- }
}
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteService.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteService.java
index 41ddb655..d06121db 100644
--- a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteService.java
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteService.java
@@ -1,91 +1,21 @@
package com.gitee.sop.index.service;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
-import com.gitee.sop.index.common.ApiInfoDTO;
-import com.gitee.sop.index.common.ApiRequest;
import com.gitee.sop.index.common.ApiRequestContext;
import com.gitee.sop.index.common.ApiResponse;
-import com.gitee.sop.index.exception.ExceptionExecutor;
-import com.gitee.sop.index.service.validate.Validator;
-import com.gitee.sop.index.util.ClassUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.dubbo.common.utils.ClassUtils;
-import org.springframework.stereotype.Service;
-import org.springframework.util.ObjectUtils;
-import org.springframework.util.StringUtils;
-
-import javax.annotation.Resource;
/**
* 接口路由
*
* @author 六如
*/
-@Service
-@Slf4j
-public class RouteService {
+public interface RouteService {
- @Resource
- private Validator validator;
-
- @Resource
- private GenericServiceInvoker genericServiceInvoker;
-
- @Resource
- private ExceptionExecutor exceptionExecutor;
-
- public ApiResponse route(ApiRequestContext apiRequestContext) {
- ApiRequest apiRequest = apiRequestContext.getApiRequest();
- log.info("收到客户端请求, ip={}, apiRequest={}", apiRequestContext.getIp(), apiRequest);
- try {
- // 接口校验
- ApiInfoDTO apiInfoDTO = validator.validate(apiRequestContext);
- return doRoute(apiRequestContext, apiInfoDTO);
- } catch (Exception e) {
- log.error("接口请求报错, , ip={}, apiRequest={}", apiRequestContext.getIp(), apiRequest, e);
- return exceptionExecutor.executeException(apiRequestContext, e);
- }
- }
-
- private ApiResponse doRoute(ApiRequestContext apiRequestContext, ApiInfoDTO apiInfo) {
- ApiRequest apiRequest = apiRequestContext.getApiRequest();
- Object result = genericServiceInvoker.invoke(
- apiInfo.getInterfaceClassName(),
- apiInfo.getMethodName(),
- buildParamType(apiInfo),
- buildInvokeParam(apiRequest, apiInfo)
- );
- return ApiResponse.success(result);
- }
-
- private String[] buildParamType(ApiInfoDTO apiInfo) {
- String paramTypeName = apiInfo.getParamTypeName();
- if (StringUtils.hasText(paramTypeName)) {
- return new String[]{apiInfo.getParamTypeName()};
- } else {
- return new String[0];
- }
- }
-
- private Object[] buildInvokeParam(ApiRequest apiRequest, ApiInfoDTO apiInfo) {
- if (ObjectUtils.isEmpty(apiInfo.getParamTypeName())) {
- return new Object[0];
- }
- String bizContent = apiRequest.getBiz_content();
- JSONObject jsonObject = JSON.parseObject(bizContent);
- if (ClassUtil.isPrimitive(apiInfo.getParamTypeName())) {
- try {
- Object value = jsonObject.getObject(apiInfo.getParamName(), ClassUtils.forName(apiInfo.getParamTypeName()));
- return new Object[]{value};
- } catch (ClassNotFoundException e) {
- log.error("找不到参数class, paramTypeName={}, apiRequest={}, apiInfo={}",
- apiInfo.getParamTypeName(), apiRequest, apiInfo, e);
- throw new RuntimeException(e);
- }
- } else {
- return new Object[]{jsonObject};
- }
- }
+ /**
+ * 路由
+ *
+ * @param apiRequestContext 接口上下文
+ * @return 返回结果
+ */
+ ApiResponse route(ApiRequestContext apiRequestContext);
}
diff --git a/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteServiceImpl.java b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteServiceImpl.java
new file mode 100644
index 00000000..1e6262cf
--- /dev/null
+++ b/sop-index/sop-index-service/src/main/java/com/gitee/sop/index/service/RouteServiceImpl.java
@@ -0,0 +1,108 @@
+package com.gitee.sop.index.service;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.gitee.sop.index.common.ApiInfoDTO;
+import com.gitee.sop.index.common.ApiRequest;
+import com.gitee.sop.index.common.ApiRequestContext;
+import com.gitee.sop.index.common.ApiResponse;
+import com.gitee.sop.index.common.ParamInfoDTO;
+import com.gitee.sop.index.exception.ExceptionExecutor;
+import com.gitee.sop.index.service.validate.Validator;
+import com.gitee.sop.index.util.ClassUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.common.utils.ClassUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 接口路由
+ *
+ * @author 六如
+ */
+@Service
+@Slf4j
+public class RouteServiceImpl implements RouteService {
+
+ private static final String CLASS = "class";
+
+ @Resource
+ protected Validator validator;
+
+ @Resource
+ protected GenericServiceInvoker genericServiceInvoker;
+
+ @Resource
+ protected ExceptionExecutor exceptionExecutor;
+
+ @Override
+ public ApiResponse route(ApiRequestContext apiRequestContext) {
+ ApiRequest apiRequest = apiRequestContext.getApiRequest();
+ log.info("收到客户端请求, ip={}, apiRequest={}", apiRequestContext.getIp(), apiRequest);
+ try {
+ // 接口校验
+ ApiInfoDTO apiInfoDTO = validator.validate(apiRequestContext);
+ // 微服务结果
+ Object result = doRoute(apiRequestContext, apiInfoDTO);
+ return ApiResponse.success(result);
+ } catch (Exception e) {
+ log.error("接口请求报错, , ip={}, apiRequest={}", apiRequestContext.getIp(), apiRequest, e);
+ return exceptionExecutor.executeException(apiRequestContext, e);
+ }
+ }
+
+ protected Object doRoute(ApiRequestContext apiRequestContext, ApiInfoDTO apiInfo) {
+ ApiRequest apiRequest = apiRequestContext.getApiRequest();
+ String paramInfo = apiInfo.getParamInfo();
+ List paramInfoList = JSON.parseArray(paramInfo, ParamInfoDTO.class);
+ Object result = genericServiceInvoker.invoke(
+ apiInfo.getInterfaceClassName(),
+ apiInfo.getMethodName(),
+ buildParamType(paramInfoList),
+ buildInvokeParam(apiRequest, paramInfoList)
+ );
+ if (result instanceof Map) {
+ ((Map, ?>) result).remove(CLASS);
+ }
+ return result;
+ }
+
+ protected String[] buildParamType(List paramInfoList) {
+ if (ObjectUtils.isEmpty(paramInfoList)) {
+ return new String[0];
+ }
+ return paramInfoList.stream()
+ .map(ParamInfoDTO::getType)
+ .toArray(String[]::new);
+ }
+
+ protected Object[] buildInvokeParam(ApiRequest apiRequest, List paramInfoList) {
+ if (ObjectUtils.isEmpty(paramInfoList)) {
+ return new Object[0];
+ }
+ String bizContent = apiRequest.getBiz_content();
+ JSONObject jsonObject = JSON.parseObject(bizContent);
+ List