Skip to content

Commit f55dc1d

Browse files
authored
Merge pull request #507 from TarsCloud/lbbniu/perf/config
perf: optimize service configuration file parse
2 parents f4adeb5 + cf84518 commit f55dc1d

File tree

1 file changed

+70
-62
lines changed

1 file changed

+70
-62
lines changed

tars/application.go

+70-62
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ func init() {
8383
func newApp() *application {
8484
return &application{
8585
opt: &options{},
86+
cltCfg: newClientConfig(),
87+
svrCfg: newServerConfig(),
8688
tarsConfig: make(map[string]*transport.TarsServerConf),
8789
goSvrs: make(map[string]*transport.TarsServer),
8890
httpSvrs: make(map[string]*http.Server),
@@ -123,8 +125,6 @@ func (a *application) initConfig() {
123125
})
124126
}()
125127
}()
126-
a.svrCfg = newServerConfig()
127-
a.cltCfg = newClientConfig()
128128
if ServerConfigPath == "" {
129129
svrFlag := flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
130130
svrFlag.StringVar(&ServerConfigPath, "config", "", "server config path")
@@ -140,9 +140,32 @@ func (a *application) initConfig() {
140140
TLOG.Errorf("Parse server config fail %v", err)
141141
return
142142
}
143+
144+
// parse config
145+
a.parseServerConfig(c)
146+
a.parseClientConfig(c)
143147
a.conf = c
144148

145-
// Config.go
149+
cachePath := filepath.Join(a.svrCfg.DataPath, a.svrCfg.Server) + ".tarsdat"
150+
if cacheData, err := os.ReadFile(cachePath); err == nil {
151+
_ = json.Unmarshal(cacheData, &a.appCache)
152+
}
153+
// cache
154+
a.appCache.TarsVersion = Version
155+
if a.svrCfg.LogLevel == "" {
156+
a.svrCfg.LogLevel = a.appCache.LogLevel
157+
} else {
158+
a.appCache.LogLevel = a.svrCfg.LogLevel
159+
}
160+
rogger.SetLevel(rogger.StringToLevel(a.svrCfg.LogLevel))
161+
if a.svrCfg.LogPath != "" {
162+
_ = TLOG.SetFileRoller(a.svrCfg.LogPath+"/"+a.svrCfg.App+"/"+a.svrCfg.Server, int(a.svrCfg.LogNum), int(a.svrCfg.LogSize))
163+
}
164+
protocol.SetMaxPackageLength(a.svrCfg.MaxPackageLength)
165+
_, _ = maxprocs.Set(maxprocs.Logger(TLOG.Infof))
166+
}
167+
168+
func (a *application) parseServerConfig(c *conf.Conf) {
146169
// init server config
147170
if strings.EqualFold(c.GetString("/tars/application<enableset>"), "Y") {
148171
a.svrCfg.Enableset = true
@@ -173,24 +196,6 @@ func (a *application) initConfig() {
173196
// add adapters config
174197
a.svrCfg.Adapters = make(map[string]adapterConfig)
175198

176-
cachePath := filepath.Join(a.svrCfg.DataPath, a.svrCfg.Server) + ".tarsdat"
177-
if cacheData, err := os.ReadFile(cachePath); err == nil {
178-
_ = json.Unmarshal(cacheData, &a.appCache)
179-
}
180-
181-
if a.svrCfg.LogLevel == "" {
182-
a.svrCfg.LogLevel = a.appCache.LogLevel
183-
} else {
184-
a.appCache.LogLevel = a.svrCfg.LogLevel
185-
}
186-
rogger.SetLevel(rogger.StringToLevel(a.svrCfg.LogLevel))
187-
if a.svrCfg.LogPath != "" {
188-
_ = TLOG.SetFileRoller(a.svrCfg.LogPath+"/"+a.svrCfg.App+"/"+a.svrCfg.Server, int(a.svrCfg.LogNum), int(a.svrCfg.LogSize))
189-
}
190-
191-
// cache
192-
a.appCache.TarsVersion = Version
193-
194199
// add timeout config
195200
a.svrCfg.AcceptTimeout = tools.ParseTimeOut(c.GetIntWithDef("/tars/application/server<accepttimeout>", AcceptTimeout))
196201
a.svrCfg.ReadTimeout = tools.ParseTimeOut(c.GetIntWithDef("/tars/application/server<readtimeout>", ReadTimeout))
@@ -214,11 +219,14 @@ func (a *application) initConfig() {
214219
a.svrCfg.StatReportChannelBufLen = c.GetInt32WithDef("/tars/application/server<statreportchannelbuflen>", StatReportChannelBufLen)
215220
// maxPackageLength
216221
a.svrCfg.MaxPackageLength = c.GetIntWithDef("/tars/application/server<maxPackageLength>", MaxPackageLength)
217-
protocol.SetMaxPackageLength(a.svrCfg.MaxPackageLength)
222+
218223
// tls
219224
a.svrCfg.Key = c.GetString("/tars/application/server<key>")
220225
a.svrCfg.Cert = c.GetString("/tars/application/server<cert>")
221-
var tlsConfig *tls.Config
226+
var (
227+
tlsConfig *tls.Config
228+
err error
229+
)
222230
if a.svrCfg.Key != "" && a.svrCfg.Cert != "" {
223231
a.svrCfg.CA = c.GetString("/tars/application/server<ca>")
224232
a.svrCfg.VerifyClient = c.GetStringWithDef("/tars/application/server<verifyclient>", "0") != "0"
@@ -233,39 +241,6 @@ func (a *application) initConfig() {
233241
a.svrCfg.SampleAddress = c.GetString("/tars/application/server<sampleaddress>")
234242
a.svrCfg.SampleEncoding = c.GetStringWithDef("/tars/application/server<sampleencoding>", "json")
235243

236-
// init client config
237-
cMap := c.GetMap("/tars/application/client")
238-
a.cltCfg.Locator = cMap["locator"]
239-
a.cltCfg.Stat = cMap["stat"]
240-
a.cltCfg.Property = cMap["property"]
241-
a.cltCfg.ModuleName = cMap["modulename"]
242-
a.cltCfg.AsyncInvokeTimeout = c.GetIntWithDef("/tars/application/client<async-invoke-timeout>", AsyncInvokeTimeout)
243-
a.cltCfg.RefreshEndpointInterval = c.GetIntWithDef("/tars/application/client<refresh-endpoint-interval>", refreshEndpointInterval)
244-
a.cltCfg.ReportInterval = c.GetIntWithDef("/tars/application/client<report-interval>", reportInterval)
245-
a.cltCfg.CheckStatusInterval = c.GetIntWithDef("/tars/application/client<check-status-interval>", checkStatusInterval)
246-
a.cltCfg.KeepAliveInterval = c.GetIntWithDef("/tars/application/client<keep-alive-interval>", keepAliveInterval)
247-
248-
// add client timeout
249-
a.cltCfg.ClientQueueLen = c.GetIntWithDef("/tars/application/client<clientqueuelen>", ClientQueueLen)
250-
a.cltCfg.ClientIdleTimeout = tools.ParseTimeOut(c.GetIntWithDef("/tars/application/client<clientidletimeout>", ClientIdleTimeout))
251-
a.cltCfg.ClientReadTimeout = tools.ParseTimeOut(c.GetIntWithDef("/tars/application/client<clientreadtimeout>", ClientReadTimeout))
252-
a.cltCfg.ClientWriteTimeout = tools.ParseTimeOut(c.GetIntWithDef("/tars/application/client<clientwritetimeout>", ClientWriteTimeout))
253-
a.cltCfg.ClientDialTimeout = tools.ParseTimeOut(c.GetIntWithDef("/tars/application/client<clientdialtimeout>", ClientDialTimeout))
254-
a.cltCfg.ReqDefaultTimeout = c.GetInt32WithDef("/tars/application/client<reqdefaulttimeout>", ReqDefaultTimeout)
255-
a.cltCfg.ObjQueueMax = c.GetInt32WithDef("/tars/application/client<objqueuemax>", ObjQueueMax)
256-
a.cltCfg.context["node_name"] = a.svrCfg.NodeName
257-
ca := c.GetString("/tars/application/client<ca>")
258-
if ca != "" {
259-
cert := c.GetString("/tars/application/client<cert>")
260-
key := c.GetString("/tars/application/client<key>")
261-
ciphers := c.GetString("/tars/application/client<ciphers>")
262-
clientTlsConfig, err := ssl.NewClientTlsConfig(ca, cert, key, ciphers)
263-
if err != nil {
264-
panic(err)
265-
}
266-
a.clientTlsConfig = clientTlsConfig
267-
}
268-
269244
serList := c.GetDomain("/tars/application/server")
270245
for _, adapter := range serList {
271246
endString := c.GetString("/tars/application/server/" + adapter + "<endpoint>")
@@ -285,7 +260,7 @@ func (a *application) initConfig() {
285260
key := c.GetString("/tars/application/server/" + adapter + "<key>")
286261
cert := c.GetString("/tars/application/server/" + adapter + "<cert>")
287262
if key != "" && cert != "" {
288-
ca = c.GetString("/tars/application/server/" + adapter + "<ca>")
263+
ca := c.GetString("/tars/application/server/" + adapter + "<ca>")
289264
verifyClient := c.GetString("/tars/application/server/"+adapter+"<verifyclient>") != "0"
290265
ciphers := c.GetString("/tars/application/server/" + adapter + "<ciphers>")
291266
var adpTlsConfig *tls.Config
@@ -303,8 +278,6 @@ func (a *application) initConfig() {
303278
}
304279
a.serList = serList
305280

306-
TLOG.Debug("config add ", a.tarsConfig)
307-
308281
if len(a.svrCfg.Local) > 0 {
309282
localPoint := endpoint.Parse(a.svrCfg.Local)
310283
// 管理端口不启动协程池
@@ -313,6 +286,43 @@ func (a *application) initConfig() {
313286
RegisterAdmin(rogger.Admin, rogger.HandleDyeingAdmin)
314287
}
315288

289+
TLOG.Debug("config add ", a.tarsConfig)
290+
}
291+
292+
func (a *application) parseClientConfig(c *conf.Conf) {
293+
// init client config
294+
cMap := c.GetMap("/tars/application/client")
295+
a.cltCfg.Locator = cMap["locator"]
296+
a.cltCfg.Stat = cMap["stat"]
297+
a.cltCfg.Property = cMap["property"]
298+
a.cltCfg.ModuleName = cMap["modulename"]
299+
a.cltCfg.AsyncInvokeTimeout = c.GetIntWithDef("/tars/application/client<async-invoke-timeout>", AsyncInvokeTimeout)
300+
a.cltCfg.RefreshEndpointInterval = c.GetIntWithDef("/tars/application/client<refresh-endpoint-interval>", refreshEndpointInterval)
301+
a.cltCfg.ReportInterval = c.GetIntWithDef("/tars/application/client<report-interval>", reportInterval)
302+
a.cltCfg.CheckStatusInterval = c.GetIntWithDef("/tars/application/client<check-status-interval>", checkStatusInterval)
303+
a.cltCfg.KeepAliveInterval = c.GetIntWithDef("/tars/application/client<keep-alive-interval>", keepAliveInterval)
304+
305+
// add client timeout
306+
a.cltCfg.ClientQueueLen = c.GetIntWithDef("/tars/application/client<clientqueuelen>", ClientQueueLen)
307+
a.cltCfg.ClientIdleTimeout = tools.ParseTimeOut(c.GetIntWithDef("/tars/application/client<clientidletimeout>", ClientIdleTimeout))
308+
a.cltCfg.ClientReadTimeout = tools.ParseTimeOut(c.GetIntWithDef("/tars/application/client<clientreadtimeout>", ClientReadTimeout))
309+
a.cltCfg.ClientWriteTimeout = tools.ParseTimeOut(c.GetIntWithDef("/tars/application/client<clientwritetimeout>", ClientWriteTimeout))
310+
a.cltCfg.ClientDialTimeout = tools.ParseTimeOut(c.GetIntWithDef("/tars/application/client<clientdialtimeout>", ClientDialTimeout))
311+
a.cltCfg.ReqDefaultTimeout = c.GetInt32WithDef("/tars/application/client<reqdefaulttimeout>", ReqDefaultTimeout)
312+
a.cltCfg.ObjQueueMax = c.GetInt32WithDef("/tars/application/client<objqueuemax>", ObjQueueMax)
313+
a.cltCfg.context["node_name"] = a.svrCfg.NodeName
314+
ca := c.GetString("/tars/application/client<ca>")
315+
if ca != "" {
316+
cert := c.GetString("/tars/application/client<cert>")
317+
key := c.GetString("/tars/application/client<key>")
318+
ciphers := c.GetString("/tars/application/client<ciphers>")
319+
clientTlsConfig, err := ssl.NewClientTlsConfig(ca, cert, key, ciphers)
320+
if err != nil {
321+
panic(err)
322+
}
323+
a.clientTlsConfig = clientTlsConfig
324+
}
325+
316326
auths := c.GetDomain("/tars/application/client")
317327
for _, objName := range auths {
318328
authInfo := make(map[string]string)
@@ -324,15 +334,13 @@ func (a *application) initConfig() {
324334
authInfo["ciphers"] = c.GetString("/tars/application/client/" + objName + "<ciphers>")
325335
a.clientObjInfo[objName] = authInfo
326336
if authInfo["ca"] != "" {
327-
var objTlsConfig *tls.Config
328-
objTlsConfig, err = ssl.NewClientTlsConfig(authInfo["ca"], authInfo["cert"], authInfo["key"], authInfo["ciphers"])
337+
objTlsConfig, err := ssl.NewClientTlsConfig(authInfo["ca"], authInfo["cert"], authInfo["key"], authInfo["ciphers"])
329338
if err != nil {
330339
panic(err)
331340
}
332341
a.clientObjTlsConfig[objName] = objTlsConfig
333342
}
334343
}
335-
_, _ = maxprocs.Set(maxprocs.Logger(TLOG.Infof))
336344
}
337345

338346
// Run the application

0 commit comments

Comments
 (0)