package
0.0.0-20241217062345-852b9c5a8d98
Repository: https://github.com/tianlin0/plat-lib.git
Documentation: pkg.go.dev

# README

[TOC]

Startupconfig

启动配置

Installation

Usage

examples

Basic

import (
    "log"

    startup ""
)

func main() {
    conf, err := startup.New("config.yaml")
    if err != nil {
        log.Fatal(err)
        return
    }
    // Mysql配置
    mysqlName := "myMysql"
    conf.Mysql(mysqlName) // Database interface
    log.Println(conf.MysqlDriverName(mysqlName))
    log.Println(conf.MysqlDSN(mysqlName)) // root:12345678@tcp(127.0.0.1:3306)/db_database?charset=utf8&parseTime=true&loc=Local
    log.Println(conf.MysqlAddress(mysqlName))
    log.Println(conf.MysqlPassword(mysqlName))
    log.Println(conf.MysqlUser(mysqlName))
    log.Println(conf.MysqlDatabase(mysqlName))
    log.Println(conf.MysqlPassword("noConfig")) // ""
    // Redis配置
    redisName := "myRedis"
    conf.Redis(redisName) // Database interface
    log.Println(conf.RedisAddress(redisName))
    log.Println(conf.RedisDatabase(redisName))
    log.Println(conf.RedisPWD(redisName))
    log.Println(conf.RedisPWD("noConfig")) // "" 
    log.Println(conf.RedisUser(redisName)) // odp 
    log.Println(conf.RedisUseTLS(redisName)) // true 
    // 服务接口配置
    service := "paas1"
    conf.PaasAPI(service)                  // PaasAPI interface
    log.Println(conf.UserPolaris(service)) // 是否可以使用北极星(完整配置了北极星)
    log.Println(conf.PaasAPIDomain(service))
    log.Println(conf.PaasAPIPolaris(service)) // polaris instance
    log.Println(conf.PaasAPIPolarisHost(service))
    log.Println(conf.PaasAPIPolarisNamespace(service))
    log.Println(conf.PaasAPIPolarisService(service))
    log.Println(conf.PaasAPIUrl(service, "orders"))
    log.Println(conf.PaasAPIAuthValue(service, "token"))
    log.Println(conf.PaasAPIAuthValue(service, "tok")) // "",nil
    // TDMQ配置
    tdmqName := "myTDMQ"
    conf.TDMQ(tdmqName) // TDMQ interface
    log.Println(conf.TDMQUrl(tdmqName))
    log.Println(conf.TDMQToken(tdmqName))
    log.Println(conf.TDMQSubscription(tdmqName))
    log.Println(conf.TDMQInitialPosition(tdmqName))
    log.Println(conf.TDMQTopic(tdmqName, "ci"))
    log.Println(conf.TDMQTopic(tdmqName, "cc"))   // ""
    log.Println(conf.TDMQTopic("noConfig", "cc")) // ""
    // 自定义kv配置
    conf.Custom() // Custom config Interface
    log.Println(conf.CustomNormal("timeout"))
    log.Println(conf.CustomSensitive("clientId"))
    log.Println(conf.CustomSensitive("sda")) // "", nil
    // 公共环境变量
    log.Println(conf.ConsulHost())
    log.Println(conf.ConsulToken())
    // Trace配置
    conf.Trace()                    // Trace interface
    log.Println(conf.TraceConfig()) // trace配置实例

    log.Println(conf.StartupConfig())             // 启动配置结构实例
    log.Println(conf.StartupMysqlAll())           // 获取所有mysql配置实例
    log.Println(conf.StartupRedisAll())           // 获取所有redis配置实例
    log.Println(conf.StartupTDMQAll())            // 获取所有tdmq配置实例
    log.Println(conf.StartupCustomNormalAll())    // 获取所有自定义 非加密 配置KV
    log.Println(conf.StartupCustomSensitiveAll()) // 获取所有自定义 加密 配置KV
    log.Println(conf.StartupPaasApiAll())         // 获取所有接口配置实例

    // 将配置内容转换为指定的结构体,加密字段会被自动解密  v1.0.12
    var data map[string]interface{}
    if err := conf.Transform(&data); err != nil {
        log.Fatal(err)
        return
    }
    dataJson, _ := json.Marshal(data)
    log.Println(string(dataJson))
    
    // Supported Since v1.0.17 用户操作记录配置
    conf.Recorder()                 // recorder config instance
    conf.RecorderTDMQ()             // recorder config relate tdmq config instance
    t.Log(conf.RecorderTDMQURL())   // get Recorder TDMQ URL
    t.Log(conf.RecorderTDMQToken()) // get Recorder TDMQ Token
    t.Log(conf.RecorderTDMQTopic()) // get Recorder TDMQ topic, aim topic should be "userOperation"
    t.Log(conf.RecorderGroups())    // get Recorder groups information
    group := conf.RecorderGroup("cd") // get Recorder group of key "cd"
    t.Log(group.GroupId) // get Recorder groupId of key "cd"  
    t.Log(group.Module("pod")) // get Recorder module of key "pod" from group "cd"(key)
}

