当前位置: 首页 > news >正文

怎么制作网站开发设计广州海外建站

怎么制作网站开发设计,广州海外建站,房屋装修预算明细表格,做汽车售后的网站百度网盘不限速被限速您可能正在开发某种形式的#xff08;Web / RESTful#xff09;API#xff0c;并且如果它是面向公众的#xff08;甚至是内部的#xff09;#xff0c;则通常需要以某种方式对其进行速率限制。 即#xff0c;限制一段时间内执行的请求数#xff0c… 百度网盘不限速被限速 您可能正在开发某种形式的Web / RESTfulAPI并且如果它是面向公众的甚至是内部的则通常需要以某种方式对其进行速率限制。 即限制一段时间内执行的请求数以节省资源并防止滥用。 这可能可以通过一些聪明的配置在Web服务器/负载均衡器级别上实现但是通常您希望速率限制器是特定于客户端的即API的每个客户端都应具有单独的速率限制以及客户端的方式被确定是不同的。 可能仍然可以在负载均衡器上执行此操作但是我认为将其放在应用程序级别上是有意义的。 我将使用spring-mvc作为示例但是任何Web框架都有插入拦截器的好方法。 所以这是一个spring-mvc拦截器的例子 Component public class RateLimitingInterceptor extends HandlerInterceptorAdapter {private static final Logger logger LoggerFactory.getLogger(RateLimitingInterceptor.class);Value(${rate.limit.enabled})private boolean enabled;Value(${rate.limit.hourly.limit})private int hourlyLimit;private MapString, OptionalSimpleRateLimiter limiters new ConcurrentHashMap();Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {if (!enabled) {return true;}String clientId request.getHeader(Client-Id);// let non-API requests passif (clientId null) {return true;}SimpleRateLimiter rateLimiter getRateLimiter(clientId);boolean allowRequest limiter.tryAcquire();if (!allowRequest) {response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());}response.addHeader(X-RateLimit-Limit, String.valueOf(hourlyLimit));return allowRequest;}private SimpleRateLimiter getRateLimiter(String clientId) {if (limiters.containsKey(clientId)) {return limiters.get(clientId);} else {synchronized(clientId.intern()) {// double-checked locking to avoid multiple-reinitializationsif (limiters.containsKey(clientId)) {return limiters.get(clientId);}SimpleRateLimiter rateLimiter createRateLimiter(clientId);limiters.put(clientId, rateLimiter);return rateLimiter;}}}PreDestroypublic void destroy() {// loop and finalize all limiters} } 这将按需初始化每个客户端的速率限制器。 另外在启动时您可以遍历所有已注册的API客户端并为每个客户端创建一个速率限制器。 如果速率限制器不允许更多请求tryAcquire返回false则取消“ Too many requests”太多请求并中止请求的执行从拦截器返回“ false”。 这听起来很简单。 但是有一些问题。 您可能想知道上面的SimpleRateLimiter在哪里定义。 我们将到达那里但首先让我们看看我们对速率限制器实现有哪些选择。 最受欢迎的似乎是番石榴RateLimiter 。 它具有简单的工厂方法可为您提供指定速率每秒允许的速率限制器。 但是它不能很好地适应Web API因为您无法使用预先存在的许可数量初始化RateLimiter。 这意味着在限制器允许请求之前应经过一段时间。 还有另一个问题–如果您每秒的许可数量少于一个例如如果您希望的速率限制为“每小时200个请求”则可以传递一个分数hourlyLimit / secondsInHour但仍然无法达到您的目的可以预期因为内部有一个“ maxPermits”字段可以将许可证数量的上限限制为比您想要的要少得多。 此外速率限制器不允许突发-您每秒恰好有X个许可但您不能长时间分散它们例如在一秒钟内有5个请求然后在接下来的几秒钟内没有请求。 实际上上述所有问题都可以解决但遗憾的是可以通过您无法访问的隐藏字段来解决。 多年来存在多个功能请求但是Guava不会更新速率限制器从而使其不适用于API速率限制。 使用反射您可以调整参数并使限制器工作。 但是这很丑陋并且不能保证它会按预期工作。 我在这里展示了如何使用每小时X许可爆破性和完整的初始许可来初始化番石榴速率限制器。 当我认为这样做的时候我看到tryAcquire()有一块tryAcquire() synchronized(..)块。 这是否意味着在仅检查是否允许发出请求时所有请求都会彼此等待 那太可怕了。 因此实际上番石榴RateLimiter并非旨在网络API速率限制。 番石榴Guava劝阻人们不要滥用它的方法也许保持其功能欠佳 这就是为什么我决定根据Java信号量自己实现一些简单的事情。 这是朴素的实现 public class SimpleRateLimiter {private Semaphore semaphore;private int maxPermits;private TimeUnit timePeriod;private ScheduledExecutorService scheduler;public static SimpleRateLimiter create(int permits, TimeUnit timePeriod) {SimpleRateLimiter limiter new SimpleRateLimiter(permits, timePeriod);limiter.schedulePermitReplenishment();return limiter;}private SimpleRateLimiter(int permits, TimeUnit timePeriod) {this.semaphore new Semaphore(permits);this.maxPermits permits;this.timePeriod timePeriod;}public boolean tryAcquire() {return semaphore.tryAcquire();}public void stop() {scheduler.shutdownNow();}public void schedulePermitReplenishment() {scheduler Executors.newScheduledThreadPool(1);scheduler.schedule(() - {semaphore.release(maxPermits - semaphore.availablePermits());}, 1, timePeriod);} } 它需要一定数量的许可允许的请求数量和一段时间。 时间段为“ 1 X”其中X可以是秒/分钟/小时/每天-取决于您希望如何配置限制-每秒每分钟每小时每天。 调度程序每1 X补充所获得的许可证。 无法控制突发事件客户端可以用快速连续的请求花费所有许可没有热身功能没有逐步的补充。 根据您的需要这可能并不理想但这只是一个基本的速率限制器它是线程安全的没有任何阻塞。 我编写了一个单元测试以确认限制器的行为正确并且还对本地应用程序进行了性能测试以确保遵守限制。 到目前为止它似乎正在工作。 有其他选择吗 好吧是的–像RateLimitJ这样的库使用Redis来实现速率限制。 但是这意味着您需要设置和运行Redis。 对于“简单地”进行速率限制这似乎是开销。 另一方面限速将如何在一组应用程序节点中正常工作 应用程序节点可能需要一些数据库或八卦协议来共享有关剩余的每个客户端许可请求的数据 不必要。 解决此问题的一种非常简单的方法是假设负载均衡器在节点之间平均分配负载。 这样您只需要将每个节点上的限制设置为等于总限制除以节点数即可。 它不是很精确但是您很少需要做到这一点–允许5-10个以上的请求不会终止您的应用程序允许5-10个以下的请求对用户来说并不算太大。 但是那将意味着您必须知道应用程序节点的数量。 如果您使用自动缩放例如在AWS中则节点数可能会根据负载而变化。 在这种情况下补给排定的作业无需配置硬编码的许可证数量而是可以通过调用AWS或其他云提供商API来获取其中的节点数量从而动态计算“ maxPermits”。当前的自动缩放组。 这比仅支持Redis部署要简单得多。 总的来说我很惊讶没有一种“规范”的方法来实现速率限制在Java中。 限制速率的需求可能并不像看起来那样普遍。 或者它是手动实施的–通过临时禁止使用“资源过多”的API客户端。 翻译自: https://www.javacodegeeks.com/2017/07/basic-api-rate-limiting.html百度网盘不限速被限速
http://www.zqtcl.cn/news/634280/

