package com.dsh.guns.modular.system.audit;
|
|
import com.alibaba.fastjson.JSON;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.cloud.client.ServiceInstance;
|
import org.springframework.cloud.client.discovery.DiscoveryClient;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.Resource;
|
import java.io.OutputStream;
|
import java.io.InputStream;
|
import java.net.HttpURLConnection;
|
import java.net.URL;
|
import java.nio.charset.StandardCharsets;
|
import java.util.List;
|
import java.util.Map;
|
|
/** 直连审计服务,刻意不使用 Feign,避免 Sentinel fallback 与审计递归。 */
|
@Slf4j
|
@Component
|
public class ManagementAuditWriter {
|
@Resource private DiscoveryClient discoveryClient;
|
|
public void append(Map<String, Object> audit) {
|
try {
|
List<ServiceInstance> instances = discoveryClient.getInstances("mb-cloud-other");
|
if (instances == null || instances.isEmpty()) {
|
log.warn("管理端审计写入失败:未发现审计服务 mb-cloud-other");
|
return;
|
}
|
URL url = new URL(instances.get(0).getUri().toString() + "/internal/audit-logs");
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
connection.setConnectTimeout(1000);
|
connection.setReadTimeout(1500);
|
connection.setRequestMethod("POST");
|
connection.setDoOutput(true);
|
connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
|
byte[] body = JSON.toJSONString(audit).getBytes(StandardCharsets.UTF_8);
|
try (OutputStream output = connection.getOutputStream()) { output.write(body); }
|
int status = connection.getResponseCode();
|
if (status < HttpURLConnection.HTTP_OK || status >= HttpURLConnection.HTTP_MULT_CHOICE) {
|
log.warn("管理端审计写入失败,响应状态: {}, 响应内容: {}", status,
|
readResponse(connection.getErrorStream()));
|
}
|
connection.disconnect();
|
} catch (Exception e) {
|
log.warn("管理端审计写入失败", e);
|
}
|
}
|
|
private String readResponse(InputStream input) {
|
if (input == null) return "";
|
try (InputStream stream = input) {
|
byte[] buffer = new byte[1024];
|
int length = stream.read(buffer);
|
return length <= 0 ? "" : new String(buffer, 0, length, StandardCharsets.UTF_8);
|
} catch (Exception ignored) {
|
return "";
|
}
|
}
|
}
|