Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan bahasa Go untuk pembangunan perkhidmatan mikro

Cara menggunakan bahasa Go untuk pembangunan perkhidmatan mikro

PHPz
PHPzasal
2023-08-04 17:06:161607semak imbas

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通信。

在这个示例中,我们有两个微服务:service1service2,两个服务分别运行在不同的端口上。service1service2发起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

2. Komunikasi antara perkhidmatan

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.

Dalam contoh ini, kami mempunyai dua perkhidmatan mikro: 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))
        }
    }
}

service2:

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.
  1. Dalam bahasa Go, anda boleh menggunakan alatan seperti Consul dan etcd untuk penemuan perkhidmatan. Di sini, Konsul digunakan sebagai contoh untuk menunjukkan penggunaan penemuan perkhidmatan dan pengimbangan beban.
  2. rrreee
  3. Dalam kod di atas, kami menggunakan perpustakaan pelanggan Consul's Go untuk mendapatkan nod yang sihat bagi perkhidmatan yang ditentukan dan membina senarai URL. Kemudian buat permintaan kepada setiap URL secara bergilir-gilir dan cetak data yang dikembalikan.
Kesimpulan: 🎜Artikel ini memperkenalkan cara menggunakan bahasa Go untuk pembangunan perkhidmatan mikro, termasuk mencipta perkhidmatan, komunikasi antara perkhidmatan, penemuan perkhidmatan dan pengimbangan beban. Saya harap artikel ini dapat membantu pembaca menggunakan bahasa Go dengan lebih baik untuk membina sistem perkhidmatan mikro yang cekap dan berskala. 🎜🎜Rujukan: 🎜🎜🎜https://golang.org/🎜🎜https://github.com/hashicorp/consul/--🎜🎜

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!

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