Rumah > pembangunan bahagian belakang > Golang > Apakah keperluan teras yang boleh dibangunkan oleh perkhidmatan mikro berdasarkan sokongan Golang?

Apakah keperluan teras yang boleh dibangunkan oleh perkhidmatan mikro berdasarkan sokongan Golang?

王林
Lepaskan: 2023-09-18 12:49:49
asal
1260 orang telah melayarinya

Apakah keperluan teras yang boleh dibangunkan oleh perkhidmatan mikro berdasarkan sokongan Golang?

Perkhidmatan mikro yang dibangunkan berdasarkan Golang boleh menyokong pelbagai keperluan teras, termasuk konkurensi tinggi, penskalaan anjal, penggunaan teragih, komunikasi tak segerak dan pemprosesan tahan kerosakan. Artikel ini akan menunjukkan pelaksanaan keperluan teras ini dalam perkhidmatan mikro Golang melalui contoh kod terperinci.

Konkurensi tinggi:

Model konkurensi Golang adalah berdasarkan konsep benang ringan (goroutine) dan Proses Berjujukan Berkomunikasi (CSP), menjadikan pengaturcaraan serentak lebih mudah dan cekap. Berikut ialah contoh kod untuk menggunakan goroutine untuk mencapai keselarasan tinggi:

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            fmt.Printf("goroutine %d started
", i)
            time.Sleep(1 * time.Second)
            fmt.Printf("goroutine %d finished
", i)
        }(i)
    }

    wg.Wait()
    fmt.Println("All goroutines finished")
}
Salin selepas log masuk

Kod di atas menggunakan WaitGroup dalam pakej penyegerakan untuk menunggu semua goroutine tamat. Dengan menjalankan program ini, anda boleh melihat bahawa 10 goroutine akan dilaksanakan pada masa yang sama dan semuanya tamat selepas 1 saat.

Skala elastik:

Perkhidmatan mikro Golang boleh diskalakan secara elastik mengikut keadaan beban untuk memenuhi permintaan saiz yang berbeza. Berikut ialah contoh kod ringkas:

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
    "os/signal"
    "syscall"

    "github.com/gorilla/mux"
)

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/hello", helloHandler)

    server := &http.Server{
        Addr:    ":8080",
        Handler: router,
    }

    go func() {
        if err := server.ListenAndServe(); err != nil {
            log.Fatal(err)
        }
    }()

    // 监听系统信号,如Ctrl+C
    stop := make(chan os.Signal, 1)
    signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)

    <-stop

    if err := server.Shutdown(nil); err != nil {
        log.Fatal(err)
    }

    fmt.Println("Server gracefully stopped")
}

func helloHandler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello, World!"))
}
Salin selepas log masuk

Kod di atas menggunakan perpustakaan gorila/mux untuk mencipta perkhidmatan HTTP yang ringkas dan mendengar isyarat sistem untuk mematikan perkhidmatan dengan anggun. Dengan menjalankan program, anda boleh mengakses "http://localhost:8080/hello" dalam penyemak imbas untuk melihat hasil yang sedang dijalankan.

Pengedaran teragih:

Perkhidmatan mikro Golang boleh dengan mudah melaksanakan penggunaan teragih untuk memenuhi keperluan berbilang kluster, berbilang pusat data dan senario lain. Berikut ialah contoh kod yang menggunakan Consul sebagai pusat penemuan dan konfigurasi perkhidmatan:

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/hashicorp/consul/api"
    "github.com/gorilla/mux"
)

func main() {
    consulConfig := api.DefaultConfig()
    consul, err := api.NewClient(consulConfig)
    if err != nil {
        log.Fatal(err)
    }

    agent := consul.Agent()

    registration := &api.AgentServiceRegistration{
        ID:      "microservice-example",
        Name:    "microservice",
        Address: "localhost",
        Port:    8080,
    }

    if err := agent.ServiceRegister(registration); err != nil {
        log.Fatal(err)
    }

    router := mux.NewRouter()
    router.HandleFunc("/hello", helloHandler)

    server := &http.Server{
        Addr:    ":8080",
        Handler: router,
    }

    go func() {
        if err := server.ListenAndServe(); err != nil {
            log.Fatal(err)
        }
    }()

    fmt.Println("Server started")
}

