Browse Source

ADD-添加redis相关配置

liyang 1 year ago
parent
commit
485a35e6b2

+ 17 - 0
pom.xml

@@ -86,6 +86,23 @@
 		</dependency>
 
 		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-redis</artifactId>
+			<scope>provided</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-redis</artifactId>
+			<scope>provided</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.redisson</groupId>
+			<artifactId>redisson</artifactId>
+		</dependency>
+
+		<dependency>
 			<groupId>io.springfox</groupId>
 			<artifactId>springfox-swagger2</artifactId>
 			<scope>provided</scope>

+ 68 - 0
src/main/java/com/ywt/biz/common/config/redis/LettuceRedisConfig.java

@@ -0,0 +1,68 @@
+package com.ywt.biz.common.config.redis;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.*;
+
+/**
+ * Redis配置类
+ * @author liy
+ * @date 2021/5/18 16:48
+ */
+@EnableCaching
+@Configuration
+@ConfigurationProperties(prefix = "spring.redis")
+@ConditionalOnProperty(name = "redis.enable", havingValue = "true")
+public class LettuceRedisConfig {
+
+
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
+        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
+        redisTemplate.setConnectionFactory(connectionFactory);
+        //首先解决key的序列化方式
+        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
+        redisTemplate.setKeySerializer(stringRedisSerializer);
+        //解决value的序列化方式
+        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
+        //序列化时将类的数据类型存入json,以便反序列化的时候转换成正确的类型
+        ObjectMapper objectMapper = new ObjectMapper();
+        //objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
+        // 解决jackson2无法反序列化LocalDateTime的问题
+        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+        objectMapper.registerModule(new JavaTimeModule());
+        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
+        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
+        return redisTemplate;
+    }
+
+    @Bean
+    public CacheManager cacheManager(LettuceConnectionFactory factory) {
+        RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig();
+        // 设置缓存管理器管理的缓存的默认过期时间
+        defaultCacheConfig
+                .computePrefixWith(cacheName -> "entity:" + cacheName + ":")
+                // 不缓存空值
+                .disableCachingNullValues();
+        return RedisCacheManager.builder(factory)
+                .cacheDefaults(defaultCacheConfig)
+                .build();
+    }
+}

+ 67 - 0
src/main/java/com/ywt/biz/common/config/redission/properties/RedissonConfig.java

@@ -0,0 +1,67 @@
+
+package com.ywt.biz.common.config.redission.properties;
+
+
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.redisson.config.SentinelServersConfig;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.util.StringUtils;
+
+
+/**
+ * redisson 配置
+ * @author liyang
+ */
+
+@Configuration
+@EnableConfigurationProperties(RedissonProperties.class)
+@ConditionalOnProperty(name = "redisson.enable", havingValue = "true")
+public class RedissonConfig {
+
+
+    @Bean
+    public RedissonClient getRedisson(RedissonProperties redissonProperties) {
+        Config config = new Config();
+        if("single".equals(redissonProperties.getModel())){
+            // 单机节点
+            config.useSingleServer()
+                    .setAddress("redis://" + redissonProperties.getHost() + ":" + redissonProperties.getPort())
+                    .setPassword(redissonProperties.getPassword())
+                    .setDatabase(redissonProperties.getDatabase())
+                    .setRetryInterval(5000)
+                    .setTimeout(10000)
+                    .setConnectTimeout(10000);
+            return Redisson.create(config);
+        }
+        if("sentinel".equals(redissonProperties.getModel())){
+            String[] sentinelAddresses  = redissonProperties.getSentinelAddresses();
+            String schema = redissonProperties.getSchema();
+            // 拼接协议
+            String[] sentinelAddressesWithSchema = new String[sentinelAddresses.length];
+            for (int i = 0; i < sentinelAddresses.length; i++) {
+                sentinelAddressesWithSchema[i] = schema + sentinelAddresses[i];
+            }
+
+            SentinelServersConfig serversConfig = config.useSentinelServers()
+                    .setMasterName(redissonProperties.getMasterName())
+                    .addSentinelAddress(sentinelAddressesWithSchema)
+                    .setMasterConnectionPoolSize(redissonProperties.getMasterConnectionPoolSize())
+                    .setSlaveConnectionPoolSize(redissonProperties.getSlaveConnectionPoolSize())
+                    .setMasterConnectionMinimumIdleSize(redissonProperties.getConnectionMinimumIdleSize())
+                    .setSlaveConnectionMinimumIdleSize(redissonProperties.getConnectionMinimumIdleSize());
+
+            if (StringUtils.hasText(redissonProperties.getPassword())) {
+                serversConfig.setPassword(redissonProperties.getPassword());
+            }
+            return Redisson.create(config);
+        }
+        return null ;
+    }
+
+}
+

