使用配置文件实现自动降级的开关配置

应用层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();}
  }));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值