16-TraceIdGenerator TraceIdGenerator12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576import lombok.extern.slf4j.Slf4j;import org.slf4j.MDC;import java.net.InetAddress;import java.text.SimpleDateFormat;import java.util.Date;import java.util.UUID;/** * 生成 TraceId */@Slf4jpublic class TraceIdGenerator { public static String setTraceId(String traceId) { ThreadTraceIdUtil.setTraceId(traceId); //Constant.TRACE_ID 的定义 String TRACE_ID = "traceId"; MDC.put(Constant.TRACE_ID, traceId); return traceId; } public static void removeTraceId() { ThreadTraceIdUtil.removeTraceId(); MDC.remove(Constant.TRACE_ID); } /** * 消费端创建TraceId,并设置到线程上下文中 * 该方法只调用一次 */ public static String createTraceId() { String traceId = getTraceId(); ThreadTraceIdUtil.setTraceId(traceId); return traceId; } /** * 生成32位traceId */ private static String getTraceId() { StringBuilder result = new StringBuilder(); String ip = ""; // 获取本地ipv4地址 try { InetAddress address = InetAddress.getLocalHost(); ip = address.getHostAddress(); } catch (Exception var5) { return result.toString(); } // 根据.截取为String数组 String[] ipAddressInArray = ip.split("\\."); // 拼装为字符串,将每一个元素转换为16进制 for (int i = 3; i >= 0; --i) { Integer id = Integer.parseInt(ipAddressInArray[3 - i]); result.append(String.format("%02x", id)); } // 拼装时间戳及随机数 result.append(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())); result.append(UUID.randomUUID().toString(), 0, 7); return result.toString(); } /** * TraceId默认第一个为空,如果没值则分配一个 */ public static String validateTraceId(String traceId) { if (null == traceId) { traceId = createTraceId(); } return traceId; }} ThreadTraceIdUtil123456789101112131415161718192021222324252627282930/** * InheritableThreadLocal 线程传递 */public class ThreadTraceIdUtil { /** * 使用InheritableThreadLocal便于在主子线程间传递参数 */ private static final ThreadLocal<String> TRACE_ID = new InheritableThreadLocal<>(); public ThreadTraceIdUtil() { } /** * 从当前线程局部变量获取TraceId * 首次调用该方法会生成traceId,后续每次都从线程上下文获取 */ public static String getTraceId() { return TRACE_ID.get(); } public static void setTraceId(String traceId) { TRACE_ID.set(traceId); } public static void removeTraceId() { TRACE_ID.remove(); }} 21_代码片段 > 01_工具类 #工具类 16-TraceIdGenerator https://janycode.github.io/2023/08/20/21_代码片段/01_工具类/16-TraceIdGenerator/ 作者 Jerry(姜源) 发布于 2023年8月20日 许可协议 🔗 复制链接 📢 分享到微博 🐦 分享到 Twitter 📘 分享到 Facebook 💬 分享到微信 微信扫一扫分享 × 打开微信扫一扫,点击右上角分享 Aspose操作word文档 上一篇 17-Hutool工具(上) 下一篇 Please enable JavaScript to view the comments