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") }
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!")) }
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!")) }
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") }
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() }
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!