Rumah > Artikel > pembangunan bahagian belakang > 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!
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!
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 }
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!