Cara menggunakan bahasa Go untuk pembangunan perkhidmatan mikro
Pengenalan:
Dengan pembangunan pengkomputeran awan dan teknologi kontena, corak seni bina perkhidmatan mikro menjadi semakin popular dalam industri pembangunan perisian hari ini. Seni bina Microservices menyediakan kebolehskalaan yang lebih besar, fleksibiliti penggunaan dan kebolehselenggaraan kod dengan membahagikan aplikasi yang besar kepada perkhidmatan yang kecil dan bebas. Sebagai bahasa pengaturcaraan yang ringan dan cekap, bahasa Go sangat sesuai untuk membina perkhidmatan mikro.
Artikel ini akan memperkenalkan cara menggunakan bahasa Go untuk membangunkan perkhidmatan mikro, termasuk mencipta perkhidmatan, melaksanakan komunikasi antara perkhidmatan, mengurus penemuan perkhidmatan dan pengimbangan beban serta memberikan contoh kod yang sepadan.
1. Cipta perkhidmatan
Mencipta perkhidmatan mikro menggunakan bahasa Go adalah sangat mudah. Kami boleh menentukan pelayan HTTP dan mendengar port yang ditentukan, dan kemudian mengendalikan permintaan yang berbeza dalam penghalaan.
Berikut ialah contoh kod ringkas untuk mencipta perkhidmatan mikro Hello World:
package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World!") } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }
Dalam kod di atas, kami menggunakan kaedah http.HandleFunc
untuk menentukan laluan semasa mengakses laluan akar "/" , fungsi handler
akan dipanggil untuk mengendalikan permintaan. Akhir sekali, gunakan kaedah http.ListenAndServe
untuk mendengar port 8080 dan mula menyediakan perkhidmatan. http.HandleFunc
方法来指定路由,当访问根路径"/"时,会调用handler
函数来处理请求。最后使用http.ListenAndServe
方法监听端口8080,开始提供服务。
二、服务间通信
微服务架构中,不同的服务需要进行相互的通信。可以使用HTTP、gRPC、AMQP等协议进行通信。这里以HTTP为例演示服务间的HTTP通信。
在这个示例中,我们有两个微服务:service1
和service2
,两个服务分别运行在不同的端口上。service1
向service2
发起HTTP请求,然后接收并打印出service2
返回的数据。
service1:
package main import ( "fmt" "io/ioutil" "log" "net/http" ) func main() { resp, err := http.Get("http://localhost:8081") if err != nil { log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(string(body)) }
service2:
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello from service2!") }) http.ListenAndServe(":8081", nil) }
在上面的代码中,service1
通过http.Get
方法向service2
发起GET请求,获取到返回的数据后打印出来。而service2
则通过http.HandleFunc
Dalam seni bina perkhidmatan mikro, perkhidmatan yang berbeza perlu berkomunikasi antara satu sama lain. Protokol seperti HTTP, gRPC, AMQP, dsb. boleh digunakan untuk komunikasi. Di sini, HTTP digunakan sebagai contoh untuk menunjukkan komunikasi HTTP antara perkhidmatan.
service1
dan service2
Kedua-dua perkhidmatan ini dijalankan pada port yang berbeza. service1
memulakan permintaan HTTP untuk service2
, dan kemudian menerima dan mencetak data yang dikembalikan oleh service2
. service1: package main import ( "fmt" "log" "net/http" "strings" "github.com/hashicorp/consul/api" ) func main() { config := api.DefaultConfig() client, err := api.NewClient(config) if err != nil { log.Fatal(err) } datacenters, err := client.Catalog().Datacenters() if err != nil { log.Fatal(err) } service := "my-service" healthyOnly := true // 获取指定服务的健康节点 nodes, _, err := client.Health().ServiceMultipleTags(service, []string{}, healthyOnly, &api.QueryOptions{Datacenters: datacenters}) if err != nil { log.Fatal(err) } // 构建URL列表 urls := make([]string, len(nodes)) for i, node := range nodes { urls[i] = fmt.Sprintf("http://%s:%d", node.Node.Address, node.Service.Port) } // 调用服务 for _, url := range urls { resp, err := http.Get(url) if err != nil { log.Printf("Error requesting service: %s ", err) } else { defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) log.Printf("Response from service: %s ", string(body)) } } }
rrreee
Dalam kod di atas, service1
memulakan permintaan GET ke service2
melalui http.Get
kaedah , cetaknya selepas mendapat data yang dikembalikan. Dan service2
menentukan fungsi pemprosesan penghalaan untuk mengendalikan permintaan melalui kaedah http.HandleFunc
.
3. Penemuan perkhidmatan dan pengimbangan beban
Dalam seni bina perkhidmatan mikro, bilangan perkhidmatan biasanya besar dan akan meningkat atau berkurangan secara dinamik. Untuk menemui dan memanggil perkhidmatan ini secara dinamik, kami boleh menggunakan penemuan perkhidmatan dan mekanisme pengimbangan beban.Atas ialah kandungan terperinci Cara menggunakan bahasa Go untuk pembangunan perkhidmatan mikro. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!