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;
}
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;
}
Aggregations