面试官:注解式限流是如何实现的?,2024年最新牧原集团网上面试问什么

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

在用 nginx 限流时,是将 nginx 作为代理层拦截请求处理,那么在 Spring 中代理层就是 AOP 啦。

AOP

在 web 服务器中,有很多场景都是可以靠 AOP 实现的,比如:

  1. 打印日志,记录时间类,方法,参数。

  2. 利用反射设置分页 PageRow、PageNum 的默认值。

  3. 游戏场景,判断游戏是否已经结束,不用每个方法都去判断。

  4. 解密,验签等等。

定时任务

在计数器算法中我们提到,每隔 100ms 需要记录接口调用的次数,并保存。这时候定时任务就派上用场了。

定时任务的实现有很多,像利用线程池的 ScheduledExecutorService,当然 Spring 的 Scheduled 也莫得问题。

其次,用什么数据结构保存调用次数 --> LinkedList。

另外,我们需要对多个方法限流,该如何解决呢?–> 每个方法都有唯一对应的值: package + class + methodName,于是我们将这个唯一值作为key,linkedList 作为 map,下方代码:

1 /** 每个key 对应的调用次数**/

2 private Map<String, Long> countMap = new ConcurrentHashMap<>();

3

4 /** 每个key 对应的linkedlist**/

5 private static Map<String, LinkedList> calListMap = new ConcurrentHashMap<>();

6

7 ## 每s一次查询

8 @Scheduled(cron = “*/1 * * * * ?”)

9 private void timeGet(){

10 countMap.forEach((k,v)->{

11 LinkedList calList = calListMap.get(k);

12 if(calList == null){

13 calList = new LinkedList<>();

14 }

15 # 每个方法的调用次数放入linkedList中

16 calList.addLast(v);

17 calListMap.put(k, calList);

18

19 if (calList.size() > 10) {

20 calList.removeFirst();

21 }

22 });

23 }

AOP 检查

定义注解:

1import java.lang.annotation.*;

2

3

4@Target(ElementType.METHOD)

5@Retention(RetentionPolicy.RUNTIME)

6@Documented

7public @interface CalLimitAnno {

8

9 String value() default “” ;

10

11 String methodName() default “” ;

12

13 long count() default 100;

14}

调用接口前检查:

1@Around(value = “@annotation(around)”)

2 public Object initBean(ProceedingJoinPoint point, CalLimitAnno around) throws Throwable {

3 /** 获取类名和方法名 **/

4 MethodSignature signature = (MethodSignature) point.getSignature();

5 Method method = signature.getMethod();

6 String[] classNameArray = method.getDeclaringClass().getName().split(“\.”);

7 String methodName = classNameArray[classNameArray.length - 1] + “.” + method.getName();

8 String classZ = signature.getDeclaringTypeName();

9 String countMapKey = classZ + “|” + methodName;

10

11

12 LinkedList calList = calListMap.get(countMapKey);

13 if(calList != null){

14 /** 调用次数判断是否已经超过注解设置的值 **/

15 if ((calList.peekLast() - calList.peekFirst()) > Long.valueOf(around.count())) {

16 throw new RuntimeException(“被限流了”);

17 }

18 /** 存放**/

19 countMap.putIfAbsent(countMapKey,0L);

20 countMap.put(countMapKey,countMap.get(countMapKey) + 1);

21 }

22 Object object = point.proceed();

23 return object;

24 }

方法考虑到定时任务的频率不能太小,因此我们的定时任务是每秒钟执行一次,这里我们需要设置 10s 钟的限流值,导致粒度变大了。

1@CalLimitAnno(count = 1000)

2 public void testPageAnno(){

3 System.out.println(“成功执行”);

4 }

Map 优化

上述我们将 package + className + methodName 作为唯一 key,导致 key 的长度变得特别长,我们是不是该想个办法降低 key 的长度。

大家有没有想到平时收到的短信,有时候会存在一个短链接,这些短连接其实就是用的发号器 --> 从某个服务中获取唯一的自增id,然后将这个 id 进行转化。比如这时候自增到 100000 了,那么将 100000 从十进制转化为 62 进制 q0U。这个和短信上的链接很相似不是吗?

Java核心架构进阶知识点

面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Java核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、Spring相关、分布式、微服务、RPC、网络、设计模式、MQ、Redis、MySQL、设计模式、负载均衡、算法、数据结构、kafka、ZK、集群等。而这些也全被整理浓缩到了一份pdf——《Java核心架构进阶知识点整理》,全部都是精华中的精华,本着共赢的心态,好东西自然也是要分享的

image

image

image

内容颇多,篇幅却有限,这就不在过多的介绍了,大家可根据以上截图自行脑补

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
根据以上截图自行脑补

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-dz9a7NsQ-1713561013096)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值