このAPIは持っているために、何度も何度もこれらの概念を、いくつかのフロー制御、認証、監査、認証、シンプルを確保します第一印象を。それは具体的に説明するの背後にあります。
BenpianはのAPIのセキュリティとフロー制御〜第一印象。
まず、概念
フロー制御、フロー制御は、放電のみのシステムは、過去に要求の数を扱うことができる第1の閉APIのセキュアリンクで。
なぜ、フロー制御をしますか?システムの可用性を確認し、大きな流れを防止するためのシステムを粉砕しました。リソースの他の不必要な浪費を避けるために、事前にフロー制御、認証、監査、許可全体のセキュリティメカニズムの前で大半を行うための制御位置をフロー。
屋台の最初の行には、フロー制御がない場合の束を得る攻撃者を並べる鶏、打ち上げDDOSのあなたは認証、監査、認証、それはあなたのサービスが押しつぶさ置いてもよいかも関わらず、背後にある場合でも、攻撃を。
例えば、システムは、システムが押しつぶされることはありませんので、リクエストうちの第二の、より直接的な拒否ごとに、過去500個の要求を入れ、その後、毎秒500件のリクエストを処理することができます。実際の流量制御単に提供番号が終了されることになるではない、非常に複雑です。
第二に、フロー制御は何?
実際の開発を制限することなど、多くの場所で行うことができます。
行うためのロードバランシングでは1、
行うためのリバースプロキシ上の2、
ロードバランシングやリバースプロキシレベルを制限するに行い、実際には、クラスタが制限ないため、一般的に真実です。たとえば、ユーザサービス、実際の展開は、4つまたは8つのマシンマシンクラスタも負荷分散や、クラスタ全体が多くのトラフィックを維持することができ、本当に制限クラスタ全体を実行することです行うには、プロキシのクラスタレベルを反転することです、限定することにします。
3、独自のアプリケーションのコード上で行います。
単一ノード・アプリケーションは、リバースプロキシ、ロード・バランシングと、フロー制御を行うだけのために、制限寸法は、装備されている場合、その後、二つの側面が伴っているしていない、彼らは競合しません。クラスタトラフィック制御の後ろにフレームを介して導入されます。
第三には、グアバを使用して、簡単な電流が制限ん
最新のグアバポンポンの導入への依存
<! - https://mvnrepository.com/artifact/com.google.guava/guava - > < 依存> < groupIdを> com.google.guava </ groupIdを> < たartifactId >グアバ</ たartifactId > < バージョン> 28.1-JRE </ バージョン> </ 依存関係>
アイテム:
の制限フィルタを書きます:
package com.nb.security.filter; import com.google.common.util.concurrent.RateLimiter; import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 继承 OncePerRequestFilter 保证过滤器里的逻辑在一个请求里只会被过滤一次 * 在SpringBoot里,任何实现了Filter接口的类,SpringBoot会自动把它加到web应用的过滤器链里,只要声名为Component就行了 */ @Order(1)//执行顺序 @Component public class RateLimitFilter extends OncePerRequestFilter {// //每秒1个请求的限流器 private RateLimiter rateLimiter = RateLimiter.create(1); protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { System.err.println("++++流控++++"); if (rateLimiter.tryAcquire()) { //如果没达到限流阈值,放行 filterChain.doFilter(request, response); } else { response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());//429请过过多 response.getWriter().write("too many request!"); response.getWriter().flush(); return ; } } }
调用用户查询接口,使劲刷新,就返回429
这个是个简单的例子, 实际中的流控,比这个要复杂的多,比如可以根据用户来限流,VIP用户每秒500请求,普通用户每秒50请求,这样大量请求过来了,VIP用户没什么感觉可以正常访问,普通用户就被拒绝了。
代码:https://github.com/lhy1234/springcloud-security/tree/master/nb-user-api
++++++++++++++++++++++++分割线++++++++++++++++++++++++
小结:
1,流控概念:流量控制
2,流控位置:负载均衡、反向代理、应用逻辑
3,guava做简单的限流,对限流有个第一印象