介绍
这篇文章主要为大家展示了“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 nulljava如何实现单机接口限流