相关文章:

  • 网站的前台后台网站建设公司新报
  • 菜鸟式网站建设图书深圳建站公司好坏
  • 品牌网站建设熊掌号一级消防工程师考试通过率多少
  • 网站建设淘宝客模板湖口网站建设
  • 拱墅区建设局网站做设计的搜素材上什么网站
  • 济南烨铭网站建设外贸建网站免费模板
  • 那些网站可以做反链浏览器网站大全
  • 泉州网站建设推广企业网页兼容性站点
  • 怎样做视频上网站赚钱推广计划怎么做推广是什么
  • 台州外贸网站建设做网站开发一般用什么语言
  • 咸阳做网站的公司漯河网做网站
  • 红酒网站模板下载做网站加推广
  • 免费网站服务器域名在线手机网站建设
  • 北京网站ui设计公司在线设计装修
  • 大学生网站作业北京网站优化技术
  • 静安区网站开发固原网络推广
  • WordPress网站修改志成网站设计制作
  • 做网站需要注意的昭通网站seo优化
  • 站群软件lanyun网站开发
  • 固始网站制作html美食网页设计源码
  • 软件研发过程管理岳阳seo
  • 舟山网站建设代理门户网站建设流程
  • 天水建设银行网站网站建设方案免费下载
  • 长城宽带魔方优化大师官网下载
  • 宁波建设工程主管部门网站长沙网站维护
  • 网站推广机构我的世界怎么做赞助网站
  • 做网站的公司图sae wordpress storage
  • 做塑料的网站有哪些东道设计公司待遇如何
  • 烟台做网站哪家好网站加速器下载
  • 哪些网站是响应式河北省住房和城乡建设厅信用网站