GuavaのRateLimiterはインタフェースの制限流を実現する

1769 ワード

最近の開発ニーズではバックグラウンドインタフェースを限流処理する必要があり,基本的な使い方を整理した.
まずguava依存性を追加します.
    
      com.google.guava
      guava
      23.0
    

その後、パッケージRateLimiterはマルチインタフェースの制限を適用します.
import com.google.common.util.concurrent.RateLimiter;
import org.springframework.util.StringUtils;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

public class RateLimiterFactory {

    private static ConcurrentHashMap limiterMap = new ConcurrentHashMap<>(); //        private static double permitsPerSecond = 1000; //       private static long timeout = 4L; /** *@param apiId      id *@description      */ public static boolean tryAcquire(String apiId) { //    apiId     true if (StringUtils.isEmpty(apiId)) { return true; } limiterMap.putIfAbsent(apiId, RateLimiter.create(permitsPerSecond)); return limiterMap.get(apiId).tryAcquire(timeout, TimeUnit.SECONDS); } }

RateLimiterFactoryを使用して、インタフェースの制限を実現します.
@Controller
public class TestController {

    ...

    @RequestMapping("/test")
    @ResponseBody
    public String test(){
        if(!RateLimiterFactory.tryAcquire(ApiInfo.TEST)) {
            return "       !"; } ... } }

以上がRateLimiterがインタフェースのストリーム制限を実現する一般的な使用であり、最初のメッセージはmarkである.