关于如何使用 Service Weaver 设置多个不同侦听器的问题
php小编小新在这里为大家介绍如何使用Service Weaver来设置多个不同侦听器的问题。Service Weaver是一个功能强大的工具,它允许开发人员创建和管理多个服务。通过设置不同的侦听器,我们可以实现对不同的服务进行监控和管理。在本文中,我们将详细讨论如何使用Service Weaver来配置和管理多个不同侦听器,以便更好地控制和优化我们的服务。无论您是初学者还是有经验的开发人员,本文都将为您提供详细的指导和实用的技巧。让我们一起来探索吧!
问题内容
我一直在使用 Service Weaver,它已经发布了一段时间,并且很好奇我们应该如何使用它设置多个侦听器。我的意图是,当我们部署应用程序时,web
的处理程序和 api
的处理程序单独运行(作为示例)。我的代码目前如下:
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
}
登录后复制