From 997abd5f91cdd84ca1b1ee17e191e6bfe90ebcec Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 3 Jun 2022 14:09:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9MlscConfig=E5=A2=9E=E5=8A=A0ToString?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87MlsrConfi?= =?UTF-8?q?gParameters=E4=B8=AD=E5=85=B3=E4=BA=8E=E6=A0=87=E8=AF=86?= =?UTF-8?q?=E5=92=8C=E6=97=B6=E9=97=B4=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/MlsrConfig.go | 148 +++++++++++++++++++----- common/MlsrConfigParameters.go | 199 ++++++++++++++++++++++++++++----- common/MlsrConfig_test.go | 21 ++++ 3 files changed, 308 insertions(+), 60 deletions(-) diff --git a/common/MlsrConfig.go b/common/MlsrConfig.go index 0fbc6b8..1a3d057 100644 --- a/common/MlsrConfig.go +++ b/common/MlsrConfig.go @@ -12,6 +12,7 @@ import ( "encoding/json" "gopkg.in/ini.v1" common2 "minlib/common" + "strconv" ) const DefaultConfFileName = "mlsrConf.ini" @@ -36,28 +37,105 @@ type MlsrConfig struct { neighbors []NeighborConfig // NeighborsConfig中的信息 } +// +// ToString +// @Description: +// @receiver c +// +func (c *MlsrConfig) ToString() string { + var str string + str += "----------------------- MlsrConfig -------------------------\n" + str += "Config File Path: " + c.mlsrConfigPath + "\n" + str += "----------------- 1. GeneralConfig -------------------------\n" + bytes, err := json.Marshal(c.GeneralConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "----------------- 2. LogConfig -----------------------------\n" + bytes, err = json.Marshal(c.LogConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "----------------- 3. NeighborsConfig -----------------------\n" + bytes, err = json.Marshal(c.NeighborsConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "----------------- 4. HyperbolicConfig ----------------------\n" + bytes, err = json.Marshal(c.HyperbolicConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "----------------- 5. FibConfig -----------------------------\n" + bytes, err = json.Marshal(c.FibConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "----------------- 6. AdvertisingConfig ---------------------\n" + bytes, err = json.Marshal(c.AdvertisingConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "----------------- 7. SecurityConfig ------------------------\n" + bytes, err = json.Marshal(c.SecurityConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "\n" + return str +} + +func (c *MlsrConfig) ParametersToString() string { + var str string + str += "----------------------- MlsrConfigParameters -------------------------\n" + str += "----------------------- 1. 标识符 -------------------------------------\n" + str += "路由器定位符:" + c.MlsrConfigParameters.m_routerName.ToUri() + "\n" + str += "网域定位符:" + c.MlsrConfigParameters.m_siteName.ToUri() + "\n" + str += "网络定位符:" + c.MlsrConfigParameters.m_network.ToUri() + "\n" + str += "路由器前缀:" + c.MlsrConfigParameters.m_routerPrefix.ToUri() + "\n" + str += "同步用户前缀:" + c.MlsrConfigParameters.m_syncUserPrefix.ToUri() + "\n" + str += "同步前缀:" + c.MlsrConfigParameters.m_syncPrefix.ToUri() + "\n" + str += "LSA前缀:" + c.MlsrConfigParameters.m_lsaPrefix.ToUri() + "\n" + str += "----------------------- 2. 时间 ---------------------------------------\n" + str += "LSA刷新时间:" + strconv.Itoa(int(c.MlsrConfigParameters.m_lsaRefreshTime.Seconds())) + " " + + "秒 = " + strconv.Itoa(int(c.MlsrConfigParameters.m_lsaRefreshTime.Seconds())/60) + "分钟\n" + str += "LSA兴趣包生命周期:" + strconv.Itoa(int(c.MlsrConfigParameters.m_lsaInterestLifetime.Seconds())) + " 秒" + "\n" + str += "路由器死亡间隔:" + strconv.Itoa(int(c.MlsrConfigParameters.m_routerDeadInterval.Seconds())) + " " + + "秒 = " + strconv.Itoa(int(c.MlsrConfigParameters.m_routerDeadInterval.Seconds())/60) + "分钟\n" + str += "同步兴趣包生命周期:" + strconv.Itoa(int(c.MlsrConfigParameters.m_syncInterestLifetime.Seconds())) + " 秒" + "\n" + + str += "hello超时时间:" + strconv.Itoa(int(c.MlsrConfigParameters.m_helloTimeout.Seconds())) + " 秒" + "\n" + str += "hello发送间隔:" + strconv.Itoa(int(c.MlsrConfigParameters.m_helloInterval.Seconds())) + " 秒" + "\n" + str += "邻接LSA构建间隔:" + strconv.Itoa(int(c.MlsrConfigParameters.m_adjLsaBuildInterval.Seconds())) + " 秒" + "\n" + str += "LogicFace数据集请求间隔:" + strconv.Itoa(int(c.MlsrConfigParameters.m_faceDatasetFetchInterval.Seconds())) + " " + + "秒 = " + strconv.Itoa(int(c.MlsrConfigParameters.m_faceDatasetFetchInterval.Seconds())/60) + "分钟\n" + str += "路由计算间隔:" + strconv.Itoa(int(c.MlsrConfigParameters.m_RoutingCalcInterval.Seconds())) + " 秒" + "\n" + str += "\n" + return str +} + // // GeneralConfig -// @Description: 最基础配置信息:LSA、同步协议 +// @Description: 一、最基础配置信息:LSA、同步协议 // type GeneralConfig struct { Network string `ini:"Network"` // 所属网络 Site string `ini:"Site"` // 所属站点 Router string `ini:"Router"` // 所属路由器 - LsaRefreshTime uint32 `ini:"LsaRefreshTime"` // LSA刷新时间 + LsaRefreshTime uint32 `ini:"LsaRefreshTime"` // LSA刷新时间【单位:毫秒】 - RouterDeadInterval uint32 `ini:"RouterDeadInterval"` // 路由器判断死亡的时间间隔(必须大于LSA刷新时间) + RouterDeadInterval uint32 `ini:"RouterDeadInterval"` // 路由器判断死亡的时间间隔(必须大于LSA刷新时间)【单位:毫秒】 LsaInterestLifetime int `ini:"LsaInterestLifetime"` // LSA兴趣包生存周期。当使用推式包时,此值无效【单位:毫秒】 SyncProtocol string `ini:"SyncProtocol"` // 同步协议 - SyncInterestLifetime uint32 `ini:"SyncInterestLifetime"` // 同步协议兴趣包生命周期 + SyncInterestLifetime uint32 `ini:"SyncInterestLifetime"` // 同步协议兴趣包生命周期【单位:毫秒】 } // // LogConfig -// @Description: 日志模块 +// @Description: 二、日志模块 // type LogConfig struct { LogLevel string `ini:"LogLevel"` // 日志等级 @@ -68,14 +146,14 @@ type LogConfig struct { // // NeighborsConfig -// @Description: 邻居路由器相关配置 +// @Description: 三、邻居路由器相关配置 // type NeighborsConfig struct { - HelloRetries int `ini:"HelloRetries"` // hello协议探测最大次数 - HelloTimeout uint32 `ini:"HelloTimeout"` // hello协议中的超时时间 - HelloInterval uint32 `ini:"HelloInterval"` // 两个hello包之间的间隔时间 + HelloRetries int `ini:"HelloRetries"` // hello协议探测最大次数【单位:毫秒】 + HelloTimeout uint32 `ini:"HelloTimeout"` // hello协议中的超时时间【单位:毫秒】 + HelloInterval uint32 `ini:"HelloInterval"` // 两个hello包之间的间隔时间【单位:毫秒】 - AdjLsaBuildInterval uint32 `ini:"AdjLsaBuildInterval"` // 邻接LSA构建的时间间隔 + AdjLsaBuildInterval uint32 `ini:"AdjLsaBuildInterval"` // 邻接LSA构建的时间间隔【单位:毫秒】 LogicFaceDatasetFetchRetries uint32 `ini:"LogicFaceDatasetFetchRetries"` // 获取FaceStatus数据集的重试次数 LogicFaceDatasetFetchInterval uint32 `ini:"LogicFaceDatasetFetchInterval"` // FaceStatus数据集获取尝试之间的间隔【单位:毫秒】 @@ -124,24 +202,32 @@ func parseJsonStringToNeighbors(jsonString NeighborsJsonString) ([]NeighborConfi // // HyperbolicConfig -// @Description: 预留双曲坐标的接口 +// @Description: 四、预留双曲坐标的配置 // type HyperbolicConfig struct { } // // FibConfig -// @Description: 路由计算相关配置 +// @Description: 五、路由计算与FIB更新相关配置 // type FibConfig struct { MaxLogicFacesPerPrefix int `ini:"MaxLogicFacesPerPrefix"` // 每个前缀对应的下一跳face列表的最大数目 - RoutingCalcInterval uint32 `ini:"RoutingCalcInterval"` // 两次路由计算的时间间隔 + RoutingCalcInterval uint32 `ini:"RoutingCalcInterval"` // 两次路由计算的时间间隔【单位:毫秒】 } +// +// AdvertisingConfig +// @Description: 六、需要通告给其它路由器的前缀 +// type AdvertisingConfig struct { Prefixs []string `ini:"Prefixs"` // 需要广告给其他路由器的本机前缀 } +// +// SecurityConfig +// @Description: 七、预留安全相关的配置 +// type SecurityConfig struct { } @@ -151,29 +237,29 @@ type SecurityConfig struct { // @receiver c // func (c *MlsrConfig) Init() { - // 通用配置参数 + // 1. 通用配置参数 c.GeneralConfig.Network = "/min" c.GeneralConfig.Site = "/pkusz" c.GeneralConfig.Router = "/routerA" - c.GeneralConfig.LsaRefreshTime = 1800 // 240-7200 - c.GeneralConfig.RouterDeadInterval = 2 * c.GeneralConfig.LsaRefreshTime - c.GeneralConfig.LsaInterestLifetime = 4 // 4-60 + c.GeneralConfig.LsaRefreshTime = 30 * 60 * 1000 // 60*4-60*120,范围是4分钟-2小时。默认半小时 + c.GeneralConfig.RouterDeadInterval = 2 * c.GeneralConfig.LsaRefreshTime // 默认一小时 + c.GeneralConfig.LsaInterestLifetime = 4 * 1000 // 4-60,范围是4秒钟到1分钟。默认4秒钟 c.GeneralConfig.SyncProtocol = "min-sync" - c.GeneralConfig.SyncInterestLifetime = 60000 // 1000-120000 + c.GeneralConfig.SyncInterestLifetime = 60 * 1000 // 1000-120*1000,范围是1秒到2分钟。默认1分钟 - // Log + // 2. Log c.LogConfig.LogLevel = "INFO" c.LogConfig.ReportCaller = true c.LogConfig.LogFormat = "text" c.LogConfig.LogFilePath = "" - // 邻居路由器配置参数 - c.NeighborsConfig.HelloRetries = 3 // 1-15 - c.NeighborsConfig.HelloTimeout = 1 // 1-15 - c.NeighborsConfig.HelloInterval = 60 // 30-90 - c.NeighborsConfig.AdjLsaBuildInterval = 10 // 5-30 - c.NeighborsConfig.LogicFaceDatasetFetchRetries = 3 // 1-10 - c.NeighborsConfig.LogicFaceDatasetFetchInterval = 3600 // 1800-5400 + // 3. 邻居路由器配置参数 + c.NeighborsConfig.HelloRetries = 3 // 1-15,次数 + c.NeighborsConfig.HelloTimeout = 1 * 1000 // 1-15,超时时间,范围1秒-15秒。默认1秒钟 + c.NeighborsConfig.HelloInterval = 60 * 1000 // 30-90,间隔时间,范围30秒到1分钟。默认1分钟 + c.NeighborsConfig.AdjLsaBuildInterval = 10 * 1000 // 5-30,构建间隔,范围5秒到30秒。默认10秒钟 + c.NeighborsConfig.LogicFaceDatasetFetchRetries = 3 // 1-10,次数 + c.NeighborsConfig.LogicFaceDatasetFetchInterval = 60 * 60 * 1000 // 30*60-90*60,半小时到一个半小时。默认1小时 // 将邻居链路信息存储到配置文件中 todo:用于测试 neighborConfig1 := NeighborConfig{ NeighborName: "/routerB", @@ -190,11 +276,11 @@ func (c *MlsrConfig) Init() { //c.NeighborsConfig.NeighborsInfo=neighborsJsonString c.neighbors = []NeighborConfig{neighborConfig1, neighborConfig2} - // 路由计算配置参数 - c.FibConfig.MaxLogicFacesPerPrefix = 0 // 0-60 todo:为啥默认是0呢 - c.FibConfig.RoutingCalcInterval = 15 // 0-15 + // 5. FIB更新配置参数 + c.FibConfig.MaxLogicFacesPerPrefix = 0 // 0-60,个数,最多有多少个下一跳。置0表示保留所有计算出的下一跳 + c.FibConfig.RoutingCalcInterval = 15 * 1000 // 0-15,路由计算间隔。默认15秒计算一次 - // 广播本地前缀配置参数 + // 6. 广播本地前缀配置参数 c.AdvertisingConfig.Prefixs = []string{"/videos", "/files", "voices"} // todo:用于测试 } @@ -233,7 +319,7 @@ func ParseConfig(configPath string) (*MlsrConfig, error) { mlsrConfig.mlsrConfigPath = configPath // 初始化配置,给所有的配置项设置默认值 mlsrConfig.Init() - // 加载配置文件中的配置 + // 加载配置文件中的配置:如果有,则理应覆盖Init中设置的默认配置 if err = cfg.MapTo(&mlsrConfig); err != nil { common2.LogFatal("ParseConfig error, mapTo error, path is ", configPath, err.Error()) return nil, err diff --git a/common/MlsrConfigParameters.go b/common/MlsrConfigParameters.go index 4ca79d3..4e5c734 100644 --- a/common/MlsrConfigParameters.go +++ b/common/MlsrConfigParameters.go @@ -32,14 +32,20 @@ type MlsrConfigParameters struct { m_syncPrefix *component.Identifier m_lsaPrefix *component.Identifier - m_lsaRefreshTime time.Duration - m_adjLsaBuildInterval time.Duration - - // 路由器死亡时间(经过了该时间,NameLsa将触发超时) - m_routerDeadInterval time.Duration + // 时间:通用配置 + m_lsaRefreshTime time.Duration + m_lsaInterestLifetime time.Duration + m_routerDeadInterval time.Duration // 路由器死亡时间(经过了该时间,NameLsa将触发超时) + m_syncInterestLifetime time.Duration + // 时间:邻居路由器 + m_helloTimeout time.Duration + m_helloInterval time.Duration + m_adjLsaBuildInterval time.Duration m_faceDatasetFetchInterval time.Duration - m_lsaInterestLifetime time.Duration + + // 时间:FIB更新 + m_RoutingCalcInterval time.Duration } // MlsrConfig初始化 @@ -49,6 +55,8 @@ func (mcp *MlsrConfigParameters) Init(config *MlsrConfig) { _ = mcp.build3Prefix() _ = mcp.buildSyncAndLsaPrefix() _ = mcp.buildRouterAndSyncUserPrefix() + // 构建时间间隔 + mcp.genDurations() } // @@ -61,19 +69,32 @@ func (mcp *MlsrConfigParameters) setMetaData(config *MlsrConfig) { mcp.mlsrconf = config } +// +// genDurations +// @Description: 生成时间相关配置信息 +// @receiver mcp +// func (mcp *MlsrConfigParameters) genDurations() { mcp.m_lsaRefreshTime = time.Duration(mcp.mlsrconf.LsaRefreshTime) * time.Millisecond - mcp.m_adjLsaBuildInterval = - time.Duration(mcp.mlsrconf.AdjLsaBuildInterval) * time.Millisecond - - mcp.m_routerDeadInterval = - time.Duration(mcp.mlsrconf.RouterDeadInterval) * time.Millisecond - - mcp.m_faceDatasetFetchInterval = - time.Duration(mcp.mlsrconf.LogicFaceDatasetFetchInterval) * time.Millisecond mcp.m_lsaInterestLifetime = time.Duration(mcp.mlsrconf.LsaInterestLifetime) * time.Millisecond + mcp.m_routerDeadInterval = + time.Duration(mcp.mlsrconf.RouterDeadInterval) * time.Millisecond + mcp.m_syncInterestLifetime = + time.Duration(mcp.mlsrconf.SyncInterestLifetime) * time.Millisecond + + mcp.m_helloTimeout = + time.Duration(mcp.mlsrconf.HelloTimeout) * time.Millisecond + mcp.m_helloInterval = + time.Duration(mcp.mlsrconf.HelloInterval) * time.Millisecond + mcp.m_adjLsaBuildInterval = + time.Duration(mcp.mlsrconf.AdjLsaBuildInterval) * time.Millisecond + mcp.m_faceDatasetFetchInterval = + time.Duration(mcp.mlsrconf.LogicFaceDatasetFetchInterval) * time.Millisecond + + mcp.m_RoutingCalcInterval = + time.Duration(mcp.mlsrconf.RoutingCalcInterval) * time.Millisecond } // @@ -137,30 +158,72 @@ func (mcp *MlsrConfigParameters) buildRouterAndSyncUserPrefix() error { return nil } +// +// GetNetwork +// @Description: 网络定位符 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetNetwork() *component.Identifier { return mcp.m_network } +// +// GetSiteName +// @Description:网域定位符 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetSiteName() *component.Identifier { return mcp.m_siteName } +// +// GetRouterName +// @Description: 路由器定位符 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetRouterName() *component.Identifier { return mcp.m_routerName } +// +// GetRouterPrefix +// @Description: 路由器前缀 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetRouterPrefix() *component.Identifier { return mcp.m_routerPrefix } +// +// GetSyncUserPrefix +// @Description: 同步用户前缀 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetSyncUserPrefix() *component.Identifier { return mcp.m_syncUserPrefix } +// +// GetSyncPrefix +// @Description: 同步前缀 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetSyncPrefix() *component.Identifier { return mcp.m_syncPrefix } +// +// GetLsaPrefix +// @Description: LSA前缀 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetLsaPrefix() *component.Identifier { return mcp.m_lsaPrefix } @@ -169,38 +232,120 @@ func (mcp *MlsrConfigParameters) GetSyncProtocol() { // todo } +// +// GetLsaRefreshTime +// @Description: LSA刷新时间 +// @receiver mcp +// @return time.Duration +// func (mcp *MlsrConfigParameters) GetLsaRefreshTime() time.Duration { return mcp.m_lsaRefreshTime } +// +// GetLsaInterestLifetime +// @Description: LSA兴趣包生命周期 +// @receiver mcp +// @return time.Duration +// func (mcp *MlsrConfigParameters) GetLsaInterestLifetime() time.Duration { return mcp.m_lsaInterestLifetime } -func (mcp *MlsrConfigParameters) GetAdjLsaBuildInterval() time.Duration { - return mcp.m_adjLsaBuildInterval -} - -func (mcp *MlsrConfigParameters) GetRoutingCalcInterval() uint32 { - return mcp.mlsrconf.RoutingCalcInterval -} - +// +// GetRouterDeadInterval +// @Description: 路由器死亡间隔 +// @receiver mcp +// @return time.Duration +// func (mcp *MlsrConfigParameters) GetRouterDeadInterval() time.Duration { return mcp.m_routerDeadInterval } -func (mcp *MlsrConfigParameters) GetFaceDatasetFetchTries() uint32 { - return mcp.mlsrconf.LogicFaceDatasetFetchRetries +// +// GetSyncInterestLifetime +// @Description: 同步兴趣包生命周期 +// @receiver mcp +// @return time.Duration +// +func (mcp *MlsrConfigParameters) GetSyncInterestLifetime() time.Duration { + return mcp.m_syncInterestLifetime } +// +// GetAdjLsaBuildInterval +// @Description: 邻接LSA构建间隔 +// @receiver mcp +// @return time.Duration +// +func (mcp *MlsrConfigParameters) GetAdjLsaBuildInterval() time.Duration { + return mcp.m_adjLsaBuildInterval +} + +// +// GetFaceDatasetFetchInterval +// @Description: LogicFace数据集请求间隔 +// @receiver mcp +// @return time.Duration +// func (mcp *MlsrConfigParameters) GetFaceDatasetFetchInterval() time.Duration { return mcp.m_faceDatasetFetchInterval } -func (mcp *MlsrConfigParameters) GetInterestRetryNumber() int { +// +// GetRoutingCalcInterval +// @Description: 路由计算间隔 +// @receiver mcp +// @return time.Duration +// +func (mcp *MlsrConfigParameters) GetRoutingCalcInterval() time.Duration { + return mcp.m_RoutingCalcInterval +} + +// +// GetFaceDatasetFetchTries +// @Description: LogicFace数据集请求次数 +// @receiver mcp +// @return int +// +func (mcp *MlsrConfigParameters) GetFaceDatasetFetchTries() uint32 { + return mcp.mlsrconf.LogicFaceDatasetFetchRetries +} + +// +// GetHelloRetries +// @Description: hello兴趣包重传次数 +// @receiver mcp +// @return int +// +func (mcp MlsrConfigParameters) GetHelloRetries() int { return mcp.mlsrconf.HelloRetries } +// +// GetHelloTimeout +// @Description: Hello超时时间 +// @receiver mcp +// @return time.Duration +// +func (mcp *MlsrConfigParameters) GetHelloTimeout() time.Duration { + return mcp.m_helloTimeout +} + +// +// GetHelloInterval +// @Description: Hello重传间隔 +// @receiver mcp +// @return time.Duration +// +func (mcp *MlsrConfigParameters) GetHelloInterval() time.Duration { + return mcp.m_helloInterval +} + +func (mcp *MlsrConfigParameters) GetInterestRetryNumber() { + // todo +} + func (mcp *MlsrConfigParameters) GetInterestResendTime() { // todo } @@ -213,10 +358,6 @@ func (mcp *MlsrConfigParameters) GetMaxFacesPerPrefix() int { return mcp.mlsrconf.MaxLogicFacesPerPrefix } -func (mcp *MlsrConfigParameters) GetSyncInterestLifetime() uint32 { - return mcp.mlsrconf.SyncInterestLifetime -} - func (mcp *MlsrConfigParameters) GetAdjacencyList() *lsa.AdjLsaAdjacenctList { // todo return nil diff --git a/common/MlsrConfig_test.go b/common/MlsrConfig_test.go index 4ddbc98..3925434 100644 --- a/common/MlsrConfig_test.go +++ b/common/MlsrConfig_test.go @@ -25,6 +25,8 @@ func getCurrentDirectory() string { return dir } +const testConfigPath = "D:\\" + DefaultConfFileName + // // TestCreatConfigFile // @Description: 测试生成mlsrConfig文件 @@ -42,6 +44,25 @@ func TestCreatConfigFile(t *testing.T) { _ = mlsrConfig.Save() } +// +// TestMlsrConfigParameters +// @Description: 测试配置项所有参数 +// @param t +// +func TestMlsrConfigParameters(t *testing.T) { + // 1、从指定目录解析配置文件 + mlsrConfig, err := ParseConfig(testConfigPath) + if err != nil { + fmt.Println("配置文件解析错误") + } + // 2、打印配置中的普通字符串信息 + fmt.Println(mlsrConfig.ToString()) + // 3、打印配置中的特殊参数信息 + fmt.Println(mlsrConfig.ParametersToString()) + fmt.Println("!!!", mlsrConfig.MlsrConfigParameters.GetSyncUserPrefix().ToUri()+"00000") + fmt.Println("end") +} + // // TestMlsrConfig_ParseConfigAndSave // @Description: 测试配置文件解析和存储