mirror of
https://gitee.com/durcframework/SOP.git
synced 2025-08-11 21:57:56 +08:00
对接easyopen
This commit is contained in:
@@ -2,21 +2,19 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.1.2.RELEASE</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>com.gitee.sop</groupId>
|
||||
<artifactId>sop-gateway-common</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>sop-gateway-common</name>
|
||||
<description>sop-gateway-common</description>
|
||||
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
|
||||
<spring-boot.version>2.1.2.RELEASE</spring-boot.version>
|
||||
<maven.compiler.source>1.8</maven.compiler.source>
|
||||
<maven.compiler.target>1.8</maven.compiler.target>
|
||||
<!-- Logging -->
|
||||
<logback.version>1.0.13</logback.version>
|
||||
<slf4j.version>1.7.5</slf4j.version>
|
||||
@@ -28,28 +26,44 @@
|
||||
<commons-io.version>2.5</commons-io.version>
|
||||
<commons-fileupload.version>1.3.3</commons-fileupload.version>
|
||||
<commons-collection.version>3.2.2</commons-collection.version>
|
||||
<xstream.version>1.4.7</xstream.version>
|
||||
<velocity.version>1.7</velocity.version>
|
||||
<hibernate-validator.version>6.0.10.Final</hibernate-validator.version>
|
||||
<oltu.version>0.31</oltu.version>
|
||||
<jwt.version>3.2.0</jwt.version>
|
||||
<guava.version>18.0</guava.version>
|
||||
<spring-data-redis.version>1.8.8.RELEASE</spring-data-redis.version>
|
||||
<netty.version>4.1.25.Final</netty.version>
|
||||
<jboss-marshalling-serial.version>2.0.5.Final</jboss-marshalling-serial.version>
|
||||
<itextpdf.version>5.5.12</itextpdf.version>
|
||||
<xmlworker.version>5.5.8</xmlworker.version>
|
||||
<itext-asian.version>5.2.0</itext-asian.version>
|
||||
<asm.version>6.2</asm.version>
|
||||
<commons-lang3.version>3.8.1</commons-lang3.version>
|
||||
<commons-codec.version>1.11</commons-codec.version>
|
||||
<xstream.version>1.4.7</xstream.version>
|
||||
<zookeeper.version>3.4.12</zookeeper.version>
|
||||
</properties>
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<!-- 加了这个就不需要加版本号了 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-dependencies</artifactId>
|
||||
<version>${spring-boot.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-dependencies</artifactId>
|
||||
<version>${spring-cloud.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-netflix-ribbon</artifactId>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-gateway</artifactId>
|
||||
@@ -60,10 +74,6 @@
|
||||
<artifactId>spring-boot-starter-webflux</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- zookeeper -->
|
||||
<dependency>
|
||||
@@ -84,7 +94,7 @@
|
||||
<dependency>
|
||||
<groupId>org.apache.zookeeper</groupId>
|
||||
<artifactId>zookeeper</artifactId>
|
||||
<version>3.4.12</version>
|
||||
<version>${zookeeper.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.slf4j</groupId>
|
||||
@@ -93,11 +103,17 @@
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.thoughtworks.xstream</groupId>
|
||||
<artifactId>xstream</artifactId>
|
||||
@@ -109,15 +125,11 @@
|
||||
<artifactId>fastjson</artifactId>
|
||||
<version>${fastjson.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
</dependency>
|
||||
<!-- commons -->
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.8.1</version>
|
||||
<version>${commons-lang3.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-collections</groupId>
|
||||
@@ -151,42 +163,60 @@
|
||||
<version>3.1.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-netflix-ribbon</artifactId>
|
||||
<version>2.1.0.RELEASE</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-dependencies</artifactId>
|
||||
<version>${spring-cloud.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<!-- 打包时跳过测试 -->
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<skipTests>true</skipTests>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>${java.version}</source>
|
||||
<target>${java.version}</target>
|
||||
<encoding>UTF-8</encoding>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<version>2.2.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-sources</id>
|
||||
<goals>
|
||||
<goal>jar-no-fork</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>2.9</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-javadocs</id>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
<!-- JDK8必须使用下面的配置 -->
|
||||
<configuration>
|
||||
<additionalparam>-Xdoclint:none</additionalparam>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>spring-milestones</id>
|
||||
<name>Spring Milestones</name>
|
||||
<url>https://repo.spring.io/milestone</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
</project>
|
||||
|
@@ -95,6 +95,11 @@ public class ApiConfig {
|
||||
*/
|
||||
private boolean ignoreValidate;
|
||||
|
||||
/**
|
||||
* 是否对结果进行合并
|
||||
*/
|
||||
private boolean mergeResult = true;
|
||||
|
||||
/**
|
||||
* 超时时间
|
||||
*/
|
||||
|
@@ -21,4 +21,9 @@ public class BaseRouteDefinition {
|
||||
* 路由执行的顺序
|
||||
*/
|
||||
private int order = 0;
|
||||
|
||||
/**
|
||||
* 是否忽略验证,业务参数验证除外
|
||||
*/
|
||||
private boolean ignoreValidate;
|
||||
}
|
||||
|
@@ -32,7 +32,7 @@ public class SopConstants {
|
||||
public static final int BIZ_ERROR_STATUS = 4000;
|
||||
|
||||
/**
|
||||
* zookeeper存放接口信息的根目录
|
||||
* zookeeper存放接口路由信息的根目录
|
||||
*/
|
||||
public static final String SOP_SERVICE_API_PATH = "/sop-service-api";
|
||||
public static final String SOP_SERVICE_ROUTE_PATH = "/sop-service-route";
|
||||
}
|
||||
|
@@ -0,0 +1,27 @@
|
||||
package com.gitee.sop.gatewaycommon.easyopen;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.gitee.sop.gatewaycommon.message.Error;
|
||||
import com.gitee.sop.gatewaycommon.result.ApiResult;
|
||||
import com.gitee.sop.gatewaycommon.result.ResultExecutor;
|
||||
import com.gitee.sop.gatewaycommon.zuul.result.ZuulResultExecutor;
|
||||
import com.netflix.zuul.context.RequestContext;
|
||||
|
||||
/**
|
||||
* @author tanghc
|
||||
*/
|
||||
public class EasyopenResultExecutor implements ResultExecutor<RequestContext, String> {
|
||||
@Override
|
||||
public String mergeResult(RequestContext request, String serviceResult) {
|
||||
return serviceResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String buildErrorResult(RequestContext request, Throwable ex) {
|
||||
ApiResult apiResult = new ApiResult();
|
||||
Error error = ZuulResultExecutor.getError(ex);
|
||||
apiResult.setCode(error.getSub_code());
|
||||
apiResult.setMsg(error.getSub_msg());
|
||||
return JSON.toJSONString(apiResult);
|
||||
}
|
||||
}
|
@@ -0,0 +1,34 @@
|
||||
package com.gitee.sop.gatewaycommon.easyopen;
|
||||
|
||||
import com.gitee.sop.gatewaycommon.param.ApiParam;
|
||||
import com.gitee.sop.gatewaycommon.validate.AbstractSigner;
|
||||
import com.gitee.sop.gatewaycommon.validate.taobao.TaobaoSigner;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author tanghc
|
||||
*/
|
||||
public class EasyopenSigner extends AbstractSigner {
|
||||
@Override
|
||||
protected String buildServerSign(ApiParam params, String secret) {
|
||||
Set<String> keySet = params.keySet();
|
||||
List<String> paramNames = new ArrayList<String>(keySet);
|
||||
|
||||
Collections.sort(paramNames);
|
||||
|
||||
StringBuilder paramNameValue = new StringBuilder();
|
||||
|
||||
for (String paramName : paramNames) {
|
||||
paramNameValue.append(paramName).append(params.get(paramName));
|
||||
}
|
||||
|
||||
String source = secret + paramNameValue.toString() + secret;
|
||||
|
||||
return DigestUtils.md5Hex(source).toUpperCase();
|
||||
}
|
||||
}
|
@@ -0,0 +1,26 @@
|
||||
package com.gitee.sop.gatewaycommon.easyopen;
|
||||
|
||||
import com.gitee.sop.gatewaycommon.bean.ApiConfig;
|
||||
import com.gitee.sop.gatewaycommon.bean.ApiContext;
|
||||
import com.gitee.sop.gatewaycommon.gateway.configuration.BaseGatewayConfiguration;
|
||||
import com.gitee.sop.gatewaycommon.param.ParamNames;
|
||||
import com.gitee.sop.gatewaycommon.validate.taobao.TaobaoSigner;
|
||||
import com.gitee.sop.gatewaycommon.zuul.configuration.BaseZuulConfiguration;
|
||||
|
||||
/**
|
||||
* @author tanghc
|
||||
*/
|
||||
public class EasyopenZuulConfiguration extends BaseZuulConfiguration {
|
||||
|
||||
static {
|
||||
ParamNames.APP_KEY_NAME = "app_key";
|
||||
ParamNames.API_NAME = "name";
|
||||
ParamNames.SIGN_TYPE_NAME = "sign_type";
|
||||
ParamNames.APP_AUTH_TOKEN_NAME = "access_token";
|
||||
ApiConfig apiConfig = ApiContext.getApiConfig();
|
||||
apiConfig.setSigner(new EasyopenSigner());
|
||||
apiConfig.setZuulResultExecutor(new EasyopenResultExecutor());
|
||||
apiConfig.setMergeResult(false);
|
||||
}
|
||||
|
||||
}
|
@@ -2,6 +2,7 @@ package com.gitee.sop.gatewaycommon.gateway.param;
|
||||
|
||||
import com.gitee.sop.gatewaycommon.bean.SopConstants;
|
||||
import com.gitee.sop.gatewaycommon.param.ApiParam;
|
||||
import com.gitee.sop.gatewaycommon.param.ApiParamFactory;
|
||||
import com.gitee.sop.gatewaycommon.param.ParamBuilder;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
|
||||
@@ -14,11 +15,7 @@ public class GatewayParamBuilder implements ParamBuilder<ServerWebExchange> {
|
||||
@Override
|
||||
public ApiParam build(ServerWebExchange exchange) {
|
||||
Map<String, String> params = exchange.getAttribute(SopConstants.CACHE_REQUEST_BODY_FOR_MAP);
|
||||
ApiParam apiParam = new ApiParam();
|
||||
for (Map.Entry<String, String> entry : params.entrySet()) {
|
||||
apiParam.put(entry.getKey(), entry.getValue());
|
||||
}
|
||||
return apiParam;
|
||||
return ApiParamFactory.build(params);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -16,7 +16,7 @@ import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static com.gitee.sop.gatewaycommon.bean.SopConstants.SOP_SERVICE_API_PATH;
|
||||
import static com.gitee.sop.gatewaycommon.bean.SopConstants.SOP_SERVICE_ROUTE_PATH;
|
||||
|
||||
|
||||
/**
|
||||
@@ -30,7 +30,7 @@ import static com.gitee.sop.gatewaycommon.bean.SopConstants.SOP_SERVICE_API_PATH
|
||||
@Slf4j
|
||||
public abstract class BaseRouteManager<R extends BaseServiceRouteInfo<E>, E extends BaseRouteDefinition, T> implements RouteManager {
|
||||
|
||||
protected String sopServiceApiPath = SOP_SERVICE_API_PATH;
|
||||
protected String sopServiceApiPath = SOP_SERVICE_ROUTE_PATH;
|
||||
|
||||
protected Environment environment;
|
||||
|
||||
@@ -93,10 +93,7 @@ public abstract class BaseRouteManager<R extends BaseServiceRouteInfo<E>, E exte
|
||||
String nodeData = new String(childData.getData());
|
||||
log.info("\t* 子节点路径:" + childData.getPath() + ",该节点的数据为:" + nodeData);
|
||||
R serviceRouteInfo = JSON.parseObject(nodeData, getServiceRouteInfoClass());
|
||||
for (E routeDefinitionItem : serviceRouteInfo.getRouteDefinitionList()) {
|
||||
T routeDefinition = buildRouteDefinition(serviceRouteInfo, routeDefinitionItem);
|
||||
routeRepository.add(serviceRouteInfo, routeDefinition);
|
||||
}
|
||||
saveRouteDefinitionList(serviceRouteInfo);
|
||||
}
|
||||
// 添加事件监听器
|
||||
childrenCache.getListenable().addListener(new PathChildrenCacheListener() {
|
||||
@@ -110,10 +107,7 @@ public abstract class BaseRouteManager<R extends BaseServiceRouteInfo<E>, E exte
|
||||
R serviceRouteInfo = JSON.parseObject(nodeData, getServiceRouteInfoClass());
|
||||
// 添加子节点时触发
|
||||
log.info("子节点:{}添加,数据为:{}", event.getData().getPath(), nodeData);
|
||||
for (E routeDefinitionItem : serviceRouteInfo.getRouteDefinitionList()) {
|
||||
T routeDefinition = buildRouteDefinition(serviceRouteInfo, routeDefinitionItem);
|
||||
routeRepository.add(serviceRouteInfo, routeDefinition);
|
||||
}
|
||||
saveRouteDefinitionList(serviceRouteInfo);
|
||||
} else if (PathChildrenCacheEvent.Type.CHILD_UPDATED.equals(type)) {
|
||||
String nodeData = new String(event.getData().getData());
|
||||
R serviceRouteInfo = JSON.parseObject(nodeData, getServiceRouteInfoClass());
|
||||
@@ -122,20 +116,31 @@ public abstract class BaseRouteManager<R extends BaseServiceRouteInfo<E>, E exte
|
||||
// 删除下面所有节点
|
||||
routeRepository.deleteAll(serviceRouteInfo);
|
||||
// 添加新节点
|
||||
for (E routeDefinitionItem : serviceRouteInfo.getRouteDefinitionList()) {
|
||||
T routeDefinition = buildRouteDefinition(serviceRouteInfo, routeDefinitionItem);
|
||||
routeRepository.add(serviceRouteInfo, routeDefinition);
|
||||
}
|
||||
saveRouteDefinitionList(serviceRouteInfo);
|
||||
} else if (PathChildrenCacheEvent.Type.CHILD_REMOVED.equals(type)) {
|
||||
String nodeData = new String(event.getData().getData());
|
||||
log.info("子节点:{}删除,数据为:{}", event.getData().getPath(), nodeData);
|
||||
R serviceRouteInfo = JSON.parseObject(nodeData, getServiceRouteInfoClass());
|
||||
routeRepository.deleteAll(serviceRouteInfo);
|
||||
deleteRouteDefinitionList(serviceRouteInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected void saveRouteDefinitionList(R serviceRouteInfo) {
|
||||
for (E routeDefinitionItem : serviceRouteInfo.getRouteDefinitionList()) {
|
||||
RouteDefinitionItemContext.add(routeDefinitionItem);
|
||||
T routeDefinition = buildRouteDefinition(serviceRouteInfo, routeDefinitionItem);
|
||||
routeRepository.add(serviceRouteInfo, routeDefinition);
|
||||
}
|
||||
}
|
||||
|
||||
protected void deleteRouteDefinitionList(R serviceRouteInfo) {
|
||||
for (E routeDefinitionItem : serviceRouteInfo.getRouteDefinitionList()) {
|
||||
RouteDefinitionItemContext.delete(routeDefinitionItem);
|
||||
}
|
||||
routeRepository.deleteAll(serviceRouteInfo);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,27 @@
|
||||
package com.gitee.sop.gatewaycommon.manager;
|
||||
|
||||
import com.gitee.sop.gatewaycommon.bean.BaseRouteDefinition;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author tanghc
|
||||
*/
|
||||
public class RouteDefinitionItemContext {
|
||||
// key:id
|
||||
private static Map<String, BaseRouteDefinition> routeDefinitionMap = new HashMap<>(64);
|
||||
|
||||
public static void add(BaseRouteDefinition routeDefinition) {
|
||||
routeDefinitionMap.put(routeDefinition.getId(), routeDefinition);
|
||||
}
|
||||
|
||||
public static BaseRouteDefinition getRouteDefinition(String id) {
|
||||
return routeDefinitionMap.get(id);
|
||||
}
|
||||
|
||||
public static void delete(BaseRouteDefinition routeDefinition) {
|
||||
routeDefinitionMap.remove(routeDefinition.getId());
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,25 @@
|
||||
package com.gitee.sop.gatewaycommon.param;
|
||||
|
||||
import com.gitee.sop.gatewaycommon.bean.BaseRouteDefinition;
|
||||
import com.gitee.sop.gatewaycommon.manager.RouteDefinitionItemContext;
|
||||
import com.gitee.sop.gatewaycommon.message.ErrorEnum;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author tanghc
|
||||
*/
|
||||
public class ApiParamFactory {
|
||||
public static ApiParam build(Map<String, ?> params) {
|
||||
ApiParam apiParam = new ApiParam();
|
||||
for (Map.Entry<String, ?> entry : params.entrySet()) {
|
||||
apiParam.put(entry.getKey(), entry.getValue());
|
||||
}
|
||||
BaseRouteDefinition routeDefinition = RouteDefinitionItemContext.getRouteDefinition(apiParam.fetchNameVersion());
|
||||
if (routeDefinition == null) {
|
||||
throw ErrorEnum.ISV_INVALID_METHOD.getErrorMeta().getException();
|
||||
}
|
||||
apiParam.setIgnoreValidate(routeDefinition.isIgnoreValidate());
|
||||
return apiParam;
|
||||
}
|
||||
}
|
@@ -2,10 +2,14 @@ package com.gitee.sop.gatewaycommon.result;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.gitee.sop.gatewaycommon.bean.ApiContext;
|
||||
import com.gitee.sop.gatewaycommon.bean.SopConstants;
|
||||
import com.gitee.sop.gatewaycommon.exception.ApiException;
|
||||
import com.gitee.sop.gatewaycommon.message.Error;
|
||||
import com.gitee.sop.gatewaycommon.message.ErrorEnum;
|
||||
import com.gitee.sop.gatewaycommon.message.ErrorMeta;
|
||||
import com.gitee.sop.gatewaycommon.param.ParamNames;
|
||||
import com.netflix.zuul.exception.ZuulException;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
@@ -45,6 +49,10 @@ public abstract class BaseExecutorAdapter<T, R> implements ResultExecutor<T, R>
|
||||
|
||||
@Override
|
||||
public String mergeResult(T request, String serviceResult) {
|
||||
boolean isMergeResult = ApiContext.getApiConfig().isMergeResult();
|
||||
if (!isMergeResult) {
|
||||
return serviceResult;
|
||||
}
|
||||
serviceResult = wrapResult(serviceResult);
|
||||
int responseStatus = this.getBizHeaderCode(request);
|
||||
JSONObject jsonObjectService;
|
||||
@@ -99,4 +107,5 @@ public abstract class BaseExecutorAdapter<T, R> implements ResultExecutor<T, R>
|
||||
ret.put(ParamNames.SIGN_NAME, sign);
|
||||
return ret.toJSONString();
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -37,7 +37,7 @@ public interface ResultExecutor<T, R> {
|
||||
* 合并结果
|
||||
* @param request
|
||||
* @param serviceResult
|
||||
* @return
|
||||
* @return 返回最终输出结果
|
||||
*/
|
||||
String mergeResult(T request, String serviceResult);
|
||||
|
||||
@@ -45,7 +45,7 @@ public interface ResultExecutor<T, R> {
|
||||
* 合并错误结果
|
||||
* @param request
|
||||
* @param ex
|
||||
* @return
|
||||
* @return 返回最终输出结果
|
||||
*/
|
||||
R buildErrorResult(T request, Throwable ex);
|
||||
}
|
||||
|
@@ -30,6 +30,9 @@ public class PostResultFilter extends BaseZuulFilter {
|
||||
|
||||
@Override
|
||||
protected Object doRun(RequestContext requestContext) throws ZuulException {
|
||||
if (requestContext.getResponse().isCommitted()) {
|
||||
return null;
|
||||
}
|
||||
InputStream responseDataStream = requestContext.getResponseDataStream();
|
||||
ApiConfig apiConfig = ApiContext.getApiConfig();
|
||||
ResultExecutor<RequestContext, String> resultExecutor = apiConfig.getZuulResultExecutor();
|
||||
|
@@ -2,10 +2,13 @@ package com.gitee.sop.gatewaycommon.zuul.filter;
|
||||
|
||||
import com.gitee.sop.gatewaycommon.bean.ApiContext;
|
||||
import com.gitee.sop.gatewaycommon.bean.ApiConfig;
|
||||
import com.gitee.sop.gatewaycommon.bean.BaseRouteDefinition;
|
||||
import com.gitee.sop.gatewaycommon.exception.ApiException;
|
||||
import com.gitee.sop.gatewaycommon.manager.RouteDefinitionItemContext;
|
||||
import com.gitee.sop.gatewaycommon.param.ApiParam;
|
||||
import com.gitee.sop.gatewaycommon.validate.Validator;
|
||||
import com.gitee.sop.gatewaycommon.zuul.ZuulContext;
|
||||
import com.gitee.sop.gatewaycommon.zuul.route.ZuulRouteDefinition;
|
||||
import com.netflix.zuul.context.RequestContext;
|
||||
import com.netflix.zuul.exception.ZuulException;
|
||||
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
|
||||
|
@@ -1,14 +1,17 @@
|
||||
package com.gitee.sop.gatewaycommon.zuul.param;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.gitee.sop.gatewaycommon.bean.SopConstants;
|
||||
import com.gitee.sop.gatewaycommon.message.ErrorEnum;
|
||||
import com.gitee.sop.gatewaycommon.param.ApiParam;
|
||||
import com.gitee.sop.gatewaycommon.param.ApiParamFactory;
|
||||
import com.gitee.sop.gatewaycommon.param.ApiUploadContext;
|
||||
import com.gitee.sop.gatewaycommon.param.ParamBuilder;
|
||||
import com.gitee.sop.gatewaycommon.util.RequestUtil;
|
||||
import com.gitee.sop.gatewaycommon.zuul.ZuulContext;
|
||||
import com.netflix.zuul.context.RequestContext;
|
||||
import com.netflix.zuul.http.HttpServletRequestWrapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
||||
@@ -24,6 +27,7 @@ import java.util.Set;
|
||||
*
|
||||
* @author tanghc
|
||||
*/
|
||||
@Slf4j
|
||||
public class ZuulParamBuilder implements ParamBuilder<RequestContext> {
|
||||
|
||||
private static final String CONTENT_TYPE_MULTIPART = MediaType.MULTIPART_FORM_DATA_VALUE;
|
||||
@@ -33,16 +37,12 @@ public class ZuulParamBuilder implements ParamBuilder<RequestContext> {
|
||||
|
||||
@Override
|
||||
public ApiParam build(RequestContext ctx) {
|
||||
try {
|
||||
HttpServletRequest request = ctx.getRequest();
|
||||
Map<String, Object> params = this.getJson(request);
|
||||
return new ApiParam(params);
|
||||
} catch (Exception e) {
|
||||
throw ErrorEnum.ISV_INVALID_PARAMETER.getErrorMeta().getException();
|
||||
}
|
||||
HttpServletRequest request = ctx.getRequest();
|
||||
Map<String, Object> params = this.getParams(request);
|
||||
return ApiParamFactory.build(params);
|
||||
}
|
||||
|
||||
public Map<String, Object> getJson(HttpServletRequest request) throws Exception {
|
||||
public Map<String, Object> getParams(HttpServletRequest request) {
|
||||
// zuul会做一层包装
|
||||
if (request instanceof HttpServletRequestWrapper) {
|
||||
HttpServletRequestWrapper req = (HttpServletRequestWrapper) request;
|
||||
@@ -63,7 +63,12 @@ public class ZuulParamBuilder implements ParamBuilder<RequestContext> {
|
||||
|
||||
// json或者纯文本形式
|
||||
if (contectType.contains(CONTENT_TYPE_JSON) || contectType.contains(CONTENT_TYPE_TEXT)) {
|
||||
String txt = RequestUtil.getText(request);
|
||||
String txt = SopConstants.EMPTY_JSON;
|
||||
try {
|
||||
txt = RequestUtil.getText(request);
|
||||
} catch (Exception e) {
|
||||
log.error("获取纯文本内容失败", e);
|
||||
}
|
||||
params = JSON.parseObject(txt);
|
||||
} else if (contectType.contains(CONTENT_TYPE_MULTIPART)) {
|
||||
// 上传文件形式
|
||||
|
@@ -40,6 +40,12 @@ public class ZuulResultExecutor extends BaseExecutorAdapter<RequestContext, Stri
|
||||
|
||||
@Override
|
||||
public String buildErrorResult(RequestContext request, Throwable throwable) {
|
||||
Error error = getError(throwable);
|
||||
JSONObject jsonObject = (JSONObject) JSON.toJSON(error);
|
||||
return this.merge(request, jsonObject);
|
||||
}
|
||||
|
||||
public static Error getError(Throwable throwable) {
|
||||
Error error = null;
|
||||
if (throwable instanceof ZuulException) {
|
||||
ZuulException ex = (ZuulException) throwable;
|
||||
@@ -52,8 +58,6 @@ public class ZuulResultExecutor extends BaseExecutorAdapter<RequestContext, Stri
|
||||
if (error == null) {
|
||||
error = ErrorEnum.AOP_UNKNOW_ERROR.getErrorMeta().getError();
|
||||
}
|
||||
JSONObject jsonObject = (JSONObject) JSON.toJSON(error);
|
||||
return this.merge(request, jsonObject);
|
||||
return error;
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user