ทางเลือกอื่น: HashiCorp go-plugin
ปลั๊กอินที่ใช้ RPC เพื่อรองรับหลายแพลตฟอร์ม
ทางเลือกอื่น: 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานแพ็กเกจ plugin ของ Go
- การออกแบบ interface ของปลั๊กอิน
- การโหลดแบบไดนามิกและสัญลักษณ์
- ทางเลือกอื่น: HashiCorp go-plugin