diff --git a/cmd/main.go b/cmd/main.go index 4eed07cae..e43636398 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -3,6 +3,7 @@ package main import ( "bytes" "context" + "errors" "flag" "fmt" "net" @@ -12,6 +13,7 @@ import ( "path/filepath" "reflect" "runtime" + "strconv" "strings" "sync" "syscall" @@ -41,6 +43,7 @@ import ( "github.com/openimsdk/tools/log" "github.com/openimsdk/tools/system/program" "github.com/openimsdk/tools/utils/datautil" + "github.com/openimsdk/tools/utils/network" ) func init() { @@ -75,6 +78,7 @@ func main() { putCmd(cmd, true, msgtransfer.Start) putCmd(cmd, true, api.Start) putCmd(cmd, true, cron.Start) + putCmd(cmd, true, startRedisServerRegister) ctx := context.Background() if err := cmd.run(ctx); err != nil { _, _ = fmt.Fprintf(os.Stderr, "server exit %s", err) @@ -434,3 +438,36 @@ func (x *cmdManger) Running() []string { } return names } + +type serverConfig struct { + API config.API + Share config.Share + RedisConfig config.Redis + Index config.Index +} + +func startRedisServerRegister(ctx context.Context, cfg *serverConfig, client discovery.SvcDiscoveryRegistry, service grpc.ServiceRegistrar) error { + apiPort, err := datautil.GetElemByIndex(cfg.API.Api.Ports, int(cfg.Index)) + if err != nil { + return err + } + if apiPort <= 0 { + return errors.New("standalone api port is 0") + } + registerIP, err := network.GetRpcRegisterIP(cfg.API.Api.RegisterIP) + if err != nil { + return err + } + addr := net.JoinHostPort(registerIP, strconv.Itoa(apiPort)) + inprocess.SetLocalTarget(addr) + timer := time.NewTimer(time.Second * 5) + defer timer.Stop() + for { + select { + case <-timer.C: + case <-ctx.Done(): + return context.Cause(ctx) + } + + } +} diff --git a/config/openim-api.yml b/config/openim-api.yml index 89be50123..a879fcb1e 100644 --- a/config/openim-api.yml +++ b/config/openim-api.yml @@ -3,6 +3,8 @@ api: listenIP: 0.0.0.0 # Listening ports; if multiple are configured, multiple instances will be launched, must be consistent with the number of prometheus.ports ports: [ 10002 ] + # Fallback for IP resolution issues in multi-instance standalone mode. + # registerIP: # API compression level; 0: default compression, 1: best compression, 2: best speed, -1: no compression compressionLevel: 0 diff --git a/internal/api/init.go b/internal/api/init.go index f3548e29a..77011d0ad 100644 --- a/internal/api/init.go +++ b/internal/api/init.go @@ -23,13 +23,14 @@ import ( "strconv" "time" + "google.golang.org/grpc" + conf "github.com/openimsdk/open-im-server/v3/pkg/common/config" "github.com/openimsdk/tools/discovery" "github.com/openimsdk/tools/log" "github.com/openimsdk/tools/utils/datautil" "github.com/openimsdk/tools/utils/network" "github.com/openimsdk/tools/utils/runtimeenv" - "google.golang.org/grpc" ) type Config struct { @@ -77,18 +78,6 @@ func Start(ctx context.Context, config *Config, client discovery.SvcDiscoveryReg apiCancel(err) }() - //if config.Discovery.Enable == conf.ETCD { - // cm := disetcd.NewConfigManager(client.(*etcd.SvcDiscoveryRegistryImpl).GetClient(), config.GetConfigNames()) - // cm.Watch(ctx) - //} - //sigs := make(chan os.Signal, 1) - //signal.Notify(sigs, syscall.SIGTERM) - //select { - //case val := <-sigs: - // log.ZDebug(ctx, "recv exit", "signal", val.String()) - // cancel(fmt.Errorf("signal %s", val.String())) - //case <-ctx.Done(): - //} <-apiCtx.Done() exitCause := context.Cause(apiCtx) log.ZWarn(ctx, "api server exit", exitCause) diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index dbcf57f20..8ec648359 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -142,6 +142,7 @@ type API struct { Api struct { ListenIP string `yaml:"listenIP"` Ports []int `yaml:"ports"` + RegisterIP string `yaml:"registerIP"` CompressionLevel int `yaml:"compressionLevel"` } `yaml:"api"` Prometheus struct {