Search in sources :

Example 1 with Advice

use of com.shulie.instrument.simulator.api.listener.ext.Advice in project LinkAgent by shulieTech.

the class LettuceMasterStrategy method match.

@Override
public List<String> match(Object obj) {
    List<String> result = new ArrayList<String>();
    if (obj instanceof Advice) {
        try {
            Object resultObj = ((Advice) obj).getReturnObj();
            String className = resultObj.getClass().getName();
            if (className.equals("io.lettuce.core.masterslave.StatefulRedisMasterSlaveConnectionImpl")) {
                Object channelWriter = Reflect.on(resultObj).get(LettuceConstants.REFLECT_FIELD_CHANNEL_WRITER);
                Object masterSlaveConnectionProvider = Reflect.on(channelWriter).get("masterSlaveConnectionProvider");
                RedisURI initialRedisUri = null;
                try {
                    initialRedisUri = Reflect.on(masterSlaveConnectionProvider).get("initialRedisUri");
                } catch (Throwable t) {
                }
                if (initialRedisUri != null && CollectionUtils.isNotEmpty(initialRedisUri.getSentinels())) {
                    /**
                     * initialRedisUri针对哨兵模式
                     */
                    if (initialRedisUri.getSentinelMasterId() != null) {
                        result.add(initialRedisUri.getSentinelMasterId());
                    }
                    if (CollectionUtils.isNotEmpty(initialRedisUri.getSentinels())) {
                        for (RedisURI redisURI : initialRedisUri.getSentinels()) {
                            result.add(redisURI.getHost() + ":" + redisURI.getPort());
                        }
                    }
                    return result;
                }
                List list = Reflect.on(masterSlaveConnectionProvider).get("knownNodes");
                for (Object redisMasterSlaveNode : list) {
                    RedisURI uri = Reflect.on(redisMasterSlaveNode).get("redisURI");
                    result.add(uri.getHost() + ":" + uri.getPort());
                }
            } else {
                throw new PressureMeasureError("not support masterSlave type. className = " + resultObj.getClass().getName());
            }
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
        }
    }
    return result;
}
Also used : RedisURI(io.lettuce.core.RedisURI) PressureMeasureError(com.pamirs.pradar.exception.PressureMeasureError) ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) List(java.util.List) Advice(com.shulie.instrument.simulator.api.listener.ext.Advice)

Example 2 with Advice

use of com.shulie.instrument.simulator.api.listener.ext.Advice in project LinkAgent by shulieTech.

the class LettuceMasterSlaveFactory method createMediator.