func helloHandler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello, World!"))
}
Salin selepas log masuk

Apabila memulakan perkhidmatan, kod di atas menggunakan API Consul untuk mendaftarkan perkhidmatan dan mendaftarkan maklumat perkhidmatan termasuk ID, nama, alamat dan port ke Konsul. Dengan menjalankan program ini, anda boleh melihat perkhidmatan mikro berdaftar dalam senarai perkhidmatan Konsul.

Komunikasi tak segerak:

Dalam perkhidmatan mikro Golang, baris gilir mesej boleh digunakan untuk melaksanakan komunikasi tak segerak dan meningkatkan kebolehpercayaan dan prestasi sistem. Berikut ialah contoh kod menggunakan RabbitMQ sebagai perisian tengah mesej:

package main

import (
    "fmt"
    "log"

    "github.com/streadway/amqp"
)

func main() {
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        log.Fatal(err)
    }

    channel, err := conn.Channel()
    if err != nil {
        log.Fatal(err)
    }

    queue, err := channel.QueueDeclare(
        "hello",
        false,
        false,
        false,
        false,
        nil,
    )
    if err != nil {
        log.Fatal(err)
    }

    body := "Hello, World!"

    err = channel.Publish(
        "",
        queue.Name,
        false,
        false,
        amqp.Publishing{
            ContentType: "text/plain",
            Body:        []byte(body),
        },
    )

    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Message sent")
}
Salin selepas log masuk

Kod di atas bersambung ke RabbitMQ melalui perpustakaan amqp dan menghantar mesej ke baris gilir bernama "hello". Dengan menjalankan program ini, anda boleh melihat mesej yang dihantar dalam antara muka pengurusan RabbitMQ.

Toleransi kesalahan:

Toleransi kesalahan ialah aspek penting dalam seni bina perkhidmatan mikro Golang boleh mencapai toleransi kesalahan dengan menambahkan pemutus litar. Berikut ialah kod sampel yang menggunakan pemutus litar dalam pustaka go-kit untuk melaksanakan pemprosesan tahan kerosakan:

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/afex/hystrix-go/hystrix"
)

const commandName = "myCommand"

func main() {
    hystrix.ConfigureCommand(commandName, hystrix.CommandConfig{Timeout: 1000})

    for i := 0; i < 10; i++ {
        output := make(chan string, 1)
        hystrix.Go(commandName, func() error {
            // 模拟请求
            time.Sleep(200 * time.Millisecond)
            output <- "success"
            return nil
        }, func(err error) error {
            // 处理断路器打开后的逻辑
            output <- "failure"
            return nil
        })

        select {
        case res := <-output:
            fmt.Printf("Response: %s
", res)
        case <-time.After(time.Second * 1):
            fmt.Println("Timeout")
        }
    }

    // 关闭断路器
    hystrix.Flush()
}
Salin selepas log masuk

Kod di atas menggunakan pustaka hystrix untuk mengkonfigurasi pemutus litar bernama "myCommand" dan melaksanakannya melalui hystrix. Go berfungsi dalam blok kod perlindungan pemutus litar di bawah. Dalam blok kod, kami mensimulasikan operasi 200 milisaat yang memakan masa dan mengembalikan hasilnya melalui saluran keluaran. Dengan menjalankan program ini, anda dapat melihat bahawa apabila pemutus litar ditutup, semua permintaan berjaya dijawab apabila pemutus litar dibuka, permintaan akan gagal dengan cepat dan mengembalikan ralat.

Artikel ini memperkenalkan keperluan teras sokongan perkhidmatan mikro yang dibangunkan berdasarkan Golang melalui contoh kod terperinci, termasuk konkurensi tinggi, penskalaan anjal, penggunaan teragih, komunikasi tak segerak dan pemprosesan tahan kerosakan. Melalui contoh ini, pembaca boleh lebih memahami dan menggunakan seni bina perkhidmatan mikro Golang.

Atas ialah kandungan terperinci Apakah keperluan teras yang boleh dibangunkan oleh perkhidmatan mikro berdasarkan sokongan Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan