Inhaltsverzeichnis
Frageninhalt
Workaround
Details
Heim Backend-Entwicklung Golang Frage zum Einrichten mehrerer verschiedener Listener mit Service Weaver

Frage zum Einrichten mehrerer verschiedener Listener mit Service Weaver

Feb 14, 2024 pm 01:57 PM

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

Der PHP-Editor Xiaoxin ist hier, um Ihnen vorzustellen, wie Sie mit Service Weaver mehrere verschiedene Listener einrichten. Service Weaver ist ein leistungsstarkes Tool, mit dem Entwickler mehrere Dienste erstellen und verwalten können. Durch die Einrichtung verschiedener Listener können wir verschiedene Dienste überwachen und verwalten. In diesem Artikel besprechen wir ausführlich, wie Sie mit Service Weaver mehrere verschiedene Listener konfigurieren und verwalten, um unsere Dienste besser steuern und optimieren zu können. Egal, ob Sie Anfänger oder erfahrener Entwickler sind, dieser Artikel bietet Ihnen detaillierte Anleitungen und praktische Tipps. Lasst uns gemeinsam erkunden!

Frageninhalt

Ich verwende Service Weaver, das seit einiger Zeit veröffentlicht wird, und war neugierig, wie wir damit mehrere Listener einrichten sollten. Meine Absicht ist, dass bei der Bereitstellung der Anwendung der Handler für web 的处理程序和 api alleine läuft (als Beispiel). Mein Code sieht derzeit so aus:

<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>
Nach dem Login kopieren

Im Grunde habe ich einfach zwei Echo-Server eingerichtet, einen für jede Komponente.

Für das, was es wert ist, hier ist meine Konfiguration:

<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>
Nach dem Login kopieren

Wenn ich es in einem einzigen Prozess ausführe, scheint alles wie erwartet zu funktionieren. Ich sehe Protokolleinträge für Netzwerkanfragen, die darauf hinweisen, dass alles in Ordnung ist. Wenn ich es im Bereitstellungsmodus ausführe (also tatsächlich die Multiprozess-Magie ausführe), kann ich nur 1-2 Anfragen stellen, bevor ich einen Protokolleintrag wie diesen sehe, und dann funktioniert die Antwort nicht sehr oft:

2023/09/14 21:35:51 http: proxy error: context canceled
Nach dem Login kopieren

Sieht so aus, als ob ich etwas falsch mache, aber es scheint, dass dies ein Anwendungsfall ist, der in irgendeiner Weise unterstützt würde, also frage ich mich, ob es einen geeigneten Weg gibt, dieses Problem zu lösen.

Danke!

Workaround

tl;dr Service Weaver Es gibt derzeit keine gute Möglichkeit, einen HTTP-Server von einer Nicht-Hauptkomponente aus auszuführen. Ich empfehle, dass Sie die beiden Listener innerhalb der Server 结构,并在 Serve-Funktion verschieben, um die beiden HTTP-Server auszuführen. HTTP-Server können Methoden anderer Komponenten aufrufen.

type Server struct {
    weaver.Implements[weaver.Main]
    api weaver.Listener
    web weaver.Listener
}
Nach dem Login kopieren

Details

weaver multi 部署程序将每个组件复制两次,每个副本都在自己的操作系统进程中运行。考虑当 APIServer 组件请求端口 12345 上的网络侦听器时会发生什么。 APIServer 组件的两个副本不能同时侦听端口 12345;只有一个操作系统进程可以侦听该端口。为了解决这个问题,两个副本分别侦听随机选择的端口,例如 8000 和 9000。然后 weaver multi Der Deployer führt einen HTTP-Proxy auf Port 12345 aus und leitet Anfragen an die Ports 8000 und 9000 weiter.

In Ihrer Anwendung führt eine Kopie des Masters Server 组件被复制两次,并且 Serve 函数运行两次,每个副本运行一次。在 Serve 内部,当您调用 apiServer.Get().Serve(context.Background()) 时,会随机选择 APIServer 的副本来执行 Serve 方法。如果幸运的话,这两个方法调用被发送到两个不同的副本,那么一切都应该顺利运行。但是,如果两个方法调用都发送到同一个副本,则 APIServer einen HTTP-Server aus und die andere nicht.

In diesem Fall leitet der Proxy die Hälfte aller Anfragen an den laufenden HTTP-Server und die andere Hälfte an den nicht abgehörten Listener weiter. Dadurch werden Proxy-Fehler angezeigt.

Bitte beachten Sie abschließend, dass beim Ausführen der Anwendung mit go runweaver single deploy alles einwandfrei funktioniert, da kein Proxy vorhanden ist und die Komponenten nicht kopiert werden.

Das obige ist der detaillierte Inhalt vonFrage zum Einrichten mehrerer verschiedener Listener mit Service Weaver. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich? GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich?

Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren? Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren? Mar 03, 2025 pm 05:22 PM

Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren?

Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache? Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache? Mar 03, 2025 pm 05:18 PM

Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache?

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Mar 10, 2025 pm 03:20 PM

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren?

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Mar 10, 2025 pm 05:38 PM

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go?

Wie schreibt man Unit -Tests in Go? Wie schreibt man Unit -Tests in Go? Mar 21, 2025 pm 06:34 PM

Wie schreibt man Unit -Tests in Go?

Wie schreibe ich Dateien in Go Language bequem? Wie schreibe ich Dateien in Go Language bequem? Mar 03, 2025 pm 05:15 PM

Wie schreibe ich Dateien in Go Language bequem?

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Mar 10, 2025 pm 05:36 PM

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen?

See all articles