@Override
public RedisClientMediator<Object> createMediator(Object obj, ShadowRedisConfig shadowRedisConfig) {
    if (!(obj instanceof Advice)) {
        return null;
    }
    boolean isSentinel = false;
    boolean withDataBase = shadowRedisConfig.getDatabase() != null;
    Integer pressureDatabase = shadowRedisConfig.getDatabase();
    Advice advice = (Advice) obj;
    RedisClientMediator<Object> mediator = null;
    try {
        String method = advice.getBehavior().getName();
        Object[] args = advice.getParameterArray();
        Object performanceConnection = null;
        List<RedisURI> performanceUris = new ArrayList<RedisURI>();
        RedisURI performanceUri = null;
        if (args[2] instanceof RedisURI) {
            isSentinel = isSentinel(args[2], shadowRedisConfig);
            String nodes = shadowRedisConfig.getNodes();
            if (isSentinel) {
                String[] nodesSplitter = nodes.split(",");
                RedisURI.Builder builder = RedisURI.builder();
                for (String node : nodesSplitter) {
                    String[] innerSplitter = node.split(":");
                    builder.withSentinel(innerSplitter[0], Integer.parseInt(innerSplitter[1]));
                    if (withDataBase) {
                        builder.withDatabase(pressureDatabase);
                    }
                }
                builder.withSentinelMasterId(shadowRedisConfig.getMaster());
                performanceUri = builder.build();
            } else {
                String[] nodesSplitter = nodes.split(",");
                for (String node : nodesSplitter) {
                    node = node.startsWith("redis://") ? node : "redis://" + node;
                    RedisURI uri = RedisURI.create(node);
                    if (withDataBase) {
                        uri.setDatabase(pressureDatabase);
                    }
                    performanceUris.add(uri);
                }
            }
        } else if (args[2] instanceof List) {
            isSentinel = isSentinel(args[2], shadowRedisConfig);
            String nodes = shadowRedisConfig.getNodes();
            if (isSentinel) {
                String[] nodesSplitter = nodes.split(",");
                RedisURI.Builder builder = RedisURI.builder();
                for (String node : nodesSplitter) {
                    builder.withSentinel(node);
                    if (withDataBase) {
                        builder.withDatabase(pressureDatabase);
                    }
                }
                builder.withSentinelMasterId(shadowRedisConfig.getMaster());
                performanceUri = builder.build();
            } else {
                String[] nodesSplitter = nodes.split(",");
                for (String node : nodesSplitter) {
                    node = node.startsWith("redis://") ? node : "redis://" + node;
                    RedisURI uri = RedisURI.create(node);
                    if (withDataBase) {
                        uri.setDatabase(pressureDatabase);
                    }
                    performanceUris.add(uri);
                }
                String shadowMaster = shadowRedisConfig.getMaster();
                if (!StringUtil.isEmpty(shadowMaster)) {
                    shadowMaster = shadowMaster.startsWith("redis://") ? shadowMaster : "redis://" + shadowMaster;
                    RedisURI uri = RedisURI.create(shadowMaster);
                    if (withDataBase) {
                        uri.setDatabase(pressureDatabase);
                    }
                    performanceUris.add(uri);
                }
            }
        } else {
        /* performanceUris.add(RedisURI.create(
                        shadowRedisConfig.getMaster().startsWith("redis://") ? shadowRedisConfig.getMaster() : "redis://" + shadowRedisConfig.getMaster())
                );
                for (String nodeNum : shadowRedisConfig.getNodeNums()) {
                    performanceUris.add(RedisURI.create("redis://" + nodeNum));
                }*/
        }
        LettuceUtils.cachePressureNode(performanceUri);
        LettuceUtils.cachePressureNode(performanceUris);
        if ("connect".equals(method)) {
            if (isRedisUri(args[2], performanceUri)) {
                performanceConnection = MasterSlave.connect((RedisClient) args[0], (RedisCodec) args[1], performanceUri);
            } else {
                performanceConnection = MasterSlave.connect((RedisClient) args[0], (RedisCodec) args[1], performanceUris);
            }
        } else if ("connectAsync".equals(method)) {
            if (isRedisUri(args[2], performanceUri)) {
                performanceConnection = MasterSlave.connectAsync((RedisClient) args[0], (RedisCodec) args[1], performanceUri);
            } else {
                performanceConnection = MasterSlave.connectAsync((RedisClient) args[0], (RedisCodec) args[1], performanceUris);
            }
        }
        mediator = new RedisClientMediator<Object>(advice.getReturnObj(), performanceConnection);
    } catch (Exception e) {
        LOGGER.error(e.getMessage(), e);
        ErrorReporter.buildError().setErrorType(ErrorTypeEnum.RedisServer).setErrorCode("redisServer-0001").setMessage("redis server lettuce master slave error!").setDetail(ExceptionUtils.getStackTrace(e)).report();
    }
    return mediator;
}
Also used : RedisURI(io.lettuce.core.RedisURI) RedisClient(io.lettuce.core.RedisClient) RedisCodec(io.lettuce.core.codec.RedisCodec) Advice(com.shulie.instrument.simulator.api.listener.ext.Advice)

Aggregations

Advice (com.shulie.instrument.simulator.api.listener.ext.Advice)2 RedisURI (io.lettuce.core.RedisURI)2 PressureMeasureError (com.pamirs.pradar.exception.PressureMeasureError)1 RedisClient (io.lettuce.core.RedisClient)1 RedisCodec (io.lettuce.core.codec.RedisCodec)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1