赞
踩
公司产品微服务架构下有十几个模块,几乎大部分模块都要连接redis。每次在客户那里部署应用,都要改十几遍配置,太痛苦了。当然可以用nacos配置中心的功能,配置公共参数。不过我是喜欢在应用级别上解决问题,因为并不是每个项目都会使用nacos,做个知识储备还是不错的。
当前redis 没有数据
这里的初始化和正常把redis配置信息放到application.yml里的初始化是一样的。
package cn.com.soulfox.common.config; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; /** * * @create 2024/4/11 10:48 */ @Configuration @ConditionalOnClass(RedisOperations.class) @EnableConfigurationProperties(RedisProperties.class) @Slf4j public class RedisTemplateConfig { @Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory){ log.info("开始初始化 RedisTemplate ------------------"); RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); // key的序列化类型 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.setConnectionFactory(factory); log.info("初始化 RedisTemplate 结束------------------"); return redisTemplate; } }
package cn.com.soulfox.business.config; import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.io.FileSystemResource; import org.springframework.stereotype.Component; /** * * @create 2024/6/26 16:41 */ @Configuration public class CommonConfig { @Bean("common-config") public static PropertySourcesPlaceholderConfigurer properties() { PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer(); YamlPropertiesFactoryBean redis = new YamlPropertiesFactoryBean(); //文件路径写死的,真正做项目时,文件路径可以配置到application.yml文件 FileSystemResource redisResource = new FileSystemResource("../common-config/sf-redis.yml"); redis.setResources(redisResource); configurer.setPropertiesArray(redis.getObject()); //如果有多个配置文件,也是可以处理的。setPropertiesArray(Properties... propertiesArray)方法的参数是个数组, //如下还可以同时处理文件sf-ports.yml,此时configurer.setPropertiesArray(redis.getObject());代码要注释掉 //YamlPropertiesFactoryBean ports = new YamlPropertiesFactoryBean(); // FileSystemResource portsResource = new FileSystemResource("../common-config/sf-ports.yml"); // ports.setResources(portsResource); //同时添加sf-redis.yml和sf-ports.yml的配置信息 // configurer.setPropertiesArray(redis.getObject(), ports.getObject()); return configurer; } }
注意一下,因为我已经搭建了完整的微服务,包括nacos,mybatis,feign等,所以启动类上注解比较多。如果只是单纯测试一下,引入springboot基础框架和redis依赖,写一个基础启动类就可以了。
package cn.com.soulfox.business; import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.PathResource; import org.springframework.core.io.Resource; import org.springframework.transaction.annotation.EnableTransactionManagement; import tk.mybatis.spring.annotation.MapperScan; import java.io.File; @SpringBootApplication @EnableDiscoveryClient//nacos注册中心 @EnableFeignClients(basePackages = {"cn.com.soulfox.common.feign.client"})//feign扫描 @MapperScan(basePackages={"cn.com.soulfox.*.mvc.mapper"})//mybatis mapper扫描 @EnableTransactionManagement//开启数据库事务 @ComponentScan("cn.com.soulfox") public class BusinessApplicationRun { public static void main(String[] args) { SpringApplication.run(BusinessApplicationRun.class, args); } }
package cn.com.soulfox.common.config; import cn.com.soulfox.business.BusinessApplicationRun; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.test.context.junit4.SpringRunner; /** * * @create 2024/6/26 16:52 */ @RunWith(SpringRunner.class) @SpringBootTest(classes = BusinessApplicationRun.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class CommonConfigTest { @Autowired private RedisTemplate<String, Object> redisTemplate; //文件sf-redis.yml里属性的使用和applications.yml一样 @Value("${spring.redis.host}") private String redisHost; @Test public void test(){ System.out.println("从文件取参数测试+++++++++++"); System.out.println("redisHost: " + redisHost); } }
@Test
public void testRedisSetValue(){
this.redisTemplate.opsForValue().set("test", "test123");
}
测试结果
测试读取数据,增加以下测试方法
@Test
public void testRedisGetValue(){
Object testValue = this.redisTemplate.opsForValue().get("test");
System.out.println(testValue);
}
测试结果
现在的微服务,大多使用nacos作为注册中心,同时nacos也能作为配置中心使用。公共配置一般放在nacos中,以上方法没有什么用处。但总有项目可能不会使用nacos,比如使用eureka,这时候以上方法就有用武之地。这个方法可以作为知识储备,了解一下总是有好处的 :–)
还有一点需要注意的,就是yml文件是在程序启动后解析的,所以文件里的配置信息,在application.yml里是不能通过${xxx.xxx}使用的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。