feat: add Go migration compatibility foundation
This commit is contained in:
1 parent
7de3300034
commit
716a8031b1
27 files changed
+2582
No files matched your search
@@ -0,0 +1,79 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"git.nianxx.cn/wangxuming/NianAIGC/backend/internal/application"
|
||||
)
|
||||
|
||||
const shutdownTimeout = 10 * time.Second
|
||||
|
||||
func main() {
|
||||
if err := run(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func run() error {
|
||||
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
|
||||
defer stop()
|
||||
|
||||
app, err := application.New(application.Options{Context: ctx})
|
||||
if err != nil {
|
||||
return fmt.Errorf("initialize Go backend: %w", err)
|
||||
}
|
||||
defer app.Close()
|
||||
|
||||
server := &http.Server{
|
||||
Addr: listenAddress(os.Getenv),
|
||||
Handler: app.Handler(),
|
||||
ReadHeaderTimeout: 5 * time.Second,
|
||||
}
|
||||
|
||||
serveErr := make(chan error, 1)
|
||||
go func() {
|
||||
log.Printf("zhinian-api foundation listening on %s", server.Addr)
|
||||
serveErr <- server.ListenAndServe()
|
||||
}()
|
||||
|
||||
select {
|
||||
case err := <-serveErr:
|
||||
if errors.Is(err, http.ErrServerClosed) {
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("serve Go backend: %w", err)
|
||||
case <-ctx.Done():
|
||||
}
|
||||
|
||||
shutdownCtx, cancel := context.WithTimeout(context.Background(), shutdownTimeout)
|
||||
defer cancel()
|
||||
if err := server.Shutdown(shutdownCtx); err != nil {
|
||||
return fmt.Errorf("shut down Go backend: %w", err)
|
||||
}
|
||||
if err := <-serveErr; err != nil && !errors.Is(err, http.ErrServerClosed) {
|
||||
return fmt.Errorf("serve Go backend: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func listenAddress(getenv func(string) string) string {
|
||||
host := strings.TrimSpace(getenv("GO_BACKEND_HOST"))
|
||||
if host == "" {
|
||||
host = "127.0.0.1"
|
||||
}
|
||||
port := strings.TrimSpace(getenv("GO_BACKEND_PORT"))
|
||||
if port == "" {
|
||||
port = "8080"
|
||||
}
|
||||
return net.JoinHostPort(host, port)
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package main
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestListenAddressDefaultsToLoopbackAndSupportsExplicitBinding(t *testing.T) {
|
||||
if got := listenAddress(func(string) string { return "" }); got != "127.0.0.1:8080" {
|
||||
t.Fatalf("listenAddress(defaults) = %q", got)
|
||||
}
|
||||
values := map[string]string{"GO_BACKEND_HOST": "0.0.0.0", "GO_BACKEND_PORT": "9080"}
|
||||
if got := listenAddress(func(name string) string { return values[name] }); got != "0.0.0.0:9080" {
|
||||
t.Fatalf("listenAddress(explicit) = %q", got)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user