应用层API封装
USER{
"用户信息",
“user.not.call.backend”,//是否调用后端服务
“user.call.backend.rate.limit”,//调用后端服务的限流
“user.redis.expire.seconds”,//redis缓存过期时间
}
其中涉及几个配置
1.user.not.call.backend
是否回源到调用后端用户服务,如果不开启,那么访问缓存,不会将流量打入后端
2.user.call.backend.rate.limit
调用后端服务的限流,比如配置100,既一秒只有100个请求会打到后端服务,剩余请求如果缓存没有命中时候,直接报错
3.user.redis.expire.seconds
后端返回的用户数据在缓存中缓存多久,通过封装后,可以直接使用
API实现从配置文件获取相关配置,如果没有,则返回一个默认值
public boolean notCall(){
return DynamicConfigurer.getBoolean(callKey,false);
}
使用配置文件实现开关配置
static{
try{
filename = "application.properties";
resource = new ClassPathResource(filename);
//监听filename所在目录下的文件修改,删除事件
watchService = FileSystems.getDefault().newWatchServices();
Paths.get(resource.getFile().getParent())
.register(watchService,StandardWatchEventKinds.ENTRY_MODIFY,
StandardWatchEventKinds.ENTRY_DELETE);
properties = PropertiesLoaderUtils.loadProperties(resource);
}catch(IOException e){
e.printStackTrack();
}
//启用一个线程监听内容变化,并重新你载入配置
Thread watchThread = new Thread(()->{
while(true){
try{
WatchKey watchKey = watchService.take();
for(WatchEvent<?> event:watchKey.pollEvents()){
if(Objects.equal(event.context().toString(),filename)){
properties = PropertiesLoaderUtils.loadProperties(resource);
break;
watchKey.reset();
}
}
}catch(Exception e){e.printStackTrace();}
}
});
watchThread.setDaemon(true);
watchThread.start();
Runtime.getRuntime().addShutdownHook(new Thread(()->{
try{
watchService.close();
}catch(IOException e){e.printStackTrace();}
}));
}