Compare commits
2 Commits
8febeeb5e4
...
91a54e2d26
| Author | SHA1 | Date |
|---|---|---|
|
|
91a54e2d26 | |
|
|
040885e507 |
6
pom.xml
6
pom.xml
|
|
@ -89,12 +89,12 @@
|
||||||
<id>prod</id>
|
<id>prod</id>
|
||||||
<properties>
|
<properties>
|
||||||
<profiles.active>prod</profiles.active>
|
<profiles.active>prod</profiles.active>
|
||||||
<nacos.server>127.0.0.1:8848</nacos.server>
|
<nacos.server>53.16.17.16:8848</nacos.server>
|
||||||
<nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
|
<nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
|
||||||
<nacos.config.group>DEFAULT_GROUP</nacos.config.group>
|
<nacos.config.group>DEFAULT_GROUP</nacos.config.group>
|
||||||
<nacos.username>nacos</nacos.username>
|
<nacos.username>nacos</nacos.username>
|
||||||
<nacos.password>nacos</nacos.password>
|
<nacos.password>Ycgis!2509</nacos.password>
|
||||||
<logstash.address>127.0.0.1:4560</logstash.address>
|
<logstash.address>53.16.17.16:4560</logstash.address>
|
||||||
</properties>
|
</properties>
|
||||||
</profile>
|
</profile>
|
||||||
</profiles>
|
</profiles>
|
||||||
|
|
|
||||||
|
|
@ -130,6 +130,8 @@ public class LoginUser implements Serializable {
|
||||||
*/
|
*/
|
||||||
private String deviceType;
|
private String deviceType;
|
||||||
|
|
||||||
|
private String manageDeptId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取登录id
|
* 获取登录id
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -49,10 +49,15 @@ import static org.apache.dubbo.metadata.report.support.Constants.DEFAULT_METADAT
|
||||||
public class RedisMetadataReport extends AbstractMetadataReport {
|
public class RedisMetadataReport extends AbstractMetadataReport {
|
||||||
|
|
||||||
private static final String REDIS_DATABASE_KEY = "database";
|
private static final String REDIS_DATABASE_KEY = "database";
|
||||||
|
|
||||||
|
private static final String SENTINEL_KEY = "sentinel";
|
||||||
private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(RedisMetadataReport.class);
|
private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(RedisMetadataReport.class);
|
||||||
|
|
||||||
// protected , for test
|
// protected , for test
|
||||||
protected JedisPool pool;
|
protected JedisPool pool;
|
||||||
|
|
||||||
|
protected JedisSentinelPool sentinelPool;
|
||||||
|
|
||||||
private Set<HostAndPort> jedisClusterNodes;
|
private Set<HostAndPort> jedisClusterNodes;
|
||||||
private int timeout;
|
private int timeout;
|
||||||
private String password;
|
private String password;
|
||||||
|
|
@ -75,6 +80,14 @@ public class RedisMetadataReport extends AbstractMetadataReport {
|
||||||
for (URL tmpUrl : urls) {
|
for (URL tmpUrl : urls) {
|
||||||
jedisClusterNodes.add(new HostAndPort(tmpUrl.getHost(), tmpUrl.getPort()));
|
jedisClusterNodes.add(new HostAndPort(tmpUrl.getHost(), tmpUrl.getPort()));
|
||||||
}
|
}
|
||||||
|
} else if (url.getParameter(SENTINEL_KEY,false)) {
|
||||||
|
Set<String> sentinels = new HashSet<>();
|
||||||
|
List<URL> 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 {
|
} else {
|
||||||
int database = url.getParameter(REDIS_DATABASE_KEY, 0);
|
int database = url.getParameter(REDIS_DATABASE_KEY, 0);
|
||||||
pool = new JedisPool(new JedisPoolConfig(), url.getHost(), url.getPort(), timeout, password, database);
|
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) {
|
private void storeMetadata(BaseMetadataIdentifier metadataIdentifier, String v) {
|
||||||
if (pool != null) {
|
if (pool != null) {
|
||||||
storeMetadataStandalone(metadataIdentifier, v);
|
storeMetadataStandalone(metadataIdentifier, v);
|
||||||
|
}else if(sentinelPool != null) {
|
||||||
|
storeMetadataInSentinel(metadataIdentifier, v);
|
||||||
} else {
|
} else {
|
||||||
storeMetadataInCluster(metadataIdentifier, v);
|
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) {
|
private void storeMetadataInCluster(BaseMetadataIdentifier metadataIdentifier, String v) {
|
||||||
try (JedisCluster jedisCluster =
|
try (JedisCluster jedisCluster =
|
||||||
new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) {
|
new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) {
|
||||||
|
|
@ -158,11 +185,24 @@ public class RedisMetadataReport extends AbstractMetadataReport {
|
||||||
private void deleteMetadata(BaseMetadataIdentifier metadataIdentifier) {
|
private void deleteMetadata(BaseMetadataIdentifier metadataIdentifier) {
|
||||||
if (pool != null) {
|
if (pool != null) {
|
||||||
deleteMetadataStandalone(metadataIdentifier);
|
deleteMetadataStandalone(metadataIdentifier);
|
||||||
|
}else if(sentinelPool != null) {
|
||||||
|
deleteMetadataSentinel(metadataIdentifier);
|
||||||
} else {
|
} else {
|
||||||
deleteMetadataInCluster(metadataIdentifier);
|
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) {
|
private void deleteMetadataInCluster(BaseMetadataIdentifier metadataIdentifier) {
|
||||||
try (JedisCluster jedisCluster =
|
try (JedisCluster jedisCluster =
|
||||||
new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) {
|
new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) {
|
||||||
|
|
@ -187,11 +227,24 @@ public class RedisMetadataReport extends AbstractMetadataReport {
|
||||||
private String getMetadata(BaseMetadataIdentifier metadataIdentifier) {
|
private String getMetadata(BaseMetadataIdentifier metadataIdentifier) {
|
||||||
if (pool != null) {
|
if (pool != null) {
|
||||||
return getMetadataStandalone(metadataIdentifier);
|
return getMetadataStandalone(metadataIdentifier);
|
||||||
|
}else if(sentinelPool != null) {
|
||||||
|
return getMetadataSentinel(metadataIdentifier);
|
||||||
} else {
|
} else {
|
||||||
return getMetadataInCluster(metadataIdentifier);
|
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) {
|
private String getMetadataInCluster(BaseMetadataIdentifier metadataIdentifier) {
|
||||||
try (JedisCluster jedisCluster =
|
try (JedisCluster jedisCluster =
|
||||||
new JedisCluster(jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) {
|
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) {
|
private boolean storeMapping(String key, String field, String value, String ticket) {
|
||||||
if (pool != null) {
|
if (pool != null) {
|
||||||
return storeMappingStandalone(key, field, value, ticket);
|
return storeMappingStandalone(key, field, value, ticket);
|
||||||
|
}else if(sentinelPool != null) {
|
||||||
|
return storeMappingSentinel(key, field, value, ticket);
|
||||||
} else {
|
} else {
|
||||||
return storeMappingInCluster(key, field, value, ticket);
|
return storeMappingInCluster(key, field, value, ticket);
|
||||||
}
|
}
|
||||||
|
|
@ -278,6 +333,33 @@ public class RedisMetadataReport extends AbstractMetadataReport {
|
||||||
return false;
|
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<Object> result = transaction.exec();
|
||||||
|
if (null != result) {
|
||||||
|
jedisSentinel.publish(buildPubSubKey(), field);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jedisSentinel.unwatch();
|
||||||
|
} catch (Throwable e) {
|
||||||
|
String msg = "Failed to put " + key + ":" + field + " to redis " + value + ", cause: " + e.getMessage();
|
||||||
|
logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e);
|
||||||
|
throw new RpcException(msg, e);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* use 'watch' to implement cas.
|
* use 'watch' to implement cas.
|
||||||
* Find information about slot distribution by key.
|
* Find information about slot distribution by key.
|
||||||
|
|
@ -339,6 +421,8 @@ public class RedisMetadataReport extends AbstractMetadataReport {
|
||||||
private String getMappingData(String key, String field) {
|
private String getMappingData(String key, String field) {
|
||||||
if (pool != null) {
|
if (pool != null) {
|
||||||
return getMappingDataStandalone(key, field);
|
return getMappingDataStandalone(key, field);
|
||||||
|
}else if(sentinelPool != null) {
|
||||||
|
return getMappingDataSentinel(key, field);
|
||||||
} else {
|
} else {
|
||||||
return getMappingDataInCluster(key, field);
|
return getMappingDataInCluster(key, field);
|
||||||
}
|
}
|
||||||
|
|
@ -355,6 +439,17 @@ public class RedisMetadataReport extends AbstractMetadataReport {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getMappingDataSentinel(String key, String field) {
|
||||||
|
try (Jedis jedisSentinel = sentinelPool.getResource()) {
|
||||||
|
return jedisSentinel.hget(key, field);
|
||||||
|
} catch (Throwable e) {
|
||||||
|
String msg = "Failed to get " + key + ":" + field + " from redis , cause: " + e.getMessage();
|
||||||
|
logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e);
|
||||||
|
throw new RpcException(msg, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private String getMappingDataStandalone(String key, String field) {
|
private String getMappingDataStandalone(String key, String field) {
|
||||||
try (Jedis jedis = pool.getResource()) {
|
try (Jedis jedis = pool.getResource()) {
|
||||||
return jedis.hget(key, field);
|
return jedis.hget(key, field);
|
||||||
|
|
@ -502,6 +597,14 @@ public class RedisMetadataReport extends AbstractMetadataReport {
|
||||||
logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e);
|
logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e);
|
||||||
throw new RpcException(msg, e);
|
throw new RpcException(msg, e);
|
||||||
}
|
}
|
||||||
|
} else if (sentinelPool != null) {
|
||||||
|
try (Jedis jedisSentinel = sentinelPool.getResource()) {
|
||||||
|
jedisSentinel.subscribe(notifySub, path);
|
||||||
|
} catch (Throwable e) {
|
||||||
|
String msg = "Failed to subscribe " + path + ", cause: " + e.getMessage();
|
||||||
|
logger.error(TRANSPORT_FAILED_RESPONSE, "", "", msg, e);
|
||||||
|
throw new RpcException(msg, e);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
try (JedisCluster jedisCluster = new JedisCluster(
|
try (JedisCluster jedisCluster = new JedisCluster(
|
||||||
jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) {
|
jedisClusterNodes, timeout, timeout, 2, password, new GenericObjectPoolConfig<>())) {
|
||||||
|
|
|
||||||
|
|
@ -23,15 +23,27 @@ dubbo:
|
||||||
address: redis://${spring.data.redis.host}:${spring.data.redis.port}
|
address: redis://${spring.data.redis.host}:${spring.data.redis.port}
|
||||||
group: DUBBO_GROUP
|
group: DUBBO_GROUP
|
||||||
username: dubbo
|
username: dubbo
|
||||||
password: ${spring.data.redis.password}
|
password: ruoyi123
|
||||||
# 集群开关
|
# 集群开关
|
||||||
cluster: false
|
sentinel: true
|
||||||
parameters:
|
parameters:
|
||||||
namespace: ${spring.profiles.active}
|
namespace: ${spring.profiles.active}
|
||||||
database: ${spring.data.redis.database}
|
database: ${spring.data.redis.database}
|
||||||
timeout: ${spring.data.redis.timeout}
|
timeout: ${spring.data.redis.timeout}
|
||||||
# 集群地址 cluster 为 true 生效
|
backup: 53.16.17.13:26380,53.16.17.14:26380,53.16.17.16:26380
|
||||||
backup: 127.0.0.1:6379,127.0.0.1:6381
|
# metadata-report:
|
||||||
|
# address: redis://${spring.data.redis.host}:${spring.data.redis.port}
|
||||||
|
# group: DUBBO_GROUP
|
||||||
|
# username: dubbo
|
||||||
|
# password: ${spring.data.redis.password}
|
||||||
|
# # 集群开关
|
||||||
|
# cluster: false
|
||||||
|
# parameters:
|
||||||
|
# namespace: ${spring.profiles.active}
|
||||||
|
# database: ${spring.data.redis.database}
|
||||||
|
# timeout: ${spring.data.redis.timeout}
|
||||||
|
# # 集群地址 cluster 为 true 生效
|
||||||
|
# backup: 127.0.0.1:6379,127.0.0.1:6381
|
||||||
# 消费者相关配置
|
# 消费者相关配置
|
||||||
consumer:
|
consumer:
|
||||||
# 结果缓存(LRU算法)
|
# 结果缓存(LRU算法)
|
||||||
|
|
@ -43,3 +55,12 @@ dubbo:
|
||||||
retries: 0
|
retries: 0
|
||||||
# 初始化检查
|
# 初始化检查
|
||||||
check: false
|
check: false
|
||||||
|
|
||||||
|
logging:
|
||||||
|
level:
|
||||||
|
# 设置 Dubbo 核心包的日志级别为 DEBUG
|
||||||
|
org.apache.dubbo: DEBUG
|
||||||
|
# 如果需要更细粒度的调试,可指定元数据报告模块
|
||||||
|
org.apache.dubbo.metadata: DEBUG
|
||||||
|
# Redis 客户端日志(可选)
|
||||||
|
io.lettuce.core: WARN # 避免 Redis 连接日志过多
|
||||||
|
|
|
||||||
|
|
@ -38,12 +38,12 @@ public enum DataScopeType {
|
||||||
/**
|
/**
|
||||||
* 部门数据权限
|
* 部门数据权限
|
||||||
*/
|
*/
|
||||||
DEPT("3", " #{#deptName} = #{#user.deptId} ", " 1 = 0 "),
|
DEPT("3", " #{#deptName} = #{#user.manageDeptId} ", " 1 = 0 "),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 部门及以下数据权限
|
* 部门及以下数据权限
|
||||||
*/
|
*/
|
||||||
DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )", " 1 = 0 "),
|
DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.manageDeptId )} )", " 1 = 0 "),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 仅本人数据权限
|
* 仅本人数据权限
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,8 @@ public class LoginHelper {
|
||||||
public static final String USER_KEY = "userId";
|
public static final String USER_KEY = "userId";
|
||||||
public static final String USER_NAME_KEY = "userName";
|
public static final String USER_NAME_KEY = "userName";
|
||||||
public static final String DEPT_KEY = "deptId";
|
public static final String DEPT_KEY = "deptId";
|
||||||
|
|
||||||
|
public static final String MANAGE_DEPT__KEY = "manageDeptId";
|
||||||
public static final String DEPT_NAME_KEY = "deptName";
|
public static final String DEPT_NAME_KEY = "deptName";
|
||||||
public static final String DEPT_CATEGORY_KEY = "deptCategory";
|
public static final String DEPT_CATEGORY_KEY = "deptCategory";
|
||||||
public static final String CLIENT_KEY = "clientid";
|
public static final String CLIENT_KEY = "clientid";
|
||||||
|
|
@ -53,6 +55,7 @@ public class LoginHelper {
|
||||||
.setExtra(USER_KEY, loginUser.getUserId())
|
.setExtra(USER_KEY, loginUser.getUserId())
|
||||||
.setExtra(USER_NAME_KEY, loginUser.getUsername())
|
.setExtra(USER_NAME_KEY, loginUser.getUsername())
|
||||||
.setExtra(DEPT_KEY, loginUser.getDeptId())
|
.setExtra(DEPT_KEY, loginUser.getDeptId())
|
||||||
|
.setExtra(MANAGE_DEPT__KEY,loginUser.getManageDeptId())
|
||||||
.setExtra(DEPT_NAME_KEY, loginUser.getDeptName())
|
.setExtra(DEPT_NAME_KEY, loginUser.getDeptName())
|
||||||
.setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory())
|
.setExtra(DEPT_CATEGORY_KEY, loginUser.getDeptCategory())
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -131,6 +131,13 @@
|
||||||
<artifactId>elasticsearch-rest-client</artifactId>
|
<artifactId>elasticsearch-rest-client</artifactId>
|
||||||
<version>7.14.0</version>
|
<version>7.14.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.elasticsearch.client</groupId>
|
||||||
|
<artifactId>elasticsearch-rest-client</artifactId>
|
||||||
|
<version>7.6.0-hw-ei-302002</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.elasticsearch.client</groupId>
|
<groupId>org.elasticsearch.client</groupId>
|
||||||
<artifactId>elasticsearch-rest-high-level-client</artifactId>
|
<artifactId>elasticsearch-rest-high-level-client</artifactId>
|
||||||
|
|
@ -147,6 +154,12 @@
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.kafka</groupId>
|
||||||
|
<artifactId>kafka-clients</artifactId>
|
||||||
|
<version>2.4.0-hw-ei-302002</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<!-- kafka -->
|
<!-- kafka -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|
|
||||||
|
|
@ -20,10 +20,11 @@ import java.util.List;
|
||||||
/**
|
/**
|
||||||
* restHighLevelClient 客户端配置类
|
* restHighLevelClient 客户端配置类
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
|
||||||
|
/*@Slf4j
|
||||||
@Data
|
@Data
|
||||||
@Configuration
|
@Configuration
|
||||||
@ConfigurationProperties(prefix = "elasticsearch")
|
@ConfigurationProperties(prefix = "elasticsearch")*/
|
||||||
public class ElasticsearchConfig {
|
public class ElasticsearchConfig {
|
||||||
|
|
||||||
// es host ip 地址(集群)
|
// es host ip 地址(集群)
|
||||||
|
|
@ -85,7 +86,7 @@ public class ElasticsearchConfig {
|
||||||
});
|
});
|
||||||
restHighLevelClient = new RestHighLevelClient(builder);
|
restHighLevelClient = new RestHighLevelClient(builder);
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
log.error("ES 连接池初始化异常");
|
// log.error("ES 连接池初始化异常");
|
||||||
}
|
}
|
||||||
return restHighLevelClient;
|
return restHighLevelClient;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
package org.dromara.data2es.config;
|
||||||
|
|
||||||
|
import org.dromara.data2es.util.GenerateEnumUtil;
|
||||||
|
import org.elasticsearch.client.RestHighLevelClient;
|
||||||
|
import org.elasticsearch.hwclient.HwRestClient;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>description: </p>
|
||||||
|
*
|
||||||
|
* @author chenle
|
||||||
|
* @date 2021-07-05 18:22
|
||||||
|
*/
|
||||||
|
@Component(value = "esConfig")
|
||||||
|
public class EsConfig {
|
||||||
|
|
||||||
|
private String prefix = "gpsinfo";
|
||||||
|
|
||||||
|
public String indexNameByDay(){
|
||||||
|
return prefix+ LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean(destroyMethod = "close",name = "restHighLevelClient")
|
||||||
|
public RestHighLevelClient restClient() {
|
||||||
|
// String configPath = System.getProperty("user.dir") + File.separator+ "app_data2es_aq" + File.separator + "conf" + File.separator;
|
||||||
|
String configPath = "/rsoft/";
|
||||||
|
|
||||||
|
// KAFKA("KafkaClient"), ZOOKEEPER("Client");
|
||||||
|
GenerateEnumUtil.addEnum(LoginUtil.Module.class,"KAFKA","KafkaClient");
|
||||||
|
GenerateEnumUtil.addEnum(LoginUtil.Module.class,"ZOOKEEPER","Client");
|
||||||
|
HwRestClient hwRestClient = new HwRestClient(configPath);
|
||||||
|
RestHighLevelClient highLevelClient = new RestHighLevelClient(hwRestClient.getRestClientBuilder());
|
||||||
|
return highLevelClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -24,11 +24,11 @@ public class KafkaConfig {
|
||||||
|
|
||||||
private Logger logger = LoggerFactory.getLogger(KafkaConfig.class);
|
private Logger logger = LoggerFactory.getLogger(KafkaConfig.class);
|
||||||
|
|
||||||
// private String kafkaServers = "140.168.2.31:21007,140.168.2.32:21007,140.168.2.33:21007";
|
private String kafkaServers = "140.168.2.31:21007,140.168.2.32:21007,140.168.2.33:21007"; //省厅 kafka
|
||||||
// private String kafkaServers = "53.208.61.105:6667,53.208.61.106:6667,53.208.61.107:6667";//六安GA网
|
// private String kafkaServers = "53.208.61.105:6667,53.208.61.106:6667,53.208.61.107:6667";//六安GA网
|
||||||
// private String kafkaServers = "34.72.62.93:9092";//六安视频网
|
// private String kafkaServers = "34.72.62.93:9092";//六安视频网
|
||||||
// private String kafkaServers = "127.0.0.1:9092";//本地
|
// private String kafkaServers = "127.0.0.1:9092";//本地
|
||||||
private String kafkaServers = "53.207.8.71:9092,53.193.3.15:9092,53.160.0.237:9092,53.104.56.58:9092,53.128.22.61:9092";//省厅 马伟提供
|
// private String kafkaServers = "53.207.8.71:9092,53.193.3.15:9092,53.160.0.237:9092,53.104.56.58:9092,53.128.22.61:9092";//省厅 马伟提供
|
||||||
|
|
||||||
private String groupId = "ruansiProducer";
|
private String groupId = "ruansiProducer";
|
||||||
|
|
||||||
|
|
@ -128,11 +128,11 @@ public class KafkaConfig {
|
||||||
// props.put(kerberosDomainName, "hadoop.hadoop.com");
|
// props.put(kerberosDomainName, "hadoop.hadoop.com");
|
||||||
//设置自定义的分区策略类,默认不传key,是粘性分区,尽量往一个分区中发消息。如果key不为null,则默认是按照key的hashcode与 partition的取余来决定哪个partition
|
//设置自定义的分区策略类,默认不传key,是粘性分区,尽量往一个分区中发消息。如果key不为null,则默认是按照key的hashcode与 partition的取余来决定哪个partition
|
||||||
//props.put("partitioner.class","com.kafka.myparitioner.CidPartitioner");
|
//props.put("partitioner.class","com.kafka.myparitioner.CidPartitioner");
|
||||||
props.put(securityProtocol, "SASL_PLAINTEXT");
|
// props.put(securityProtocol, "SASL_PLAINTEXT");
|
||||||
props.put("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"zkxc\" password=\"zkxcKafka07252023\";");
|
// props.put("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"zkxc\" password=\"zkxcKafka07252023\";");
|
||||||
props.put("sasl.mechanism", "SCRAM-SHA-256");
|
// props.put("sasl.mechanism", "SCRAM-SHA-256");
|
||||||
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
|
// KafkaProducer<String, String> producer = new KafkaProducer<>(props);
|
||||||
// KafkaProducer producer = new KafkaProducer<>(props);
|
KafkaProducer producer = new KafkaProducer<>(props);
|
||||||
|
|
||||||
return producer;
|
return producer;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ public class KafkaSecurityUtil {
|
||||||
/**
|
/**
|
||||||
* 用户自己申请的机机账号名称
|
* 用户自己申请的机机账号名称
|
||||||
*/
|
*/
|
||||||
private static final String USER_PRINCIPAL = "aqdsj_ruansi@HADOOP.COM";
|
private static final String USER_PRINCIPAL = "yhy_ahrs_rcw@HADOOP.COM";
|
||||||
|
|
||||||
public static void securityPrepare() throws IOException
|
public static void securityPrepare() throws IOException
|
||||||
{
|
{
|
||||||
|
|
@ -34,10 +34,10 @@ public class KafkaSecurityUtil {
|
||||||
//String krbFile = filePath + "krb5.conf";
|
//String krbFile = filePath + "krb5.conf";
|
||||||
//ClassPathResource classPathResource = new ClassPathResource("krb5.conf");
|
//ClassPathResource classPathResource = new ClassPathResource("krb5.conf");
|
||||||
//String krbFile = classPathResource.getAbsolutePath();
|
//String krbFile = classPathResource.getAbsolutePath();
|
||||||
String krbFile = "/gpsstore/krb5.conf";
|
String krbFile = "/rsoft/krb5.conf";
|
||||||
// String userKeyTableFile = filePath + USER_KEYTAB_FILE;
|
// String userKeyTableFile = filePath + USER_KEYTAB_FILE;
|
||||||
//ClassPathResource classPathResource1 = new ClassPathResource(USER_KEYTAB_FILE);
|
//ClassPathResource classPathResource1 = new ClassPathResource(USER_KEYTAB_FILE);
|
||||||
String userKeyTableFile = "/gpsstore/user.keytab";
|
String userKeyTableFile = "/rsoft/user.keytab";
|
||||||
|
|
||||||
//windows路径下分隔符替换
|
//windows路径下分隔符替换
|
||||||
userKeyTableFile = userKeyTableFile.replace("\\", "\\\\");
|
userKeyTableFile = userKeyTableFile.replace("\\", "\\\\");
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,146 @@
|
||||||
|
package org.dromara.data2es.util;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.lang.reflect.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>description: </p>
|
||||||
|
*
|
||||||
|
* @author luya
|
||||||
|
* @date 2025-07-08
|
||||||
|
*/
|
||||||
|
public class GenerateEnumUtil {
|
||||||
|
|
||||||
|
static Logger log = LoggerFactory.getLogger(GenerateEnumUtil.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加枚举类
|
||||||
|
*
|
||||||
|
* @param enumClass 枚举类
|
||||||
|
* @param enumName 枚举名称 (不可重复)
|
||||||
|
* @param params 属性参数,按顺序写入
|
||||||
|
*/
|
||||||
|
public static <T extends Enum<?>> void addEnum(Class<T> enumClass, String enumName, Object... params) {
|
||||||
|
sanityChecks(enumClass, enumName);
|
||||||
|
Field valuesField = null;
|
||||||
|
Field[] fields = enumClass.getDeclaredFields();
|
||||||
|
List<Class<?>> paramTypes = new LinkedList<>();
|
||||||
|
|
||||||
|
for (Field field : fields) {
|
||||||
|
if (field.isEnumConstant() && field.getName().equals(enumName)) {
|
||||||
|
log.warn("该枚举类已经存在!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (field.isSynthetic() && field.getName().contains("$VALUES")) {
|
||||||
|
valuesField = field;
|
||||||
|
}
|
||||||
|
if (!field.isSynthetic() && !field.isEnumConstant()) {
|
||||||
|
paramTypes.add(field.getType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (valuesField == null) {
|
||||||
|
throw new RuntimeException("未获取到合成类型");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 设置可访问
|
||||||
|
valuesField.setAccessible(true);
|
||||||
|
T[] previousValues = (T[]) valuesField.get(null);
|
||||||
|
List<T> values = new ArrayList<>(Arrays.asList(previousValues));
|
||||||
|
|
||||||
|
// 创建新枚举实例
|
||||||
|
T newValue = makeEnum(enumClass, enumName, values.size(), paramTypes.toArray(new Class[0]), params);
|
||||||
|
values.add(newValue);
|
||||||
|
|
||||||
|
// 更新枚举数组
|
||||||
|
setFailsafeFieldValue(valuesField, null, values.toArray((T[]) Array.newInstance(enumClass, 0)));
|
||||||
|
|
||||||
|
// 清理枚举缓存
|
||||||
|
cleanEnumCache(enumClass);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("添加枚举失败: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验参数
|
||||||
|
*/
|
||||||
|
private static <T extends Enum<?>> void sanityChecks(Class<T> enumClass, String enumName) {
|
||||||
|
if (!Enum.class.isAssignableFrom(enumClass)) {
|
||||||
|
throw new RuntimeException(enumClass + " 不是一个枚举类。");
|
||||||
|
}
|
||||||
|
if (enumName == null || enumName.trim().isEmpty()) {
|
||||||
|
throw new RuntimeException("枚举名称不能为空");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建枚举实例
|
||||||
|
*/
|
||||||
|
private static <T> T makeEnum(Class<T> enumClass, String enumName, int ordinal,
|
||||||
|
Class<?>[] additionalTypes, Object[] additionalValues) throws Exception {
|
||||||
|
Class<?>[] paramTypes = new Class[additionalTypes.length + 2];
|
||||||
|
paramTypes[0] = String.class;
|
||||||
|
paramTypes[1] = int.class;
|
||||||
|
System.arraycopy(additionalTypes, 0, paramTypes, 2, additionalTypes.length);
|
||||||
|
|
||||||
|
// 获取并调用构造器
|
||||||
|
Constructor<T> constructor = enumClass.getDeclaredConstructor(paramTypes);
|
||||||
|
constructor.setAccessible(true);
|
||||||
|
|
||||||
|
Object[] params = new Object[additionalValues.length + 2];
|
||||||
|
params[0] = enumName;
|
||||||
|
params[1] = ordinal;
|
||||||
|
System.arraycopy(additionalValues, 0, params, 2, additionalValues.length);
|
||||||
|
|
||||||
|
return constructor.newInstance(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置字段值(包括final字段)
|
||||||
|
*/
|
||||||
|
private static void setFailsafeFieldValue(Field field, Object target, Object value)
|
||||||
|
throws NoSuchFieldException, IllegalAccessException {
|
||||||
|
|
||||||
|
field.setAccessible(true);
|
||||||
|
|
||||||
|
// 处理final修饰符
|
||||||
|
Field modifiersField = Field.class.getDeclaredField("modifiers");
|
||||||
|
modifiersField.setAccessible(true);
|
||||||
|
|
||||||
|
int originalModifiers = field.getModifiers();
|
||||||
|
modifiersField.setInt(field, originalModifiers & ~Modifier.FINAL);
|
||||||
|
|
||||||
|
// 设置字段值
|
||||||
|
field.set(target, value);
|
||||||
|
|
||||||
|
// 恢复原始修饰符(可选)
|
||||||
|
modifiersField.setInt(field, originalModifiers);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清理枚举缓存
|
||||||
|
*/
|
||||||
|
private static void cleanEnumCache(Class<?> enumClass)
|
||||||
|
throws NoSuchFieldException, IllegalAccessException {
|
||||||
|
|
||||||
|
blankField(enumClass, "enumConstantDirectory");
|
||||||
|
blankField(enumClass, "enumConstants");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void blankField(Class<?> enumClass, String fieldName)
|
||||||
|
throws NoSuchFieldException, IllegalAccessException {
|
||||||
|
|
||||||
|
for (Field field : Class.class.getDeclaredFields()) {
|
||||||
|
if (field.getName().contains(fieldName)) {
|
||||||
|
field.setAccessible(true);
|
||||||
|
setFailsafeFieldValue(field, enumClass, null);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -103,6 +103,8 @@ public class SysUser extends TenantEntity {
|
||||||
*/
|
*/
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
private String manageDeptId;
|
||||||
|
|
||||||
|
|
||||||
public SysUser(Long userId) {
|
public SysUser(Long userId) {
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,8 @@ public class SysUserBo extends BaseEntity {
|
||||||
*/
|
*/
|
||||||
private String excludeUserIds;
|
private String excludeUserIds;
|
||||||
|
|
||||||
|
private String manageDeptId;
|
||||||
|
|
||||||
public SysUserBo(Long userId) {
|
public SysUserBo(Long userId) {
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,7 @@ public class SysUserVo implements Serializable {
|
||||||
*/
|
*/
|
||||||
private Date createTime;
|
private Date createTime;
|
||||||
|
|
||||||
|
private String manageDeptId;
|
||||||
/**
|
/**
|
||||||
* 部门名
|
* 部门名
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -253,6 +253,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
|
||||||
loginUser.setTenantId(userVo.getTenantId());
|
loginUser.setTenantId(userVo.getTenantId());
|
||||||
loginUser.setUserId(userVo.getUserId());
|
loginUser.setUserId(userVo.getUserId());
|
||||||
loginUser.setDeptId(userVo.getDeptId());
|
loginUser.setDeptId(userVo.getDeptId());
|
||||||
|
loginUser.setManageDeptId(userVo.getManageDeptId());
|
||||||
loginUser.setUsername(userVo.getUserName());
|
loginUser.setUsername(userVo.getUserName());
|
||||||
loginUser.setNickname(userVo.getNickName());
|
loginUser.setNickname(userVo.getNickName());
|
||||||
loginUser.setPassword(userVo.getPassword());
|
loginUser.setPassword(userVo.getPassword());
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ spring.sql.init.platform=postgresql
|
||||||
db.num=1
|
db.num=1
|
||||||
|
|
||||||
### Connect URL of DB:
|
### Connect URL of DB:
|
||||||
db.url.0=jdbc:postgresql://localhost:5432/ypc-config?tcpKeepAlive=true&reWriteBatchedInserts=true&ApplicationName=ruoyi-nacos
|
db.url.0=jdbc:postgresql://53.16.17.15:5432/ypc-config?tcpKeepAlive=true&reWriteBatchedInserts=true&ApplicationName=ruoyi-nacos
|
||||||
db.user.0=postgres
|
db.user.0=postgres
|
||||||
db.password.0=ycgis
|
db.password.0=ycgis
|
||||||
db.pool.config.driverClassName=org.postgresql.Driver
|
db.pool.config.driverClassName=org.postgresql.Driver
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue