Rumah >pembangunan bahagian belakang >Golang >Melaksanakan kunci teragih menggunakan rangka kerja web Golang Rangka kerja Gin-gonic

Melaksanakan kunci teragih menggunakan rangka kerja web Golang Rangka kerja Gin-gonic

WBOY
WBOYasal
2023-06-24 09:03:251247semak imbas

Kunci teragih ialah cara biasa untuk menyelesaikan masalah akses serentak kepada sumber yang dikongsi. Dalam sistem teragih, memandangkan berbilang nod mengendalikan sumber yang sama pada masa yang sama, ketidakkonsistenan data dan persaingan sumber mungkin berlaku. Oleh itu, menggunakan mekanisme kunci teragih boleh mengelakkan masalah ini dengan berkesan. Di Golang, anda boleh menggunakan rangka kerja Gin-gonik untuk melaksanakan kunci teragih.

Gin-gonic ialah rangka kerja web ringan berdasarkan penghala HTTP dan menyediakan banyak perisian tengah yang berkuasa. Antaranya, perisian tengah Mutex yang disediakan oleh Gin-gonic boleh digunakan untuk melaksanakan kunci yang diedarkan. Perisian tengah Mutex membolehkan kami menyegerakkan antara permintaan yang berbeza untuk memastikan hanya satu permintaan boleh mengakses sumber yang dikongsi pada masa yang sama.

Di bawah, kami akan menggunakan contoh mudah untuk menunjukkan cara menggunakan rangka kerja Gin-gonik untuk melaksanakan kunci teragih.

Pertama, kami perlu memasang perpustakaan gin dan redis yang berkaitan:

go get github.com/gin-gonic/gin
go get github.com/go-redis/redis

Seterusnya, kami akan mencipta perkhidmatan HTTP yang menyediakan dua API: kunci dan buka kunci. Antara muka kunci digunakan untuk mendapatkan kunci yang diedarkan, dan antara muka buka kunci digunakan untuk melepaskan kunci yang diedarkan. Kita boleh menggunakan redis sebagai kaedah penyimpanan untuk kunci yang diedarkan.

package main

import (
    "github.com/gin-gonic/gin"
    "github.com/go-redis/redis"
    "net/http"
    "time"
)

func main() {
    r := gin.Default()

    // 初始化Redis
    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "",
        DB:       0,
    })

    // lock接口
    r.POST("/lock", func(c *gin.Context) {
        lockKey := c.PostForm("key")
        locked, err := client.SetNX(lockKey, "locked", time.Second*30).Result()
        if err != nil || !locked {
            c.JSON(http.StatusConflict, gin.H{
                "code":    1,
                "message": "get lock failed",
            })
            return
        }
        c.JSON(http.StatusOK, gin.H{
            "code":    0,
            "message": "get lock success",
        })
    })

    // unlock接口
    r.POST("/unlock", func(c *gin.Context) {
        lockKey := c.PostForm("key")
        if err := client.Del(lockKey).Err(); err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{
                "code":    2,
                "message": "release lock failed",
            })
            return
        }
        c.JSON(http.StatusOK, gin.H{
            "code":    0,
            "message": "release lock success",
        })
    })

    r.Run()
}

Dalam kod di atas, kami mula-mula memulakan klien redis. Dalam antara muka kunci, kami menggunakan perintah SetNX Redis untuk menetapkan kunci kepada "dikunci" apabila kunci tidak wujud, dan menetapkan tamat masa selama 30 saat. Jika kunci berjaya diperoleh, 200 OK dikembalikan, jika tidak 409 Konflik dikembalikan. Dalam antara muka buka kunci, kami menggunakan arahan Redis Del untuk melepaskan kunci. Jika kunci dilepaskan dengan jayanya, 200 OK dikembalikan, jika tidak 500 Ralat Pelayan Dalaman dikembalikan.

Kini, kita boleh menguji kedua-dua API ini menggunakan arahan curl. Andaikan aplikasi kami berjalan pada localhost:8080:

# 获取锁
curl --request POST 
  --url http://localhost:8080/lock 
  --header 'content-type: application/x-www-form-urlencoded' 
  --data key=mylock
# {"code":0,"message":"get lock success"}

# 再次获取锁
curl --request POST 
  --url http://localhost:8080/lock 
  --header 'content-type: application/x-www-form-urlencoded' 
  --data key=mylock
# {"code":1,"message":"get lock failed"}

# 释放锁
curl --request POST 
  --url http://localhost:8080/unlock 
  --header 'content-type: application/x-www-form-urlencoded' 
  --data key=mylock
# {"code":0,"message":"release lock success"}

Melalui ujian di atas, kami dapat melihat bahawa aplikasi Gin-gonic kami telah berjaya melaksanakan kunci teragih. Melalui perisian tengah Mutex, kami boleh melaksanakan kunci teragih dengan mudah untuk memastikan akses serentak yang selamat kepada sumber yang dikongsi.

Atas ialah kandungan terperinci Melaksanakan kunci teragih menggunakan rangka kerja web Golang Rangka kerja Gin-gonic. 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