/
config.go
100 lines (89 loc) · 2.59 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package conf
import (
"fmt"
"github.com/go-kit/kit/log"
"github.com/openzipkin/zipkin-go"
zipkinhttp "github.com/openzipkin/zipkin-go/reporter/http"
_ "github.com/openzipkin/zipkin-go/reporter/recorder"
"github.com/pp553933054/micro-go-book/ch13-seckill/pkg/bootstrap"
"github.com/pp553933054/micro-go-book/ch13-seckill/pkg/discover"
"github.com/spf13/viper"
"net/http"
"os"
"strconv"
)
const (
kConfigType = "CONFIG_TYPE"
)
var ZipkinTracer *zipkin.Tracer
var Logger log.Logger
func initDefault() {
viper.SetDefault(kConfigType, "yaml")
}
func init() {
Logger = log.NewLogfmtLogger(os.Stderr)
Logger = log.With(Logger, "ts", log.DefaultTimestampUTC)
Logger = log.With(Logger, "caller", log.DefaultCaller)
viper.AutomaticEnv()
initDefault()
if err := LoadRemoteConfig(); err != nil {
Logger.Log("Fail to load remote config", err)
}
//if err := Sub("mysql", &MysqlConfig); err != nil {
// Logger.Log("Fail to parse mysql", err)
//}
if err := Sub("trace", &TraceConfig); err != nil {
Logger.Log("Fail to parse trace", err)
}
zipkinUrl := "http://" + TraceConfig.Host + ":" + TraceConfig.Port + TraceConfig.Url
Logger.Log("zipkin url", zipkinUrl)
initTracer(zipkinUrl)
}
func initTracer(zipkinURL string) {
var (
err error
useNoopTracer = zipkinURL == ""
reporter = zipkinhttp.NewReporter(zipkinURL)
)
//defer reporter.Close()
zEP, _ := zipkin.NewEndpoint(bootstrap.DiscoverConfig.ServiceName, bootstrap.HttpConfig.Port)
ZipkinTracer, err = zipkin.NewTracer(
reporter, zipkin.WithLocalEndpoint(zEP), zipkin.WithNoopTracer(useNoopTracer),
)
if err != nil {
Logger.Log("err", err)
os.Exit(1)
}
if !useNoopTracer {
Logger.Log("tracer", "Zipkin", "type", "Native", "URL", zipkinURL)
}
}
func LoadRemoteConfig() (err error) {
serviceInstance, err := discover.DiscoveryService(bootstrap.ConfigServerConfig.Id)
if err != nil {
return
}
configServer := "http://" + serviceInstance.Host + ":" + strconv.Itoa(serviceInstance.Port)
confAddr := fmt.Sprintf("%v/%v/%v-%v.%v",
configServer, bootstrap.ConfigServerConfig.Label,
bootstrap.DiscoverConfig.ServiceName, bootstrap.ConfigServerConfig.Profile,
viper.Get(kConfigType))
resp, err := http.Get(confAddr)
if err != nil {
return
}
defer resp.Body.Close()
viper.SetConfigType(viper.GetString(kConfigType))
if err = viper.ReadConfig(resp.Body); err != nil {
return
}
Logger.Log("Load config from: ", confAddr)
return
}
func Sub(key string, value interface{}) error {
Logger.Log("配置文件的前缀为:", key)
sub := viper.Sub(key)
sub.AutomaticEnv()
sub.SetEnvPrefix(key)
return sub.Unmarshal(value)
}