


Soalan tentang cara menyediakan berbilang pendengar berbeza menggunakan 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 run
或 weaver 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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah?

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego?

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go?

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO?

Bagaimana saya menulis objek dan stub untuk ujian di GO?

Bagaimana anda menulis ujian unit di GO?

Bagaimana cara menulis fail dalam bahasa Go dengan mudah?

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya?
