實例:接口並發限流RateLimiter


需求:接口每秒最多只能相應1個請求

 

1.創建 全局類對象

import com.google.common.util.concurrent.RateLimiter;
import org.springframework.stereotype.Service;

/**
 * @Auther: 011336
 * @Date: 2019/4/29 17:31
 */
@Service
public class AccessLimitService {
    /**
     * 每秒只發出1個令牌
     */
    RateLimiter rateLimiter = RateLimiter.create(1.0);

    /**
     * 獲取等待時間 方法阻塞
     * 每次等待一個獲取一個令牌
     * @return
     */
    public double acquire(){
        double waitTime = rateLimiter.acquire(1);
        return waitTime;
    }
}

2.測試實例  模擬10個並發請求

@Controller
@RequestMapping("/SegmentRecommend")
public class NearestAirportController {

    private Logger logger = Logger.getLogger(NearestAirportController.class);

    @Autowired
    private NearestAirportService nearestAirportService;

    @Autowired
    private AccessLimitService accessLimitService;

    /**
   * 此方法是我們對外提供的接口,通過調用acquire()方法獲取令牌,獲取失時會阻塞直到獲取令牌成功才繼續執行
   */
public ModelAndView getNearestAirport(HttpServletRequest request, HttpServletResponse response)throws Exception { logger.info("NearestAirportController.getNearestAirport begin"); System.out.println(" |||||||||||||waitTime:" + accessLimitService.acquire()); RemoteAirportsData data = nearestAirportService.getNearestAirports(); logger.info("NearestAirportController.getNearestAirport end"); return null; } @RequestMapping(value ="/GetNearestAirport" ,produces = "application/json;charset=UTF-8") public ModelAndView ttttt (HttpServletRequest request, HttpServletResponse response) throws Exception{ logger.info("============================================================================="); ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
    //開啟10個線程模擬10個並發請求
for(int i=0;i<10;i++) { fixedThreadPool.submit(new Runnable() { @Override public void run() { try { getNearestAirport(request,response); } catch (Exception e) { e.printStackTrace(); } } }); } fixedThreadPool.shutdown(); fixedThreadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); logger.info("================================================================================"); return null; } }

3. 執行結果:getNearestAirpor()方法每秒只執行了一次

總結:關鍵是要讓  rateLimiter  變量成為線程共享變量,每個請求執行前都要來到 rateLimiter 中獲取令牌。成功擇執行,失敗則阻塞 直到拿到令牌才繼續執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM