java如何实现单机接口限流

  介绍

这篇文章主要为大家展示了“java如何实现单机接口限流”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java如何实现单机接口限流”这篇文章吧。

简单说就是设定某个接口一定时间只接受固定次数的请求,比如/添加接口1秒最多接收100次请求,多的直接拒绝,这个问题很常见,场景也好理解,直接上代码:

/* *   ,*单机限流   ,*/@Slf4j   public  class  FlowLimit  {      ,//接口限流上限值和限流时间缓存   ,,,private  static  Cache<字符串,AtomicLong>, localCache =, CacheBuilder.newBuilder () .maximumSize (100)   ,,,,,,,,,,,.expireAfterWrite(1000年,TimeUnit.MILLISECONDS) .build ();      ,//每个接口的上限缓存   ,,,private  static  Map<字符串,Long>, maxFlowLimitMap =, new  ConcurrentHashMap<在();      ,,,private  static  final  FlowLimit  instance =, new  FlowLimit ();      ,//这块的目的是初始化每个接口的上限,下面的变量:apiFlowLimitConfigure    ,//实际使用的时候应该是从db或者其他地方获取设置的每个接口的限流上限值,   ,//这样可以动态的调整接口上限,比如直接修改数据库,不用发布,就可以调整接口限流值   ,,,static  {   ,,,,,,,new  ScheduledThreadPoolExecutor (1, runnable →, {   ,,,,,,,,,,,Thread  Thread =, new 线程(可运行,“api-flowLimit-configure");//,,,,,,,,,,,,thread.setDaemon(真正的);   ,,,,,,,,,,,return 螺纹;   ,,,,,,,}).scheduleAtFixedRate ((),→, {   ,,,,,,,,,,,try  {   ,,,,,,,,,,,,,,,String  apiFlowLimitConfigure =,“{\“doAdd \“: 100},,,,//表示/doAdd接口1秒接受100次请求   ,,,,,,,,,,,,,,,Map  mapObj =, JSONObject.parseObject (Map.class apiFlowLimitConfigure也);   ,,,,,,,,,,,,,,,如果(mapObj  !=, null) {   ,,,,,,,,,,,,,,,,,,,mapObj.forEach((键,值),→,{   ,,,,,,,,,,,,,,,,,,,,,,,如果(value  !=, null) {   ,,,,,,,,,,,,,,,,,,,,,,,,,,,instance.setMaxFlowLimit (key.toString (),, new 长(value.toString ()));   ,,,,,,,,,,,,,,,,,,,,,,,其他}{   ,,,,,,,,,,,,,,,,,,,,,,,,,,,log.warn(时间+ key “,安康;设置接口限流发现限流值为空,设置默认值“);   ,,,,,,,,,,,,,,,,,,,,,,,,,,,instance.setMaxFlowLimit (key.toString (),, 100 l);   ,,,,,,,,,,,,,,,,,,,,,,,}   ,,,,,,,,,,,,,,,,,,,});   ,,,,,,,,,,,,,,,}   ,,,,,,,,,,,},catch  (Exception  e), {   ,,,,,,,,,,,,,,,log.error(“设置接口限流出现异常{},,,e);   ,,,,,,,,,,,}   ,,,,,,,},,0,,3,,TimeUnit.SECONDS);   ,,,}      ,,,public  static  FlowLimit  getInstance (), {   ,,,,,,,return 实例;   ,,,}      ,,,private  FlowLimit  setMaxFlowLimit (String 关键,Long  maxFlowLimit), {   ,,,,,,,maxFlowLimitMap.put(钥匙,,maxFlowLimit);   ,,,,,,,return ;   ,,,}      ,,,public  Boolean  isAvailable (String 键),{   ,,,,,,,return  checkAvailable(关键,,1升);   ,,,}      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

java如何实现单机接口限流