`
tuhaitao
  • 浏览: 378727 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

接口调用频率限制代码

    博客分类:
  • java
阅读更多

有很多时候我们写的代码不是你想跑多快就能跑多快的, 因为一些陈旧的核心系统支撑不了,在此万般无奈的情况下,

 

调用老系统的接口,服务 就需要运维给一个可以接受的范围参考, 情景大概是这样,现实还是很难接受,明明写好的代码

 

还用了一些自己优化技术来使代码运行的更快, 现实都是残酷的,不那么完美的, 与其被弓虽女干,不如好好享受一番。

 

 

分享一下基于ThreadLocal限制调用频率的代码:

 

其中引入了commons-lang里的StopWatch计时器

 

 

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.opencfg.core.limit;

import org.apache.commons.lang.time.StopWatch;

/**
 * <p>
 * Frequence Utils
 * <p>
 * 
 * <p>#ThreadSafe#</p>
 * 
 * @author Opencfg Software Foundation
 * @since 0.0.1-SNAPSHOT
 * @version $Id: FrequenceUtils.java 2011-06-11 23:58:53 reymondtu $
 */
public final class FrequenceUtils {

	/**
	 * <p>
	 * Limit call count in split time
	 * </p>
	 * 
	 * @param limitSplitTime
	 * @param limitCount
	 * @throws InterruptedException
	 */
	public static void limit(final long limitSplitTime, final int limitCount) throws InterruptedException {
		FrequenceUnit funit = threadLocal.get();
		funit.limitSplitTime = limitSplitTime;
		funit.limitCount = limitCount;
		funit.watch.split();
		long diffTime = funit.limitSplitTime - funit.watch.getSplitTime();
		if (diffTime >= 0) {
			if (funit.realCount >= funit.limitCount) {
				funit.watch.suspend();
				Thread.sleep(diffTime);
				funit.watch.resume();
				funit.realCount = 0;
			}
		}
		funit.realCount++;
	}
	
	/**
	 * FrequenceUnit
	 */
	private static class FrequenceUnit {		
		FrequenceUnit() {
			this.watch = new StopWatch();
		}
		long limitSplitTime;
		int limitCount;
		StopWatch watch;		
		int realCount = 0;
	}

	private static ThreadLocal<FrequenceUnit> threadLocal = new ThreadLocal<FrequenceUnit>(){
        protected synchronized FrequenceUnit initialValue() {
        	FrequenceUnit funit = new FrequenceUnit();
        	funit.watch.start();
            return funit;
        }
    };

}

 

 

下边是测试用例:

 

 

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.opencfg.core.limit;

import static org.junit.Assert.assertTrue;

import org.junit.Test;

/**
 * <p>
 * Frequence Utils Test
 * <p>
 * 
 * <p>JUnit4 Test</p>
 * 
 * @author Opencfg Software Foundation
 * @since 0.0.1-SNAPSHOT
 * @version $Id: FrequenceUtilsTest.java 2011-06-12 01:36:53 reymondtu $
 */
public class FrequenceUtilsTest {

	@Test
	public void testLimit() throws InterruptedException {
		FrequenceTestClass ftc = new FrequenceTestClass(1000, 10);
		for(int i = 0; i < 100; i++) {
			ftc.method(i);
		}
		assertTrue(true);
	}
	
	@Test
	public void testLimitMutiThreads() throws InterruptedException {
		Thread t1 = new Thread(new FrequenceTestClass(1000, 10));
		t1.start();
		
		Thread t2 = new Thread(new FrequenceTestClass(1000, 20));
		t2.start();

		Thread.sleep(10000);
	}

	class FrequenceTestClass implements Runnable {
		final long limitTime;
		final int limitCount;
		FrequenceTestClass(final long limitTime, final int limitCount) {
			this.limitTime = limitTime;
			this.limitCount = limitCount;
		}
		public void method(int i) throws InterruptedException {
			FrequenceUtils.limit(limitTime, limitCount);
			System.out.println("tid:" + Thread.currentThread().getId() + ", i=" + i);
		}

		@Override
		public void run() {
			for(int i = 0; i < 100; i++) {
				try {
					method(i);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}
分享到:
评论

相关推荐

    SpringBoot 接口访问频率限制(一)

    在IT行业中,尤其是在Web开发领域,接口访问频率限制是一个至关重要的议题。这涉及到系统的稳定性和安全性,防止恶意用户通过频繁请求API接口导致服务过载。本文将深入探讨如何在Spring Boot应用中实现接口访问频率...

    API 调用次数限制实现

    在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源,通常来说我们会对于服务器上的各种接口进行调用次数的限制。这是一种常见的限流(Rate Limiting)机制,旨在防止恶意的请求对服务器...

    微信native支付接口调用代码示例+企业微信消息推送接口调用示例

    - 企业微信消息推送接口有频率限制,避免频繁调用导致账号被封禁。 - 企业微信消息的接收者可以是用户、部门或者整个企业,需要根据实际需求设置。 - 调用接口时,务必处理好错误情况,如网络异常、超时、权限...

    SpringBoot 接口访问频率限制(二)

    在SpringBoot应用中,接口访问频率限制是一种常见的安全策略,用于防止恶意用户或自动化脚本对服务进行过度请求,导致服务器资源耗尽。在"SpringBoot 接口访问频率限制(二)"的主题下,我们将深入探讨如何利用Spring ...

    HTML商城接口调用小例子.zip

    限制请求频率,防止DDoS攻击。 综上所述,这个压缩包中的例子将涵盖HTML页面与API接口的交互、接口的管理和发布、以及前后端通信等关键点,对于理解和实现商城系统的功能具有指导意义。开发者可以通过学习和实践这...

    腾讯云SDK调用的QPS限制优化专用网关

    然而,在高并发场景下,调用频率(Query Per Second, QPS)可能会成为性能瓶颈,导致请求被限制或延迟。为了解决这一问题,腾讯云提供了QPS限制优化的专用网关,旨在提高服务的稳定性和效率。 QPS限制优化专用网关...

    钉钉消息接口调用源码

    此外,为了保证安全性,需要定期更新和管理Access Token,以及遵循钉钉的API调用频率限制。 综上所述,【钉钉消息接口调用源码】项目展示了如何结合Delphi、`xSuperObject`和`openssl`库来实现与钉钉API的高效、...

    APISpace 身份证OCR API接口 PHP调用示例代码

    在IT行业中,API(应用程序编程接口)扮演着重要的角色,它允许不同的软件系统之间进行通信。身份证OCR API接口是其中一个常见的API类型,主要用于自动识别...同时,遵循API的使用规则和频率限制,以避免不必要的问题。

    APISpace 车辆违章查询 API接口 PHP调用示例代码

    在本文中,我们将深入探讨如何使用PHP调用APISpace提供的车辆违章查询API接口。...记得在实际开发中,不仅要关注代码实现,还要注意API的使用权限、调用频率限制以及错误处理,以确保服务的稳定性和用户体验。

    APISpace 驾驶证OCR API接口 PHP调用示例代码

    5. **请求限制**:API通常有调用频率限制,超出限制可能会导致请求被拒绝,需关注API文档中的相关规定。 综上所述,通过APISpace的驾驶证OCR API接口,开发者可以轻松集成驾驶证信息的自动化识别功能,提高业务流程...

    APISpace 运营商二要素 API接口 PHP调用示例代码

    同时,API调用的频率和次数也可能受到限制,需要合理管理以防止被封禁或超出配额。 总的来说,APISpace的运营商二要素API接口为PHP开发者提供了一种简便的方式来验证用户手机号码的运营商信息,从而提升应用的安全...

    百度翻译接口调用实例

    此外,根据百度翻译API的使用政策,要注意调用频率限制,防止因过度使用导致的账号被封禁。 在实际开发中,还可以结合其他技术,如GUI界面设计,让用户可以直接在应用中输入待翻译的文本,或者实现批量翻译文件的...

    APISpace 手机号码归属地 API接口 PHP调用示例代码

    本文将详细讲解如何使用APISpace提供的手机号码归属地API接口,并展示PHP调用示例代码。 APISpace是一个综合性的API社区平台,它提供多种API服务,包括但不限于查询手机号码归属地的功能。平台会根据API的表现,如...

    完整的新浪API接口调用API工程文件

    2. **API调用限制**:新浪对API的调用频率有规定,过度频繁的请求可能会导致IP被封禁。合理规划调用策略,避免短时间内大量请求。 3. **权限管理**:根据应用需求申请合适的权限。例如,发布状态可能需要“写入”...

    短信平台接口代码

    同时,接口调用应限制频率,防止恶意攻击。 8. **日志记录**:为了便于调试和问题追踪,开发者通常会记录每次接口调用的详细信息,包括请求参数、响应数据以及可能出现的错误信息。 9. **测试环境与生产环境**:...

    APISpace 银行卡二要素标准版 API接口 PHP调用示例代码

    本文将详细解析"APISpace 银行卡二要素标准版 API接口 PHP调用示例代码",并介绍相关知识点。 首先,APISpace是一个综合性的API服务平台,它提供了一个中立的环境,让开发者可以查找、测试和使用各种API。这个平台...

    APISpace 银行卡OCR API接口 PHP调用示例代码

    此外,确保遵循API的调用频率限制,避免因频繁请求导致账户被锁定。 总之,通过APISpace的银行卡OCR API,我们可以利用PHP轻松地自动化处理银行卡信息的识别任务。只需正确配置和调用API,就可以集成到自己的系统中...

    简单的调用百度api翻译工具js代码

    8. **安全性** - API密钥的管理和安全存储,防止泄露,同时要遵循API的使用条款,避免超出调用频率限制。 9. **前端架构** - 尽管项目可能较小,但依然可以学习到模块化、组织代码的技巧,比如使用立即执行函数...

    二次开发使用 WEB32网页调用接口说明.zip_aloudv4k_二次开发使用 WEB32网页调用接口说明

    8. **API调用限制**:如果存在,会说明接口调用的频率限制,防止滥用。 对于"aloudv4k"这个标签,可能是某种特定的声音输出技术或硬件设备的标识。在二次开发中,可能涉及到声音播放、录音、音效处理等功能的实现,...

    新浪、网易、腾讯实时tick接口_python股票_股票接口_新浪股票_tick股票_股票接口_源码.zip

    例如,调用新浪的股票接口可能需要指定股票代码(如'600000'代表浦发银行)和接口URL,然后解析返回的数据获取实时价格、成交量等信息。 在Python中,我们可以创建一个函数,传入股票代码和接口地址,然后发送HTTP...

Global site tag (gtag.js) - Google Analytics