java速学教程(入门到精通)
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
比如你希望自己的应用程序 qps不要超过1000,那么ratelimiter设置1000的速率后,就会每秒往桶里 扔1000个令牌,ratelimiter经常用于限制对一些物理资源或者逻辑资源的访 问速率。
对于单机版的限流,可以使用Google 开源的 Guava项目,这个项目提供了Google在Java项目中使用一些核心库,包含集合(Collections),缓存(Caching),并发编程库(Concurrency),常用注解(Common annotations),String操作,I/O操作方面的众多非常实用的函数。
这个项目也包含了限流的功能,其原理是根据令牌桶算法来实现。
提供了两种限流策略:
● 平滑突发限流(SmoothBursty)
● 平滑预热限流(SmoothWarmingUp)实现。
依赖:
<dependency> <groupid>com.google.guava</groupid> <artifactid>guava</artifactid> <version>29.0-jre</version></dependency>
方法描述:
场景一:
当我们希望某一个接口每秒的访问量不超过10次
package org.xhs.test; import org.apache.curator.shaded.com.google.common.util.concurrent.RateLimiter; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.*; /** * @Author: hu.chen * @Description: **/ public class Test { /** * 存储接口名和令牌生成器的对应关系 */ private static Map<string> interfaces = new ConcurrentHashMap(); /** * 线程池 */ private static ExecutorService threadPool = new ThreadPoolExecutor(10,15,3,TimeUnit.SECONDS,new ArrayBlockingQueue(100)); public static void main(String[] args) throws InterruptedException { List<userrequest> tasks = new ArrayList<userrequest>(); // 准备工作,先初始化 10个线程(用户),这10个用户同时访问一个接口 for (int i = 1; i { System.err.println("接口:"+request.getInterfaceName()+" 访问还未达到上限,"+request.getUserName()+"可以访问"); }); }else { // 已经等待了10秒还获取不到令牌,进行其他业务处理 System.err.println("当前时间访问失败,"+request.getUserName()+"无法获取令牌"); } } } private static class UserRequest { /** * 请求用户ip */ private String ip; /** * 用户名 */ private String userName; /** * 请求的接口名 */ private String interfaceName; public UserRequest(String ip, String userName, String interfaceName) { this.ip = ip; this.userName = userName; this.interfaceName = interfaceName; } public String getIp() {return ip;} public String getUserName() { return userName;} public String getInterfaceName() {return interfaceName;} } }</userrequest></userrequest></string>
场景二:
当我们希望某一个用户或者ip,每秒的访问量不超过10
package org.xhs.test; import org.apache.curator.shaded.com.google.common.util.concurrent.RateLimiter; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.*; /** * @Author: hu.chen * @Description: **/ public class Test { /** * 存储用户名和令牌生成器的对应关系 */ private static Map<string> interfaces = new ConcurrentHashMap(); /** * 线程池 */ private static ExecutorService threadPool = new ThreadPoolExecutor(10,15,3,TimeUnit.SECONDS,new ArrayBlockingQueue(100)); public static void main(String[] args) throws InterruptedException { List<userrequest> tasks = new ArrayList<userrequest>(); // 准备工作,先初始化 10个线程(用户),这10个用户同时访问一个接口 for (int i = 1; i { System.err.println("用户:"+request.getUserName()+" 当前时间访问次数还未达到上限,可以访问"); }); }else { // 已经等待了10秒还获取不到令牌,进行其他业务处理 System.err.println("当前时间访问失败,"+request.getUserName()+"无法获取令牌"); } } } private static class UserRequest { /** * 请求用户ip */ private String ip; /** * 用户名 */ private String userName; /** * 请求的接口名 */ private String interfaceName; public UserRequest(String ip, String userName, String interfaceName) { this.ip = ip; this.userName = userName; this.interfaceName = interfaceName; } public String getIp() {return ip;} public String getUserName() { return userName;} public String getInterfaceName() {return interfaceName;} } }</userrequest></userrequest></string>
Java免费学习笔记:立即学习
解锁 Java 大师之旅:从入门到精通的终极指南
已抢7199个
抢已抢94818个
抢已抢14816个
抢已抢52063个
抢已抢194624个
抢已抢87259个
抢