Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Soalan tentang cara menyediakan berbilang pendengar berbeza menggunakan Service Weaver

Soalan tentang cara menyediakan berbilang pendengar berbeza menggunakan Service Weaver

王林
王林ke hadapan
2024-02-14 13:57:07465semak imbas

关于如何使用 Service Weaver 设置多个不同侦听器的问题

Editor PHP Xiaoxin di sini untuk memperkenalkan kepada anda cara menggunakan Service Weaver untuk menyediakan berbilang pendengar yang berbeza. Service Weaver ialah alat berkuasa yang membolehkan pembangun mencipta dan mengurus berbilang perkhidmatan. Dengan menetapkan pendengar yang berbeza, kami boleh memantau dan mengurus perkhidmatan yang berbeza. Dalam artikel ini, kami akan membincangkan secara terperinci cara menggunakan Service Weaver untuk mengkonfigurasi dan mengurus berbilang pendengar berbeza untuk mengawal dan mengoptimumkan perkhidmatan kami dengan lebih baik. Sama ada anda seorang pemula atau pembangun berpengalaman, artikel ini akan memberikan anda panduan terperinci dan petua praktikal. Mari kita meneroka bersama-sama!

Kandungan soalan

Saya telah menggunakan Service Weaver, yang telah dikeluarkan untuk seketika, dan ingin tahu cara kami harus menggunakannya untuk menyediakan berbilang pendengar. Niat saya ialah apabila kita menggunakan aplikasi, pengendali untuk web 的处理程序和 api berjalan sendiri (sebagai contoh). Kod saya pada masa ini kelihatan seperti ini:

<code>package main

import (
    "context"
    "log"
    "sync"

    "github.com/ServiceWeaver/weaver"
    "github.com/labstack/echo/v4"
    "github.com/labstack/echo/v4/middleware"
)

type Server struct {
    weaver.Implements[weaver.Main]
    apiServer weaver.Ref[APIServer]
    webServer weaver.Ref[WebServer]
}

type APIServer interface {
    Serve(context.Context) error
}

type apiServer struct {
    weaver.Implements[APIServer]
    api weaver.Listener
}

func (a apiServer) Serve(ctx context.Context) error {
    logger := a.Logger(ctx)
    e := echo.New()
    e.Listener = a.api

    e.Use(middleware.RequestID())

    e.Use(middleware.RequestLoggerWithConfig(middleware.RequestLoggerConfig{
        LogStatus: true,
        LogURI:    true,
        LogValuesFunc: func(c echo.Context, v middleware.RequestLoggerValues) error {
            logger.Info("Request", "id", v.RequestID, "uri", v.URI, "status", v.Status, "size", v.ResponseSize)
            return nil
        },
    }))

    return e.Start("")
}

type WebServer interface {
    Serve(context.Context) error
}

type webServer struct {
    weaver.Implements[WebServer]
    web weaver.Listener
}

func (w webServer) Serve(ctx context.Context) error {
    logger := w.Logger(ctx)
    e := echo.New()
    e.Listener = w.web

    e.Use(middleware.RequestID())

    e.Use(middleware.RequestLoggerWithConfig(middleware.RequestLoggerConfig{
        LogStatus: true,
        LogURI:    true,
        LogValuesFunc: func(c echo.Context, v middleware.RequestLoggerValues) error {
            logger.Info("Request", "id", v.RequestID, "uri", v.URI, "status", v.Status, "size", v.ResponseSize)
            return nil
        },
    }))

    return e.Start("")
}

func main() {
    if err := weaver.Run(context.Background(), serve); err != nil {
        log.Fatal(err)
    }
}

func serve(ctx context.Context, server *Server) error {
    wg := sync.WaitGroup{}
    wg.Add(2)

    go func() {
        defer wg.Done()
        server.apiServer.Get().Serve(context.Background())
    }()

    go func() {
        defer wg.Done()
        server.webServer.Get().Serve(context.Background())
    }()

    wg.Wait()

    return nil
}
</code>

Pada asasnya, saya hanya menyediakan dua pelayan Echo, satu untuk setiap komponen.

Untuk nilainya, berikut ialah konfigurasi saya:

<code>[serviceweaver]
binary = "./platform"

[multi]
listeners.api = { address = "localhost:12345" }
listeners.web = { address = "localhost:54321" }

[single]
listeners.api = { address = "localhost:12345" }
listeners.web = { address = "localhost:54321" }
</code>

Apabila saya menjalankannya dalam satu proses, semuanya kelihatan berfungsi seperti yang diharapkan. Saya melihat entri log untuk permintaan rangkaian yang menunjukkan bahawa semuanya baik-baik saja. Apabila saya menjalankannya dalam mod penggunaan (iaitu, sebenarnya melakukan keajaiban berbilang proses) saya hanya boleh membuat 1-2 permintaan sebelum saya melihat entri log seperti ini, dan kemudian respons tidak berfungsi dengan kerap:

2023/09/14 21:35:51 http: proxy error: context canceled

Nampaknya saya melakukan sesuatu yang salah, tetapi nampaknya ini adalah kes penggunaan yang akan disokong dalam beberapa cara, jadi saya tertanya-tanya sama ada terdapat cara yang betul untuk menyelesaikan masalah ini.

Terima kasih!

Penyelesaian

tl;dr Service Weaver Pada masa ini tiada cara yang baik untuk menjalankan pelayan HTTP daripada komponen bukan utama. Saya syorkan anda memindahkan dua pendengar di dalam fungsi Server 结构,并在 Serve untuk menjalankan dua pelayan HTTP. Pelayan HTTP boleh memanggil kaedah pada komponen lain.

type Server struct {
    weaver.Implements[weaver.Main]
    api weaver.Listener
    web weaver.Listener
}

Butiran

weaver multi 部署程序将每个组件复制两次,每个副本都在自己的操作系统进程中运行。考虑当 APIServer 组件请求端口 12345 上的网络侦听器时会发生什么。 APIServer 组件的两个副本不能同时侦听端口 12345;只有一个操作系统进程可以侦听该端口。为了解决这个问题,两个副本分别侦听随机选择的端口,例如 8000 和 9000。然后 weaver multi Penyerahan menjalankan proksi HTTP pada port 12345, memajukan permintaan ke port 8000 dan 9000.

Dalam aplikasi anda, satu salinan induk Server 组件被复制两次,并且 Serve 函数运行两次,每个副本运行一次。在 Serve 内部,当您调用 apiServer.Get().Serve(context.Background()) 时,会随机选择 APIServer 的副本来执行 Serve 方法。如果幸运的话,这两个方法调用被发送到两个不同的副本,那么一切都应该顺利运行。但是,如果两个方法调用都发送到同一个副本,则 APIServer sedang menjalankan pelayan HTTP dan satu lagi tidak.

Dalam kes ini, proksi memajukan separuh daripada semua permintaan ke pelayan HTTP yang sedang berjalan dan separuh lagi kepada pendengar yang tidak mendengar. Ini akan menyebabkan anda melihat ralat proksi.

Akhir sekali, sila ambil perhatian bahawa apabila anda menjalankan aplikasi menggunakan go runweaver single deploy semuanya berfungsi dengan baik kerana tiada proksi dan komponen tidak disalin.

Atas ialah kandungan terperinci Soalan tentang cara menyediakan berbilang pendengar berbeza menggunakan Service Weaver. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam