Bagikan melalui


Mulai cepat: Menambahkan bendera fitur ke aplikasi web Go Gin

Dalam panduan cepat ini, Anda akan membuat flag fitur di Azure App Configuration dan menggunakannya untuk mengontrol ketersediaan halaman web baru secara dinamis di aplikasi web Go Gin tanpa melakukan restart atau melakukan deploy ulang.

Dukungan manajemen fitur memperluas fitur konfigurasi dinamis di App Configuration. Contoh ini menunjukkan cara mengintegrasikan bendera fitur ke dalam aplikasi web Go Gin dengan pembaruan real time dan penyajian halaman kondisional.

Prasyarat

Membuat bendera fitur

Tambahkan bendera fitur yang disebut Beta ke penyimpanan App Configuration dan biarkan Label dan Deskripsi dengan nilai defaultnya. Untuk informasi selengkapnya tentang cara menambahkan bendera fitur ke penyimpanan menggunakan portal Azure atau CLI, buka Membuat bendera fitur.

Cuplikan layar pembuatan bendera fitur.

Membuat aplikasi web Go

  1. Buat direktori baru untuk proyek Go Anda dan navigasikan ke dalamnya:

    mkdir gin-feature-flag-quickstart
    cd gin-feature-flag-quickstart
    
  2. Menginisialisasi modul Go baru:

    go mod init gin-feature-flag-quickstart
    
  3. Instal paket Go yang diperlukan untuk Azure App Configuration, kerangka kerja web Gin, dan manajemen fitur:

    go get github.com/gin-gonic/gin
    go get github.com/microsoft/Featuremanagement-Go/featuremanagement
    go get github.com/microsoft/Featuremanagement-Go/featuremanagement/providers/azappconfig
    
  4. Buat direktori templat untuk templat HTML Anda dan tambahkan file HTML yang diperlukan:

    mkdir templates
    

    Tambahkan file templat HTML berikut dari repositori GitHub dan letakkan di templates direktori:

