成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:限流的實現方式有哪些?

網絡 網絡管理
通常在網關層的上游,我們會使用 Nginx 一起來配合使用,也就是用戶請求會先到 Nginx(或 Nginx 集群),然后再將請求轉發給網關,網關再調用其他的微服務,從而實現整個流程的請求調用,因此 Nginx 限流也是分布式系統中常用的限流手段。

限流是指在各種應用場景中,通過技術和策略手段對數據流量、請求頻率或資源消耗進行有計劃的限制,以避免系統負載過高、性能下降甚至崩潰的情況發生。限流的目標在于維護系統的穩定性和可用性,并確保服務質量。

使用限流的好處有以下幾個:

  1. 保護系統穩定性:過多的并發請求可能導致服務器內存耗盡、CPU 使用率飽和,從而引發系統響應慢、無法正常服務的問題。
  2. 防止資源濫用:確保有限的服務資源被合理公平地分配給所有用戶,防止個別用戶或惡意程序過度消耗資源。
  3. 優化用戶體驗:對于網站和應用程序而言,如果任由高并發導致響應速度變慢,會影響所有用戶的正常使用體驗。
  4. 保障安全:在網絡層面,限流有助于防范 DoS/DDoS 攻擊,降低系統遭受惡意攻擊的風險。
  5. 運維成本控制:合理的限流措施可以幫助企業減少不必要的硬件投入,節省運營成本。

在 Java 中,限流的實現方式有很多種,例如以下這些:

  1. 單機限流:使用 JUC 下的 Semaphore 限流,或一些常用的框架,例如 Google 的 Guava 框架進行限流,但這種限流方式都是基于 JVM 層面的內存級別的單臺機器限流。
  2. 網關層限流:單機限流往往不適用于分布式系統,而分布式系統可以在網關層限流,如 Spring Cloud Gateway 通過 Sentinel、Hystrix 對整個集群進行限流。
  3. Nginx 限流:通常在網關層的上游,我們會使用 Nginx 一起來配合使用,也就是用戶請求會先到 Nginx(或 Nginx 集群),然后再將請求轉發給網關,網關再調用其他的微服務,從而實現整個流程的請求調用,因此 Nginx 限流也是分布式系統中常用的限流手段。

它們限流的具體實現如下。

1.單機限流

JVM 層面多線程級別的限流可以使用 JUC 下的 Semaphore,具體使用示例如下:

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class SemaphoreExample {

    private final Semaphore semaphore = new Semaphore(5); // 只允許5個線程同時訪問

    public void accessResource() {
        try {
            semaphore.acquire(); // 獲取許可,如果當前許可數不足,則會阻塞
            System.out.println(Thread.currentThread().getName() + "獲得了許可,正在訪問資源...");
            // 模擬訪問資源的時間消耗
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName() + "訪問資源結束,釋放許可...");
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            e.printStackTrace();
        } finally {
            semaphore.release(); // 訪問結束后釋放許可
        }
    }

    public static void main(String[] args) {
        SemaphoreExample example = new SemaphoreExample();

        for (int i = 0; i < 10; i++) {
            new Thread(() -> example.accessResource()).start();
        }
    }
}

想要實現更平滑的單機限流,可以考慮 Google 提供的 Guava 框架,它的使用示例如下。

首先在 pom.xml 添加 guava 引用,配置如下:

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>28.2-jre</version>
</dependency>

具體實現代碼如下:

import com.google.common.util.concurrent.RateLimiter;
import java.time.Instant;

/**
 * Guava 實現限流
 */
public class RateLimiterExample {
    public static void main(String[] args) {
        // 每秒產生 10 個令牌(每 100 ms 產生一個)
        RateLimiter rt = RateLimiter.create(10);
        for (int i = 0; i < 11; i++) {
            new Thread(() -> {
                // 獲取 1 個令牌,獲取到令牌就執行,否則就阻塞等待
                rt.acquire();
                System.out.println("正常執行方法,ts:" + Instant.now());
            }).start();
        }
    }
}

2.網關層限流

在 Spring Cloud Gateway 網關層限流,可以借助 Sentinel 等限流框架來實現,它的實現步驟如下。

首先,在 pom.xml 中添加 Gateway 和 Sentinel 相關依賴,如下所示:

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

配置限流相關的規則,如下示例所示:

spring:
  application:
    name: gate-way-blog
  cloud:
    sentinel:
      transport:
        dashboard: localhost:18080
      scg: # 配置限流之后,響應內容
        fallback:
          # 兩種模式,一種是 response 返回文字提示信息,
          # 另一種是 redirect 重定向跳轉,不過配置 redirect 也要配置對應的跳轉的 uri
          mode: response
          # 響應的狀態
          response-status: 200
          # 響應體
          response-body: '{"code": -10,"message": "被熔斷或限流!"}'

