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 audit) { try { List 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 ""; } } }