带你读《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

 

相关文章
|
Java 测试技术 应用服务中间件
常见 Java 代码缺陷及规避方式(下)
常见 Java 代码缺陷及规避方式(下)
289 0
|
消息中间件 存储 负载均衡
深入了解Kafka中Topic的神奇之处
深入了解Kafka中Topic的神奇之处
798 0
|
缓存 NoSQL Java
Java工具篇之Guava-cache内存缓存
常在业务系统中做开发,不会点高级知识点,有点不好意思了。在业务系统中,提高系统响应速度,提供系统高并发能力,其实方向很简单,三个方向,六个字而已: **缓存降级限流。** 当然这是在排除代码质量非常差的情况,如果代码质量很差,都是while循环和高内存占用,那么其实再怎么做都于事无补。除非你有一个马云爸爸,性能不够,机器来凑嘛。阿里云前来支持(1000台机器够了吗?)
1574 0
|
6月前
|
设计模式 算法 前端开发
【设计模式】【行为型模式】职责链模式(Chain of Responsibility)
一、入门 什么是职责链模式? 职责链模式是一种行为设计模式,它允许你将请求沿着一条链传递,直到有对象处理它为止。每个对象都有机会处理请求,或者将其传递给链中的下一个对象。 为什么需要职责链模式? 使用
257 16
|
8月前
|
设计模式 XML 算法
策略模式(Strategy Pattern)深度解析教程
策略模式属于行为型设计模式,通过定义算法族并将其封装为独立的策略类,使得算法可以动态切换且与使用它的客户端解耦。该模式通过组合替代继承,符合开闭原则(对扩展开放,对修改关闭)。
|
存储 索引 Python
元组(Tuple)在Python编程中的应用与实例
元组(Tuple)在Python编程中的应用与实例
657 2
|
存储 传感器 数据采集
大数据
大数据是指数据量庞大(Volume)、增长迅速(Velocity)、类型多样(Variety)、价值密度低(Value)但潜力巨大的数据集。其来源包括互联网、物联网及企业内部数据。处理技术涵盖采集、预处理、存储、分析与可视化。应用领域涉及商业智能、金融、医疗、交通及公共服务等,助力决策优化与创新。
871 8
|
存储 缓存 监控
性能利器Caffeine缓存全面指南
通过以上指南,您应该能够有效利用Caffeine缓存来优化您的Java应用程序。Caffeine的强大功能和灵活性,使它成为提升应用性能的理想选择。
819 4
|
缓存 Java Spring
Guava缓存工具类封装和使用
Guava缓存工具类封装和使用
394 0
|
监控 安全 Java
常见 Java 代码缺陷及规避方式(中)
常见 Java 代码缺陷及规避方式(中)
270 1