Advance

Supported Since v1.1.0

支持通过 JSON Path 获取配置内容,并转换为自定义的结构

func TestConvert(t *testing.T) {
    conf, err := New("config.yaml")
    if err != nil {
      t.Error(err)
      return
    }
    type Custom struct {
      Max   int               `json:"max"`
      Users map[string]string `json:"users"`
      Key   Decrypted         `json:"key"`
    }
    cs := new(Custom)
    if err := conf.ConvertTo("custom.normal", &cs); err != nil {
      t.Error(err)
      return
    }
    t.Logf("%+v", cs) // &{Max:100 Users:map[a:a b:b c:c] Key:87654321}

    var users map[string]string
    if err := conf.ConvertFromCustomNormalTo("users", &users); err != nil {
      t.Error(err)
      return
    }
    t.Logf("%+v", users) // map[a:a b:b c:c]

    max, err := conf.Decrypted("custom.normal.max")
    if err == nil {
      t.Errorf("unexpected")
      return
    }
    t.Logf("max:%v, err:%s", max, err) // max:, err:encoding/hex: odd length hex string

    key := conf.MustDecrypted("custom.normal.key")
    t.Log(key) // 87654321

    us, err := conf.CustomNormalDecrypted("users")
    if err == nil {
      t.Errorf("unexpected")
      return
    }
    t.Logf("us:%v, err:%s", us, err) // us:, err:encoding/hex: invalid byte: U+007B '{'

    key1 := conf.CustomNormalMustDecrypted("key")
    t.Log(key1) // 87654321

    maxRs := conf.GetValue("custom.normal.max")
    t.Log(maxRs.Int()) // 100

    encrypted := conf.GetValueFromCustomNormal("key")
    t.Log(encrypted.String()) // 30acf6565b803600ceaad1584b477d29a784e8f52644c828dd1be1d0dcabd25b
}

配置模板

api: # 接口调用配置
  paas1: # 接口服务名
    auth: # 加密授权信息
      token: 6d6d4ee0a871d34f47e39450f9219883112839e7b2bfac418f35abef09961317
    domain: 
    polaris:
      host: odp-platform.idle-paas-discovery
      namespace: Development
      service: odpqclouddev120.odp-platform.idle-paas-discovery
    urls:
      orders: /vi/project/{projectName}/paas/{paasName}/orders
      resource: /vi/project/{projectName}/paas/{paasName}/resource
  paas2: # 接口服务名
    auth: # 加密授权信息
      id: 6d6d4ee0a871d34f47e39450f9219883112839e7b2bfac418f35abef09961317
    domain: 
    polaris:
      host: odp-platform.startup-configuration
      namespace: Development
      service: odpqclouddev120.odp-platform.startup-configuration
    urls:
      config: /vi/project/{projectName}/paas/{paasName}/config
mysql: # mysql 配置
  envoyDB:
    address: 127.0.0.1:3306
    database: db_test
    pwEncoded: 6d6d4ee0a871d34f47e39450f9219883112839e7b2bfac418f35abef09961317 # 加密password
    username: root
  myMysql:
    address: 127.0.0.1:3306
    database: db_test
    pwEncoded: 6d6d4ee0a871d34f47e39450f9219883112839e7b2bfac418f35abef09961317 # 加密password
    username: root
