All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hundsun.lightdb.unisql.utils.MicroServiceParameterUtils Maven / Gradle / Ivy

There is a newer version: 24.1.7.0-beta-2
Show newest version
package com.hundsun.lightdb.unisql.utils;

import com.hundsun.jrescloud.common.t2.event.IEvent;
import com.hundsun.jrescloud.common.util.ConfigUtils;
import com.hundsun.jrescloud.common.util.SpringUtils;
import com.hundsun.jrescloud.rpc.api.IRpcContext;
import com.hundsun.jrescloud.trace.util.TraceAdapterUtil;
import com.hundsun.lightdb.unisql.golang.Transformer;
import com.hundsun.lightdb.unisql.golang.VariableParameter;
import com.hundsun.lightdb.unisql.model.UnisqlProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.Optional;

/**
 * @program: sql-convert-runtime
 * @description: 采集微服务运行时参数的工具类
 * @author: liangdong30629
 * @date: 2024-06-12 14:28
 **/
@Slf4j
public class MicroServiceParameterUtils {

    /**
     * 类数组,需要检测这些类存在或者不存在
     *
     * @Author: liangdong30629
     * @Date: 2024/6/12 14:40
     */
    private static final Class[] CLASS_TO_CHECK_ARRAY = new Class[]{TraceAdapterUtil.class, ConfigUtils.class,
            IRpcContext.class};
    /**
     * 表示类数组({@link MicroServiceParameterUtils#CLASS_TO_CHECK_ARRAY})中的类是否存在,true:存在,false:不存在
     */
    private static boolean classPreCheckPassed;

    static {
        /**
         * 类数组({@link MicroServiceParameterUtils#CLASS_TO_CHECK_ARRAY})中类是否均存在
         * @Author: liangdong30629
         * @Date: 2024/6/12 15:04
         */
        classPreCheckPassed = checkClassExists();
    }


    /**
     * `采集微服务`参数开关{@link UnisqlProperties#collectMicroServiceParametersEnabled}打开的情况下,采集`trace_id`、`微服务名称`、`方法名`和`sql
     * 执行顺序`(sql执行顺序参考{@link SqlSequenceUtils#nextSequenceId(String)})
     *
     * @param: variableParameter 该对象用于暂存`trace_id`、`微服务名称`、`方法名`和`sql执行顺序`
     * @return: void
     * @Author: liangdong30629
     * @Date: 2024/6/12 13:04
     */
    public static void collectMicroServiceParameters(VariableParameter variableParameter) {
        // 获取微服务信息所需的类已存在
        if (classPreCheckPassed) {
            VariableParameter vp = Transformer.VARIABLE_PARAMETER_THREAD_LOCAL.get();
            String currentTraceId = StringUtils.isNotEmpty(vp.getCurrentTraceId()) ? vp.getCurrentTraceId() : TraceAdapterUtil.getCurrentTraceId();
            // trace_id
            variableParameter.setCurrentTraceId(currentTraceId);
            // 微服务名称
            variableParameter.setAppName(StringUtils.isNotEmpty(vp.getAppName()) ? vp.getAppName() : ConfigUtils.getAppName());
            // 微服务功能号(对应微服务内接口方法)
            variableParameter.setFunctionId(StringUtils.isNotEmpty(vp.getFunctionId()) ? vp.getFunctionId() : getFunctionID());
            // sql执行顺序
            variableParameter.setSqlSequence(SqlSequenceUtils.nextSequenceId(StringUtils.isBlank(currentTraceId) ? "" : currentTraceId));
        }
    }

    /**
     * 检测类数组({@link MicroServiceParameterUtils#CLASS_TO_CHECK_ARRAY})中的这些类是否存在
     *
     * @param: []
     * @return: boolean
     * @Author: liangdong30629
     * @Date: 2024/6/12 14:55
     */
    private static boolean checkClassExists() {
        for (Class aClass : CLASS_TO_CHECK_ARRAY) {
            // 类不存在
            if (!isClassExists(aClass.getName())) {
                return false;
            }
        }
        return true;
    }

    /**
     * 判断一个类存在不存在
     *
     * @param className 类名称
     * @return true:类存在,false:类不存在
     */
    public static boolean isClassExists(String className) {
        try {
            Class.forName(className);
            return true;
        } catch (ClassNotFoundException e) {
            if (log.isErrorEnabled()) {
                log.error("采集微服务信息所需类{}不存在", className, e);
            }
            return false;
        }
    }

    /**
     * 返回微服务功能号,对应t3协议5号域{@linkplain https://iknow.hs.net/portal/docView/home/4423}
     *
     * @param: []
     * @return: java.lang.String
     * @Author: liangdong30629
     * @Date: 2024/6/12 14:30
     */
    private static String getFunctionID() {
        IEvent event = SpringUtils.getBean(IRpcContext.class).getEvent();
        // event为null
        if (!Optional.ofNullable(event).isPresent()) {
            return null;
        }
        String functionID = event.getStringAttributeValue("5");
        if (StringUtils.isBlank(functionID)) {
            return null;
        }
        return functionID;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy