导入修改为阿里云ACM方式,支持导入ACM文件

This commit is contained in:
keran 2019-05-19 22:27:15 +08:00
parent ad3a6953cb
commit 14e8d92ec6
4 changed files with 183 additions and 107 deletions

View File

@ -399,14 +399,18 @@ public class ConfigController {
@RequestParam(value = "ids", required = false)List<Long> ids) {
try {
// 暂时不考虑数据量大的问题,配制应该不会很多
StringBuilder idsSb = new StringBuilder();
for(int i = 0; i < ids.size(); i++){
Long id = ids.get(i);
idsSb.append(id);
if((i + 1) < ids.size()){
idsSb.append(",");
if(ids != null && !ids.isEmpty()){
for(int i = 0; i < ids.size(); i++){
Long id = ids.get(i);
idsSb.append(id);
if((i + 1) < ids.size()){
idsSb.append(",");
}
}
}
List<ConfigInfo> dataList = persistService.findAllConfigInfo4eExport(group, tenant, appName, idsSb.toString());
List<ZipUtils.ZipItem> zipItemList = new ArrayList<>();
StringBuilder metaData = null;
@ -419,12 +423,15 @@ public class ConfigController {
String metaDataId = ci.getDataId().substring(0,ci.getDataId().lastIndexOf("."))
+ "~" + ci.getDataId().substring(ci.getDataId().lastIndexOf(".") + 1);
metaData.append(ci.getGroup()).append(".").append(metaDataId).append(".app=")
.append(ci.getAppName()).append("\r\n");
.append(ci.getAppName()).append("\r\n"); // ACM使用的是 \r\n, 不是根据系统取的
}
String itemName = ci.getGroup() + "/" + ci.getDataId() ;
zipItemList.add(new ZipUtils.ZipItem(itemName, ci.getContent()));
}
zipItemList.add(new ZipUtils.ZipItem(".meta.yml", metaData.toString()));
if(metaData != null){
zipItemList.add(new ZipUtils.ZipItem(".meta.yml", metaData.toString()));
}
HttpHeaders headers = new HttpHeaders();
String fileName="nacos_config_export_" + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss") + ".zip";
headers.add("Content-Disposition", "attachment;filename="+fileName);
@ -436,43 +443,84 @@ public class ConfigController {
}
}
// @RequestMapping(params = "import=true", method = RequestMethod.POST)
// @ResponseBody
// public RestResult<Boolean> importAndPublishConfig(HttpServletRequest request, HttpServletResponse response,
// @RequestParam(value = "src_user", required = false) String srcUser,
// MultipartFile file) throws NacosException {
// RestResult<Boolean> rr = new RestResult<Boolean>();
// List<ConfigInfo> configInfoList = null;
// try {
// configInfoList = (List<ConfigInfo>) JSONUtils.deserializeObject( ZipUtils.unzip(file.getBytes()), new TypeReference<ArrayList<ConfigInfo>>() {
// });
// } catch (IOException e) {
// rr.setCode(500);
// rr.setData(false);
// rr.setMessage("parsing data failed");
// log.error("parsing data failed", e);
// return rr;
// }
// if (configInfoList == null || configInfoList.isEmpty()) {
// rr.setCode(500);
// rr.setData(false);
// rr.setMessage("data is empty");
// return rr;
// }
// final String srcIp = RequestUtil.getRemoteIp(request);
// String requestIpApp = RequestUtil.getAppName(request);
// final Timestamp time = TimeUtils.getCurrentTime();
// persistService.batchInsertOrUpdate(configInfoList, srcUser, srcIp, null, time, false);
// for (ConfigInfo configInfo : configInfoList) {
// EventDispatcher.fireEvent(new ConfigDataChangeEvent(false, configInfo.getDataId(), configInfo.getGroup(),
// configInfo.getTenant(), time.getTime()));
// ConfigTraceService.logPersistenceEvent(configInfo.getDataId(), configInfo.getGroup(),
// configInfo.getTenant(), requestIpApp, time.getTime(),
// LOCAL_IP, ConfigTraceService.PERSISTENCE_EVENT_PUB, configInfo.getContent());
// }
// rr.setCode(200);
// rr.setData(true);
// rr.setMessage("import ok");
// return rr;
// }
@RequestMapping(params = "import=true", method = RequestMethod.POST)
@ResponseBody
public RestResult<Boolean> importAndPublishConfig(HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = "src_user", required = false) String srcUser,
@RequestParam(value = "namespace", required = false) String namespace,
MultipartFile file) throws NacosException {
RestResult<Boolean> rr = new RestResult<Boolean>();
if(StringUtils.isNotBlank(namespace)){
if(persistService.tenantInfoCountByTenantId(namespace) <= 0){
rr.setCode(500);
rr.setData(false);
rr.setMessage("namespace does not exist");
return rr;
}
}
List<ConfigInfo> configInfoList = null;
try {
ZipUtils.UnZipResult unziped = ZipUtils.unzip(file.getBytes());
ZipUtils.ZipItem metaDataZipItem = unziped.getMetaDataItem();
Map<String, String> metaDataMap = new HashMap<>();
if(metaDataZipItem != null){
String metaDataStr = metaDataZipItem.getItemData();
String[] metaDataArr = metaDataStr.split("\r\n");
for(String metaDataItem : metaDataArr){
String[] metaDataItemArr = metaDataItem.split("=");
metaDataMap.put(metaDataItemArr[0], metaDataItemArr[1]);
}
}
List<ZipUtils.ZipItem> itemList = unziped.getZipItemList();
if(itemList != null && !itemList.isEmpty()){
configInfoList = new ArrayList<>(itemList.size());
for(ZipUtils.ZipItem item : itemList){
String[] groupAdnDataId = item.getItemName().split("/");
String group = groupAdnDataId[0];
String dataId = groupAdnDataId[1];
String metaDataId = group + "." + dataId;
metaDataId = metaDataId.substring(0, metaDataId.lastIndexOf("."))
+ "~" + metaDataId.substring(metaDataId.lastIndexOf(".") + 1)
+ ".app";
ConfigInfo ci = new ConfigInfo();
ci.setTenant(namespace);
ci.setGroup(group);
ci.setDataId(dataId);
ci.setContent(item.getItemData());
if(metaDataMap.get(metaDataId) != null){
ci.setAppName(metaDataMap.get(metaDataId));
}
configInfoList.add(ci);
}
}
} catch (IOException e) {
rr.setCode(500);
rr.setData(false);
rr.setMessage("parsing data failed");
log.error("parsing data failed", e);
return rr;
}
if (configInfoList == null || configInfoList.isEmpty()) {
rr.setCode(500);
rr.setData(false);
rr.setMessage("data is empty");
return rr;
}
final String srcIp = RequestUtil.getRemoteIp(request);
String requestIpApp = RequestUtil.getAppName(request);
final Timestamp time = TimeUtils.getCurrentTime();
persistService.batchInsertOrUpdate(configInfoList, srcUser, srcIp, null, time, false);
for (ConfigInfo configInfo : configInfoList) {
EventDispatcher.fireEvent(new ConfigDataChangeEvent(false, configInfo.getDataId(), configInfo.getGroup(),
configInfo.getTenant(), time.getTime()));
ConfigTraceService.logPersistenceEvent(configInfo.getDataId(), configInfo.getGroup(),
configInfo.getTenant(), requestIpApp, time.getTime(),
LOCAL_IP, ConfigTraceService.PERSISTENCE_EVENT_PUB, configInfo.getContent());
}
rr.setCode(200);
rr.setData(true);
rr.setMessage("import ok");
return rr;
}
}

