带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(9)

简介: 带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(9)

带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(8)https://developer.aliyun.com/article/1339670?groupCode=taobaotech


image.pngAcquireThrottlerHandler

 

/**
* 请求令牌处理类
*/
public class AcquireThrottlerHandler implements MessageThrottlerHandler {
private static final Logger apiThrottlerLog = LoggerFactory.getLogger("api.throttler.log"); @Autowired
private ThrottlerProxy throttlerProxy;
@Autowired
private ThrottlerModeConfiguration throttlerModeConfiguration;
private boolean throttle(AcquireToken acquireToken) {
// 获取限流模式
ThrottlerMode throttlerMode = throttlerModeConfiguration.getThrottlerMode(acquireToken.getAp- pKey(), acquireToken.getThrottleTag());
// 执行限流
return !throttlerProxy.tryAcquireWithAppKey(throttlerMode, acquireToken.getAppKey(), acquireTo- ken.getPermits());
}
@Override
  public boolean throttle(MessageThrottlerToken messageThrottlerToken, MessageThrottlerHandler- Context context) {
  boolean throttled = throttle(new AcquireToken(messageThrottlerToken.getThrottleTag(), message- ThrottlerToken.getAppKey(), messageThrottlerToken.getPermits()));
// 限流日志埋点
if (SendSwitch.THROTTLER_ONLY_WATCH || throttled) {
  log(messageThrottlerToken.getAppKey(), messageThrottlerToken.getPermits(), messageThrot- tlerToken.getThrottleTag(), throttled);
  }
  return throttled;
  }
@Override
  public boolean anyThrottle(List<MessageThrottlerToken> messageThrottlerTokens, MessageThrot- tlerHandlerContext context) {
  return throttle(messageThrottlerTokens, acquireTokens -> acquireTokens.stream().anyMatch (this::throttle)
  );
  }
@Override
  public boolean allThrottle(List<MessageThrottlerToken> messageThrottlerTokens, MessageThrot- tlerHandlerContext messageThrottlerHandlerContext) {
  return throttle(messageThrottlerTokens, acquireTokens -> acquireTokens.stream().allMatch (this::throttle)
  );
  }
  private static boolean throttle(List<MessageThrottlerToken> messageThrottlerTokens, Func- tion<List<AcquireToken>, Boolean> function) {
if (CollectionUtils.isEmpty(messageThrottlerTokens)) {
return false;
  }
List<AcquireToken> acquireTokens = messageThrottlerTokens.stream()
  .collect(Collectors.groupingBy(messageThrottlerToken ->  messageThrottlerToken.getAppKey ()))
.entrySet()
.stream()
.map(messageEntry -> {
String appKey = messageEntry.getKey();
int permits = messageEntry.getValue().stream()
.map(messageThrottlerToken -> messageThrottlerToken.getPermits())
.reduce(Integer::sum).orElse(1);
String throttlerTag = messageEntry.getValue().get(0).getThrottleTag();
return new AcquireToken(throttlerTag, appKey, permits);
}).collect(Collectors.toList()); 
  boolean throttled = function.apply(acquireTokens); 
// 限流日志埋点
if (SendSwitch.THROTTLER_ONLY_WATCH || throttled) {
messageThrottlerTokens.forEach(messageThrottlerToken -> {
  log(messageThrottlerToken.getAppKey(), messageThrottlerToken.getPermits(), messageTh- rottlerToken.getThrottleTag(), throttled);
  });
  }
  return throttled;
  }
private static void log(String appKey, int permits, String throttlerTag, boolean throtted) {
List<String> metrics = new ArrayList<>();
metrics.add(appKey);
metrics.add(String.valueOf(permits));
metrics.add(throttlerTag);
metrics.add(String.valueOf(throtted));
String logContent = StringUtils.join(metrics, "|");
apiThrottlerLog.info(logContent);

 

82

 

}

83

 

 

84

 

@Data

85

 

@AllArgsConstructor

86

 

private static class AcquireToken {

87

 

private final String throttleTag;

88

 

private final String appKey;

89

 

private final int permits;

90

 

}

91

}

 

 

 

带你读《2022技术人的百宝黑皮书》——一个搞定责任链的注解(10)https://developer.aliyun.com/article/1339668?groupCode=taobaotech

 

相关文章
|
算法 测试技术 编译器
掌握CTest:CTest综合指南
掌握CTest:CTest综合指南
1454 1
|
存储 算法 定位技术
软考中级软件设计师专项-操作系统篇
专为软考打造的操作系统终极攻略,涵盖进程管理、死锁、存储系统等核心考点,结合20+真题与答题模板,助你高效掌握命题规律,提升应试能力。
718 1
软考中级软件设计师专项-操作系统篇
|
人工智能 供应链 算法
AI 产业服务平台:打造产业智能化的“加速器”与“连接器”
AI产业服务平台整合技术、数据、算力与人才,为中小企业提供低门槛、一站式AI赋能服务,覆盖研发、生产、营销、管理全链条,助力产业智能化转型。
427 0
|
监控 Go 开发者
深入解析 go 语言中的 select 语句
在 Go 语言中,`select` 是专为并发编程设计的控制结构,用于在多个 channel 操作间进行非阻塞选择。它类似于 `switch`,但所有 case 分支必须是 channel 的 I/O 操作。本文通过通俗易懂的语言和丰富代码示例,详细讲解 `select` 的各种用法,包括基本语法、空 `select`、多分支选择、`default` 分支、特点总结及最佳实践,适合初学者和有经验的开发者学习参考。掌握 `select`,能有效提升 Go 并发编程的灵活性与效率。
459 6
|
传感器 算法 定位技术
走错路就尴尬了?AR导航才是“出门不慌”王炸神器!
走错路就尴尬了?AR导航才是“出门不慌”王炸神器!
625 0
|
Linux Windows
硬盘误删文件还能救?专业数据恢复工具大全
电脑里的硬盘或是移动硬盘都承载着我们日常生活和工作中的重要数据,比如珍贵的照片、关键的工作文件。一旦这种重要资料丢失了,会令人非常焦虑。好消息是,大多数情况下,即便硬盘上的文件被意外删除、分区被格式化,甚至硬盘出现逻辑故障(比如硬盘打不开提示格式化),专业的数据恢复工具仍然能够帮助我们找回丢失的数据。本文会详细介绍一些常见且功能强大的硬盘数据恢复工具,帮助大家选择最适合的解决方案。
|
数据采集 供应链 搜索推荐
商业案例 I AllData数据中台商业版落地实践
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
存储 自然语言处理 搜索推荐
从零开始掌握全文本搜索:快速查找信息的最佳实践
全文本搜索技术(Full-text search)通过关键词或短语快速准确查找文档,其核心在于对文本数据的全面检索和索引。主要步骤包括分词处理、建立倒排索引、关键词匹配和结果排序。常见工具如Lucene、Solr和Elasticsearch提供了强大的搜索功能和高扩展性,适用于大数据和复杂数据分析,广泛应用于搜索引擎、日志分析等领域。
654 0
|
领域建模 uml Android开发
|
机器学习/深度学习 算法 Java
【数据结构查找算法篇】----二分查找【实战项目】
【数据结构查找算法篇】----二分查找【实战项目】
492 1

热门文章

最新文章