remove config resync request and add getting cluster metrics (#4846)
* from diamond over nacos 2.0 * config notify task type bugfix * keep consistent with diamond over nacos 2.0 * remove config resync request and add getting cluster metrics * add using address server to look up interface * add using address server to look up interface
This commit is contained in:
parent
5626b2be1f
commit
d5af830d52
@ -196,4 +196,11 @@ public class Constants {
|
|||||||
|
|
||||||
public static final String POUND = "#";
|
public static final String POUND = "#";
|
||||||
|
|
||||||
|
public static final String VIPSERVER_TAG = "Vipserver-Tag";
|
||||||
|
|
||||||
|
public static final String AMORY_TAG = "Amory-Tag";
|
||||||
|
|
||||||
|
public static final String LOCATION_TAG = "Location-Tag";
|
||||||
|
|
||||||
|
public static final String CHARSET_KEY = "charset";
|
||||||
}
|
}
|
||||||
|
@ -16,13 +16,45 @@
|
|||||||
|
|
||||||
package com.alibaba.nacos.api.config.remote.request;
|
package com.alibaba.nacos.api.config.remote.request;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.api.remote.request.ServerRequest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ConfigChangeNotifyRequest.
|
* ConfigChangeNotifyRequest.
|
||||||
*
|
*
|
||||||
* @author liuzunfei
|
* @author liuzunfei
|
||||||
* @version $Id: ConfigChangeNotifyRequest.java, v 0.1 2020年07月14日 3:20 PM liuzunfei Exp $
|
* @version $Id: ConfigChangeNotifyRequest.java, v 0.1 2020年07月14日 3:20 PM liuzunfei Exp $
|
||||||
*/
|
*/
|
||||||
public class ConfigChangeNotifyRequest extends ConfigReSyncRequest {
|
public class ConfigChangeNotifyRequest extends ServerRequest {
|
||||||
|
|
||||||
|
String dataId;
|
||||||
|
|
||||||
|
String group;
|
||||||
|
|
||||||
|
String tenant;
|
||||||
|
|
||||||
|
public String getDataId() {
|
||||||
|
return dataId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDataId(String dataId) {
|
||||||
|
this.dataId = dataId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGroup() {
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGroup(String group) {
|
||||||
|
this.group = group;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTenant() {
|
||||||
|
return tenant;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTenant(String tenant) {
|
||||||
|
this.tenant = tenant;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* build success response.
|
* build success response.
|
||||||
@ -33,10 +65,15 @@ public class ConfigChangeNotifyRequest extends ConfigReSyncRequest {
|
|||||||
* @return ConfigChangeNotifyResponse
|
* @return ConfigChangeNotifyResponse
|
||||||
*/
|
*/
|
||||||
public static ConfigChangeNotifyRequest build(String dataId, String group, String tenant) {
|
public static ConfigChangeNotifyRequest build(String dataId, String group, String tenant) {
|
||||||
ConfigChangeNotifyRequest response = new ConfigChangeNotifyRequest();
|
ConfigChangeNotifyRequest request = new ConfigChangeNotifyRequest();
|
||||||
response.setDataId(dataId);
|
request.setDataId(dataId);
|
||||||
response.setGroup(group);
|
request.setGroup(group);
|
||||||
response.setTenant(tenant);
|
request.setTenant(tenant);
|
||||||
return response;
|
return request;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getModule() {
|
||||||
|
return "config";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,109 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2020 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.api.config.remote.request;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.api.remote.request.ServerRequest;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ConfigReSyncRequest.
|
|
||||||
*
|
|
||||||
* @author liuzunfei
|
|
||||||
* @version $Id: ConfigReSyncRequest.java, v 0.1 2020年07月14日 3:20 PM liuzunfei Exp $
|
|
||||||
*/
|
|
||||||
public class ConfigReSyncRequest extends ServerRequest {
|
|
||||||
|
|
||||||
private String dataId;
|
|
||||||
|
|
||||||
private String group;
|
|
||||||
|
|
||||||
private String tenant;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getModule() {
|
|
||||||
return "config";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* build success response.
|
|
||||||
*
|
|
||||||
* @param dataId dataId
|
|
||||||
* @param group group
|
|
||||||
* @param tenant tenant
|
|
||||||
* @return ConfigReSyncRequest
|
|
||||||
*/
|
|
||||||
public static ConfigReSyncRequest build(String dataId, String group, String tenant) {
|
|
||||||
ConfigReSyncRequest response = new ConfigReSyncRequest();
|
|
||||||
response.setDataId(dataId);
|
|
||||||
response.setGroup(group);
|
|
||||||
response.setTenant(tenant);
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Getter method for property <tt>dataId</tt>.
|
|
||||||
*
|
|
||||||
* @return property value of dataId
|
|
||||||
*/
|
|
||||||
public String getDataId() {
|
|
||||||
return dataId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setter method for property <tt>dataId</tt>.
|
|
||||||
*
|
|
||||||
* @param dataId value to be assigned to property dataId
|
|
||||||
*/
|
|
||||||
public void setDataId(String dataId) {
|
|
||||||
this.dataId = dataId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Getter method for property <tt>group</tt>.
|
|
||||||
*
|
|
||||||
* @return property value of group
|
|
||||||
*/
|
|
||||||
public String getGroup() {
|
|
||||||
return group;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setter method for property <tt>group</tt>.
|
|
||||||
*
|
|
||||||
* @param group value to be assigned to property group
|
|
||||||
*/
|
|
||||||
public void setGroup(String group) {
|
|
||||||
this.group = group;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Getter method for property <tt>tenant</tt>.
|
|
||||||
*
|
|
||||||
* @return property value of tenant
|
|
||||||
*/
|
|
||||||
public String getTenant() {
|
|
||||||
return tenant;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Setter method for property <tt>tenant</tt>.
|
|
||||||
*
|
|
||||||
* @param tenant value to be assigned to property tenant
|
|
||||||
*/
|
|
||||||
public void setTenant(String tenant) {
|
|
||||||
this.tenant = tenant;
|
|
||||||
}
|
|
||||||
}
|
|
@ -18,9 +18,6 @@ package com.alibaba.nacos.api.config.remote.response;
|
|||||||
|
|
||||||
import com.alibaba.nacos.api.remote.response.Response;
|
import com.alibaba.nacos.api.remote.response.Response;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ConfigQueryResponse.
|
* ConfigQueryResponse.
|
||||||
*
|
*
|
||||||
@ -37,23 +34,19 @@ public class ConfigQueryResponse extends Response {
|
|||||||
|
|
||||||
String contentType;
|
String contentType;
|
||||||
|
|
||||||
Map<String, String> labels = new HashMap<String, String>();
|
String md5;
|
||||||
|
|
||||||
|
long lastModified;
|
||||||
|
|
||||||
|
boolean isBeta;
|
||||||
|
|
||||||
|
String tag;
|
||||||
|
|
||||||
public ConfigQueryResponse() {
|
public ConfigQueryResponse() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* add label to this response.
|
* Build fail response.
|
||||||
*
|
|
||||||
* @param key key.
|
|
||||||
* @param value value.
|
|
||||||
*/
|
|
||||||
public void addLabel(String key, String value) {
|
|
||||||
this.labels.put(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Buid fail response.
|
|
||||||
*
|
*
|
||||||
* @param errorCode errorCode.
|
* @param errorCode errorCode.
|
||||||
* @param message message.
|
* @param message message.
|
||||||
@ -77,22 +70,36 @@ public class ConfigQueryResponse extends Response {
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public String getTag() {
|
||||||
* Getter method for property <tt>labels</tt>.
|
return tag;
|
||||||
*
|
|
||||||
* @return property value of labels
|
|
||||||
*/
|
|
||||||
public Map<String, String> getLabels() {
|
|
||||||
return labels;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public void setTag(String tag) {
|
||||||
* Setter method for property <tt>labels</tt>.
|
this.tag = tag;
|
||||||
*
|
}
|
||||||
* @param labels value to be assigned to property labels
|
|
||||||
*/
|
public String getMd5() {
|
||||||
public void setLabels(Map<String, String> labels) {
|
return md5;
|
||||||
this.labels = labels;
|
}
|
||||||
|
|
||||||
|
public void setMd5(String md5) {
|
||||||
|
this.md5 = md5;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLastModified() {
|
||||||
|
return lastModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastModified(long lastModified) {
|
||||||
|
this.lastModified = lastModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isBeta() {
|
||||||
|
return isBeta;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBeta(boolean beta) {
|
||||||
|
isBeta = beta;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2020 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.api.config.remote.response;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.api.remote.response.Response;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* config change notify response from client.
|
|
||||||
* @author liuzunfei
|
|
||||||
* @version $Id: ConfigChangeNotifyResponse.java, v 0.1 2020年09月01日 2:59 PM liuzunfei Exp $
|
|
||||||
*/
|
|
||||||
public class ConfigReSyncResponse extends Response {
|
|
||||||
|
|
||||||
}
|
|
@ -26,14 +26,12 @@ import com.alibaba.nacos.api.config.remote.request.ConfigBatchListenRequest;
|
|||||||
import com.alibaba.nacos.api.config.remote.request.ConfigChangeNotifyRequest;
|
import com.alibaba.nacos.api.config.remote.request.ConfigChangeNotifyRequest;
|
||||||
import com.alibaba.nacos.api.config.remote.request.ConfigPublishRequest;
|
import com.alibaba.nacos.api.config.remote.request.ConfigPublishRequest;
|
||||||
import com.alibaba.nacos.api.config.remote.request.ConfigQueryRequest;
|
import com.alibaba.nacos.api.config.remote.request.ConfigQueryRequest;
|
||||||
import com.alibaba.nacos.api.config.remote.request.ConfigReSyncRequest;
|
|
||||||
import com.alibaba.nacos.api.config.remote.request.ConfigRemoveRequest;
|
import com.alibaba.nacos.api.config.remote.request.ConfigRemoveRequest;
|
||||||
import com.alibaba.nacos.api.config.remote.response.ClientConfigMetricResponse;
|
import com.alibaba.nacos.api.config.remote.response.ClientConfigMetricResponse;
|
||||||
import com.alibaba.nacos.api.config.remote.response.ConfigChangeBatchListenResponse;
|
import com.alibaba.nacos.api.config.remote.response.ConfigChangeBatchListenResponse;
|
||||||
import com.alibaba.nacos.api.config.remote.response.ConfigChangeNotifyResponse;
|
import com.alibaba.nacos.api.config.remote.response.ConfigChangeNotifyResponse;
|
||||||
import com.alibaba.nacos.api.config.remote.response.ConfigPublishResponse;
|
import com.alibaba.nacos.api.config.remote.response.ConfigPublishResponse;
|
||||||
import com.alibaba.nacos.api.config.remote.response.ConfigQueryResponse;
|
import com.alibaba.nacos.api.config.remote.response.ConfigQueryResponse;
|
||||||
import com.alibaba.nacos.api.config.remote.response.ConfigReSyncResponse;
|
|
||||||
import com.alibaba.nacos.api.config.remote.response.ConfigRemoveResponse;
|
import com.alibaba.nacos.api.config.remote.response.ConfigRemoveResponse;
|
||||||
import com.alibaba.nacos.api.exception.NacosException;
|
import com.alibaba.nacos.api.exception.NacosException;
|
||||||
import com.alibaba.nacos.api.remote.RemoteConstants;
|
import com.alibaba.nacos.api.remote.RemoteConstants;
|
||||||
@ -45,6 +43,7 @@ import com.alibaba.nacos.client.config.utils.ContentUtils;
|
|||||||
import com.alibaba.nacos.client.monitor.MetricsMonitor;
|
import com.alibaba.nacos.client.monitor.MetricsMonitor;
|
||||||
import com.alibaba.nacos.client.naming.utils.CollectionUtils;
|
import com.alibaba.nacos.client.naming.utils.CollectionUtils;
|
||||||
import com.alibaba.nacos.client.utils.AppNameUtils;
|
import com.alibaba.nacos.client.utils.AppNameUtils;
|
||||||
|
import com.alibaba.nacos.client.utils.EnvUtil;
|
||||||
import com.alibaba.nacos.client.utils.LogUtils;
|
import com.alibaba.nacos.client.utils.LogUtils;
|
||||||
import com.alibaba.nacos.client.utils.ParamUtil;
|
import com.alibaba.nacos.client.utils.ParamUtil;
|
||||||
import com.alibaba.nacos.client.utils.TenantUtil;
|
import com.alibaba.nacos.client.utils.TenantUtil;
|
||||||
@ -581,6 +580,9 @@ public class ClientWorker implements Closeable {
|
|||||||
labels.put(RemoteConstants.LABEL_SOURCE, RemoteConstants.LABEL_SOURCE_SDK);
|
labels.put(RemoteConstants.LABEL_SOURCE, RemoteConstants.LABEL_SOURCE_SDK);
|
||||||
labels.put(RemoteConstants.LABEL_MODULE, RemoteConstants.LABEL_MODULE_CONFIG);
|
labels.put(RemoteConstants.LABEL_MODULE, RemoteConstants.LABEL_MODULE_CONFIG);
|
||||||
labels.put(Constants.APPNAME, AppNameUtils.getAppName());
|
labels.put(Constants.APPNAME, AppNameUtils.getAppName());
|
||||||
|
labels.put(Constants.VIPSERVER_TAG, EnvUtil.getSelfVipserverTag());
|
||||||
|
labels.put(Constants.AMORY_TAG, EnvUtil.getSelfAmorayTag());
|
||||||
|
labels.put(Constants.LOCATION_TAG, EnvUtil.getSelfLocationTag());
|
||||||
|
|
||||||
return labels;
|
return labels;
|
||||||
}
|
}
|
||||||
@ -590,22 +592,21 @@ public class ClientWorker implements Closeable {
|
|||||||
* Register Config Change /Config ReSync Handler
|
* Register Config Change /Config ReSync Handler
|
||||||
*/
|
*/
|
||||||
rpcClientInner.registerServerRequestHandler((request) -> {
|
rpcClientInner.registerServerRequestHandler((request) -> {
|
||||||
if (request instanceof ConfigChangeNotifyRequest || request instanceof ConfigReSyncRequest) {
|
if (request instanceof ConfigChangeNotifyRequest) {
|
||||||
ConfigReSyncRequest configReSyncRequest = (ConfigReSyncRequest) request;
|
ConfigChangeNotifyRequest configChangeNotifyRequest = (ConfigChangeNotifyRequest) request;
|
||||||
LOGGER.info("[{}] [server-push] config {}. dataId={}, group={}", rpcClientInner.getName(),
|
LOGGER.info("[{}] [server-push] config changed. dataId={}, group={},tenant={}",
|
||||||
(request instanceof ConfigChangeNotifyRequest) ? "changed" : "re sync",
|
rpcClientInner.getName(), configChangeNotifyRequest.getDataId(),
|
||||||
configReSyncRequest.getDataId(), configReSyncRequest.getGroup());
|
configChangeNotifyRequest.getGroup(), configChangeNotifyRequest.getTenant());
|
||||||
String groupKey = GroupKey
|
String groupKey = GroupKey
|
||||||
.getKeyTenant(configReSyncRequest.getDataId(), configReSyncRequest.getGroup(),
|
.getKeyTenant(configChangeNotifyRequest.getDataId(), configChangeNotifyRequest.getGroup(),
|
||||||
configReSyncRequest.getTenant());
|
configChangeNotifyRequest.getTenant());
|
||||||
|
|
||||||
CacheData cacheData = cacheMap.get().get(groupKey);
|
CacheData cacheData = cacheMap.get().get(groupKey);
|
||||||
if (cacheData != null) {
|
if (cacheData != null) {
|
||||||
cacheData.setSyncWithServer(false);
|
cacheData.setSyncWithServer(false);
|
||||||
notifyListenConfig();
|
notifyListenConfig();
|
||||||
}
|
}
|
||||||
return (request instanceof ConfigChangeNotifyRequest) ? new ConfigChangeNotifyResponse()
|
return new ConfigChangeNotifyResponse();
|
||||||
: new ConfigReSyncResponse();
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
@ -947,6 +948,7 @@ public class ClientWorker implements Closeable {
|
|||||||
try {
|
try {
|
||||||
request.putAllHeader(super.getSecurityHeaders());
|
request.putAllHeader(super.getSecurityHeaders());
|
||||||
request.putAllHeader(super.getSpasHeaders());
|
request.putAllHeader(super.getSpasHeaders());
|
||||||
|
request.putAllHeader(super.getCommonHeader());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, e);
|
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, e);
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,6 @@ import com.alibaba.nacos.client.identify.StsConfig;
|
|||||||
import com.alibaba.nacos.client.security.SecurityProxy;
|
import com.alibaba.nacos.client.security.SecurityProxy;
|
||||||
import com.alibaba.nacos.client.utils.LogUtils;
|
import com.alibaba.nacos.client.utils.LogUtils;
|
||||||
import com.alibaba.nacos.client.utils.ParamUtil;
|
import com.alibaba.nacos.client.utils.ParamUtil;
|
||||||
import com.alibaba.nacos.common.constant.HttpHeaderConsts;
|
|
||||||
import com.alibaba.nacos.common.http.HttpRestResult;
|
import com.alibaba.nacos.common.http.HttpRestResult;
|
||||||
import com.alibaba.nacos.common.http.param.Header;
|
import com.alibaba.nacos.common.http.param.Header;
|
||||||
import com.alibaba.nacos.common.http.param.Query;
|
import com.alibaba.nacos.common.http.param.Query;
|
||||||
@ -31,8 +30,6 @@ import com.alibaba.nacos.common.utils.ConvertUtils;
|
|||||||
import com.alibaba.nacos.common.utils.JacksonUtils;
|
import com.alibaba.nacos.common.utils.JacksonUtils;
|
||||||
import com.alibaba.nacos.common.utils.MD5Utils;
|
import com.alibaba.nacos.common.utils.MD5Utils;
|
||||||
import com.alibaba.nacos.common.utils.StringUtils;
|
import com.alibaba.nacos.common.utils.StringUtils;
|
||||||
import com.alibaba.nacos.common.utils.UuidUtils;
|
|
||||||
import com.alibaba.nacos.common.utils.VersionUtils;
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -142,10 +139,8 @@ public abstract class ConfigTransportClient {
|
|||||||
headers.put(Constants.CLIENT_APPNAME_HEADER, ParamUtil.getAppName());
|
headers.put(Constants.CLIENT_APPNAME_HEADER, ParamUtil.getAppName());
|
||||||
headers.put(Constants.CLIENT_REQUEST_TS_HEADER, ts);
|
headers.put(Constants.CLIENT_REQUEST_TS_HEADER, ts);
|
||||||
headers.put(Constants.CLIENT_REQUEST_TOKEN_HEADER, token);
|
headers.put(Constants.CLIENT_REQUEST_TOKEN_HEADER, token);
|
||||||
headers.put(HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.version);
|
|
||||||
headers.put("exConfigInfo", "true");
|
headers.put("exConfigInfo", "true");
|
||||||
headers.put(HttpHeaderConsts.REQUEST_ID, UuidUtils.generateUuid());
|
headers.put(Constants.CHARSET_KEY, encode);
|
||||||
headers.put(HttpHeaderConsts.ACCEPT_CHARSET, encode);
|
|
||||||
return headers;
|
return headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.alibaba.nacos.client.utils;
|
package com.alibaba.nacos.client.utils;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.api.common.Constants;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -32,7 +33,7 @@ public class EnvUtil {
|
|||||||
|
|
||||||
public static void setSelfEnv(Map<String, List<String>> headers) {
|
public static void setSelfEnv(Map<String, List<String>> headers) {
|
||||||
if (headers != null) {
|
if (headers != null) {
|
||||||
List<String> amorayTagTmp = headers.get(AMORY_TAG);
|
List<String> amorayTagTmp = headers.get(Constants.AMORY_TAG);
|
||||||
if (amorayTagTmp == null) {
|
if (amorayTagTmp == null) {
|
||||||
if (selfAmorayTag != null) {
|
if (selfAmorayTag != null) {
|
||||||
selfAmorayTag = null;
|
selfAmorayTag = null;
|
||||||
@ -46,7 +47,7 @@ public class EnvUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> vipserverTagTmp = headers.get(VIPSERVER_TAG);
|
List<String> vipserverTagTmp = headers.get(Constants.VIPSERVER_TAG);
|
||||||
if (vipserverTagTmp == null) {
|
if (vipserverTagTmp == null) {
|
||||||
if (selfVipserverTag != null) {
|
if (selfVipserverTag != null) {
|
||||||
selfVipserverTag = null;
|
selfVipserverTag = null;
|
||||||
@ -59,7 +60,7 @@ public class EnvUtil {
|
|||||||
LOGGER.warn("selfVipserverTag:{}", selfVipserverTag);
|
LOGGER.warn("selfVipserverTag:{}", selfVipserverTag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
List<String> locationTagTmp = headers.get(LOCATION_TAG);
|
List<String> locationTagTmp = headers.get(Constants.LOCATION_TAG);
|
||||||
if (locationTagTmp == null) {
|
if (locationTagTmp == null) {
|
||||||
if (selfLocationTag != null) {
|
if (selfLocationTag != null) {
|
||||||
selfLocationTag = null;
|
selfLocationTag = null;
|
||||||
@ -105,9 +106,4 @@ public class EnvUtil {
|
|||||||
|
|
||||||
private static String selfLocationTag;
|
private static String selfLocationTag;
|
||||||
|
|
||||||
private static final String AMORY_TAG = "Amory-Tag";
|
}
|
||||||
|
|
||||||
private static final String VIPSERVER_TAG = "Vipserver-Tag";
|
|
||||||
|
|
||||||
private static final String LOCATION_TAG = "Location-Tag";
|
|
||||||
}
|
|
@ -127,6 +127,8 @@ public class Constants {
|
|||||||
|
|
||||||
public static final String NAMESPACE_CONTROLLER_PATH = BASE_PATH + "/namespaces";
|
public static final String NAMESPACE_CONTROLLER_PATH = BASE_PATH + "/namespaces";
|
||||||
|
|
||||||
|
public static final String METRICS_CONTROLLER_PATH = BASE_PATH + "/metrics";
|
||||||
|
|
||||||
public static final String ENCODE = "UTF-8";
|
public static final String ENCODE = "UTF-8";
|
||||||
|
|
||||||
public static final String MAP_FILE = "map-file.js";
|
public static final String MAP_FILE = "map-file.js";
|
||||||
|
@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.alibaba.nacos.config.server.controller;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.api.config.remote.request.ClientConfigMetricRequest;
|
||||||
|
import com.alibaba.nacos.api.config.remote.response.ClientConfigMetricResponse;
|
||||||
|
import com.alibaba.nacos.common.http.Callback;
|
||||||
|
import com.alibaba.nacos.common.http.HttpClientBeanHolder;
|
||||||
|
import com.alibaba.nacos.common.http.HttpUtils;
|
||||||
|
import com.alibaba.nacos.common.http.client.NacosAsyncRestTemplate;
|
||||||
|
import com.alibaba.nacos.common.http.param.Header;
|
||||||
|
import com.alibaba.nacos.common.http.param.Query;
|
||||||
|
import com.alibaba.nacos.common.model.RestResult;
|
||||||
|
import com.alibaba.nacos.config.server.constant.Constants;
|
||||||
|
import com.alibaba.nacos.config.server.utils.GroupKey2;
|
||||||
|
import com.alibaba.nacos.core.cluster.Member;
|
||||||
|
import com.alibaba.nacos.core.cluster.ServerMemberManager;
|
||||||
|
import com.alibaba.nacos.core.remote.Connection;
|
||||||
|
import com.alibaba.nacos.core.remote.ConnectionManager;
|
||||||
|
import com.alibaba.nacos.core.utils.GenericType;
|
||||||
|
import com.alibaba.nacos.core.utils.Loggers;
|
||||||
|
import com.alibaba.nacos.sys.env.EnvUtil;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import static com.alibaba.nacos.api.config.remote.request.ClientConfigMetricRequest.MetricsKey.CACHE_DATA;
|
||||||
|
import static com.alibaba.nacos.api.config.remote.request.ClientConfigMetricRequest.MetricsKey.SNAPSHOT_DATA;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ClientMetricsController.
|
||||||
|
*
|
||||||
|
* @author zunfei.lzf
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping(Constants.METRICS_CONTROLLER_PATH)
|
||||||
|
public class ClientMetricsController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ServerMemberManager serverMemberManager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ConnectionManager connectionManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get client metric.
|
||||||
|
*
|
||||||
|
* @param ip client ip .
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@GetMapping("/cluster")
|
||||||
|
public ResponseEntity metric(@RequestParam("ip") String ip,
|
||||||
|
@RequestParam(value = "dataId", required = false) String dataId,
|
||||||
|
@RequestParam(value = "group", required = false) String group,
|
||||||
|
@RequestParam(value = "tenant", required = false) String tenant) {
|
||||||
|
Loggers.CORE.info("Get cluster config metrics received, ip={},dataId={},group={},tenant={}", ip, dataId, group,
|
||||||
|
tenant);
|
||||||
|
Map<String, Object> responseMap = new HashMap<>(3);
|
||||||
|
Collection<Member> members = serverMemberManager.allMembers();
|
||||||
|
final NacosAsyncRestTemplate nacosAsyncRestTemplate = HttpClientBeanHolder
|
||||||
|
.getNacosAsyncRestTemplate(Loggers.CLUSTER);
|
||||||
|
CountDownLatch latch = new CountDownLatch(members.size());
|
||||||
|
for (Member member : members) {
|
||||||
|
String url = HttpUtils
|
||||||
|
.buildUrl(false, member.getAddress(), EnvUtil.getContextPath(), Constants.METRICS_CONTROLLER_PATH,
|
||||||
|
"current");
|
||||||
|
Query query = Query.newInstance().addParam("ip", ip).addParam("dataId", dataId).addParam("group", group)
|
||||||
|
.addParam("tenant", tenant);
|
||||||
|
nacosAsyncRestTemplate.get(url, Header.EMPTY, query, new GenericType<Map>() {
|
||||||
|
}.getType(), new Callback<Map>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReceive(RestResult<Map> result) {
|
||||||
|
if (result.ok()) {
|
||||||
|
responseMap.putAll(result.getData());
|
||||||
|
}
|
||||||
|
latch.countDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(Throwable throwable) {
|
||||||
|
Loggers.CORE
|
||||||
|
.error("Get config metrics error from member address={}, ip={},dataId={},group={},tenant={},error={}",
|
||||||
|
member.getAddress(), ip, dataId, group, tenant, throwable);
|
||||||
|
latch.countDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCancel() {
|
||||||
|
latch.countDown();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
latch.await(3L, TimeUnit.SECONDS);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ResponseEntity.ok().body(responseMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get client config listener lists of subscriber in local machine.
|
||||||
|
*/
|
||||||
|
@GetMapping("/current")
|
||||||
|
public Map<String, Object> getClientMetrics(@RequestParam("ip") String ip,
|
||||||
|
@RequestParam(value = "dataId", required = false) String dataId,
|
||||||
|
@RequestParam(value = "group", required = false) String group,
|
||||||
|
@RequestParam(value = "tenant", required = false) String tenant) {
|
||||||
|
Map<String, Object> metrics = new HashMap<>(16);
|
||||||
|
List<Connection> connectionsByIp = connectionManager.getConnectionByIp(ip);
|
||||||
|
for (Connection connectionByIp : connectionsByIp) {
|
||||||
|
try {
|
||||||
|
ClientConfigMetricRequest clientMetrics = new ClientConfigMetricRequest();
|
||||||
|
if (StringUtils.isNotBlank(dataId)) {
|
||||||
|
clientMetrics.getMetricsKeys().add(ClientConfigMetricRequest.MetricsKey
|
||||||
|
.build(CACHE_DATA, GroupKey2.getKey(dataId, group, tenant)));
|
||||||
|
clientMetrics.getMetricsKeys().add(ClientConfigMetricRequest.MetricsKey
|
||||||
|
.build(SNAPSHOT_DATA, GroupKey2.getKey(dataId, group, tenant)));
|
||||||
|
}
|
||||||
|
|
||||||
|
ClientConfigMetricResponse request1 = (ClientConfigMetricResponse) connectionByIp
|
||||||
|
.request(clientMetrics, 1000L);
|
||||||
|
metrics.putAll(request1.getMetrics());
|
||||||
|
} catch (Exception e) {
|
||||||
|
Loggers.CORE.error("Get config metrics error from client ip={},dataId={},group={},tenant={},error={}", ip, dataId,
|
||||||
|
group, tenant, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return metrics;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -16,10 +16,6 @@
|
|||||||
|
|
||||||
package com.alibaba.nacos.config.server.controller;
|
package com.alibaba.nacos.config.server.controller;
|
||||||
|
|
||||||
import com.alibaba.nacos.api.config.remote.request.ClientConfigMetricRequest;
|
|
||||||
import com.alibaba.nacos.api.config.remote.request.ConfigChangeNotifyRequest;
|
|
||||||
import com.alibaba.nacos.api.config.remote.response.ClientConfigMetricResponse;
|
|
||||||
import com.alibaba.nacos.api.exception.NacosException;
|
|
||||||
import com.alibaba.nacos.config.server.constant.Constants;
|
import com.alibaba.nacos.config.server.constant.Constants;
|
||||||
import com.alibaba.nacos.config.server.model.SampleResult;
|
import com.alibaba.nacos.config.server.model.SampleResult;
|
||||||
import com.alibaba.nacos.config.server.remote.ConfigChangeListenContext;
|
import com.alibaba.nacos.config.server.remote.ConfigChangeListenContext;
|
||||||
@ -31,7 +27,6 @@ import com.alibaba.nacos.core.remote.Connection;
|
|||||||
import com.alibaba.nacos.core.remote.ConnectionManager;
|
import com.alibaba.nacos.core.remote.ConnectionManager;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.ui.ModelMap;
|
import org.springframework.ui.ModelMap;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
@ -40,15 +35,11 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import static com.alibaba.nacos.api.config.remote.request.ClientConfigMetricRequest.MetricsKey.CACHE_DATA;
|
|
||||||
import static com.alibaba.nacos.api.config.remote.request.ClientConfigMetricRequest.MetricsKey.SNAPSHOT_DATA;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller for other node notification.
|
* Controller for other node notification.
|
||||||
*
|
*
|
||||||
@ -145,73 +136,5 @@ public class CommunicationController {
|
|||||||
return result;
|
return result;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Notify client to check config from server.
|
|
||||||
*/
|
|
||||||
@GetMapping("/watcherSyncConfig")
|
|
||||||
public ResponseEntity watcherSyncConfig(@RequestParam("dataId") String dataId, @RequestParam("group") String group,
|
|
||||||
@RequestParam(value = "tenant", required = false) String tenant,
|
|
||||||
@RequestParam(value = "clientIp", required = false) String clientIp, ModelMap modelMap) {
|
|
||||||
String groupKey = GroupKey2.getKey(dataId, group, tenant);
|
|
||||||
Set<String> listenersClients = configChangeListenContext.getListeners(groupKey);
|
|
||||||
List<Connection> listeners = new ArrayList<>();
|
|
||||||
for (String connectionId : listenersClients) {
|
|
||||||
Connection connection = connectionManager.getConnection(connectionId);
|
|
||||||
if (connection != null) {
|
|
||||||
if (StringUtils.isNotBlank(clientIp) && !connection.getMetaInfo().getClientIp().equals(clientIp)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
listeners.add(connection);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if (!listeners.isEmpty()) {
|
|
||||||
ConfigChangeNotifyRequest notifyRequest = new ConfigChangeNotifyRequest();
|
|
||||||
notifyRequest.setDataId(dataId);
|
|
||||||
notifyRequest.setGroup(group);
|
|
||||||
notifyRequest.setTenant(tenant);
|
|
||||||
for (Connection connectionByIp : listeners) {
|
|
||||||
try {
|
|
||||||
connectionByIp.request(notifyRequest, 3000L);
|
|
||||||
} catch (NacosException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ResponseEntity.ok().body(trueStr);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get client config listener lists of subscriber in local machine.
|
|
||||||
*/
|
|
||||||
@GetMapping("/clientMetrics")
|
|
||||||
public Map<String, Object> getClientMetrics(@RequestParam("ip") String ip,
|
|
||||||
@RequestParam(value = "dataId", required = false) String dataId,
|
|
||||||
@RequestParam(value = "group", required = false) String group,
|
|
||||||
@RequestParam(value = "tenant", required = false) String tenant) {
|
|
||||||
Map<String, Object> metrics = new HashMap<>(16);
|
|
||||||
List<Connection> connectionsByIp = connectionManager.getConnectionByIp(ip);
|
|
||||||
for (Connection connectionByIp : connectionsByIp) {
|
|
||||||
try {
|
|
||||||
ClientConfigMetricRequest clientMetrics = new ClientConfigMetricRequest();
|
|
||||||
if (StringUtils.isNotBlank(dataId)) {
|
|
||||||
clientMetrics.getMetricsKeys().add(ClientConfigMetricRequest.MetricsKey
|
|
||||||
.build(CACHE_DATA, GroupKey2.getKey(dataId, group, tenant)));
|
|
||||||
clientMetrics.getMetricsKeys().add(ClientConfigMetricRequest.MetricsKey
|
|
||||||
.build(SNAPSHOT_DATA, GroupKey2.getKey(dataId, group, tenant)));
|
|
||||||
}
|
|
||||||
|
|
||||||
ClientConfigMetricResponse request1 = (ClientConfigMetricResponse) connectionByIp
|
|
||||||
.request(clientMetrics, 3000L);
|
|
||||||
metrics.putAll(request1.getMetrics());
|
|
||||||
} catch (NacosException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return metrics;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -48,8 +48,11 @@ import com.alibaba.nacos.config.server.utils.RequestUtil;
|
|||||||
import com.alibaba.nacos.config.server.utils.TimeUtils;
|
import com.alibaba.nacos.config.server.utils.TimeUtils;
|
||||||
import com.alibaba.nacos.config.server.utils.ZipUtils;
|
import com.alibaba.nacos.config.server.utils.ZipUtils;
|
||||||
import com.alibaba.nacos.sys.utils.InetUtils;
|
import com.alibaba.nacos.sys.utils.InetUtils;
|
||||||
|
import org.apache.catalina.connector.Request;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.commons.lang3.time.DateFormatUtils;
|
import org.apache.commons.lang3.time.DateFormatUtils;
|
||||||
|
import org.apache.tomcat.util.buf.ByteChunk;
|
||||||
|
import org.apache.tomcat.util.http.Parameters;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -70,12 +73,14 @@ import javax.servlet.ServletException;
|
|||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -164,17 +169,17 @@ public class ConfigController {
|
|||||||
configInfo.setType(type);
|
configInfo.setType(type);
|
||||||
if (StringUtils.isBlank(betaIps)) {
|
if (StringUtils.isBlank(betaIps)) {
|
||||||
if (StringUtils.isBlank(tag)) {
|
if (StringUtils.isBlank(tag)) {
|
||||||
persistService.insertOrUpdate(srcIp, srcUser, configInfo, time, configAdvanceInfo, true);
|
persistService.insertOrUpdate(srcIp, srcUser, configInfo, time, configAdvanceInfo, false);
|
||||||
ConfigChangePublisher
|
ConfigChangePublisher
|
||||||
.notifyConfigChange(new ConfigDataChangeEvent(false, dataId, group, tenant, time.getTime()));
|
.notifyConfigChange(new ConfigDataChangeEvent(false, dataId, group, tenant, time.getTime()));
|
||||||
} else {
|
} else {
|
||||||
persistService.insertOrUpdateTag(configInfo, tag, srcIp, srcUser, time, true);
|
persistService.insertOrUpdateTag(configInfo, tag, srcIp, srcUser, time, false);
|
||||||
ConfigChangePublisher.notifyConfigChange(
|
ConfigChangePublisher.notifyConfigChange(
|
||||||
new ConfigDataChangeEvent(false, dataId, group, tenant, tag, time.getTime()));
|
new ConfigDataChangeEvent(false, dataId, group, tenant, tag, time.getTime()));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// beta publish
|
// beta publish
|
||||||
persistService.insertOrUpdateBeta(configInfo, betaIps, srcIp, srcUser, time, true);
|
persistService.insertOrUpdateBeta(configInfo, betaIps, srcIp, srcUser, time, false);
|
||||||
ConfigChangePublisher
|
ConfigChangePublisher
|
||||||
.notifyConfigChange(new ConfigDataChangeEvent(true, dataId, group, tenant, time.getTime()));
|
.notifyConfigChange(new ConfigDataChangeEvent(true, dataId, group, tenant, time.getTime()));
|
||||||
}
|
}
|
||||||
@ -204,9 +209,10 @@ public class ConfigController {
|
|||||||
// check params
|
// check params
|
||||||
ParamUtils.checkParam(dataId, group, "datumId", "content");
|
ParamUtils.checkParam(dataId, group, "datumId", "content");
|
||||||
ParamUtils.checkParam(tag);
|
ParamUtils.checkParam(tag);
|
||||||
|
|
||||||
final String clientIp = RequestUtil.getRemoteIp(request);
|
final String clientIp = RequestUtil.getRemoteIp(request);
|
||||||
inner.doGetConfig(request, response, dataId, group, tenant, tag, clientIp);
|
String isNotify = request.getHeader("notify");
|
||||||
|
inner.doGetConfig(request, response, dataId, group, tenant, tag, isNotify, clientIp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -299,6 +305,46 @@ public class ConfigController {
|
|||||||
return rr;
|
return rr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void removeRequestContext(HttpServletRequest request) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
request.removeAttribute("body");
|
||||||
|
|
||||||
|
Map<String, String[]> parameterMap = request.getParameterMap();
|
||||||
|
Field locked = parameterMap.getClass().getDeclaredField("locked");
|
||||||
|
locked.setAccessible(true);
|
||||||
|
locked.set(parameterMap, false);
|
||||||
|
parameterMap.remove(Constants.PROBE_MODIFY_REQUEST);
|
||||||
|
|
||||||
|
Field inneRequestFiled = request.getClass().getDeclaredField("request");
|
||||||
|
inneRequestFiled.setAccessible(true);
|
||||||
|
Request innerRequest = (Request) inneRequestFiled.get(request);
|
||||||
|
|
||||||
|
Field coyoteRequest = innerRequest.getClass().getDeclaredField("coyoteRequest");
|
||||||
|
coyoteRequest.setAccessible(true);
|
||||||
|
org.apache.coyote.Request coyotoRequest = (org.apache.coyote.Request) coyoteRequest.get(innerRequest);
|
||||||
|
Parameters parameters = coyotoRequest.getParameters();
|
||||||
|
Field hashMapField = parameters.getClass().getDeclaredField("paramHashValues");
|
||||||
|
hashMapField.setAccessible(true);
|
||||||
|
LinkedHashMap hashMaps = (LinkedHashMap) hashMapField.get(parameters);
|
||||||
|
hashMaps.remove(Constants.PROBE_MODIFY_REQUEST);
|
||||||
|
|
||||||
|
Field tmpNameField = parameters.getClass().getDeclaredField("tmpName");
|
||||||
|
tmpNameField.setAccessible(true);
|
||||||
|
ByteChunk tmpName = (ByteChunk) tmpNameField.get(parameters);
|
||||||
|
byte[] bytemp = new byte[0];
|
||||||
|
tmpName.setBytes(bytemp, 0, 0);
|
||||||
|
|
||||||
|
Field tmpValueField = parameters.getClass().getDeclaredField("tmpValue");
|
||||||
|
tmpValueField.setAccessible(true);
|
||||||
|
ByteChunk tmpValue = (ByteChunk) tmpValueField.get(parameters);
|
||||||
|
tmpValue.setBytes(bytemp, 0, 0);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOGGER.warn("remove listen request param error", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The client listens for configuration changes.
|
* The client listens for configuration changes.
|
||||||
*/
|
*/
|
||||||
@ -306,13 +352,16 @@ public class ConfigController {
|
|||||||
@Secured(action = ActionTypes.READ, parser = ConfigResourceParser.class)
|
@Secured(action = ActionTypes.READ, parser = ConfigResourceParser.class)
|
||||||
public void listener(HttpServletRequest request, HttpServletResponse response)
|
public void listener(HttpServletRequest request, HttpServletResponse response)
|
||||||
throws ServletException, IOException {
|
throws ServletException, IOException {
|
||||||
|
|
||||||
request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
|
request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);
|
||||||
|
//remove large listen context , reduce request content to optimize cms gc.
|
||||||
|
removeRequestContext(request);
|
||||||
String probeModify = request.getParameter("Listening-Configs");
|
String probeModify = request.getParameter("Listening-Configs");
|
||||||
if (StringUtils.isBlank(probeModify)) {
|
if (StringUtils.isBlank(probeModify)) {
|
||||||
|
LOGGER.warn("invalid probeModify is blank");
|
||||||
throw new IllegalArgumentException("invalid probeModify");
|
throw new IllegalArgumentException("invalid probeModify");
|
||||||
}
|
}
|
||||||
request.removeAttribute("body");
|
|
||||||
|
|
||||||
probeModify = URLDecoder.decode(probeModify, Constants.ENCODE);
|
probeModify = URLDecoder.decode(probeModify, Constants.ENCODE);
|
||||||
|
|
||||||
Map<String, String> clientMd5Map;
|
Map<String, String> clientMd5Map;
|
||||||
@ -413,7 +462,7 @@ public class ConfigController {
|
|||||||
RestResult<Boolean> rr = new RestResult<Boolean>();
|
RestResult<Boolean> rr = new RestResult<Boolean>();
|
||||||
try {
|
try {
|
||||||
persistService.removeConfigInfo4Beta(dataId, group, tenant);
|
persistService.removeConfigInfo4Beta(dataId, group, tenant);
|
||||||
} catch (Exception e) {
|
} catch (Throwable e) {
|
||||||
LOGGER.error("remove beta data error", e);
|
LOGGER.error("remove beta data error", e);
|
||||||
rr.setCode(500);
|
rr.setCode(500);
|
||||||
rr.setData(false);
|
rr.setData(false);
|
||||||
@ -448,7 +497,7 @@ public class ConfigController {
|
|||||||
rr.setData(ci);
|
rr.setData(ci);
|
||||||
rr.setMessage("stop beta ok");
|
rr.setMessage("stop beta ok");
|
||||||
return rr;
|
return rr;
|
||||||
} catch (Exception e) {
|
} catch (Throwable e) {
|
||||||
LOGGER.error("remove beta data error", e);
|
LOGGER.error("remove beta data error", e);
|
||||||
rr.setCode(500);
|
rr.setCode(500);
|
||||||
rr.setMessage("remove beta data error");
|
rr.setMessage("remove beta data error");
|
||||||
|
@ -119,10 +119,15 @@ public class ConfigServletInner {
|
|||||||
* Execute to get config API.
|
* Execute to get config API.
|
||||||
*/
|
*/
|
||||||
public String doGetConfig(HttpServletRequest request, HttpServletResponse response, String dataId, String group,
|
public String doGetConfig(HttpServletRequest request, HttpServletResponse response, String dataId, String group,
|
||||||
String tenant, String tag, String clientIp) throws IOException, ServletException {
|
String tenant, String tag, String isNotify, String clientIp) throws IOException, ServletException {
|
||||||
|
|
||||||
|
boolean notify = false;
|
||||||
|
if (StringUtils.isNotBlank(isNotify)) {
|
||||||
|
notify = Boolean.valueOf(isNotify);
|
||||||
|
}
|
||||||
|
|
||||||
final String groupKey = GroupKey2.getKey(dataId, group, tenant);
|
final String groupKey = GroupKey2.getKey(dataId, group, tenant);
|
||||||
String autoTag = request.getHeader("Vipserver-Tag");
|
String autoTag = request.getHeader("Vipserver-Tag");
|
||||||
boolean notify = Boolean.valueOf(request.getHeader("notify"));
|
|
||||||
|
|
||||||
String requestIpApp = RequestUtil.getAppName(request);
|
String requestIpApp = RequestUtil.getAppName(request);
|
||||||
int lockResult = tryConfigReadLock(groupKey);
|
int lockResult = tryConfigReadLock(groupKey);
|
||||||
@ -139,14 +144,14 @@ public class ConfigServletInner {
|
|||||||
if (cacheItem.isBeta() && cacheItem.getIps4Beta().contains(clientIp)) {
|
if (cacheItem.isBeta() && cacheItem.getIps4Beta().contains(clientIp)) {
|
||||||
isBeta = true;
|
isBeta = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
final String configType =
|
final String configType =
|
||||||
(null != cacheItem.getType()) ? cacheItem.getType() : FileTypeEnum.TEXT.getFileType();
|
(null != cacheItem.getType()) ? cacheItem.getType() : FileTypeEnum.TEXT.getFileType();
|
||||||
response.setHeader("Config-Type", configType);
|
response.setHeader("Config-Type", configType);
|
||||||
FileTypeEnum fileTypeEnum = FileTypeEnum.getFileTypeEnumByFileExtensionOrFileType(configType);
|
FileTypeEnum fileTypeEnum = FileTypeEnum.getFileTypeEnumByFileExtensionOrFileType(configType);
|
||||||
String contentTypeHeader = fileTypeEnum.getContentType();
|
String contentTypeHeader = fileTypeEnum.getContentType();
|
||||||
response.setHeader(HttpHeaderConsts.CONTENT_TYPE, contentTypeHeader);
|
response.setHeader(HttpHeaderConsts.CONTENT_TYPE, contentTypeHeader);
|
||||||
|
|
||||||
File file = null;
|
File file = null;
|
||||||
ConfigInfoBase configInfoBase = null;
|
ConfigInfoBase configInfoBase = null;
|
||||||
PrintWriter out = null;
|
PrintWriter out = null;
|
||||||
@ -194,9 +199,7 @@ public class ConfigServletInner {
|
|||||||
// no data",
|
// no data",
|
||||||
// new Object[]{clientIp, groupKey});
|
// new Object[]{clientIp, groupKey});
|
||||||
|
|
||||||
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
|
return get404Result(response);
|
||||||
response.getWriter().println("config data not exist");
|
|
||||||
return HttpServletResponse.SC_NOT_FOUND + "";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -277,9 +280,7 @@ public class ConfigServletInner {
|
|||||||
.logPullEvent(dataId, group, tenant, requestIpApp, -1, ConfigTraceService.PULL_EVENT_NOTFOUND, -1,
|
.logPullEvent(dataId, group, tenant, requestIpApp, -1, ConfigTraceService.PULL_EVENT_NOTFOUND, -1,
|
||||||
requestIp, notify);
|
requestIp, notify);
|
||||||
|
|
||||||
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
|
return get404Result(response);
|
||||||
response.getWriter().println("config data not exist");
|
|
||||||
return HttpServletResponse.SC_NOT_FOUND + "";
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -297,9 +298,16 @@ public class ConfigServletInner {
|
|||||||
private static void releaseConfigReadLock(String groupKey) {
|
private static void releaseConfigReadLock(String groupKey) {
|
||||||
ConfigCacheService.releaseReadLock(groupKey);
|
ConfigCacheService.releaseReadLock(groupKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String get404Result(HttpServletResponse response) throws IOException {
|
||||||
|
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
|
||||||
|
response.getWriter().println("config data not exist");
|
||||||
|
return HttpServletResponse.SC_NOT_FOUND + "";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try to add read lock.
|
* Try to add read lock.
|
||||||
|
*
|
||||||
* @param groupKey groupKey string value.
|
* @param groupKey groupKey string value.
|
||||||
* @return 0 - No data and failed. Positive number - lock succeeded. Negative number - lock failed。
|
* @return 0 - No data and failed. Positive number - lock succeeded. Negative number - lock failed。
|
||||||
*/
|
*/
|
||||||
|
@ -27,6 +27,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
|||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Health service.
|
* Health service.
|
||||||
@ -58,9 +59,10 @@ public class HealthController {
|
|||||||
// TODO UP DOWN WARN
|
// TODO UP DOWN WARN
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
String dbStatus = dataSourceService.getHealth();
|
String dbStatus = dataSourceService.getHealth();
|
||||||
if (dbStatus.contains(heathUpStr) && memberManager.isInIpList()) {
|
boolean addressServerHealthy = isAddressServerHealthy();
|
||||||
|
if (dbStatus.contains(heathUpStr) && addressServerHealthy && memberManager.isInIpList()) {
|
||||||
sb.append(heathUpStr);
|
sb.append(heathUpStr);
|
||||||
} else if (dbStatus.contains(heathWarnStr) && memberManager.isInIpList()) {
|
} else if (dbStatus.contains(heathWarnStr) && addressServerHealthy && memberManager.isInIpList()) {
|
||||||
sb.append("WARN:");
|
sb.append("WARN:");
|
||||||
sb.append("slave db (").append(dbStatus.split(":")[1]).append(") down. ");
|
sb.append("slave db (").append(dbStatus.split(":")[1]).append(") down. ");
|
||||||
} else {
|
} else {
|
||||||
@ -68,13 +70,23 @@ public class HealthController {
|
|||||||
if (dbStatus.contains(heathDownStr)) {
|
if (dbStatus.contains(heathDownStr)) {
|
||||||
sb.append("master db (").append(dbStatus.split(":")[1]).append(") down. ");
|
sb.append("master db (").append(dbStatus.split(":")[1]).append(") down. ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!addressServerHealthy) {
|
||||||
|
sb.append("address server down. ");
|
||||||
|
}
|
||||||
if (!memberManager.isInIpList()) {
|
if (!memberManager.isInIpList()) {
|
||||||
sb.append("server ip ").append(InetUtils.getSelfIP())
|
sb.append("server ip ").append(InetUtils.getSelfIP())
|
||||||
.append(" is not in the serverList of address server. ");
|
.append(" is not in the serverList of address server. ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isAddressServerHealthy() {
|
||||||
|
Map<String, Object> info = memberManager.getLookup().info();
|
||||||
|
return info != null && info.get("addressServerHealth") != null && Boolean
|
||||||
|
.valueOf(info.get("addressServerHealth").toString());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,6 @@ import java.io.PrintWriter;
|
|||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
|
|
||||||
import static com.alibaba.nacos.api.common.Constants.LINE_BREAK;
|
import static com.alibaba.nacos.api.common.Constants.LINE_BREAK;
|
||||||
import static com.alibaba.nacos.config.server.utils.LogUtil.PULL_LOG;
|
import static com.alibaba.nacos.config.server.utils.LogUtil.PULL_LOG;
|
||||||
@ -75,11 +74,11 @@ public class ConfigQueryRequestHandler extends RequestHandler<ConfigQueryRequest
|
|||||||
@Override
|
@Override
|
||||||
@TpsControl(pointName = "ConfigQuery", parsers = {ConfigQueryGroupKeyParser.class, ConfigQueryGroupParser.class})
|
@TpsControl(pointName = "ConfigQuery", parsers = {ConfigQueryGroupKeyParser.class, ConfigQueryGroupParser.class})
|
||||||
@Secured(action = ActionTypes.READ, parser = ConfigResourceParser.class)
|
@Secured(action = ActionTypes.READ, parser = ConfigResourceParser.class)
|
||||||
public ConfigQueryResponse handle(ConfigQueryRequest configQueryRequest, RequestMeta requestMeta)
|
public ConfigQueryResponse handle(ConfigQueryRequest request, RequestMeta meta)
|
||||||
throws NacosException {
|
throws NacosException {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ConfigQueryResponse context = getContext(configQueryRequest, requestMeta, configQueryRequest.isNotify());
|
ConfigQueryResponse context = getContext(request, meta, request.isNotify());
|
||||||
return context;
|
return context;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
ConfigQueryResponse contextFail = ConfigQueryResponse
|
ConfigQueryResponse contextFail = ConfigQueryResponse
|
||||||
@ -100,14 +99,15 @@ public class ConfigQueryRequestHandler extends RequestHandler<ConfigQueryRequest
|
|||||||
|
|
||||||
final String groupKey = GroupKey2
|
final String groupKey = GroupKey2
|
||||||
.getKey(configQueryRequest.getDataId(), configQueryRequest.getGroup(), configQueryRequest.getTenant());
|
.getKey(configQueryRequest.getDataId(), configQueryRequest.getGroup(), configQueryRequest.getTenant());
|
||||||
|
|
||||||
String autoTag = configQueryRequest.getHeader("Vipserver-Tag");
|
String autoTag = configQueryRequest.getHeader(com.alibaba.nacos.api.common.Constants.VIPSERVER_TAG);
|
||||||
|
|
||||||
String requestIpApp = meta.getLabels().get(CLIENT_APPNAME_HEADER);
|
String requestIpApp = meta.getLabels().get(CLIENT_APPNAME_HEADER);
|
||||||
|
|
||||||
int lockResult = tryConfigReadLock(groupKey);
|
int lockResult = tryConfigReadLock(groupKey);
|
||||||
|
|
||||||
boolean isBeta = false;
|
boolean isBeta = false;
|
||||||
|
boolean isSli = false;
|
||||||
if (lockResult > 0) {
|
if (lockResult > 0) {
|
||||||
//FileInputStream fis = null;
|
//FileInputStream fis = null;
|
||||||
try {
|
try {
|
||||||
@ -134,7 +134,7 @@ public class ConfigQueryRequestHandler extends RequestHandler<ConfigQueryRequest
|
|||||||
} else {
|
} else {
|
||||||
file = DiskUtil.targetBetaFile(dataId, group, tenant);
|
file = DiskUtil.targetBetaFile(dataId, group, tenant);
|
||||||
}
|
}
|
||||||
response.addLabel("isBeta", "Y");
|
response.setBeta(true);
|
||||||
} else {
|
} else {
|
||||||
if (StringUtils.isBlank(tag)) {
|
if (StringUtils.isBlank(tag)) {
|
||||||
if (isUseTag(cacheItem, autoTag)) {
|
if (isUseTag(cacheItem, autoTag)) {
|
||||||
@ -151,9 +151,8 @@ public class ConfigQueryRequestHandler extends RequestHandler<ConfigQueryRequest
|
|||||||
} else {
|
} else {
|
||||||
file = DiskUtil.targetTagFile(dataId, group, tenant, autoTag);
|
file = DiskUtil.targetTagFile(dataId, group, tenant, autoTag);
|
||||||
}
|
}
|
||||||
|
response.setTag(URLEncoder.encode(autoTag, Constants.ENCODE));
|
||||||
|
|
||||||
response.addLabel("Vipserver-Tag",
|
|
||||||
URLEncoder.encode(autoTag, StandardCharsets.UTF_8.displayName()));
|
|
||||||
} else {
|
} else {
|
||||||
md5 = cacheItem.getMd5();
|
md5 = cacheItem.getMd5();
|
||||||
lastModified = cacheItem.getLastModifiedTs();
|
lastModified = cacheItem.getLastModifiedTs();
|
||||||
@ -209,11 +208,11 @@ public class ConfigQueryRequestHandler extends RequestHandler<ConfigQueryRequest
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
response.addLabel(Constants.CONTENT_MD5, md5);
|
response.setMd5(md5);
|
||||||
|
|
||||||
if (PropertyUtil.isDirectRead()) {
|
if (PropertyUtil.isDirectRead()) {
|
||||||
response.addLabel("Last-Modified", String.valueOf(lastModified));
|
response.setLastModified(lastModified);
|
||||||
response.setContent(configInfoBase.getContent());
|
response.setContent(configInfoBase.getContent());
|
||||||
response.setResultCode(ResponseCode.SUCCESS.getCode());
|
response.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||||
|
|
||||||
@ -221,7 +220,7 @@ public class ConfigQueryRequestHandler extends RequestHandler<ConfigQueryRequest
|
|||||||
//read from file
|
//read from file
|
||||||
String content = readFileContent(file);
|
String content = readFileContent(file);
|
||||||
response.setContent(content);
|
response.setContent(content);
|
||||||
response.addLabel("Last-Modified", String.valueOf(lastModified));
|
response.setLastModified(lastModified);
|
||||||
response.setResultCode(ResponseCode.SUCCESS.getCode());
|
response.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -95,7 +95,7 @@ public class AsyncNotifyService {
|
|||||||
Queue<NotifySingleRpcTask> rpcQueue = new LinkedList<NotifySingleRpcTask>();
|
Queue<NotifySingleRpcTask> rpcQueue = new LinkedList<NotifySingleRpcTask>();
|
||||||
|
|
||||||
for (Member member : ipList) {
|
for (Member member : ipList) {
|
||||||
if (MemberUtil.isSupportedLongCon(member)) {
|
if (!MemberUtil.isSupportedLongCon(member)) {
|
||||||
httpQueue.add(new NotifySingleTask(dataId, group, tenant, tag, dumpTs, member.getAddress(),
|
httpQueue.add(new NotifySingleTask(dataId, group, tenant, tag, dumpTs, member.getAddress(),
|
||||||
evt.isBeta));
|
evt.isBeta));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,56 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.alibaba.nacos.console.controller;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.core.cluster.ServerMemberManager;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ClientMetricsController.
|
|
||||||
*
|
|
||||||
* @author zunfei.lzf
|
|
||||||
*/
|
|
||||||
@RequestMapping("/v1/console/client")
|
|
||||||
public class ClientMetricsController {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private ServerMemberManager serverMemberManager;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get client metric.
|
|
||||||
* @param clientIp client ip .
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@GetMapping("/metrics")
|
|
||||||
public ResponseEntity metric(@RequestParam String clientIp) {
|
|
||||||
Map<String, String> responseMap = new HashMap<>(3);
|
|
||||||
|
|
||||||
return ResponseEntity.ok().body(responseMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Map<String, String> geMetrics(String clientIp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -36,6 +36,13 @@ public interface MemberLookup {
|
|||||||
*/
|
*/
|
||||||
void start() throws NacosException;
|
void start() throws NacosException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* is using address server.
|
||||||
|
*
|
||||||
|
* @return using address server or not.
|
||||||
|
*/
|
||||||
|
boolean useAddressServer();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inject the ServerMemberManager property.
|
* Inject the ServerMemberManager property.
|
||||||
*
|
*
|
||||||
|
@ -82,6 +82,8 @@ public class ServerMemberManager implements ApplicationListener<WebServerInitial
|
|||||||
private final NacosAsyncRestTemplate asyncRestTemplate = HttpClientBeanHolder
|
private final NacosAsyncRestTemplate asyncRestTemplate = HttpClientBeanHolder
|
||||||
.getNacosAsyncRestTemplate(Loggers.CORE);
|
.getNacosAsyncRestTemplate(Loggers.CORE);
|
||||||
|
|
||||||
|
private static boolean isUseAddressServer = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cluster node list.
|
* Cluster node list.
|
||||||
*/
|
*/
|
||||||
@ -90,7 +92,7 @@ public class ServerMemberManager implements ApplicationListener<WebServerInitial
|
|||||||
/**
|
/**
|
||||||
* Is this node in the cluster list.
|
* Is this node in the cluster list.
|
||||||
*/
|
*/
|
||||||
private volatile boolean isInIpList = true;
|
private static volatile boolean isInIpList = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* port.
|
* port.
|
||||||
@ -162,11 +164,19 @@ public class ServerMemberManager implements ApplicationListener<WebServerInitial
|
|||||||
|
|
||||||
private void initAndStartLookup() throws NacosException {
|
private void initAndStartLookup() throws NacosException {
|
||||||
this.lookup = LookupFactory.createLookUp(this);
|
this.lookup = LookupFactory.createLookUp(this);
|
||||||
|
isUseAddressServer = this.lookup.useAddressServer();
|
||||||
this.lookup.start();
|
this.lookup.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* switch look up.
|
||||||
|
*
|
||||||
|
* @param name look up name.
|
||||||
|
* @throws NacosException exception.
|
||||||
|
*/
|
||||||
public void switchLookup(String name) throws NacosException {
|
public void switchLookup(String name) throws NacosException {
|
||||||
this.lookup = LookupFactory.switchLookup(name, this);
|
this.lookup = LookupFactory.switchLookup(name, this);
|
||||||
|
isUseAddressServer = this.lookup.useAddressServer();
|
||||||
this.lookup.start();
|
this.lookup.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,6 +212,10 @@ public class ServerMemberManager implements ApplicationListener<WebServerInitial
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isUseAddressServer() {
|
||||||
|
return isUseAddressServer;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* member information update.
|
* member information update.
|
||||||
*
|
*
|
||||||
@ -257,6 +271,22 @@ public class ServerMemberManager implements ApplicationListener<WebServerInitial
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<String> getServerListUnhealth() {
|
||||||
|
List<String> unhealthyMembers = new ArrayList<>();
|
||||||
|
for (Member member : this.allMembers()) {
|
||||||
|
NodeState state = member.getState();
|
||||||
|
if (state.equals(NodeState.DOWN)) {
|
||||||
|
unhealthyMembers.add(member.getAddress());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return unhealthyMembers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MemberLookup getLookup() {
|
||||||
|
return lookup;
|
||||||
|
}
|
||||||
|
|
||||||
public Member getSelf() {
|
public Member getSelf() {
|
||||||
return this.self;
|
return this.self;
|
||||||
}
|
}
|
||||||
@ -438,7 +468,7 @@ public class ServerMemberManager implements ApplicationListener<WebServerInitial
|
|||||||
return Collections.unmodifiableMap(serverList);
|
return Collections.unmodifiableMap(serverList);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInIpList() {
|
public static boolean isInIpList() {
|
||||||
return isInIpList;
|
return isInIpList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,6 +75,11 @@ public class AddressServerMemberLookup extends AbstractMemberLookup {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean useAddressServer() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private void initAddressSys() {
|
private void initAddressSys() {
|
||||||
String envDomainName = System.getenv("address_server_domain");
|
String envDomainName = System.getenv("address_server_domain");
|
||||||
if (StringUtils.isBlank(envDomainName)) {
|
if (StringUtils.isBlank(envDomainName)) {
|
||||||
|
@ -65,6 +65,11 @@ public class FileConfigMemberLookup extends AbstractMemberLookup {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean useAddressServer() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void destroy() throws NacosException {
|
public void destroy() throws NacosException {
|
||||||
WatchFileCenter.deregisterWatcher(EnvUtil.getConfPath(), watcher);
|
WatchFileCenter.deregisterWatcher(EnvUtil.getConfPath(), watcher);
|
||||||
|
@ -37,4 +37,9 @@ public class StandaloneMemberLookup extends AbstractMemberLookup {
|
|||||||
afterLookup(MemberUtil.readServerConf(Collections.singletonList(url)));
|
afterLookup(MemberUtil.readServerConf(Collections.singletonList(url)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean useAddressServer() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,8 @@ import java.util.Date;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static com.alibaba.nacos.api.common.Constants.VIPSERVER_TAG;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ConnectionMetaInfo.
|
* ConnectionMetaInfo.
|
||||||
*
|
*
|
||||||
@ -87,6 +89,10 @@ public class ConnectionMeta {
|
|||||||
return labels.get(labelKey);
|
return labels.get(labelKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getTag() {
|
||||||
|
return labels.get(VIPSERVER_TAG);
|
||||||
|
}
|
||||||
|
|
||||||
public ConnectionMeta(String connectionId, String clientIp, int clientPort, int localPort, String connectType,
|
public ConnectionMeta(String connectionId, String clientIp, int clientPort, int localPort, String connectType,
|
||||||
String version, String appName, Map<String, String> labels) {
|
String version, String appName, Map<String, String> labels) {
|
||||||
this.connectionId = connectionId;
|
this.connectionId = connectionId;
|
||||||
|
Loading…
Reference in New Issue
Block a user