redis: # redis 配置
  myRedis:
    address: 127.0.0.1:6666
    database: 0
    pwEncoded: 30acf6565b803600ceaad1584b477d29a784e8f52644c828dd1be1d0dcabd25b # 加密password
    username: odp
    useTLS: true
  otherRedis:
    address: 127.0.0.1:6666
    database: 0
    pwEncoded: 30acf6565b803600ceaad1584b477d29a784e8f52644c828dd1be1d0dcabd25b # 加密password
tdmq: # tdmq 配置
  myTDMQ:
    brokerAddr: ""
    initialPosition: earliest # earliest/lasted
    jwtToken: -- # 加密token
    subscriptionName: odp-platform.idle-paas-discovery
    topics:
      ci: dev/gdp-event-ci
      cd: dev/gdp-event-cd
      userOperation: dev/gdp-event-operations
  otherTDMQ:
    brokerAddr: ""
    initialPosition: earliest # earliest/lasted
    jwtToken: -- # 加密token
    subscriptionName: odp-platform.idle-paas-discovery
    topics:
      ci: dev/gdp-event-ci
      cd: dev/gdp-event-cd
custom: # 自定义配置
  sensitive: # 加密敏感配置
    clientId: 6d6d4ee0a871d34f47e39450f9219883112839e7b2bfac418f35abef09961317
    clientSecret: --
  normal: # 非加密普通配置
    timeout: 10
    max: 100
    regexp: ^[a-z]([a-z0-9])*$
    users: {"a":"a","b":"b","c":"c"}
tracing: # tracing 配置
  service: "Service-A"
  tenantId: "test"
  address: "test.xxx.com"
  httpPort: "12345"
  grpcPort: "12346"
  sampleRatio: 0.01
userOperation: # 用户操作记录配置
  mqConfigKey: myTDMQ # 对应消息队列配置key,此处对应 tdmq.myTDMQ,对应topic key 必须为 userOperation
  groups:  # 操作分组列表
    cd: # CD 分组
      groupId: CD
      modules: # 操作模块
        container: Container
        pod: Pod
    ci:
      groupId: CI
  resourceNameMap: # 操作资源英文-中文对照表
    scale: 资源规格
    replicas: 副本数
    webshell: webshell

加密方法

接口加密

http://nstar.datamore.oa.com/cfgcterApi/Encrypt?originstring=TOKEN

eg.

http://nstar.datamore.oa.com/cfgcterApi/Encrypt?originstring=87654321

{"error_code":200,"error_message":"","result":"30acf6565b803600ceaad1584b477d29a784e8f52644c828dd1be1d0dcabd25b","logNo":"b06c063d7f6f51d414c149dffbab4373"}

SDK加密

import (
	"fmt"
	"log"

	startup ""
)

func main() {
	encrypted, err := startup.Encrypt("1234")
	if err != nil {
		log.Fatal(err)
		return
	}
	fmt.Println(encrypted)
}

解密方法

SDK 解密方法

import (
	"fmt"
	"log"

	startup ""
)

func main() {
	decrypted, err := startup.DecDecrypt("e9c5a70f7aa9127fbfc4245f52942629e45aef272c7e5919021960d47531bb28")
	if err != nil {
		log.Fatal(err)
		return
	}
	fmt.Println(decrypted)
}

解密字符串类型 Decrypted

Decrypted 字符串类型实现了 json、yaml (gopkg.in/yaml.v3)的 Unmarshaler 接口(interface) ,反序列化时可自动解密得到 解密后的字符串。例子如下:

func TestDecrypted(t *testing.T) {
	type people struct {
		Name Decrypted `json:"name" yaml:"name"`
		Age  int       `json:"age" yaml:"age"`
	}
	obj := people{
		Name: "767723c23f0144464f768b6fc292ac3932d2f17300d7657f578c269c65e9ed2d",
		Age:  10,
	}
	js, _ := json.Marshal(obj)

	var data people
	if err := json.Unmarshal(js, &data); err != nil {
		t.Error(err)
		return
	}
	t.Log(data) // {12345678 10}
	if err := yaml.Unmarshal(js, &data); err != nil {
		t.Error(err)
		return
	}
	t.Log(data) // {12345678 10}
}