Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara melaksanakan pengehadan semasa API menggunakan bahasa Go dan Redis

Cara melaksanakan pengehadan semasa API menggunakan bahasa Go dan Redis

WBOY
WBOYasal
2023-10-26 09:27:28709semak imbas

Cara melaksanakan pengehadan semasa API menggunakan bahasa Go dan Redis

Cara melaksanakan pengehadan semasa API menggunakan bahasa Go dan Redis

Ikhtisar:
Dengan perkembangan pesat Internet, penggunaan antara muka API juga meningkat, dan sesetengah antara muka API mungkin menyebabkan kegagalan sistem disebabkan terlalu banyak permintaan Beban terlalu tinggi atau lumpuh. Untuk memastikan kestabilan dan kebolehpercayaan sistem, kami perlu mengehadkan aliran semasa antara muka API. Artikel ini akan memperkenalkan cara menggunakan bahasa Go dan Redis untuk melaksanakan fungsi pengehadan semasa API dan memberikan contoh kod khusus.

  1. Prinsip pengehadan semasa API
    Penghadan semasa API merujuk kepada mengehadkan akses kepada antara muka API untuk melindungi sistem daripada ditimpa permintaan berniat jahat atau sejumlah besar permintaan. Algoritma pengehad semasa API biasa termasuk algoritma pembilang, algoritma baldi bocor dan algoritma baldi token. Algoritma baldi token digunakan dalam artikel ini Prinsipnya adalah untuk mengawal aliran permintaan melalui baldi token.
  2. Persediaan alam sekitar
    Sebelum bermula, kita perlu memastikan bahawa bahasa Go dan Redis dipasang dan perpustakaan yang sepadan diimport.
  3. Kod pelaksanaan
    Berikut ialah contoh kod yang menggunakan bahasa Go dan Redis untuk melaksanakan pengehadan semasa API:
package main

import (
    "fmt"
    "github.com/go-redis/redis"
    "time"
)

const (
    MaxReqPerSec = 100 // 每秒最大请求数
)

func main() {
    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // 如果有密码,填入密码
        DB:       0,  // 默认数据库
    })

    // 初始化令牌桶
    client.Set("bucket", MaxReqPerSec, 0)

    // 模拟请求
    for i := 0; i < 1000; i++ {
        if allowed, err := checkAPIRequest(client); allowed {
            // 执行API请求
            fmt.Println("API request allowed")
            // ....
        } else {
            fmt.Println("API request denied")
            // ....
        }
        time.Sleep(time.Millisecond * 100)
    }
}

func checkAPIRequest(client *redis.Client) (bool, error) {
    val, err := client.Decr("bucket").Result()
    if err != nil {
        return false, err
    }

    if val < 0 {
        client.Incr("bucket")
        return false, nil
    }

    return true, nil
}

Perihalan kod:

  • Dalam fungsi utama, kami mula-mula mewujudkan sambungan dengan Redis , dan memulakan baldi token dan menetapkan bilangan maksimum permintaan sesaat kepada 100. main函数中,我们首先建立与Redis的连接,并初始化了一个令牌桶,设置每秒最大请求数量为100。
  • checkAPIRequest函数用于检查是否允许进行API请求。在每次请求时,我们通过client.Decr("bucket")操作从令牌桶中取出一个令牌,如果令牌数量小于0,则表示不能进行请求,需要向令牌桶中添加令牌,并返回false。如果令牌数量大于等于0,则表示允许进行请求,并返回true。
  1. 运行代码
    保存以上代码为main.go文件,使用命令行进入文件所在目录,执行go run main.go
  2. Fungsi checkAPIRequest digunakan untuk menyemak sama ada permintaan API dibenarkan. Pada setiap permintaan, kami mengeluarkan token daripada baldi token melalui operasi client.Decr("baldi") Jika bilangan token kurang daripada 0, ini bermakna permintaan itu tidak boleh dibuat dan anda perlu meminta token Tambah token ke baldi dan kembalikan palsu. Jika bilangan token lebih besar daripada atau sama dengan 0, permintaan itu dibenarkan dan benar dikembalikan.

    Jalankan kod
    Simpan kod di atas sebagai fail main.go, gunakan baris arahan untuk memasuki direktori di mana fail itu terletak dan laksanakan go run main.go untuk menjalankan kod. Program ini akan mensimulasikan 100 permintaan, dengan selang 100 milisaat antara setiap permintaan. Mengikut bilangan maksimum permintaan yang ditetapkan, 100 permintaan pertama harus dibenarkan dan permintaan seterusnya harus ditolak.

    🎜🎜Ringkasan: 🎜Artikel ini memperkenalkan cara menggunakan bahasa Go dan Redis untuk melaksanakan fungsi pengehadan semasa API dan mengawal aliran permintaan melalui algoritma baldi token. Dengan menggunakan kaedah ini, anda boleh melindungi sistem dengan berkesan daripada ditimpa sebilangan besar permintaan dan meningkatkan kestabilan dan ketersediaan sistem. 🎜

Atas ialah kandungan terperinci Cara melaksanakan pengehadan semasa API menggunakan bahasa Go dan Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn