Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Integrasi fungsi Golang dalam seni bina perkhidmatan mikro

Integrasi fungsi Golang dalam seni bina perkhidmatan mikro

王林
王林asal
2024-05-03 16:39:01980semak imbas

Mengintegrasikan fungsi Go dalam seni bina perkhidmatan mikro boleh dicapai dengan mengikut langkah berikut: Cipta fungsi Go bebas. Pakej berfungsi ke dalam binari. Panggil fungsi yang disusun melalui Exec یا GRPC dalam perkhidmatan mikro. Dalam kes sebenar, perkhidmatan mikro menggunakan fungsi ProcessData untuk mendarab setiap nombor dalam senarai integer dengan 2, yang dilaksanakan dengan memanggil fail binari myfunction.

Integrasi fungsi Golang dalam seni bina perkhidmatan mikro

Mengintegrasikan fungsi Go dalam seni bina perkhidmatan mikro

Dalam seni bina perkhidmatan mikro, adalah penting untuk menyepadukan fungsi bebas ke dalam perkhidmatan dengan lancar. Bahasa Go menyediakan mekanisme yang berkuasa untuk menyepadukan fungsi Artikel ini akan meneroka cara melakukan ini dengan contoh praktikal.

1 Buat fungsi Golang

Gunakan func untuk mencipta fungsi Go kendiri yang menerima input dan menjana output. Contohnya: func 创建一个独立的 Go 函数,它接收输入并生成输出。例如:

package mypkg

func ProcessData(data []int) []int {
    // 处理数据的函数
    result := []int{}
    for _, v := range data {
        result = append(result, v*2)
    }
    return result
}

2. 将函数打包为二进制文件

将函数编译为独立的二进制文件,方法是使用 go build 命令:

go build -o myfunction mypkg/myfunction.go

3. 在微服务中调用函数

微服务可以通过以下方式调用已编译的函数:

a. Exec:

这涉及直接在微服务代码中执行函数二进制文件。例如,在 Go 中:

import (
    "bytes"
    "fmt"
    "os/exec"
)

func main() {
    cmd := exec.Command("./myfunction", "1", "2", "3")
    var out bytes.Buffer
    cmd.Stdout = &out
    cmd.Run()
    fmt.Print(out.String())
}

b. 使用 GRPC:

这是通过 gRPC 创建远程函数调用的更强大且高效的方法。使用 net/rpc 包来设置 RPC 服务器和客户端,如下所示:

// 服务端
package main

import (
    "fmt"
    "net/rpc"
)

type Args struct {
    A, B int
}

func main() {
    rpc.Register(new(Calc))
    rpc.HandleHTTP()
    fmt.Print("Server listening...")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        fmt.Println(err)
    }
}

// 客户端
package main

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

type Args struct {
    A, B int
}

func main() {
    client, err := rpc.DialHTTP("tcp", "localhost:8080")
    if err != nil {
        log.Fatal(err)
    }
    args := &Args{7, 8}
    var sum int
    err = client.Call("Calc.Add", args, &sum)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Sum: %d", sum)
}

实战案例:

假设有一个微服务,用于处理来自客户端的整数列表,并将其中的每个数字乘以 2。我们可以使用上面的 ProcessData 函数来实现此功能:

在微服务代码中:

package main

import (
    "fmt"
    "os/exec"
    "bytes"
    "strconv"
)

func main() {
    numbers := []int{1, 2, 3}
    var inputStr string
    for _, v := range numbers {
        inputStr += strconv.Itoa(v) + " "
    }
    cmd := exec.Command("./myfunction", inputStr)
    var out bytes.Buffer
    cmd.Stdout = &out
    cmd.Run()
    result := out.String()
    fmt.Print(result)
}

微服务现在将调用已编译的 myfunctionrrreee

🎜2. Pakej berfungsi sebagai perduaan 🎜🎜🎜Kompilasi fungsi ke dalam perduaan kendiri dengan menggunakan perintah go build: 🎜rrreee🎜🎜3 Dalam Fungsi Panggilan Mikroservis🎜 memanggil fungsi yang disusun melalui: 🎜🎜🎜a. Exec: 🎜🎜🎜Ini melibatkan pelaksanaan binari fungsi secara langsung dalam kod perkhidmatan mikro. Contohnya, dalam Go: 🎜rrreee🎜🎜b Menggunakan GRPC: 🎜🎜🎜Ini ialah cara yang lebih berkuasa dan cekap untuk membuat panggilan fungsi jauh melalui gRPC. Gunakan pakej net/rpc untuk menyediakan pelayan RPC dan klien seperti berikut: 🎜rrreee🎜🎜Contoh praktikal: 🎜🎜🎜Andaikan terdapat perkhidmatan mikro yang mengendalikan senarai integer daripada klien, dan Darab setiap nombor di dalamnya dengan 2. Kita boleh melaksanakan ini menggunakan fungsi ProcessData di atas: 🎜🎜Dalam kod mikroperkhidmatan: 🎜rrreee🎜Perkhidmatan mikro kini akan memanggil binari myfunction yang disusun, yang akan Melipatgandakan senarai input dengan 2 dan kembalikan hasilnya. 🎜

Atas ialah kandungan terperinci Integrasi fungsi Golang dalam seni bina 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