我一直在玩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
}
基本上,我只是设置了两个Echo服务器,每个组件一个.
无论如何,以下是我的配置:
[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" }
当我在单个进程中运行它时,一切似乎都像预期的那样工作.我看到Web请求的日志(log)条目,表明一切正常.当我在部署模式下运行它时(即,实际上正在执行多进程魔术),在看到如下所示的日志(log)条目之前,我只能发出1-2个请求,然后响应通常不起作用:
2023/09/14 21:35:51 http: proxy error: context canceled
看起来我似乎做错了什么,但这似乎是一个会以某种方式得到支持的用例,所以我想知道是否有合适的方法来解决这一问题.
谢谢!