Go Academy · บทเรียน

ทางเลือกอื่น: HashiCorp go-plugin

ปลั๊กอินที่ใช้ RPC เพื่อรองรับหลายแพลตฟอร์ม

บทเรียน 4 จาก 414 ขั้นตอน

ทางเลือกอื่น: HashiCorp go-plugin เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงควรใช้ go-plugin

แพ็กเกจปลั๊กอินแบบเนทีฟของ Go รองรับเฉพาะ Linux/macOS ต้องใช้รุ่นของการพึ่งพาที่เหมือนกัน และไม่สามารถยกเลิกการโหลดปลั๊กอินได้ HashiCorp go-plugin แก้ปัญหาเหล่านี้ด้วยการเรียกใช้ปลั๊กอินเป็นกระบวนการแยกที่สื่อสารผ่าน RPC (gRPC หรือ net/rpc)

สถาปัตยกรรม

go-plugin เรียกใช้ไบนารีปลั๊กอินเป็นกระบวนการย่อย โฮสต์จะเริ่มกระบวนการนั้น สร้างการเชื่อมต่อ gRPC/net/rpc และเรียกใช้ปลั๊กอินผ่านไคลเอ็นต์ที่สร้างขึ้น เมื่อโฮสต์สิ้นสุด กระบวนการปลั๊กอินจะถูกยุติ

การกำหนดอินเทอร์เฟซ

กำหนดอินเทอร์เฟซในแพ็กเกจที่ใช้ร่วมกัน จากนั้นจัดเตรียมบริดจ์ gRPC หรือ net/rpc

// shared/interface.go
type Greeter interface {
    Greet(name string) (string, error)
}

ฝั่งปลั๊กอิน

ปลั๊กอินนำอินเทอร์เฟซไปใช้งานและลงทะเบียนกับกลไกให้บริการของ go-plugin:

func main() {
    plugin.Serve(&plugin.ServeConfig{
        HandshakeConfig: Handshake,
        Plugins: map[string]plugin.Plugin{
            "greeter": &GreeterPlugin{Impl: &Greeter{}},
        },
        GRPCServer: plugin.DefaultGRPCServer,
    })
}

ฝั่งโฮสต์

โฮสต์เปิดกระบวนการย่อยของปลั๊กอินและรับอินเทอร์เฟซผ่านไคลเอ็นต์:

client := plugin.NewClient(&plugin.ClientConfig{
    HandshakeConfig: Handshake,
    Plugins:         PluginMap,
    Cmd:             exec.Command("./greeter-plugin"),
    AllowedProtocols: []plugin.Protocol{plugin.ProtocolGRPC},
})
rpcClient, _ := client.Client()
raw, _ := rpcClient.Dispense("greeter")
greeter := raw.(Greeter)

การกำหนดค่าแฮนด์เชก

HandshakeConfig ที่ใช้ร่วมกัน (คีย์และค่าคุกกี้วิเศษ) ป้องกันไม่ให้ไบนารีที่ไม่ใช่ปลั๊กอินถูกเปิดใช้งานโดยไม่ได้ตั้งใจในฐานะปลั๊กอิน:

var Handshake = plugin.HandshakeConfig{
    ProtocolVersion:  1,
    MagicCookieKey:   "GREETER_PLUGIN",
    MagicCookieValue: "hello",
}

ข้ามแพลตฟอร์ม

เนื่องจากปลั๊กอินเป็นกระบวนการแยกที่สื่อสารผ่าน TCP หรือซ็อกเก็ต Unix จึงสามารถคอมไพล์สำหรับแพลตฟอร์มใดก็ได้ โฮสต์และปลั๊กอินไม่จำเป็นต้องใช้ Go รุ่นเดียวกัน

การแยกความเสียหายจากการขัดข้อง

หากปลั๊กอินขัดข้อง โฮสต์จะได้รับข้อผิดพลาดในการเรียก RPC ครั้งถัดไป โฮสต์สามารถเริ่มกระบวนการย่อยของปลั๊กอินใหม่และเชื่อมต่ออีกครั้งได้โดยไม่ทำให้ตัวเองขัดข้อง

ประสิทธิภาพ

RPC ของ go-plugin เพิ่มความหน่วงเมื่อเทียบกับการเรียกฟังก์ชันภายในกระบวนการ (ไมโครวินาทีเทียบกับนาโนวินาที) เหมาะสมสำหรับการเรียกปลั๊กอินที่ไม่บ่อยแต่มีงานมาก และไม่เหมาะกับลูปที่ทำงานซ้ำบ่อย

การจัดการรุ่น

go-plugin รองรับการจัดการรุ่นของโพรโทคอล โฮสต์สามารถเจรจากับปลั๊กอินอินเทอร์เฟซหลายรุ่นพร้อมกันได้ ทำให้ทยอยอัปเกรดปลั๊กอินได้

การใช้งานจริง

go-plugin เป็นแกนหลักของผู้ให้บริการ Terraform กลไกข้อมูลลับของ Vault และเครื่องมือสร้างของ Packer ซึ่งเป็นระบบนิเวศขนาดใหญ่ที่มีปลั๊กอินจากชุมชน

ควรเลือกใช้เมื่อใด

เลือก go-plugin แทนปลั๊กอินแบบเนทีฟเมื่อจำเป็นต้องรองรับหลายแพลตฟอร์ม ต้องการแยกความเสียหายจากการขัดข้อง ไม่สามารถทำให้รุ่นของการพึ่งพาตรงกันได้ หรือปลั๊กอินเขียนโดยบุคคลภายนอก

ตรวจสอบอย่างรวดเร็ว

HashiCorp go-plugin แยกความเสียหายจากการขัดข้องได้อย่างไร

สรุป: HashiCorp go-plugin

ประเด็นสำคัญ:

  • ปลั๊กอินทำงานเป็นกระบวนการย่อยและสื่อสารผ่าน gRPC หรือ net/rpc
  • รองรับหลายแพลตฟอร์ม แยกความเสียหายจากการขัดข้อง และยืดหยุ่นต่อรุ่น
  • HandshakeConfig ป้องกันการเปิดไบนารีโดยไม่ได้ตั้งใจ
  • RPC มีค่าใช้จ่ายด้านประสิทธิภาพ จึงควรใช้กับการเรียกที่มีงานมากและไม่บ่อย
เริ่มต้นได้ฟรี

เรียนรู้ Go ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

คำถามที่พบบ่อย

บทเรียน “ทางเลือกอื่น: HashiCorp go-plugin” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ทางเลือกอื่น: HashiCorp go-plugin” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ทางเลือกอื่น: HashiCorp go-plugin”

ปลั๊กอินที่ใช้ RPC เพื่อรองรับหลายแพลตฟอร์ม คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ทางเลือกอื่น: HashiCorp go-plugin” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานแพ็กเกจ plugin ของ Go
  2. การออกแบบ interface ของปลั๊กอิน
  3. การโหลดแบบไดนามิกและสัญลักษณ์
  4. ทางเลือกอื่น: HashiCorp go-plugin
← กลับไปที่ Go Academy