feat: import services and standardize Go 1.26.5
This commit is contained in:
118
cmd/main/main.go
Normal file
118
cmd/main/main.go
Normal file
@@ -0,0 +1,118 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
"sort"
|
||||
"strings"
|
||||
"syscall"
|
||||
|
||||
ads "git.apinb.com/bsm-apps/ads/cmd/main"
|
||||
cloud "git.apinb.com/bsm-apps/cloud/cmd/main"
|
||||
cms "git.apinb.com/bsm-apps/cms/cmd/main"
|
||||
feedback "git.apinb.com/bsm-apps/feedback/cmd/main"
|
||||
fts "git.apinb.com/bsm-apps/fts/cmd/main"
|
||||
initial "git.apinb.com/bsm-apps/initial/cmd/main"
|
||||
logs "git.apinb.com/bsm-apps/logs/cmd/main"
|
||||
mgt "git.apinb.com/bsm-apps/mgt/cmd/main"
|
||||
passport "git.apinb.com/bsm-apps/passport/cmd/main"
|
||||
sender "git.apinb.com/bsm-apps/sender/cmd/main"
|
||||
address "git.apinb.com/bsm-ec/address/cmd/main"
|
||||
mall "git.apinb.com/bsm-ec/mall/cmd/main"
|
||||
market "git.apinb.com/bsm-ec/market/cmd/main"
|
||||
order "git.apinb.com/bsm-ec/order/cmd/main"
|
||||
wallet "git.apinb.com/bsm-finance/wallet/cmd/main"
|
||||
delivery "git.apinb.com/bsm-service-ec/delivery/cmd"
|
||||
)
|
||||
|
||||
type component struct {
|
||||
name string
|
||||
run func()
|
||||
}
|
||||
|
||||
var components = []component{
|
||||
{"ads", ads.Run},
|
||||
{"cloud", cloud.Run},
|
||||
{"cms", cms.Run},
|
||||
{"feedback", feedback.Run},
|
||||
{"fts", fts.Run},
|
||||
{"initial", initial.Run},
|
||||
{"logs", logs.Run},
|
||||
{"mgt", mgt.Run},
|
||||
{"passport", passport.Run},
|
||||
{"sender", sender.Run},
|
||||
{"address", address.Run},
|
||||
{"delivery", delivery.Run},
|
||||
{"mall", mall.Run},
|
||||
{"market", market.Run},
|
||||
{"order", order.Run},
|
||||
{"wallet", wallet.Run},
|
||||
}
|
||||
|
||||
func main() {
|
||||
selected, err := selectComponents(os.Getenv("BSM_SERVICES"))
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(2)
|
||||
}
|
||||
|
||||
failures := make(chan error, len(selected))
|
||||
for _, item := range selected {
|
||||
item := item
|
||||
go func() {
|
||||
defer func() {
|
||||
if value := recover(); value != nil {
|
||||
failures <- fmt.Errorf("component %s panicked: %v", item.name, value)
|
||||
}
|
||||
}()
|
||||
fmt.Printf("starting component %s\n", item.name)
|
||||
item.run()
|
||||
failures <- fmt.Errorf("component %s stopped unexpectedly", item.name)
|
||||
}()
|
||||
}
|
||||
|
||||
stop := make(chan os.Signal, 1)
|
||||
signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)
|
||||
select {
|
||||
case sig := <-stop:
|
||||
fmt.Printf("received %s, stopping monolith\n", sig)
|
||||
case err := <-failures:
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func selectComponents(raw string) ([]component, error) {
|
||||
if strings.TrimSpace(raw) == "" || strings.EqualFold(strings.TrimSpace(raw), "all") {
|
||||
return components, nil
|
||||
}
|
||||
|
||||
wanted := make(map[string]struct{})
|
||||
for _, name := range strings.Split(raw, ",") {
|
||||
name = strings.ToLower(strings.TrimSpace(name))
|
||||
if name != "" {
|
||||
wanted[name] = struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
selected := make([]component, 0, len(wanted))
|
||||
for _, item := range components {
|
||||
if _, ok := wanted[item.name]; ok {
|
||||
selected = append(selected, item)
|
||||
delete(wanted, item.name)
|
||||
}
|
||||
}
|
||||
if len(wanted) != 0 {
|
||||
unknown := make([]string, 0, len(wanted))
|
||||
for name := range wanted {
|
||||
unknown = append(unknown, name)
|
||||
}
|
||||
sort.Strings(unknown)
|
||||
return nil, fmt.Errorf("unknown BSM_SERVICES: %s", strings.Join(unknown, ", "))
|
||||
}
|
||||
if len(selected) == 0 {
|
||||
return nil, fmt.Errorf("BSM_SERVICES did not select any component")
|
||||
}
|
||||
return selected, nil
|
||||
}
|
||||
Reference in New Issue
Block a user