diff --git a/pom.xml b/pom.xml
index 7ce73d73..bacecbde 100644
--- a/pom.xml
+++ b/pom.xml
@@ -89,12 +89,12 @@
prod
prod
- 53.16.17.13:8848
+ 10.129.128.114:8848
DEFAULT_GROUP
DEFAULT_GROUP
nacos
nacos
- 53.16.17.13:4560
+ 10.129.128.114:4560
diff --git a/stwzhj-common/stwzhj-common-dubbo/pom.xml b/stwzhj-common/stwzhj-common-dubbo/pom.xml
index e515b05f..024fb983 100644
--- a/stwzhj-common/stwzhj-common-dubbo/pom.xml
+++ b/stwzhj-common/stwzhj-common-dubbo/pom.xml
@@ -40,6 +40,10 @@
org.apache.dubbo
dubbo-metadata-report-redis
+
+ io.lettuce
+ lettuce-core
+
redis.clients
jedis
@@ -51,6 +55,11 @@
jedis
5.1.0
+
+
+ io.lettuce
+ lettuce-core
+
org.projectlombok
lombok
diff --git a/stwzhj-common/stwzhj-common-dubbo/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java b/stwzhj-common/stwzhj-common-dubbo/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
index 9d6af3af..84202fdf 100644
--- a/stwzhj-common/stwzhj-common-dubbo/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
+++ b/stwzhj-common/stwzhj-common-dubbo/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
@@ -49,10 +49,15 @@ import static org.apache.dubbo.metadata.report.support.Constants.DEFAULT_METADAT
public class RedisMetadataReport extends AbstractMetadataReport {
private static final String REDIS_DATABASE_KEY = "database";
+
+ private static final String SENTINEL_KEY = "sentinel";
private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(RedisMetadataReport.class);
// protected , for test
protected JedisPool pool;
+
+ protected JedisSentinelPool sentinelPool;
+
private Set jedisClusterNodes;
private int timeout;
private String password;
@@ -75,6 +80,14 @@ public class RedisMetadataReport extends AbstractMetadataReport {
for (URL tmpUrl : urls) {
jedisClusterNodes.add(new HostAndPort(tmpUrl.getHost(), tmpUrl.getPort()));
}
+ } else if (url.getParameter(SENTINEL_KEY,false)) {
+ Set sentinels = new HashSet<>();
+ List urls = url.getBackupUrls();
+ for (URL tmpUrl : urls) {
+ sentinels.add(tmpUrl.getHost()+":"+ tmpUrl.getPort());
+ }
+ int database = url.getParameter(REDIS_DATABASE_KEY, 0);
+ sentinelPool = new JedisSentinelPool("mymaster",sentinels ,new GenericObjectPoolConfig<>(), timeout, password, database);
} else {
int database = url.getParameter(REDIS_DATABASE_KEY, 0);
pool = new JedisPool(new JedisPoolConfig(), url.getHost(), url.getPort(), timeout, password, database);
@@ -128,11 +141,25 @@ public class RedisMetadataReport extends AbstractMetadataReport {
private void storeMetadata(BaseMetadataIdentifier metadataIdentifier, String v) {
if (pool != null) {
storeMetadataStandalone(metadataIdentifier, v);
+ }else if(sentinelPool != null) {
+ storeMetadataInSentinel(metadataIdentifier, v);
} else {
storeMetadataInCluster(metadataIdentifier, v);
}
}
+ private void storeMetadataInSentinel(BaseMetadataIdentifier metadataIdentifier, String v) {
+ try (Jedis jedisSentinel = sentinelPool.getResource()) {
+ jedisSentinel.set(metadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY), v, jedisParams);
+ } catch (Throwable e) {
+ String msg =
+ "Failed to put " + metadataIdentifier + " to redis cluster " + v + ", cause: " + e.getMessage();
+ logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e);
+ throw new RpcException(msg, e);
+ }
+ }
+
+
private void storeMetadataInCluster(BaseMetadataIdentifier metadataIdentifier, String v) {
try (JedisCluster jedisCluster =
new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) {
@@ -158,11 +185,24 @@ public class RedisMetadataReport extends AbstractMetadataReport {
private void deleteMetadata(BaseMetadataIdentifier metadataIdentifier) {
if (pool != null) {
deleteMetadataStandalone(metadataIdentifier);
+ }else if(sentinelPool != null) {
+ deleteMetadataSentinel(metadataIdentifier);
} else {
deleteMetadataInCluster(metadataIdentifier);
}
}
+ private void deleteMetadataSentinel(BaseMetadataIdentifier metadataIdentifier) {
+ try (Jedis jedisSentinel = sentinelPool.getResource()) {
+ jedisSentinel.del(metadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY));
+ } catch (Throwable e) {
+ String msg = "Failed to delete " + metadataIdentifier + " from redis , cause: " + e.getMessage();
+ logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e);
+ throw new RpcException(msg, e);
+ }
+ }
+
+
private void deleteMetadataInCluster(BaseMetadataIdentifier metadataIdentifier) {
try (JedisCluster jedisCluster =
new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) {
@@ -187,11 +227,24 @@ public class RedisMetadataReport extends AbstractMetadataReport {
private String getMetadata(BaseMetadataIdentifier metadataIdentifier) {
if (pool != null) {
return getMetadataStandalone(metadataIdentifier);
+ }else if(sentinelPool != null) {
+ return getMetadataSentinel(metadataIdentifier);
} else {
return getMetadataInCluster(metadataIdentifier);
}
}
+ private String getMetadataSentinel(BaseMetadataIdentifier metadataIdentifier) {
+ try (Jedis jedisSentinel = sentinelPool.getResource()) {
+ return jedisSentinel.get(metadataIdentifier.getUniqueKey(KeyTypeEnum.UNIQUE_KEY));
+ } catch (Throwable e) {
+ String msg = "Failed to get " + metadataIdentifier + " from redis , cause: " + e.getMessage();
+ logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e);
+ throw new RpcException(msg, e);
+ }
+ }
+
+
private String getMetadataInCluster(BaseMetadataIdentifier metadataIdentifier) {
try (JedisCluster jedisCluster =
new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) {
@@ -243,6 +296,8 @@ public class RedisMetadataReport extends AbstractMetadataReport {
private boolean storeMapping(String key, String field, String value, String ticket) {
if (pool != null) {
return storeMappingStandalone(key, field, value, ticket);
+ }else if(sentinelPool != null) {
+ return storeMappingSentinel(key, field, value, ticket);
} else {
return storeMappingInCluster(key, field, value, ticket);
}
@@ -278,6 +333,33 @@ public class RedisMetadataReport extends AbstractMetadataReport {
return false;
}
+ /**
+ * use 'watch' to implement cas.
+ * Find information about slot distribution by key.
+ */
+ private boolean storeMappingSentinel(String key, String field, String value, String ticket) {
+ try (Jedis jedisSentinel = sentinelPool.getResource()) {
+ jedisSentinel.watch(key);
+ String oldValue = jedisSentinel.hget(key, field);
+ if (null == oldValue || null == ticket || oldValue.equals(ticket)) {
+ Transaction transaction = jedisSentinel.multi();
+ transaction.hset(key, field, value);
+ List