+ 33 - 0
src/main/java/com/ywt/biz/common/config/redission/properties/RedissonProperties.java

@@ -0,0 +1,33 @@
+
+package com.ywt.biz.common.config.redission.properties;
+
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+
+/**
+ * redisson 配置暂用spring-redis
+ * @author liyang
+ */
+
+@ConfigurationProperties(prefix = "redisson")
+@Data
+public class RedissonProperties {
+
+    private String model;
+    private int timeout = 3000;
+    private String schema = "redis://";
+    private String host;
+    private String port;
+    private int database;
+    private String password;
+    private int connectionPoolSize = 64;
+    private int connectionMinimumIdleSize = 10;
+    private int slaveConnectionPoolSize = 250;
+    private int masterConnectionPoolSize = 250;
+    private String[] sentinelAddresses;
+    private String masterName;
+
+}
+

+ 78 - 78
src/main/java/com/ywt/biz/common/constant/AnyTxnCommonRespCode.java → src/main/java/com/ywt/biz/common/constant/YwtCommonRespCode.java

@@ -1,78 +1,78 @@
-package com.ywt.biz.common.constant;
-
-/**
- * BIZ-COMMON工程专有响应码枚举类
- * 作为自定义异常对象的入参,为使用自定义异常必须针对异常进系枚举定义.这里的XXX/YYY均需要替换成各个真实的变量.
- * 变量的命名规则:保证简介无歧义,不可过长(>10)也不能太短导致无法辨识含义
- * 
- * 具体可参考Message工程案例(目前在dev_adjust_20200203,后续会迁移至develop)
- * @author fhp
- *
- */
-public enum AnyTxnCommonRespCode implements RespCodePrefix {
-	/**
-	 * 正常响应码枚举定义
-	 */
-	REQ_SUCCESS(PREFIX_BIZ_COMMON_N, "响应正常", "response success"),
-	/**
-	 * 参数类型响应码枚举定义
-	 */
-	P_ERR(PREFIX_BIZ_COMMON_P + "10000", "参数异常", "parameter exception"),
-	P_CLASS_CAST_ERR(PREFIX_BIZ_COMMON_P + "10001", "对象类型转换异常", "class cast exception"),
-
-	/**
-	 * 数据类型响应码枚举定义
-	 */
-	D_ERR(PREFIX_BIZ_COMMON_D + "20000", "数据异常", "data exception"),
-	D_DUPLICATEKEY(PREFIX_BIZ_COMMON_D + "20001", "违反唯一约束", ""),
-
-	U_TYPE_NOT_SUPPORTED(PREFIX_BIZ_COMMON_S + "30007", "不支持的枚举类型", ""),
-
-	/**
-	 * 物理资源类型响应码枚举定义
-	 */
-	R_DISK_FULL(PREFIX_BIZ_COMMON_R + "40001", "磁盘空间满", ""),
-	R_OFFLINE(PREFIX_BIZ_COMMON_R + "40002", "网络不通", ""),
-	R_PORT_IN_USER(PREFIX_BIZ_COMMON_R + "40003", "端口被占用", ""),
-
-	/**
-	 * 未知异常枚举定义
-	 */
-	UNKONWN_ERR(MAX_RESPONSE_CODE+RESPONSE_UNKNOWN, "其他错误", "");
-
-	/**
-	 * 响应码编码,格式为 3位业务编码+2位响应码类型编码+5位具体响应码
-	 */
-	private String code;
-	/**
-	 * 中文通用描述
-	 */
-	private String msg;
-	/**
-	 * 需要提供具体数据时使用.
-	 * 方便后续分析查看.
-	 * 可以在抛出异常处通过对此属性进行赋值记录现场
-	 */
-	private String detail;
-	AnyTxnCommonRespCode(String code, String msg, String detail ) {
-		this.code = code;
-		this.msg = msg;
-		this.detail = detail;
-	}
-
-	@Override
-	public String getCode() {
-		return code;
-	}
-
-	@Override
-	public String getMsg() {
-		return msg;
-	}
-
-	@Override
-	public String getDetail() {
-		return detail;
-	}
-
-}
+package com.ywt.biz.common.constant;
+
+/**
+ * BIZ-COMMON工程专有响应码枚举类
+ * 作为自定义异常对象的入参,为使用自定义异常必须针对异常进系枚举定义.这里的XXX/YYY均需要替换成各个真实的变量.
+ * 变量的命名规则:保证简介无歧义,不可过长(>10)也不能太短导致无法辨识含义
+ * 
+ *
+ * @author fhp
+ *
+ */
+public enum YwtCommonRespCode implements RespCodePrefix {
+	/**
+	 * 正常响应码枚举定义
+	 */
+	REQ_SUCCESS(PREFIX_BIZ_COMMON_N, "响应正常", "response success"),
+	/**
+	 * 参数类型响应码枚举定义
+	 */
+	P_ERR(PREFIX_BIZ_COMMON_P + "10000", "参数异常", "parameter exception"),
+	P_CLASS_CAST_ERR(PREFIX_BIZ_COMMON_P + "10001", "对象类型转换异常", "class cast exception"),
+
+	/**
+	 * 数据类型响应码枚举定义
+	 */
+	D_ERR(PREFIX_BIZ_COMMON_D + "20000", "数据异常", "data exception"),
+	D_DUPLICATEKEY(PREFIX_BIZ_COMMON_D + "20001", "违反唯一约束", ""),
+
+	U_TYPE_NOT_SUPPORTED(PREFIX_BIZ_COMMON_S + "30007", "不支持的枚举类型", ""),
+
+	/**
+	 * 物理资源类型响应码枚举定义
+	 */
+	R_DISK_FULL(PREFIX_BIZ_COMMON_R + "40001", "磁盘空间满", ""),
+	R_OFFLINE(PREFIX_BIZ_COMMON_R + "40002", "网络不通", ""),
+	R_PORT_IN_USER(PREFIX_BIZ_COMMON_R + "40003", "端口被占用", ""),
+
+	/**
+	 * 未知异常枚举定义
+	 */
+	UNKONWN_ERR(MAX_RESPONSE_CODE+RESPONSE_UNKNOWN, "其他错误", "");
+
+	/**
+	 * 响应码编码,格式为 3位业务编码+2位响应码类型编码+5位具体响应码
+	 */
+	private String code;
+	/**
+	 * 中文通用描述
+	 */
+	private String msg;
+	/**
+	 * 需要提供具体数据时使用.
+	 * 方便后续分析查看.
+	 * 可以在抛出异常处通过对此属性进行赋值记录现场
+	 */
+	private String detail;
+	YwtCommonRespCode(String code, String msg, String detail ) {
+		this.code = code;
+		this.msg = msg;
+		this.detail = detail;
+	}
+
+	@Override
+	public String getCode() {
+		return code;
+	}
+
+	@Override
+	public String getMsg() {
+		return msg;
+	}
+
+	@Override
+	public String getDetail() {
+		return detail;
+	}
+
+}