Menggunakan bendera fitur

  1. Buat file bernama appconfig.go dengan konten berikut. Anda dapat menyambungkan ke penyimpanan App Configuration menggunakan MICROSOFT Entra ID (disarankan) atau string koneksi.

    package main
    
    import (
        "context"
        "log"
        "os"
    
        "github.com/Azure/AppConfiguration-GoProvider/azureappconfiguration"
        "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    )
    
    func loadAzureAppConfiguration(ctx context.Context) (*azureappconfiguration.AzureAppConfiguration, error) {
        // Get the endpoint from environment variable
        endpoint := os.Getenv("AZURE_APPCONFIG_ENDPOINT")
        if endpoint == "" {
            log.Fatal("AZURE_APPCONFIG_ENDPOINT environment variable is not set")
        }
    
        // Create a credential using DefaultAzureCredential
        credential, err := azidentity.NewDefaultAzureCredential(nil)
        if err != nil {
            log.Fatalf("Failed to create credential: %v", err)
        }
    
        // Set up authentication options with endpoint and credential
        authOptions := azureappconfiguration.AuthenticationOptions{
            Endpoint:   endpoint,
            Credential: credential,
        }
    
        // Configure feature flag options
        options := &azureappconfiguration.Options{
            FeatureFlagOptions: azureappconfiguration.FeatureFlagOptions{
                Enabled: true,
                RefreshOptions: azureappconfiguration.RefreshOptions{
                    Enabled: true,
                },
            },
        }
    
        // Load configuration from Azure App Configuration
        appConfig, err := azureappconfiguration.Load(ctx, authOptions, options)
        if err != nil {
            log.Fatalf("Failed to load configuration: %v", err)
        }
    
        return appConfig, nil
    }
    

    Petunjuk

    Ketika tidak ada pemilih yang ditentukan dalam FeatureFlagOptions, itu memuat semua bendera fitur di penyimpanan App Configuration Anda tanpa label. Interval refresh default bendera fitur adalah 30 detik. Anda dapat menyesuaikan perilaku ini melalui RefreshOptions parameter . Misalnya, cuplikan kode berikut hanya memuat bendera fitur yang dimulai dengan TestApp: dalam nama kuncinya dan memiliki dev label. Kode juga mengubah waktu interval refresh menjadi 5 menit. Perhatikan bahwa waktu interval refresh ini terpisah dari itu untuk nilai kunci reguler.

    azureappconfiguration.FeatureFlagOptions{
        Enabled: true,
        Selectors: []azureappconfiguration.Selector{
            {
                KeyFilter:   "TestApp:*",
                LabelFilter: "dev",
            },
        },
        RefreshOptions: azureappconfiguration.RefreshOptions{
            Enabled: true,
            Interval: 5 * time.Minute,
        },
    }
    
  2. Buat file bernama main.go dengan konten berikut:

    package main
    
    import (
        "context"
        "fmt"
        "log"
        "net/http"
        "os"
    
        "github.com/Azure/AppConfiguration-GoProvider/azureappconfiguration"
        "github.com/gin-gonic/gin"
        "github.com/microsoft/Featuremanagement-Go/featuremanagement"
        "github.com/microsoft/Featuremanagement-Go/featuremanagement/providers/azappconfig"
    )
    
    type WebApp struct {
        featureManager *featuremanagement.FeatureManager
        appConfig      *azureappconfiguration.AzureAppConfiguration
    }
    
    func (app *WebApp) refreshMiddleware() gin.HandlerFunc {
        return func(c *gin.Context) {
            go func() {
                ctx := context.Background()
                if err := app.appConfig.Refresh(ctx); err != nil {
                    log.Printf("Error refreshing configuration: %v", err)
                }
            }()
            c.Next()
        }
    }
    
    func (app *WebApp) featureMiddleware() gin.HandlerFunc {
        return func(c *gin.Context) {
            // Check if Beta feature is enabled
            betaEnabled, err := app.featureManager.IsEnabled("Beta")
            if err != nil {
                log.Printf("Error checking Beta feature: %v", err)
                betaEnabled = false
            }
    
            // Store feature flag status for use in templates
            c.Set("betaEnabled", betaEnabled)
            c.Next()
        }
    }
    
    func (app *WebApp) setupRoutes(r *gin.Engine) {
        r.Use(app.refreshMiddleware())
        r.Use(app.featureMiddleware())
    
        // Load HTML templates
        r.LoadHTMLGlob("templates/*.html")
    
        // Routes
        r.GET("/", app.homeHandler)
        r.GET("/beta", app.betaHandler)
    }
    
    // Home page handler
    func (app *WebApp) homeHandler(c *gin.Context) {
        betaEnabled := c.GetBool("betaEnabled")
    
        c.HTML(http.StatusOK, "index.html", gin.H{
            "title":       "Feature Management Example App",
            "betaEnabled": betaEnabled,
        })
    }
    
    // Beta page handler
    func (app *WebApp) betaHandler(c *gin.Context) {
        betaEnabled := c.GetBool("betaEnabled")
    
        if !betaEnabled {
            return
        }
    
        c.HTML(http.StatusOK, "beta.html", gin.H{
            "title": "Beta Page",
        })
    }
    
    func main() {
        ctx := context.Background()
    
        // Load Azure App Configuration
        appConfig, err := loadAzureAppConfiguration(ctx)
        if err != nil {
            log.Fatalf("Error loading Azure App Configuration: %v", err)
        }
    
        // Create feature flag provider
        featureFlagProvider, err := azappconfig.NewFeatureFlagProvider(appConfig)
        if err != nil {
            log.Fatalf("Error creating feature flag provider: %v", err)
        }
    
        // Create feature manager
        featureManager, err := featuremanagement.NewFeatureManager(featureFlagProvider, nil)
        if err != nil {
            log.Fatalf("Error creating feature manager: %v", err)
        }
    
        // Create web app
        app := &WebApp{
            featureManager: featureManager,
            appConfig:      appConfig,
        }
    
        // Set up Gin with default middleware (Logger and Recovery)
        r := gin.Default()
    
        // Set up routes
        app.setupRoutes(r)
    
        // Start server
        fmt.Println("Starting server on http://localhost:8080")
        fmt.Println("Open http://localhost:8080 in your browser")
        fmt.Println("Toggle the 'Beta' feature flag in Azure portal to see changes")
        fmt.Println()
    
        if err := r.Run(":8080"); err != nil {
            log.Fatalf("Failed to start server: %v", err)
        }
    }
    

Jalankan aplikasi web

  1. Atur variabel lingkungan untuk autentikasi dan jalankan aplikasi.

    go mod tidy
    go run .
    
  2. Buka jendela browser, dan buka http://localhost:8080. Browser Anda harus menampilkan halaman yang serupa dengan gambar di bawah ini.

    Cuplikan layar aplikasi web gin sebelum mengaktifkan bendera fitur.

  3. Masuk ke portal Azure. Pilih Semua sumber daya, dan pilih penyimpanan App Configuration yang Anda buat sebelumnya.

  4. Pilih Pengelola fitur dan temukan bendera fitur Beta . Aktifkan bendera dengan memilih kotak centang di bawah Diaktifkan.

  5. Muat ulang peramban beberapa kali. Saat jendela waktu interval refresh berlalu, halaman ditampilkan dengan konten yang diperbarui:

    Cuplikan layar aplikasi web gin setelah mengaktifkan bendera fitur.

  6. Perhatikan bahwa item menu Beta sekarang muncul di bilah navigasi. Klik untuk mengakses halaman beta:

    Cuplikan layar halaman beta aplikasi web gin.

Membersihkan sumber daya

Jika Anda tidak ingin terus menggunakan sumber daya yang dibuat dalam artikel ini, hapus grup sumber daya yang Anda buat di sini untuk menghindari biaya.

Penting

Penghapusan grup sumber daya tidak bisa dipulihkan. Grup sumber daya dan semua sumber daya di dalamnya dihapus secara permanen. Pastikan Anda tidak menghapus grup atau sumber daya yang salah secara tidak sengaja. Jika Anda membuat sumber daya untuk artikel ini di dalam grup sumber daya yang berisi sumber daya lain yang ingin Anda pertahankan, hapus setiap sumber daya satu per satu dari panel masing-masing, daripada menghapus grup sumber daya tersebut.

  1. Masuk ke portal Azure, lalu pilih Grup sumber daya.
  2. Dalam kotak Filter menurut nama, masukkan nama grup sumber daya Anda.
  3. Dalam daftar hasil, pilih nama grup sumber daya untuk melihat gambaran umum.
  4. Pilih Hapus grup sumber daya.
  5. Anda diminta untuk mengonfirmasi penghapusan grup sumber daya. Masukkan nama grup sumber daya Anda untuk mengonfirmasi, dan pilih Hapus.

Setelah beberapa saat, grup sumber daya dan semua sumber dayanya dihapus.

Langkah selanjutnya

Dalam panduan cepat ini, Anda membuat feature flag di Azure App Configuration dan menggunakannya di aplikasi web Go Gin. Pustaka Feature Management Go menyediakan kemampuan bendera fitur yang terintegrasi dengan mulus dengan Azure App Configuration.Untuk fitur lainnya, lanjutkan ke dokumen berikut.

Meskipun bendera fitur memungkinkan Anda mengaktifkan atau menonaktifkan fungsionalitas di aplikasi, Anda mungkin ingin menyesuaikan bendera fitur berdasarkan logika aplikasi Anda. Filter fitur memungkinkan Anda mengaktifkan bendera fitur secara kondisional. Untuk informasi selengkapnya, lanjutkan ke tutorial berikut.

Azure App Configuration menawarkan filter fitur bawaan yang memungkinkan Anda mengaktifkan bendera fitur hanya selama periode tertentu atau ke audiens yang ditargetkan tertentu dari aplikasi Anda. Untuk informasi selengkapnya, lanjutkan ke tutorial berikut.