Skip to content

Commit

Permalink
feat: support local des
Browse files Browse the repository at this point in the history
  • Loading branch information
rchen9 committed Oct 8, 2024
1 parent e27bdeb commit ca4ca25
Show file tree
Hide file tree
Showing 8 changed files with 108 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.net.URI;
import javax.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
Expand All @@ -24,9 +25,14 @@
DataSourceAutoConfiguration.class})
public class WebSpringBootServletInitializer extends SpringBootServletInitializer {

private static final String AES_KEY_FIELD_NAME = "arex.desensitization.aesKey";

@Value("${arex.prometheus.port}")
String prometheusPort;

@Value("${arex.desensitization.aesKey:}")
private String aesKey;

public static void main(String[] args) {
System.setProperty("java.awt.headless", "false");
try {
Expand All @@ -51,5 +57,14 @@ protected SpringApplicationBuilder configure(SpringApplicationBuilder applicatio
@PostConstruct
public void init() {
PrometheusConfiguration.initMetrics(prometheusPort);
importConfigurationToEnv();
}

public void importConfigurationToEnv() {
String aesKeyProperty = System.getProperty(AES_KEY_FIELD_NAME);
if (StringUtils.isEmpty(aesKeyProperty) && StringUtils.isNotEmpty(aesKey)) {
System.setProperty(AES_KEY_FIELD_NAME, aesKey);
}
}

}
Original file line number Diff line number Diff line change
@@ -1,42 +1,28 @@
package com.arextest.schedule.beans;

import com.arextest.common.model.classloader.RemoteJarClassLoader;
import com.arextest.common.utils.RemoteJarLoaderUtils;
import com.arextest.config.model.dto.system.DesensitizationJar;
import com.arextest.extension.desensitization.DataDesensitization;
import com.arextest.extension.desensitization.DefaultDataDesensitization;
import com.arextest.schedule.service.ConfigurationService;
import java.util.List;
import javax.annotation.Resource;
import com.arextest.schedule.serialization.DesensitizationProvider;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.CollectionUtils;
import org.springframework.data.mongodb.MongoDatabaseFactory;


@Configuration
@Slf4j
public class DataDesensitizationConfiguration {

@Resource
ConfigurationService configurationService;
@Bean
@ConditionalOnMissingBean(DesensitizationProvider.class)
DesensitizationProvider desensitizationProvider(MongoDatabaseFactory factory) {
return new DesensitizationProvider(factory.getMongoDatabase());
}

@Bean
@ConditionalOnMissingBean(DataDesensitization.class)
DataDesensitization desensitizationService() {
List<DesensitizationJar> uploaded = configurationService.desensitization();
if (CollectionUtils.isEmpty(uploaded)) {
return new DefaultDataDesensitization();
} else {
try {
DesensitizationJar selected = uploaded.get(0);
RemoteJarClassLoader classLoader = RemoteJarLoaderUtils.loadJar(selected.getJarUrl());
return RemoteJarLoaderUtils.loadService(DataDesensitization.class, classLoader).get(0);
} catch (Throwable t) {
LOGGER.error("Load remote desensitization jar failed, application startup blocked", t);
throw new RuntimeException("Load remote desensitization jar failed");
}
}
DataDesensitization dataDesensitization(DesensitizationProvider desensitizationProvider) {
return desensitizationProvider.get();
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package com.arextest.schedule.serialization;

import com.arextest.common.model.classloader.RemoteJarClassLoader;
import com.arextest.common.utils.RemoteJarLoaderUtils;
import com.arextest.config.model.dao.config.SystemConfigurationCollection;
import com.arextest.config.model.dao.config.SystemConfigurationCollection.KeySummary;
import com.arextest.extension.desensitization.DataDesensitization;
import com.arextest.extension.desensitization.DefaultDataDesensitization;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.bson.conversions.Bson;


@Slf4j
@RequiredArgsConstructor
public class DesensitizationProvider {

private static final String SYSTEM_CONFIGURATION = "SystemConfiguration";
private static final String DESENSITIZATION_JAR = "desensitizationJar";
private static final String JAR_URL = "jarUrl";

private volatile DataDesensitization desensitizationService;

private final MongoDatabase mongoDatabase;

public DataDesensitization get() {
if (desensitizationService == null) {
synchronized (DesensitizationProvider.class) {
if (desensitizationService == null) {
try {
String jarUrl = getJarUrl();
desensitizationService = loadDesensitization(jarUrl);
LOGGER.info("load desensitization success, className:{}",
desensitizationService.getClass().getName());
} catch (Exception runtimeException) {
LOGGER.error("load desensitization error", runtimeException);
throw new RuntimeException(runtimeException.getMessage());
}
}
}
}
return desensitizationService;
}

protected String getJarUrl() {
MongoCollection<Document> collection = mongoDatabase.getCollection(SYSTEM_CONFIGURATION);
if (collection.countDocuments() <= 0) {
return null;
}
Bson filter = Filters.eq(SystemConfigurationCollection.Fields.key,
KeySummary.DESERIALIZATION_JAR);
Document document = collection.find(filter).first();
if (document != null && document.get(DESENSITIZATION_JAR) != null) {
return document.get(DESENSITIZATION_JAR, Document.class).getString(JAR_URL);
}
return null;
}

protected DataDesensitization loadDesensitization(String remoteJarUrl)
throws Exception {
DataDesensitization dataDesensitization = new DefaultDataDesensitization();
if (StringUtils.isEmpty(remoteJarUrl)) {
return dataDesensitization;
}
RemoteJarClassLoader remoteJarClassLoader = RemoteJarLoaderUtils.loadJar(remoteJarUrl);
dataDesensitization = RemoteJarLoaderUtils
.loadService(DataDesensitization.class, remoteJarClassLoader)
.get(0);
return dataDesensitization;
}

}
Original file line number Diff line number Diff line change
@@ -1,18 +1,12 @@
package com.arextest.schedule.service;

import com.arextest.config.model.dto.system.DesensitizationJar;
import com.arextest.model.response.ResponseStatusType;
import com.arextest.schedule.client.HttpWepServiceApiClient;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Resource;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.retry.RetryException;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

@Service
Expand All @@ -24,8 +18,6 @@ public class ConfigurationService {
private String applicationUrl;
@Value("${arex.api.config.schedule.url}")
private String scheduleUrl;
@Value("${arex.api.config.desensitization.url}")
private String desensitizationConfigUrl;

public Application application(String appId) {
ApplicationResponse applicationResponse = wepApiClientService.get(applicationUrl,
Expand All @@ -41,17 +33,6 @@ public ScheduleConfiguration schedule(String appId) {
return scheduleResponse != null ? scheduleResponse.body : null;
}

@Retryable(value = {RetryException.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000))
public List<DesensitizationJar> desensitization() {
DesensitizationResponse res = wepApiClientService.jsonPost(desensitizationConfigUrl, null,
DesensitizationResponse.class);
if (res == null) {
throw new RetryException("get desensitization config error");
} else {
return res.getBody();
}
}

private Map<String, ?> appIdUrlVariable(String appId) {
return Collections.singletonMap("appId", appId);
}
Expand Down Expand Up @@ -83,13 +64,6 @@ private static final class ApplicationResponse {
private Application body;
}

@Data
private static final class DesensitizationResponse {

private ResponseStatusType responseStatusType;
private List<DesensitizationJar> body;
}

@Data
static final class Application {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ arex:
api: http://10.118.1.217:18093
schedule:
service:
api: http://10.118.1.217:18092
api: http://127.0.0.1:8092

spring:
redis:
Expand Down
4 changes: 2 additions & 2 deletions arex-schedule-web-api/src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ arex:
url: ${arex.api.service.api}/api/config/comparison/summary/queryByAppId/{appId}
queryCompareConfig:
url: ${arex.api.service.api}/api/config/comparison/summary/queryCompareConfig
desensitization:
url: ${arex.api.service.api}/api/desensitization/listJar
schedule:
url: ${arex.api.service.api}/api/config/schedule/useResult/appId/{appId}
system:
Expand Down Expand Up @@ -98,6 +96,8 @@ arex:
excludes:
dubbo: async
http:
desensitization:
aesKey: OYX3PZ2BptKaG8yvs6AfuSpOeX7JLEuOhqcq+jE0G4s=
auto:
rerun:
threshold: 1.0
Expand Down
Binary file not shown.
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,7 @@
</sonar.exclusions>
<arex-storage-config.version>1.3.4</arex-storage-config.version>
<web-contract.version>0.6.5.2</web-contract.version>
<arex-common.version>0.2.3</arex-common.version>
<arex-common.version>0.2.6</arex-common.version>
<redisson.version>3.20.1</redisson.version>
</properties>

Expand All @@ -320,5 +320,5 @@
<url>https://github.com/arextest/arex-replay-schedule</url>
</scm>
<url>https://github.com/arextest/arex-replay-schedule</url>
<version>1.2.20</version>
<version>1.2.21</version>
</project>

0 comments on commit ca4ca25

Please sign in to comment.