+ 5 - 5
src/main/java/com/ywt/biz/common/exception/YwtCommonException.java

@@ -1,6 +1,6 @@
 package com.ywt.biz.common.exception;
 
-import com.ywt.biz.common.constant.AnyTxnCommonRespCode;
+import com.ywt.biz.common.constant.YwtCommonRespCode;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
@@ -22,7 +22,7 @@ public class YwtCommonException extends YwtException {
      * 不适用于将原始异常转为自己封装异常场景
      * @param e	自定义枚举对象
      */
-	public YwtCommonException(AnyTxnCommonRespCode e) {
+	public YwtCommonException(YwtCommonRespCode e) {
 		this(e, "");
 	}
     /**
@@ -31,7 +31,7 @@ public class YwtCommonException extends YwtException {
      * @param e	自定义枚举对象
      * @param detail 手动设置的具体信息,比如参数/上下文环境,方便排查问题
      */
-	public YwtCommonException(AnyTxnCommonRespCode e, String detail) {
+	public YwtCommonException(YwtCommonRespCode e, String detail) {
 		this(e, detail, null);
 	}
 
@@ -41,7 +41,7 @@ public class YwtCommonException extends YwtException {
      * @param e	自定义枚举对象
      * @param cause	原始异常
      */
-	public YwtCommonException(AnyTxnCommonRespCode e, Throwable cause) {
+	public YwtCommonException(YwtCommonRespCode e, Throwable cause) {
 		this(e, "", cause);
 	}
     /**
@@ -51,7 +51,7 @@ public class YwtCommonException extends YwtException {
      * @param detail 手动设置的具体信息,比如参数/上下文环境,方便排查问题
      * @param cause	原始异常
      */
-	public YwtCommonException(AnyTxnCommonRespCode e, String detail, Throwable cause) {
+	public YwtCommonException(YwtCommonRespCode e, String detail, Throwable cause) {
         super(e.getCode(),e.getMsg(),detail,cause);
 	}
 	

+ 4 - 4
src/main/java/com/ywt/biz/common/handler/GlobalExceptionHandler.java

@@ -1,6 +1,6 @@
 package com.ywt.biz.common.handler;
 
-import com.ywt.biz.common.constant.AnyTxnCommonRespCode;
+import com.ywt.biz.common.constant.YwtCommonRespCode;
 import com.ywt.biz.common.exception.YwtException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,7 +30,7 @@ public class GlobalExceptionHandler {
 	@ExceptionHandler(value = Throwable.class)
 	public YwtHttpResponse<?> txnExceptionHandler(Throwable e) {
 		logger.error("服务异常,throwable:{}",e.getMessage(),e);
-		return YwtHttpResponse.fail(AnyTxnCommonRespCode.UNKONWN_ERR.getCode(),AnyTxnCommonRespCode.UNKONWN_ERR.getMsg(),e.toString());
+		return YwtHttpResponse.fail(YwtCommonRespCode.UNKONWN_ERR.getCode(), YwtCommonRespCode.UNKONWN_ERR.getMsg(),e.toString());
 	}
 
 	/**
@@ -42,7 +42,7 @@ public class GlobalExceptionHandler {
 	@ExceptionHandler(value = Exception.class)
 	public YwtHttpResponse<?> txnExceptionHandler(Exception e) {
 		logger.error("服务异常,Exception:{},堆栈信息:{}",e.getMessage(),e);
-		return YwtHttpResponse.fail(AnyTxnCommonRespCode.UNKONWN_ERR.getCode(),AnyTxnCommonRespCode.UNKONWN_ERR.getMsg(),e.toString());
+		return YwtHttpResponse.fail(YwtCommonRespCode.UNKONWN_ERR.getCode(), YwtCommonRespCode.UNKONWN_ERR.getMsg(),e.toString());
 	}
 	/**
 	 * 对不能单独处理的异常进行统一处理
@@ -57,7 +57,7 @@ public class GlobalExceptionHandler {
 			YwtException ae = (YwtException)e;
 			return YwtHttpResponse.fail(ae.getErrCode(), ae.getErrMsg(), ae.getErrDetail());
 		}
-		return YwtHttpResponse.fail(AnyTxnCommonRespCode.UNKONWN_ERR.getCode(),AnyTxnCommonRespCode.UNKONWN_ERR.getMsg(),e.toString());
+		return YwtHttpResponse.fail(YwtCommonRespCode.UNKONWN_ERR.getCode(), YwtCommonRespCode.UNKONWN_ERR.getMsg(),e.toString());
 	}
 
 	/**

+ 4 - 4
src/main/java/com/ywt/biz/common/web/YwtHttpResponse.java

@@ -3,7 +3,7 @@
  */
 package com.ywt.biz.common.web;
 
-import com.ywt.biz.common.constant.AnyTxnCommonRespCode;
+import com.ywt.biz.common.constant.YwtCommonRespCode;
 import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
@@ -102,12 +102,12 @@ public class YwtHttpResponse<T> {
     }
 
     private YwtHttpResponse() {
-        this(AnyTxnCommonRespCode.REQ_SUCCESS, null);
+        this(YwtCommonRespCode.REQ_SUCCESS, null);
     }
     private YwtHttpResponse(T data) {
-        this(AnyTxnCommonRespCode.REQ_SUCCESS, data);
+        this(YwtCommonRespCode.REQ_SUCCESS, data);
     }
-    private YwtHttpResponse(AnyTxnCommonRespCode rc, T data) {
+    private YwtHttpResponse(YwtCommonRespCode rc, T data) {
         this.code = rc.getCode();
         this.message = rc.getMsg();
         this.data = data;