最后在 Sentinel 控制臺配置網關的限流設置即可,當然也可以使用 Nacos 作為數據源,兩者選擇配置其中一個即可。

3.Nginx 限流

Nginx 提供了兩種限流手段:

  • 通過控制速率來實現限流。
  • 通過控制并發連接數來實現限流。

我們一個一個來看。

3.1 控制速率實現限流

我們需要使用 limit_req_zone 用來限制單位時間內的請求數,即速率限制,示例配置如下:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server {
  location / {
    limit_req zone=mylimit;
  }
}

以上配置表示,限制每個 IP 訪問的速度為 2r/s,因為 Nginx 的限流統計是基于毫秒的,我們設置的速度是 2r/s,轉換一下就是 500ms 內單個 IP 只允許通過 1 個請求,從 501ms 開始才允許通過第 2 個請求。

我們使用單 IP 在 10ms 內發并發送了 6 個請求的執行結果如下:

圖片圖片

從以上結果可以看出他的執行符合我們的預期,只有 1 個執行成功了,其他的 5 個被拒絕了(第 2 個在 501ms 才會被正常執行)。

速率限制升級版

上面的速率控制雖然很精準但是應用于真實環境未免太苛刻了,真實情況下我們應該控制一個 IP 單位總時間內的總訪問次數,而不是像上面那么精確但毫秒,我們可以使用 burst 關鍵字開啟此設置,示例配置如下:

limit_req_zone $binary_remote_addr znotallow=mylimit:10m rate=2r/s;
server {
  location / {
    limit_req znotallow=mylimit burst=4;
  }
}

burst=4 表示每個 IP 最多允許4個突發請求,如果單個 IP 在 10ms 內發送 6 次請求的結果如下:

圖片圖片

從以上結果可以看出,有 1 個請求被立即處理了,4 個請求被放到 burst 隊列里排隊執行了,另外 1 個請求被拒絕了。

3.2 控制并發數實現限流

利用 limit_conn_zone 和 limit_conn 兩個指令即可控制并發數,示例配置如下:

limit_conn_zone $binary_remote_addr znotallow=perip:10m;
limit_conn_zone $server_name znotallow=perserver:10m;
server {
  ...
  limit_conn perip 10;
  limit_conn perserver 100;
}

其中 limit_conn perip 10 表示限制單個 IP 同時最多能持有 10 個連接;limit_conn perserver 100 表示 server 同時能處理并發連接的總數為 100 個。

責任編輯:武曉燕 來源: Java中文社群
相關推薦

2023-02-20 08:08:48

限流算法計數器算法令牌桶算法

2024-04-19 00:00:00

計數器算法限流算法

2023-11-20 10:09:59

2024-03-12 14:36:44

微服務HTTPRPC

2024-02-04 10:08:34

2024-12-25 15:44:15

2021-07-01 07:51:45

React事件綁定

2021-07-05 11:06:11

組件React通信

2025-03-26 01:25:00

MySQL優化事務

2022-03-21 07:35:34

處理方式跨域

2024-03-07 17:21:12

HotSpotJVMHot Code

2021-07-02 07:06:20

React組件方式

2021-05-10 08:01:12

BeanFactoryFactoryBean容器

2021-08-11 08:53:23

Git命令面試

2021-08-02 08:34:20

React性能優化

2021-09-30 07:57:13

排序算法面試

2021-05-27 05:37:10

HTTP請求頭瀏覽器

2024-05-29 14:34:07

2024-02-01 08:08:53

Spring過濾器類型Gateway

2021-10-21 07:18:02

微信程序方式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜小视频在线播放 | 天天操夜夜操免费视频 | 国产精品一区一区三区 | 国产精品欧美一区二区 | 国产精品日韩在线观看一区二区 | 久久久资源 | 91视频a| 亚洲精品在线免费 | 精品一区二区观看 | 91电影在线播放 | 欧美精品一区免费 | 国产在线一区二区三区 | 国产7777 | 天天天插 | 日韩欧美国产一区二区 | 黄色av免费网站 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | 久久国产婷婷国产香蕉 | 久久久久久久一区 | 韩国主播午夜大尺度福利 | 国产精品免费一区二区三区 | 久久国内精品 | 国产区在线 | 亚洲精品一区二区在线观看 | 天天搞天天搞 | 97精品超碰一区二区三区 | 精品国产一区二区三区日日嗨 | 亚洲精品丝袜日韩 | 亚洲综合无码一区二区 | 欧美日韩精品一区二区三区视频 | 我要看免费一级毛片 | a级片在线| 国精产品一品二品国精在线观看 | 午夜日韩精品 | 伊人婷婷| 亚洲精品一区二区三区蜜桃久 | 在线观看国产视频 | 亚洲色图50p| 午夜av免费 | 久久久久一区 | 亚洲欧美日韩国产 |