DevGang
Авторизоваться

Запуск плагинов Extism WebAssembly из приложения Go

В течение нескольких дней мы увидели, что можно разрабатывать плагины WebAssembly с помощью Extism Plugin Development Kit и запускать их с помощью Extism CLI. Сегодня пришло время перейти на следующий уровень: мы создадим приложение на Go, которое сможет загружать и запускать эти плагины так же, как это делает CLI.

Для этого мы будем использовать Host SDK от Extism для языка Go. Напоминаем, что Extism предоставляет Host SDK для многих языков (https://extism.org/docs/category/integrate-into-your-codebase).

Напомним, что хост-приложение - это приложение, которое, благодаря среде выполнения Wasm SDK, может запускать программы WebAssembly. Host SDK Extism — это «наложения» на Wasm SDK, которые упрощают вашу жизнь (избегайте сложной сантехники).

В настоящее время Extism использует среду выполнения WasmTime.

Говоря о этой проблеме (поддержка потоков WASI), то следует упомянуть о поддержке других сред выполнения Wasm и, в частности, Wazero.

Но довольно разговоров, давайте приступим к делу.

Предпосылки

Вам потребуется:

Создание приложения

Начните с создания файла go.mod с помощью команды go mod init go-host-application, затем файла main.go со следующим содержимым:

package main

import (
    "fmt"
    "github.com/extism/extism"
)

func main() {

    ctx := extism.NewContext()

    // This will free the context and all associated plugins
    defer ctx.Free() 

    // Path to the wasm file 0️⃣
    path := "../03-even-with-javascript/hello-js.wasm"

    // Define the path to the wasm file 1️⃣
    manifest := extism.Manifest{
        Wasm: []extism.Wasm{
            extism.WasmFile{
                Path: path},
        }}

    // Load the wasm plugin 2️⃣
    plugin, err := ctx.PluginFromManifest(
        manifest, 
        []extism.Function{}, 
        true,
    )

    if err != nil {
        panic(err)
    }

    // Call the `say_hello` function 3️⃣
    // with a string parameter
    res, err := plugin.Call(
        "say_hello",
        []byte("👋 Hello from the Go Host app 🤗"),
    )

    if err != nil {
        fmt.Println("😡", err)
    } else {
        // Display the return value 4️⃣
        fmt.Println("🙂", string(res))
    }

}

Видите ли, код прост:

  1. Давайте воспользуемся подключаемым модулем JavaScript Wasm, который мы разработали в предыдущей статье.
  2. Определите manifest со свойствами, включая путь к файлу Wasm.
  3. Загрузите плагин Wasm.
  4. Вызовите функцию say_hello плагина.
  5. Отобразите результат (тип res[]byte).

Запустите программу

Используйте просто эту команду:

LD_LIBRARY_PATH=/usr/local/lib go run main.go
Вам необходимо явно указать путь поиска компоновщика env var.

И вы получите это:

🙂 param: 👋 Hello from the Go Host app 🤗

Вы можете провести тест с первым плагином, разработанным с помощью TinyGo. Измените значение переменной path := "../01-simple-go-plugin/simple.wasm" и запустите снова:

LD_LIBRARY_PATH=/usr/local/lib go run main.go

И вы должны получить это:

🙂 👋 Hello 👋 Hello from the Go Host app 🤗

Видите ли, создавать приложения Go, которые запускают плагины Wasm, написанные на разных языках, очень просто.

Источник:

#Golang #Wasm
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу