blob: 2ae9fd37fa35e3caf76931e03bab0196ff75b263 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package server
import (
"net/http"
"strconv"
"sync"
)
import (
"github.com/apache/dubbo-go-pixiu/pkg/common/constant"
"github.com/apache/dubbo-go-pixiu/pkg/config"
"github.com/apache/dubbo-go-pixiu/pkg/logger"
"github.com/apache/dubbo-go-pixiu/pkg/model"
"github.com/apache/dubbo-go-pixiu/pkg/tracing"
)
var server *Server
// PX is Pixiu start struct
type Server struct {
startWG sync.WaitGroup
listenerManager *ListenerManager
clusterManager *ClusterManager
adapterManager *AdapterManager
// routerManager and apiConfigManager are duplicate, because route and dubbo-protocol api_config are a bit repetitive
routerManager *RouterManager
apiConfigManager *ApiConfigManager
dynamicResourceManger DynamicResourceManager
traceDriverManager *tracing.TraceDriverManager
}
func (s *Server) initialize(bs *model.Bootstrap) {
s.clusterManager = CreateDefaultClusterManager(bs)
s.routerManager = CreateDefaultRouterManager(s, bs)
s.apiConfigManager = CreateDefaultApiConfigManager(s, bs)
s.adapterManager = CreateDefaultAdapterManager(s, bs)
s.listenerManager = CreateDefaultListenerManager(bs)
s.dynamicResourceManger = createDynamicResourceManger(bs)
s.traceDriverManager = tracing.CreateDefaultTraceDriverManager(bs)
}
func (s *Server) GetClusterManager() *ClusterManager {
return s.clusterManager
}
func (s *Server) GetListenerManager() *ListenerManager {
return s.listenerManager
}
func (s *Server) GetRouterManager() *RouterManager {
return s.routerManager
}
func (s *Server) GetApiConfigManager() *ApiConfigManager {
return s.apiConfigManager
}
func (s *Server) GetDynamicResourceManager() DynamicResourceManager {
return s.dynamicResourceManger
}
func (s *Server) GetTraceDriverManager() *tracing.TraceDriverManager {
return s.traceDriverManager
}
// Start server start
func (s *Server) Start() {
conf := config.GetBootstrap()
s.startWG.Add(1)
defer func() {
if re := recover(); re != nil {
logger.Error(re)
}
}()
registerOtelMetricMeter(conf.Metric)
s.listenerManager.StartListen()
s.adapterManager.Start()
if conf.GetPprof().Enable {
addr := conf.GetPprof().Address.SocketAddress
if len(addr.Address) == 0 {
addr.Address = constant.PprofDefaultAddress
}
if addr.Port == 0 {
addr.Port = constant.PprofDefaultPort
}
go func() {
err := http.ListenAndServe(addr.Address+":"+strconv.Itoa(addr.Port), nil)
if err != nil {
logger.Warnf("Pprof server start failed, err: %v", err)
return
}
}()
logger.Infof("[dubbopixiu go pprof] httpListener start by : %s", addr.Address+":"+strconv.Itoa(addr.Port))
}
}
// NewServer create server
func NewServer() *Server {
return &Server{
startWG: sync.WaitGroup{},
}
}
func Start(bs *model.Bootstrap) {
logger.Infof("[dubbopixiu go] start by config : %+v", bs)
// global variable
server = NewServer()
server.initialize(bs)
server.Start()
server.startWG.Wait()
}
func GetServer() *Server {
return server
}
func GetClusterManager() *ClusterManager {
return server.GetClusterManager()
}
func GetRouterManager() *RouterManager {
return server.GetRouterManager()
}
func GetApiConfigManager() *ApiConfigManager {
return server.GetApiConfigManager()
}
func GetDynamicResourceManager() DynamicResourceManager {
return server.GetDynamicResourceManager()
}
func GetTraceDriverManager() *tracing.TraceDriverManager {
return server.traceDriverManager
}