-
Notifications
You must be signed in to change notification settings - Fork 348
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
go sdk support user define app labels #750
Changes from 1 commit
9509a6e
5b64179
f0cb0dd
f03b93a
a820063
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -18,8 +18,11 @@ package rpc | |
|
||
import ( | ||
"context" | ||
"fmt" | ||
"math" | ||
"os" | ||
"reflect" | ||
"strings" | ||
"sync" | ||
"sync/atomic" | ||
"time" | ||
|
@@ -147,24 +150,123 @@ func getClient(clientName string) IRpcClient { | |
return clientMap[clientName] | ||
} | ||
|
||
func CreateClient(ctx context.Context, clientName string, connectionType ConnectionType, labels map[string]string, nacosServer *nacos_server.NacosServer, tlsConfig *constant.TLSConfig) (IRpcClient, error) { | ||
func CreateClient(ctx context.Context, clientName string, connectionType ConnectionType, labels map[string]string, nacosServer *nacos_server.NacosServer, tlsConfig *constant.TLSConfig, appConnLabels map[string]string) (IRpcClient, error) { | ||
cMux.Lock() | ||
defer cMux.Unlock() | ||
if _, ok := clientMap[clientName]; !ok { | ||
logger.Infof("init rpc client for name ", clientName) | ||
var rpcClient IRpcClient | ||
if GRPC == connectionType { | ||
rpcClient = NewGrpcClient(ctx, clientName, nacosServer, tlsConfig) | ||
} | ||
if rpcClient == nil { | ||
return nil, errors.New("unsupported connection type") | ||
} | ||
|
||
logger.Infof("get app conn labels from client config ", appConnLabels) | ||
appConnLabelsEnv := getAppLabelsFromEnv() | ||
logger.Infof("get app conn labels from env ", appConnLabelsEnv) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 同上 |
||
|
||
appConnLabelsFinal := mergerAppLabels(appConnLabels, appConnLabelsEnv) | ||
logger.Infof("final app conn labels : ", appConnLabelsFinal) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 同上 |
||
|
||
appConnLabelsFinal = addPrefixForEachKey(appConnLabelsFinal, "app_") | ||
if appConnLabelsFinal != nil && len(appConnLabelsFinal) != 0 { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 只判断len(appConnLabelsFinal) != 0 就可以了 |
||
rpcClient.putAllLabels(appConnLabelsFinal) | ||
} | ||
|
||
rpcClient.putAllLabels(labels) | ||
clientMap[clientName] = rpcClient | ||
return rpcClient, nil | ||
} | ||
return clientMap[clientName], nil | ||
} | ||
|
||
func mergerAppLabels(appLabelsAppointed map[string]string, appLabelsEnv map[string]string) map[string]string { | ||
preferred := strings.ToLower(os.Getenv("nacos_app_conn_labels_preferred")) | ||
|
||
var preferFirst bool | ||
if preferred != "env" { | ||
preferFirst = true | ||
} else { | ||
preferFirst = false | ||
} | ||
return mergeMaps(appLabelsAppointed, appLabelsEnv, preferFirst) | ||
} | ||
|
||
func mergeMaps(map1, map2 map[string]string, preferFirst bool) map[string]string { | ||
result := make(map[string]string) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 初始化建议给容量值,如果不确定容量大小,建议设置8 |
||
|
||
for k, v := range map1 { | ||
result[k] = v | ||
} | ||
|
||
for k, v := range map2 { | ||
if preferFirst && map1[k] != "" { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. map 通常判断是否有值,用 _,ok:=map1[k] |
||
continue | ||
} | ||
result[k] = v | ||
} | ||
|
||
return result | ||
} | ||
|
||
func getAppLabelsFromEnv() map[string]string { | ||
configMap := make(map[string]string) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 容量 |
||
|
||
// nacos_config_gray_label | ||
grayLabel := os.Getenv("nacos_config_gray_label") | ||
if grayLabel != "" { | ||
configMap["nacos_config_gray_label"] = grayLabel | ||
} | ||
|
||
// nacos_app_conn_labels | ||
connLabels := os.Getenv("nacos_app_conn_labels") | ||
if connLabels != "" { | ||
labelsMap := parseLabels(connLabels) | ||
for k, v := range labelsMap { | ||
configMap[k] = v | ||
} | ||
} | ||
|
||
return configMap | ||
} | ||
|
||
func parseLabels(rawLabels string) map[string]string { | ||
if strings.TrimSpace(rawLabels) == "" { | ||
return make(map[string]string, 2) | ||
} | ||
|
||
resultMap := make(map[string]string, 2) | ||
labels := strings.Split(rawLabels, ",") | ||
for _, label := range labels { | ||
if strings.TrimSpace(label) != "" { | ||
kv := strings.Split(label, "=") | ||
if len(kv) == 2 { | ||
resultMap[strings.TrimSpace(kv[0])] = strings.TrimSpace(kv[1]) | ||
} else { | ||
fmt.Println("unknown label format:", label) | ||
} | ||
} | ||
} | ||
return resultMap | ||
} | ||
|
||
func addPrefixForEachKey(m map[string]string, prefix string) map[string]string { | ||
if m == nil || len(m) == 0 { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 判断len(m) == 0 就可以 |
||
return m | ||
} | ||
|
||
newMap := make(map[string]string, len(m)) | ||
for k, v := range m { | ||
if strings.TrimSpace(k) != "" { | ||
newKey := prefix + k | ||
newMap[newKey] = v | ||
} | ||
} | ||
return newMap | ||
} | ||
|
||
func (r *RpcClient) Start() { | ||
if ok := atomic.CompareAndSwapInt32((*int32)(&r.rpcClientStatus), (int32)(INITIALIZED), (int32)(STARTING)); !ok { | ||
return | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
日志需要格式化的占位符,才能正确的格式打印出来appConnlabels