View File

@ -25,10 +25,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.Map.Entry;
import javax.annotation.PostConstruct;
@ -54,6 +51,7 @@ import org.springframework.transaction.*;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import com.alibaba.nacos.config.server.utils.event.EventDispatcher;
import com.google.common.collect.Lists;
@ -1458,7 +1456,6 @@ public class PersistService {
*
* @param pageNo 页码(必须大于0)
* @param pageSize 每页大小(必须大于0)
* @param group
* @return ConfigInfo对象的集合
*/
public Page<ConfigInfo> findConfigInfoByApp(final int pageNo,
@ -3309,6 +3306,7 @@ public class PersistService {
public void batchInsertOrUpdate(List<ConfigInfo> configInfoList, String srcUser, String srcIp,
Map<String, Object> configAdvanceInfo, Timestamp time, boolean notify) throws NacosException{
PlatformTransactionManager transactionManager = this.getTransactionTemplate().getTransactionManager();
assert transactionManager != null;
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus status = transactionManager.getTransaction(def);
@ -3323,6 +3321,36 @@ public class PersistService {
ConfigInfo configInfo2Save = new ConfigInfo(configInfo.getDataId(), configInfo.getGroup(),
configInfo.getTenant(), configInfo.getAppName(), configInfo.getContent());
try {
String extName = configInfo.getDataId().substring(configInfo.getDataId().lastIndexOf(".") + 1).toLowerCase();
String type = null;
switch (extName){
case "yml":
case "yaml":
type = "yaml";
break;
case "txt":
case "text":
type = "text";
break;
case "json":
type = "json";
break;
case "xml":
type = "xml";
break;
case "htm":
case "html":
type = "html";
break;
case "properties":
type = "Properties";
break;
}
if (configAdvanceInfo == null) {
configAdvanceInfo = new HashMap<>();
}
configAdvanceInfo.put("type", type);
addConfigInfoNoTransaction(srcIp, srcUser, configInfo2Save, time, configAdvanceInfo, notify);
} catch (DataIntegrityViolationException ive) { // 唯一性约束冲突
updateConfigInfoNoTransaction(configInfo2Save, srcIp, srcUser, time, configAdvanceInfo, notify);
@ -3387,6 +3415,24 @@ public class PersistService {
}
}
/**
* 根据 tenantId 查询 tenantInfo (namespace)是否存在
*
* @param tenantId
* @return 根据ID查询到的数据数量
*/
public int tenantInfoCountByTenantId(String tenantId) {
Assert.hasText(tenantId, "tenantId can not be null");
String sql = "select count(1) from tenant_info where tenant_id = ?";
List<String> paramList = new ArrayList<>();
paramList.add(tenantId);
Integer result = this.jt.queryForObject(sql, paramList.toArray(), Integer.class);
if (result == null) {
return 0;
}
return result.intValue();
}
static final TenantInfoRowMapper TENANT_INFO_ROW_MAPPER = new TenantInfoRowMapper();

View File

@ -142,6 +142,35 @@ public class ZipUtils {
}
}
public static class UnZipResult{
private List<ZipItem> zipItemList;
private ZipItem metaDataItem;
public UnZipResult(List<ZipItem> zipItemList, ZipItem metaDataItem) {
this.zipItemList = zipItemList;
this.metaDataItem = metaDataItem;
}
public List<ZipItem> getZipItemList() {
return zipItemList;
}
public void setZipItemList(List<ZipItem> zipItemList) {
this.zipItemList = zipItemList;
}
public ZipItem getMetaDataItem() {
return metaDataItem;
}
public void setMetaDataItem(ZipItem metaDataItem) {
this.metaDataItem = metaDataItem;
}
}
public static byte[] zip(List<ZipItem> source){
ByteArrayOutputStream byteOut = null;
ZipOutputStream zipOut = null;
@ -176,10 +205,11 @@ public class ZipUtils {
return result;
}
public static List<ZipItem> unzip(byte[] source) {
public static UnZipResult unzip(byte[] source) {
ZipInputStream zipIn = null;
List<ZipItem> result = new ArrayList<>();
List<ZipItem> itemList = new ArrayList<>();
ZipItem metaDataItem = null;
try {
zipIn = new ZipInputStream(new ByteArrayInputStream(source));
ZipEntry entry = null;
@ -192,7 +222,11 @@ public class ZipUtils {
while ((offset = zipIn.read(buffer)) != -1) {
out.write(buffer, 0, offset);
}
result.add(new ZipItem(entry.getName(), out.toString("UTF-8")));
if(entry.getName().equals(".meta.yml")){
metaDataItem = new ZipItem(entry.getName(), out.toString("UTF-8"));
} else {
itemList.add(new ZipItem(entry.getName(), out.toString("UTF-8")));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
@ -212,7 +246,7 @@ public class ZipUtils {
}
}
}
return result;
return new UnZipResult(itemList, metaDataItem);
}

View File

@ -1,52 +0,0 @@
package top.klw8.test;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/**
* @author klw
* @ClassName: ZipTest
* @Description: zip测试
* @date 2019/5/16 14:22
*/
public class ZipTest {
public static void main(String[] args) throws IOException {
// 压缩
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ZipOutputStream zipOut = new ZipOutputStream(byteOut);
zipOut.putNextEntry(new ZipEntry("DEFAULT_GROUP2/"));
zipOut.putNextEntry(new ZipEntry("DEFAULT_GROUP/test10.yml"));
zipOut.write("abc: 123".getBytes());
zipOut.putNextEntry(new ZipEntry("DEFAULT_GROUP/test11.yml"));
zipOut.write("def: 456".getBytes());
zipOut.close();
FileOutputStream fileOut = new FileOutputStream(new File("E:/test.zip"));
byte[] zipBytes = byteOut.toByteArray();
fileOut.write(zipBytes);
fileOut.close();
byteOut.close();
//解压
ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(zipBytes));
ZipEntry entry = null;
while((entry = zipIn.getNextEntry()) != null){
System.out.println(entry.getName());
if(entry.isDirectory()){
System.out.println("是文件夹");
} else {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int offset = -1;
while ((offset = zipIn.read(buffer)) != -1) {
out.write(buffer, 0, offset );
}
System.out.println(out.toString("UTF-8"));
out.close();
}
}
zipIn.close();
}
}