diff --git a/client/src/main/java/com/alibaba/nacos/client/config/impl/HttpSimpleClient.java b/client/src/main/java/com/alibaba/nacos/client/config/impl/HttpSimpleClient.java index b8d7b5548..67499d649 100644 --- a/client/src/main/java/com/alibaba/nacos/client/config/impl/HttpSimpleClient.java +++ b/client/src/main/java/com/alibaba/nacos/client/config/impl/HttpSimpleClient.java @@ -20,7 +20,9 @@ import com.alibaba.nacos.api.exception.NacosException; import com.alibaba.nacos.client.config.utils.IOUtils; import com.alibaba.nacos.client.config.utils.MD5; import com.alibaba.nacos.client.utils.ParamUtil; +import com.alibaba.nacos.common.constant.HttpHeaderConsts; import com.alibaba.nacos.common.util.UuidUtils; +import com.alibaba.nacos.common.util.VersionUtils; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -201,7 +203,7 @@ public class HttpSimpleClient { conn.addRequestProperty(iter.next(), iter.next()); } } - conn.addRequestProperty("Client-Version", ParamUtil.getClientVersion()); + conn.addRequestProperty(HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.VERSION); conn.addRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + encoding); String ts = String.valueOf(System.currentTimeMillis()); diff --git a/client/src/main/java/com/alibaba/nacos/client/naming/beat/BeatReactor.java b/client/src/main/java/com/alibaba/nacos/client/naming/beat/BeatReactor.java index 3d3e60d25..f316e3deb 100644 --- a/client/src/main/java/com/alibaba/nacos/client/naming/beat/BeatReactor.java +++ b/client/src/main/java/com/alibaba/nacos/client/naming/beat/BeatReactor.java @@ -56,7 +56,13 @@ public class BeatReactor { public void addBeatInfo(String serviceName, BeatInfo beatInfo) { NAMING_LOGGER.info("[BEAT] adding beat: {} to beat map.", beatInfo); - dom2Beat.put(buildKey(serviceName, beatInfo.getIp(), beatInfo.getPort()), beatInfo); + String key = buildKey(serviceName, beatInfo.getIp(), beatInfo.getPort()); + BeatInfo existBeat = null; + //fix #1733 + if ((existBeat = dom2Beat.remove(key)) != null) { + existBeat.setStopped(true); + } + dom2Beat.put(key, beatInfo); executorService.schedule(new BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS); MetricsMonitor.getDom2BeatSizeMonitor().set(dom2Beat.size()); } diff --git a/client/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy.java b/client/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy.java index 92de72fa7..3eec5d752 100644 --- a/client/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy.java +++ b/client/src/main/java/com/alibaba/nacos/client/naming/net/NamingProxy.java @@ -35,8 +35,10 @@ import com.alibaba.nacos.client.naming.utils.*; import com.alibaba.nacos.client.utils.AppNameUtils; import com.alibaba.nacos.client.utils.StringUtils; import com.alibaba.nacos.client.utils.TemplateUtils; +import com.alibaba.nacos.common.constant.HttpHeaderConsts; import com.alibaba.nacos.common.util.HttpMethod; import com.alibaba.nacos.common.util.UuidUtils; +import com.alibaba.nacos.common.util.VersionUtils; import java.io.IOException; import java.io.StringReader; @@ -499,8 +501,9 @@ public class NamingProxy { } public List builderHeaders() { - List headers = Arrays.asList("Client-Version", UtilAndComs.VERSION, - "User-Agent", UtilAndComs.VERSION, + List headers = Arrays.asList( + HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.VERSION, + HttpHeaderConsts.USER_AGENT_HEADER, UtilAndComs.VERSION, "Accept-Encoding", "gzip,deflate,sdch", "Connection", "Keep-Alive", "RequestId", UuidUtils.generateUuid(), "Request-Module", "Naming"); diff --git a/common/src/main/java/com/alibaba/nacos/common/constant/HttpHeaderConsts.java b/common/src/main/java/com/alibaba/nacos/common/constant/HttpHeaderConsts.java new file mode 100644 index 000000000..f6d0215e2 --- /dev/null +++ b/common/src/main/java/com/alibaba/nacos/common/constant/HttpHeaderConsts.java @@ -0,0 +1,28 @@ +/* + * 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.common.constant; + +/** + * Nacos header constants + * + * @author ly + */ +public interface HttpHeaderConsts { + + String CLIENT_VERSION_HEADER = "Client-Version"; + String USER_AGENT_HEADER = "User-Agent"; + +} diff --git a/core/src/main/java/com/alibaba/nacos/core/utils/WebUtils.java b/core/src/main/java/com/alibaba/nacos/core/utils/WebUtils.java index 4f5d2d2b6..5fd037340 100644 --- a/core/src/main/java/com/alibaba/nacos/core/utils/WebUtils.java +++ b/core/src/main/java/com/alibaba/nacos/core/utils/WebUtils.java @@ -15,6 +15,7 @@ */ package com.alibaba.nacos.core.utils; +import com.alibaba.nacos.common.constant.HttpHeaderConsts; import org.apache.commons.lang3.StringUtils; import javax.servlet.http.HttpServletRequest; @@ -71,4 +72,20 @@ public class WebUtils { encode = encode.contains(",") ? encode.substring(0, encode.indexOf(",")) : encode; return encode.contains(";") ? encode.substring(0, encode.indexOf(";")) : encode; } + + /** + * Returns the value of the request header "user-agent" as a String. + * + * @param request HttpServletRequest + * @return the value of the request header "user-agent", or the value of the + * request header "client-version" if the request does not have a + * header of "user-agent" + */ + public static String getUserAgent(HttpServletRequest request) { + String userAgent = request.getHeader(HttpHeaderConsts.USER_AGENT_HEADER); + if (StringUtils.isEmpty(userAgent)) { + userAgent = StringUtils.defaultIfEmpty(request.getHeader(HttpHeaderConsts.CLIENT_VERSION_HEADER), StringUtils.EMPTY); + } + return userAgent; + } } diff --git a/distribution/bin/shutdown.sh b/distribution/bin/shutdown.sh index cb64555b1..3df4a03e6 100644 --- a/distribution/bin/shutdown.sh +++ b/distribution/bin/shutdown.sh @@ -12,8 +12,10 @@ # 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. +cd `dirname $0`/../target +target_dir=`pwd` -pid=`ps ax | grep -i 'nacos.nacos' |grep java | grep -v grep | awk '{print $1}'` +pid=`ps ax | grep -i 'nacos.nacos' | grep ${target_dir} | grep java | grep -v grep | awk '{print $1}'` if [ -z "$pid" ] ; then echo "No nacosServer running." exit -1; diff --git a/naming/src/main/java/com/alibaba/nacos/naming/acl/AuthChecker.java b/naming/src/main/java/com/alibaba/nacos/naming/acl/AuthChecker.java index be2545c65..aa863732b 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/acl/AuthChecker.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/acl/AuthChecker.java @@ -52,12 +52,7 @@ public class AuthChecker { return; } - String agent = req.getHeader("Client-Version"); - if (StringUtils.startsWith(agent, UtilsAndCommons.NACOS_SERVER_HEADER)) { - return; - } - - agent = req.getHeader("User-Agent"); + String agent = WebUtils.getUserAgent(req); if (StringUtils.startsWith(agent, UtilsAndCommons.NACOS_SERVER_HEADER)) { return; } diff --git a/naming/src/main/java/com/alibaba/nacos/naming/controllers/ApiController.java b/naming/src/main/java/com/alibaba/nacos/naming/controllers/ApiController.java index a9da7b0bb..98ea7724f 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/controllers/ApiController.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/controllers/ApiController.java @@ -61,7 +61,7 @@ public class ApiController extends InstanceController { JSONObject result = new JSONObject(); // For old DNS-F client: String dnsfVersion = "1.0.1"; - String agent = request.getHeader("Client-Version"); + String agent = WebUtils.getUserAgent(request); ClientInfo clientInfo = new ClientInfo(agent); if (clientInfo.type == ClientInfo.ClientType.DNS && clientInfo.version.compareTo(VersionUtil.parseVersion(dnsfVersion)) <= 0) { @@ -122,7 +122,7 @@ public class ApiController extends InstanceController { Constants.DEFAULT_NAMESPACE_ID); String dom = WebUtils.required(request, "dom"); - String agent = request.getHeader("Client-Version"); + String agent = WebUtils.getUserAgent(request); String clusters = WebUtils.optional(request, "clusters", StringUtils.EMPTY); String clientIP = WebUtils.optional(request, "clientIP", StringUtils.EMPTY); Integer udpPort = Integer.parseInt(WebUtils.optional(request, "udpPort", "0")); diff --git a/naming/src/main/java/com/alibaba/nacos/naming/controllers/InstanceController.java b/naming/src/main/java/com/alibaba/nacos/naming/controllers/InstanceController.java index c8b4cb829..f3f1ebb21 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/controllers/InstanceController.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/controllers/InstanceController.java @@ -126,10 +126,7 @@ public class InstanceController { String serviceName = WebUtils.required(request, CommonParams.SERVICE_NAME); String namespaceId = WebUtils.optional(request, CommonParams.NAMESPACE_ID, Constants.DEFAULT_NAMESPACE_ID); - String agent = request.getHeader("Client-Version"); - if (StringUtils.isBlank(agent)) { - agent = request.getHeader("User-Agent"); - } + String agent = WebUtils.getUserAgent(request); ClientInfo clientInfo = new ClientInfo(agent); @@ -149,10 +146,7 @@ public class InstanceController { Constants.DEFAULT_NAMESPACE_ID); String serviceName = WebUtils.required(request, CommonParams.SERVICE_NAME); - String agent = request.getHeader("Client-Version"); - if (StringUtils.isBlank(agent)) { - agent = request.getHeader("User-Agent"); - } + String agent = WebUtils.getUserAgent(request); String clusters = WebUtils.optional(request, "clusters", StringUtils.EMPTY); String clientIP = WebUtils.optional(request, "clientIP", StringUtils.EMPTY); Integer udpPort = Integer.parseInt(WebUtils.optional(request, "udpPort", "0")); diff --git a/naming/src/main/java/com/alibaba/nacos/naming/controllers/ServiceController.java b/naming/src/main/java/com/alibaba/nacos/naming/controllers/ServiceController.java index 28870a624..56067b19a 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/controllers/ServiceController.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/controllers/ServiceController.java @@ -237,7 +237,7 @@ public class ServiceController { String namespaceId = WebUtils.optional(request, CommonParams.NAMESPACE_ID, Constants.DEFAULT_NAMESPACE_ID); String serviceName = WebUtils.required(request, CommonParams.SERVICE_NAME); - float protectThreshold = NumberUtils.toFloat(WebUtils.required(request, "protectThreshold")); + float protectThreshold = NumberUtils.toFloat(WebUtils.optional(request, "protectThreshold", "0")); String metadata = WebUtils.optional(request, "metadata", StringUtils.EMPTY); String selector = WebUtils.optional(request, "selector", StringUtils.EMPTY); diff --git a/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClient.java b/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClient.java index 808d7016a..b3f4ab7f9 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClient.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/misc/HttpClient.java @@ -15,7 +15,9 @@ */ package com.alibaba.nacos.naming.misc; +import com.alibaba.nacos.common.constant.HttpHeaderConsts; import com.alibaba.nacos.common.util.HttpMethod; +import com.alibaba.nacos.common.util.VersionUtils; import com.ning.http.client.AsyncCompletionHandler; import com.ning.http.client.AsyncHttpClient; import com.ning.http.client.AsyncHttpClientConfig; @@ -102,8 +104,6 @@ public class HttpClient { conn.setReadTimeout(readTimeout); conn.setRequestMethod(method); - conn.addRequestProperty("Client-Version", UtilsAndCommons.SERVER_VERSION); - conn.addRequestProperty("User-Agent", UtilsAndCommons.SERVER_VERSION); setHeaders(conn, headers, encoding); conn.connect(); @@ -449,8 +449,8 @@ public class HttpClient { conn.addRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + encoding); conn.addRequestProperty("Accept-Charset", encoding); - conn.addRequestProperty("Client-Version", UtilsAndCommons.SERVER_VERSION); - conn.addRequestProperty("User-Agent", UtilsAndCommons.SERVER_VERSION); + conn.addRequestProperty(HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.VERSION); + conn.addRequestProperty(HttpHeaderConsts.USER_AGENT_HEADER, UtilsAndCommons.SERVER_VERSION); } public static String encodingParams(Map params, String encoding) diff --git a/naming/src/main/java/com/alibaba/nacos/naming/misc/NamingProxy.java b/naming/src/main/java/com/alibaba/nacos/naming/misc/NamingProxy.java index 9945ad629..c1a4aa27a 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/misc/NamingProxy.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/misc/NamingProxy.java @@ -16,6 +16,8 @@ package com.alibaba.nacos.naming.misc; import com.alibaba.fastjson.JSON; +import com.alibaba.nacos.common.constant.HttpHeaderConsts; +import com.alibaba.nacos.common.util.VersionUtils; import com.alibaba.nacos.naming.boot.RunningConfig; import com.ning.http.client.AsyncCompletionHandler; import com.ning.http.client.Response; @@ -43,8 +45,8 @@ public class NamingProxy { try { Map headers = new HashMap<>(128); - headers.put("Client-Version", UtilsAndCommons.SERVER_VERSION); - headers.put("User-Agent", UtilsAndCommons.SERVER_VERSION); + headers.put(HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.VERSION); + headers.put(HttpHeaderConsts.USER_AGENT_HEADER, UtilsAndCommons.SERVER_VERSION); headers.put("Connection", "Keep-Alive"); HttpClient.asyncHttpPutLarge("http://" + server + RunningConfig.getContextPath() @@ -110,9 +112,9 @@ public class NamingProxy { public static boolean syncData(byte[] data, String curServer) { Map headers = new HashMap<>(128); - - headers.put("Client-Version", UtilsAndCommons.SERVER_VERSION); - headers.put("User-Agent", UtilsAndCommons.SERVER_VERSION); + + headers.put(HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.VERSION); + headers.put(HttpHeaderConsts.USER_AGENT_HEADER, UtilsAndCommons.SERVER_VERSION); headers.put("Accept-Encoding", "gzip,deflate,sdch"); headers.put("Connection", "Keep-Alive"); headers.put("Content-Encoding", "gzip"); @@ -138,8 +140,9 @@ public class NamingProxy { public static String reqAPI(String api, Map params, String curServer) throws Exception { try { - List headers = Arrays.asList("Client-Version", UtilsAndCommons.SERVER_VERSION, - "User-Agent", UtilsAndCommons.SERVER_VERSION, + List headers = Arrays.asList( + HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.VERSION, + HttpHeaderConsts.USER_AGENT_HEADER, UtilsAndCommons.SERVER_VERSION, "Accept-Encoding", "gzip,deflate,sdch", "Connection", "Keep-Alive", "Content-Encoding", "gzip"); @@ -172,8 +175,9 @@ public class NamingProxy { public static String reqAPI(String api, Map params, String curServer, boolean isPost) throws Exception { try { - List headers = Arrays.asList("Client-Version", UtilsAndCommons.SERVER_VERSION, - "User-Agent", UtilsAndCommons.SERVER_VERSION, + List headers = Arrays.asList( + HttpHeaderConsts.CLIENT_VERSION_HEADER, VersionUtils.VERSION, + HttpHeaderConsts.USER_AGENT_HEADER, UtilsAndCommons.SERVER_VERSION, "Accept-Encoding", "gzip,deflate,sdch", "Connection", "Keep-Alive", "Content-Encoding", "gzip"); diff --git a/naming/src/main/java/com/alibaba/nacos/naming/web/DistroFilter.java b/naming/src/main/java/com/alibaba/nacos/naming/web/DistroFilter.java index 78b51e138..85873163c 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/web/DistroFilter.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/web/DistroFilter.java @@ -17,6 +17,7 @@ package com.alibaba.nacos.naming.web; import com.alibaba.nacos.api.common.Constants; import com.alibaba.nacos.api.naming.CommonParams; +import com.alibaba.nacos.common.constant.HttpHeaderConsts; import com.alibaba.nacos.naming.core.DistroMapper; import com.alibaba.nacos.naming.misc.HttpClient; import com.alibaba.nacos.naming.misc.Loggers; @@ -97,7 +98,7 @@ public class DistroFilter implements Filter { // proxy request to other server if necessary: if (method.isAnnotationPresent(CanDistro.class) && !distroMapper.responsible(groupedServiceName)) { - String userAgent = req.getHeader("User-Agent"); + String userAgent = req.getHeader(HttpHeaderConsts.USER_AGENT_HEADER); if (StringUtils.isNotBlank(userAgent) && userAgent.contains(UtilsAndCommons.NACOS_SERVER_HEADER)) { // This request is sent from peer server, should not be redirected again: diff --git a/naming/src/main/java/com/alibaba/nacos/naming/web/TrafficReviseFilter.java b/naming/src/main/java/com/alibaba/nacos/naming/web/TrafficReviseFilter.java index 8ba69b551..9240dbf0d 100644 --- a/naming/src/main/java/com/alibaba/nacos/naming/web/TrafficReviseFilter.java +++ b/naming/src/main/java/com/alibaba/nacos/naming/web/TrafficReviseFilter.java @@ -16,6 +16,7 @@ package com.alibaba.nacos.naming.web; import com.alibaba.nacos.common.util.HttpMethod; +import com.alibaba.nacos.core.utils.WebUtils; import com.alibaba.nacos.naming.cluster.ServerStatus; import com.alibaba.nacos.naming.cluster.ServerStatusManager; import com.alibaba.nacos.naming.misc.SwitchDomain; @@ -70,10 +71,7 @@ public class TrafficReviseFilter implements Filter { } // requests from peer server should be let pass: - String agent = req.getHeader("Client-Version"); - if (StringUtils.isBlank(agent)) { - agent = req.getHeader("User-Agent"); - } + String agent = WebUtils.getUserAgent(req); if (StringUtils.startsWith(agent, UtilsAndCommons.NACOS_SERVER_HEADER)) { filterChain.doFilter(req, resp); diff --git a/test/src/test/java/com/alibaba/nacos/test/naming/NamingBase.java b/test/src/test/java/com/alibaba/nacos/test/naming/NamingBase.java index a76fc785a..96b634e00 100644 --- a/test/src/test/java/com/alibaba/nacos/test/naming/NamingBase.java +++ b/test/src/test/java/com/alibaba/nacos/test/naming/NamingBase.java @@ -17,6 +17,7 @@ package com.alibaba.nacos.test.naming; import com.alibaba.nacos.api.naming.pojo.Instance; import com.alibaba.nacos.client.naming.net.HttpClient; +import com.alibaba.nacos.common.constant.HttpHeaderConsts; import org.apache.http.HttpStatus; import org.junit.Assert; @@ -173,7 +174,7 @@ public class NamingBase { public static void prepareServer(int localPort, String status) { String url = "http://127.0.0.1:" + localPort + "/nacos/v1/ns/operator/switches?entry=overriddenServerStatus&value=" + status; List headers = new ArrayList(); - headers.add("User-Agent"); + headers.add(HttpHeaderConsts.USER_AGENT_HEADER); headers.add("Nacos-Server"); HttpClient.HttpResult result = HttpClient.request(url, headers, new HashMap(), "UTF-8", "PUT");