mirror of https://github.com/alibaba/nacos.git
				
				
				
			Merge remote-tracking branch 'upstream/develop' into feature_support_grpc_core
# Conflicts: # api/pom.xml # client/src/main/java/com/alibaba/nacos/client/config/NacosConfigService.java # client/src/main/java/com/alibaba/nacos/client/naming/NacosNamingService.java # client/src/main/java/com/alibaba/nacos/client/naming/core/HostReactor.java # client/src/main/java/com/alibaba/nacos/client/naming/remote/http/NamingHttpClientProxy.java # client/src/test/java/com/alibaba/nacos/client/naming/core/HostReactorTest.java # common/src/main/java/com/alibaba/nacos/common/notify/NotifyCenter.java # core/pom.xml # naming/src/main/java/com/alibaba/nacos/naming/healthcheck/HttpHealthCheckProcessor.java # naming/src/main/java/com/alibaba/nacos/naming/web/DistroFilter.java # pom.xml
This commit is contained in:
		
						commit
						e56eb3680c
					
				|  | @ -15,3 +15,4 @@ derby.log | |||
| work | ||||
| test/logs | ||||
| derby.log | ||||
| yarn.lock | ||||
|  | @ -18,6 +18,7 @@ package com.alibaba.nacos.address.component; | |||
| 
 | ||||
| import com.alibaba.nacos.address.constant.AddressServerConstants; | ||||
| import com.alibaba.nacos.api.common.Constants; | ||||
| import com.alibaba.nacos.common.utils.IPUtil; | ||||
| import com.alibaba.nacos.naming.core.Instance; | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.stereotype.Component; | ||||
|  | @ -85,14 +86,11 @@ public class AddressServerGeneratorManager { | |||
|     } | ||||
|      | ||||
|     private String[] generateIpAndPort(String ip) { | ||||
|          | ||||
|         int index = ip.indexOf(AddressServerConstants.IP_PORT_SEPARATOR); | ||||
|         if (index != -1) { | ||||
|              | ||||
|             return new String[] {ip.substring(0, index), ip.substring(index + 1)}; | ||||
|         String[] result = IPUtil.splitIPPortStr(ip); | ||||
|         if (result.length != IPUtil.SPLIT_IP_PORT_RESULT_LENGTH) { | ||||
|             return new String[] {result[0], String.valueOf(AddressServerConstants.DEFAULT_SERVER_PORT)}; | ||||
|         } | ||||
|          | ||||
|         return new String[] {ip, String.valueOf(AddressServerConstants.DEFAULT_SERVER_PORT)}; | ||||
|         return result; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|  |  | |||
|  | @ -38,11 +38,6 @@ public interface AddressServerConstants { | |||
|      */ | ||||
|     String DEFAULT_PRODUCT = "nacos"; | ||||
|      | ||||
|     /** | ||||
|      * the separator between ip and port. | ||||
|      */ | ||||
|     String IP_PORT_SEPARATOR = ":"; | ||||
|      | ||||
|     /** | ||||
|      * the separator for service name between raw service name and group. | ||||
|      */ | ||||
|  |  | |||
|  | @ -20,9 +20,9 @@ import com.alibaba.nacos.address.component.AddressServerGeneratorManager; | |||
| import com.alibaba.nacos.address.component.AddressServerManager; | ||||
| import com.alibaba.nacos.address.constant.AddressServerConstants; | ||||
| import com.alibaba.nacos.address.misc.Loggers; | ||||
| import com.alibaba.nacos.address.util.AddressServerParamCheckUtil; | ||||
| import com.alibaba.nacos.api.common.Constants; | ||||
| import com.alibaba.nacos.api.naming.pojo.healthcheck.AbstractHealthChecker; | ||||
| import com.alibaba.nacos.common.utils.IPUtil; | ||||
| import com.alibaba.nacos.naming.core.Cluster; | ||||
| import com.alibaba.nacos.naming.core.Instance; | ||||
| import com.alibaba.nacos.naming.core.Service; | ||||
|  | @ -87,8 +87,8 @@ public class AddressServerClusterController { | |||
|             clusterObj.setHealthChecker(new AbstractHealthChecker.None()); | ||||
|             serviceManager.createServiceIfAbsent(Constants.DEFAULT_NAMESPACE_ID, serviceName, false, clusterObj); | ||||
|             String[] ipArray = addressServerManager.splitIps(ips); | ||||
|             String checkResult = AddressServerParamCheckUtil.checkIps(ipArray); | ||||
|             if (AddressServerParamCheckUtil.CHECK_OK.equals(checkResult)) { | ||||
|             String checkResult = IPUtil.checkIPs(ipArray); | ||||
|             if (IPUtil.checkOK(checkResult)) { | ||||
|                 List<Instance> instanceList = addressServerGeneratorManager | ||||
|                         .generateInstancesByIps(serviceName, rawProductName, clusterName, ipArray); | ||||
|                 for (Instance instance : instanceList) { | ||||
|  | @ -143,8 +143,8 @@ public class AddressServerClusterController { | |||
|                 } else { | ||||
|                     // delete specified ip list | ||||
|                     String[] ipArray = addressServerManager.splitIps(ips); | ||||
|                     String checkResult = AddressServerParamCheckUtil.checkIps(ipArray); | ||||
|                     if (AddressServerParamCheckUtil.CHECK_OK.equals(checkResult)) { | ||||
|                     String checkResult = IPUtil.checkIPs(ipArray); | ||||
|                     if (IPUtil.checkOK(checkResult)) { | ||||
|                         List<Instance> instanceList = addressServerGeneratorManager | ||||
|                                 .generateInstancesByIps(serviceName, rawProductName, clusterName, ipArray); | ||||
|                         serviceManager.removeInstance(Constants.DEFAULT_NAMESPACE_ID, serviceName, false, | ||||
|  |  | |||
|  | @ -1,67 +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.address.util; | ||||
| 
 | ||||
| import java.util.regex.Matcher; | ||||
| import java.util.regex.Pattern; | ||||
| 
 | ||||
| /** | ||||
|  * Provides a unified tool class for address server parameter verification. | ||||
|  * | ||||
|  * @author pbting | ||||
|  * @date 2019-06-19 11:19 AM | ||||
|  * @since 1.1.0 | ||||
|  */ | ||||
| public class AddressServerParamCheckUtil { | ||||
|      | ||||
|     public static final String CHECK_OK = "ok"; | ||||
|      | ||||
|     public static final String ILLEGAL_IP_PREFIX = "illegal ip: "; | ||||
|      | ||||
|     private static final String IP_REGEX = "(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})(\\.(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})){3}"; | ||||
|      | ||||
|     private static final Pattern IP_PATTERN = Pattern.compile(IP_REGEX); | ||||
|      | ||||
|     /** | ||||
|      * Check ips. | ||||
|      * | ||||
|      * @param ips ips | ||||
|      * @return 'ok' if check passed, otherwise illegal ip | ||||
|      */ | ||||
|     public static String checkIps(String... ips) { | ||||
|          | ||||
|         if (ips == null || ips.length == 0) { | ||||
|              | ||||
|             return CHECK_OK; | ||||
|         } | ||||
|         // illegal response | ||||
|         StringBuilder illegalResponse = new StringBuilder(); | ||||
|         for (String ip : ips) { | ||||
|             Matcher matcher = IP_PATTERN.matcher(ip); | ||||
|             if (matcher.matches()) { | ||||
|                 continue; | ||||
|             } | ||||
|             illegalResponse.append(ip + ","); | ||||
|         } | ||||
|          | ||||
|         if (illegalResponse.length() == 0) { | ||||
|             return CHECK_OK; | ||||
|         } | ||||
|          | ||||
|         return ILLEGAL_IP_PREFIX + illegalResponse.substring(0, illegalResponse.length() - 1); | ||||
|     } | ||||
| } | ||||
|  | @ -16,17 +16,17 @@ | |||
| 
 | ||||
| package com.alibaba.nacos.address; | ||||
| 
 | ||||
| import com.alibaba.nacos.address.util.AddressServerParamCheckUtil; | ||||
| import com.alibaba.nacos.common.utils.IPUtil; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class ParamCheckUtilTests { | ||||
|      | ||||
|     @Test | ||||
|     public void checkIps() { | ||||
|     public void checkIPs() { | ||||
|         String[] ips = {"127.0.0.1"}; | ||||
|         System.out.println(AddressServerParamCheckUtil.checkIps(ips)); | ||||
|         System.out.println(IPUtil.checkIPs(ips)); | ||||
|          | ||||
|         String[] illlegalIps = {"127.100.19", "127.0.0.1"}; | ||||
|         System.err.println(AddressServerParamCheckUtil.checkIps(illlegalIps)); | ||||
|         System.err.println(IPUtil.checkIPs(illlegalIps)); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -59,7 +59,6 @@ | |||
|                     <target>6</target> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
| 
 | ||||
|         </plugins> | ||||
|     </build> | ||||
|      | ||||
|  | @ -80,10 +79,6 @@ | |||
|             <groupId>org.reflections</groupId> | ||||
|             <artifactId>reflections</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.apache.commons</groupId> | ||||
|             <artifactId>commons-lang3</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>junit</groupId> | ||||
|             <artifactId>junit</artifactId> | ||||
|  | @ -99,7 +94,6 @@ | |||
|             <artifactId>guava</artifactId> | ||||
|         </dependency> | ||||
|          | ||||
|      | ||||
|         <dependency> | ||||
|             <groupId>io.grpc</groupId> | ||||
|             <artifactId>grpc-netty-shaded</artifactId> | ||||
|  |  | |||
|  | @ -79,6 +79,18 @@ public interface ConfigService { | |||
|      */ | ||||
|     boolean publishConfig(String dataId, String group, String content) throws NacosException; | ||||
|      | ||||
|     /** | ||||
|      * Publish config. | ||||
|      * | ||||
|      * @param dataId  dataId | ||||
|      * @param group   group | ||||
|      * @param content content | ||||
|      * @param type    config type {@link ConfigType} | ||||
|      * @return Whether publish | ||||
|      * @throws NacosException NacosException | ||||
|      */ | ||||
|     boolean publishConfig(String dataId, String group, String content, String type) throws NacosException; | ||||
|      | ||||
|     /** | ||||
|      * Remove config. | ||||
|      * | ||||
|  |  | |||
|  | @ -16,6 +16,8 @@ | |||
| 
 | ||||
| package com.alibaba.nacos.api.config; | ||||
| 
 | ||||
| import com.alibaba.nacos.api.utils.StringUtils; | ||||
| 
 | ||||
| /** | ||||
|  * Config data type. | ||||
|  * | ||||
|  | @ -62,4 +64,26 @@ public enum ConfigType { | |||
|     public String getType() { | ||||
|         return type; | ||||
|     } | ||||
|      | ||||
|     public static ConfigType getDefaultType() { | ||||
|         return TEXT; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * check input type is valid. | ||||
|      * | ||||
|      * @param type config type | ||||
|      * @return it the type valid | ||||
|      */ | ||||
|     public static Boolean isValidType(String type) { | ||||
|         if (StringUtils.isBlank(type)) { | ||||
|             return false; | ||||
|         } | ||||
|         for (ConfigType value : values()) { | ||||
|             if (value.type.equals(type)) { | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,38 @@ | |||
| /* | ||||
|  * 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.api.naming.listener; | ||||
| 
 | ||||
| import java.util.concurrent.Executor; | ||||
| 
 | ||||
| /** | ||||
|  * Abstract event listener, to support handle event by user custom executor. | ||||
|  * | ||||
|  * @author horizonzy | ||||
|  * @since 1.4.1 | ||||
|  */ | ||||
| public abstract class AbstractEventListener implements EventListener { | ||||
|      | ||||
|     /** | ||||
|      * Get executor for execute this receive. | ||||
|      * | ||||
|      * @return Executor | ||||
|      */ | ||||
|     public Executor getExecutor() { | ||||
|         return null; | ||||
|     } | ||||
|      | ||||
| } | ||||
|  | @ -31,6 +31,7 @@ import java.util.List; | |||
|  * ServiceInfo. | ||||
|  * | ||||
|  * @author nkorange | ||||
|  * @author shizhengxing | ||||
|  */ | ||||
| @JsonInclude(Include.NON_NULL) | ||||
| public class ServiceInfo { | ||||
|  | @ -67,19 +68,28 @@ public class ServiceInfo { | |||
|         this.allIPs = allIPs; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * There is only one form of the key:groupName@@name@clusters. This constuctor used by DiskCache.read(String) and | ||||
|      * FailoverReactor.FailoverFileReader,you should know that 'groupName' must not be null,and 'clusters' can be null. | ||||
|      */ | ||||
|     public ServiceInfo(String key) { | ||||
|          | ||||
|         int maxIndex = 2; | ||||
|         int clusterIndex = 1; | ||||
|         int serviceNameIndex = 0; | ||||
|         int clusterIndex = 2; | ||||
|         int serviceNameIndex = 1; | ||||
|         int groupIndex = 0; | ||||
|          | ||||
|         String[] keys = key.split(Constants.SERVICE_INFO_SPLITER); | ||||
|         if (keys.length >= maxIndex) { | ||||
|         if (keys.length >= maxIndex + 1) { | ||||
|             this.groupName = keys[groupIndex]; | ||||
|             this.name = keys[serviceNameIndex]; | ||||
|             this.clusters = keys[clusterIndex]; | ||||
|         } else if (keys.length == maxIndex) { | ||||
|             this.groupName = keys[groupIndex]; | ||||
|             this.name = keys[serviceNameIndex]; | ||||
|         } else { | ||||
|             //defensive programming | ||||
|             throw new IllegalArgumentException("Cann't parse out 'groupName',but it must not be null!"); | ||||
|         } | ||||
|          | ||||
|         this.name = keys[0]; | ||||
|     } | ||||
|      | ||||
|     public ServiceInfo(String name, String clusters) { | ||||
|  | @ -190,7 +200,8 @@ public class ServiceInfo { | |||
|      | ||||
|     @JsonIgnore | ||||
|     public String getKey() { | ||||
|         return getKey(name, clusters); | ||||
|         String serviceName = getGroupedServiceName(); | ||||
|         return getKey(serviceName, clusters); | ||||
|     } | ||||
|      | ||||
|     @JsonIgnore | ||||
|  | @ -205,11 +216,21 @@ public class ServiceInfo { | |||
|      | ||||
|     @JsonIgnore | ||||
|     public String getKeyEncoded() { | ||||
|         String serviceName = getGroupedServiceName(); | ||||
|         try { | ||||
|             return getKey(URLEncoder.encode(name, "UTF-8"), clusters); | ||||
|             serviceName = URLEncoder.encode(serviceName, "UTF-8"); | ||||
|         } catch (UnsupportedEncodingException e) { | ||||
|             return getKey(); | ||||
|             //do nothing | ||||
|         } | ||||
|         return getKey(serviceName, clusters); | ||||
|     } | ||||
|      | ||||
|     private String getGroupedServiceName() { | ||||
|         String serviceName = this.name; | ||||
|         if (!isEmpty(groupName) && serviceName.indexOf(Constants.SERVICE_INFO_SPLITER) == -1) { | ||||
|             serviceName = groupName + Constants.SERVICE_INFO_SPLITER + serviceName; | ||||
|         } | ||||
|         return serviceName; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|  |  | |||
|  | @ -56,9 +56,7 @@ public class NamingUtils { | |||
|     } | ||||
|      | ||||
|     /** | ||||
|      * check combineServiceName format. the serviceName can't be blank. some relational logic in {@link | ||||
|      * com.alibaba.nacos.naming.web.DistroFilter#doFilter}, it will handle combineServiceName in some case, you should | ||||
|      * know it. | ||||
|      * check combineServiceName format. the serviceName can't be blank. | ||||
|      * <pre> | ||||
|      * serviceName = "@@"; the length = 0; illegal | ||||
|      * serviceName = "group@@"; the length = 1; illegal | ||||
|  |  | |||
|  | @ -23,6 +23,8 @@ import org.junit.Before; | |||
| import org.junit.Test; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.io.UnsupportedEncodingException; | ||||
| import java.net.URLEncoder; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| import static org.junit.Assert.assertFalse; | ||||
|  | @ -38,13 +40,13 @@ public class ServiceInfoTest { | |||
|     public void setUp() throws Exception { | ||||
|         mapper = new ObjectMapper(); | ||||
|         mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); | ||||
|         serviceInfo = new ServiceInfo("testName", "testClusters"); | ||||
|         serviceInfo = new ServiceInfo("G@@testName", "testClusters"); | ||||
|     } | ||||
|      | ||||
|     @Test | ||||
|     public void testSerialize() throws JsonProcessingException { | ||||
|         String actual = mapper.writeValueAsString(serviceInfo); | ||||
|         assertTrue(actual.contains("\"name\":\"testName\"")); | ||||
|         assertTrue(actual.contains("\"name\":\"G@@testName\"")); | ||||
|         assertTrue(actual.contains("\"clusters\":\"testClusters\"")); | ||||
|         assertTrue(actual.contains("\"cacheMillis\":1000")); | ||||
|         assertTrue(actual.contains("\"hosts\":[]")); | ||||
|  | @ -58,11 +60,11 @@ public class ServiceInfoTest { | |||
|     } | ||||
|      | ||||
|     @Test | ||||
|     @SuppressWarnings("checkstyle:linelength") | ||||
|     public void testDeserialize() throws IOException { | ||||
|         String example = "{\"name\":\"testName\",\"clusters\":\"testClusters\",\"cacheMillis\":1000,\"hosts\":[],\"lastRefTime\":0,\"checksum\":\"\",\"allIPs\":false,\"valid\":true,\"groupName\":\"\"}"; | ||||
|         String example = "{\"name\":\"G@@testName\",\"clusters\":\"testClusters\",\"cacheMillis\":1000,\"hosts\":[]," | ||||
|                 + "\"lastRefTime\":0,\"checksum\":\"\",\"allIPs\":false,\"valid\":true,\"groupName\":\"\"}"; | ||||
|         ServiceInfo actual = mapper.readValue(example, ServiceInfo.class); | ||||
|         assertEquals("testName", actual.getName()); | ||||
|         assertEquals("G@@testName", actual.getName()); | ||||
|         assertEquals("testClusters", actual.getClusters()); | ||||
|         assertEquals("", actual.getChecksum()); | ||||
|         assertEquals("", actual.getGroupName()); | ||||
|  | @ -72,4 +74,32 @@ public class ServiceInfoTest { | |||
|         assertTrue(actual.isValid()); | ||||
|         assertFalse(actual.isAllIPs()); | ||||
|     } | ||||
|      | ||||
|     @Test | ||||
|     public void testGetKey() { | ||||
|         String key = serviceInfo.getKey(); | ||||
|         assertEquals("G@@testName@@testClusters", key); | ||||
|     } | ||||
|      | ||||
|     @Test | ||||
|     public void testGetKeyEncode() { | ||||
|         String key = serviceInfo.getKeyEncoded(); | ||||
|         String encodeName = null; | ||||
|         try { | ||||
|             encodeName = URLEncoder.encode("G@@testName", "utf-8"); | ||||
|         } catch (UnsupportedEncodingException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         assertEquals(key, ServiceInfo.getKey(encodeName, "testClusters")); | ||||
|     } | ||||
|      | ||||
|     @Test | ||||
|     public void testServiceInfoConstructor() { | ||||
|         String key1 = "group@@name"; | ||||
|         String key2 = "group@@name@@c2"; | ||||
|         ServiceInfo s1 = new ServiceInfo(key1); | ||||
|         ServiceInfo s2 = new ServiceInfo(key2); | ||||
|         assertEquals(key1, s1.getKey()); | ||||
|         assertEquals(key2, s2.getKey()); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -19,6 +19,7 @@ package com.alibaba.nacos.client.config; | |||
| import com.alibaba.nacos.api.PropertyKeyConst; | ||||
| import com.alibaba.nacos.api.common.Constants; | ||||
| import com.alibaba.nacos.api.config.ConfigService; | ||||
| import com.alibaba.nacos.api.config.ConfigType; | ||||
| import com.alibaba.nacos.api.config.listener.Listener; | ||||
| import com.alibaba.nacos.api.exception.NacosException; | ||||
| import com.alibaba.nacos.client.config.filter.impl.ConfigFilterChainManager; | ||||
|  | @ -88,7 +89,12 @@ public class NacosConfigService implements ConfigService { | |||
|      | ||||
|     @Override | ||||
|     public boolean publishConfig(String dataId, String group, String content) throws NacosException { | ||||
|         return publishConfigInner(namespace, dataId, group, null, null, null, content); | ||||
|         return publishConfig(dataId, group, content, ConfigType.getDefaultType().getType()); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public boolean publishConfig(String dataId, String group, String content, String type) throws NacosException { | ||||
|         return publishConfigInner(namespace, dataId, group, null, null, null, content, type); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|  | @ -157,7 +163,7 @@ public class NacosConfigService implements ConfigService { | |||
|     } | ||||
|      | ||||
|     private boolean publishConfigInner(String tenant, String dataId, String group, String tag, String appName, | ||||
|             String betaIps, String content) throws NacosException { | ||||
|             String betaIps, String content, String type) throws NacosException { | ||||
|         group = null2defaultGroup(group); | ||||
|         ParamUtils.checkParam(dataId, group, content); | ||||
|          | ||||
|  |  | |||
|  | @ -30,6 +30,7 @@ import com.alibaba.nacos.common.http.param.Query; | |||
| import com.alibaba.nacos.common.lifecycle.Closeable; | ||||
| import com.alibaba.nacos.common.notify.NotifyCenter; | ||||
| import com.alibaba.nacos.common.utils.IoUtils; | ||||
| import com.alibaba.nacos.common.utils.IPUtil; | ||||
| import com.alibaba.nacos.common.utils.StringUtils; | ||||
| import com.alibaba.nacos.common.utils.ThreadUtils; | ||||
| import org.slf4j.Logger; | ||||
|  | @ -87,9 +88,9 @@ public class ServerListManager implements Closeable { | |||
|         this.isStarted = true; | ||||
|         List<String> serverAddrs = new ArrayList<String>(); | ||||
|         for (String serverAddr : fixed) { | ||||
|             String[] serverAddrArr = serverAddr.split(":"); | ||||
|             String[] serverAddrArr = IPUtil.splitIPPortStr(serverAddr); | ||||
|             if (serverAddrArr.length == 1) { | ||||
|                 serverAddrs.add(serverAddrArr[0] + ":" + ParamUtil.getDefaultServerPort()); | ||||
|                 serverAddrs.add(serverAddrArr[0] + IPUtil.IP_PORT_SPLITER + ParamUtil.getDefaultServerPort()); | ||||
|             } else { | ||||
|                 serverAddrs.add(serverAddr); | ||||
|             } | ||||
|  | @ -156,9 +157,10 @@ public class ServerListManager implements Closeable { | |||
|                 if (serverAddr.startsWith(HTTPS) || serverAddr.startsWith(HTTP)) { | ||||
|                     serverAddrs.add(serverAddr); | ||||
|                 } else { | ||||
|                     String[] serverAddrArr = serverAddr.split(":"); | ||||
|                     String[] serverAddrArr = IPUtil.splitIPPortStr(serverAddr); | ||||
|                     if (serverAddrArr.length == 1) { | ||||
|                         serverAddrs.add(HTTP + serverAddrArr[0] + ":" + ParamUtil.getDefaultServerPort()); | ||||
|                         serverAddrs.add(HTTP + serverAddrArr[0] + IPUtil.IP_PORT_SPLITER + ParamUtil | ||||
|                                 .getDefaultServerPort()); | ||||
|                     } else { | ||||
|                         serverAddrs.add(HTTP + serverAddr); | ||||
|                     } | ||||
|  | @ -355,10 +357,10 @@ public class ServerListManager implements Closeable { | |||
|                 List<String> result = new ArrayList<String>(lines.size()); | ||||
|                 for (String serverAddr : lines) { | ||||
|                     if (StringUtils.isNotBlank(serverAddr)) { | ||||
|                         String[] ipPort = serverAddr.trim().split(":"); | ||||
|                         String[] ipPort = IPUtil.splitIPPortStr(serverAddr.trim()); | ||||
|                         String ip = ipPort[0].trim(); | ||||
|                         if (ipPort.length == 1) { | ||||
|                             result.add(ip + ":" + ParamUtil.getDefaultServerPort()); | ||||
|                             result.add(ip + IPUtil.IP_PORT_SPLITER + ParamUtil.getDefaultServerPort()); | ||||
|                         } else { | ||||
|                             result.add(serverAddr); | ||||
|                         } | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ | |||
| package com.alibaba.nacos.client.config.utils; | ||||
| 
 | ||||
| import com.alibaba.nacos.api.exception.NacosException; | ||||
| import com.alibaba.nacos.common.utils.IpUtils; | ||||
| import com.alibaba.nacos.common.utils.IPUtil; | ||||
| import com.alibaba.nacos.common.utils.StringUtils; | ||||
| 
 | ||||
| import java.util.List; | ||||
|  | @ -190,7 +190,7 @@ public class ParamUtils { | |||
|         } | ||||
|         String[] ipsArr = betaIps.split(","); | ||||
|         for (String ip : ipsArr) { | ||||
|             if (!IpUtils.isIpv4(ip)) { | ||||
|             if (!IPUtil.isIP(ip)) { | ||||
|                 throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "betaIps invalid"); | ||||
|             } | ||||
|         } | ||||
|  |  | |||
|  | @ -1,189 +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.client.naming.core; | ||||
| 
 | ||||
| import com.alibaba.nacos.api.exception.NacosException; | ||||
| import com.alibaba.nacos.api.naming.listener.EventListener; | ||||
| import com.alibaba.nacos.api.naming.listener.NamingEvent; | ||||
| import com.alibaba.nacos.api.naming.pojo.Instance; | ||||
| import com.alibaba.nacos.api.naming.pojo.ServiceInfo; | ||||
| import com.alibaba.nacos.client.naming.utils.CollectionUtils; | ||||
| import com.alibaba.nacos.common.lifecycle.Closeable; | ||||
| import com.alibaba.nacos.common.utils.ThreadUtils; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.Iterator; | ||||
| import java.util.List; | ||||
| import java.util.concurrent.BlockingQueue; | ||||
| import java.util.concurrent.ConcurrentHashMap; | ||||
| import java.util.concurrent.ConcurrentMap; | ||||
| import java.util.concurrent.ExecutorService; | ||||
| import java.util.concurrent.Executors; | ||||
| import java.util.concurrent.LinkedBlockingQueue; | ||||
| import java.util.concurrent.ThreadFactory; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| 
 | ||||
| import static com.alibaba.nacos.client.utils.LogUtils.NAMING_LOGGER; | ||||
| 
 | ||||
| /** | ||||
|  * Event dispatcher. | ||||
|  * | ||||
|  * @author xuanyin | ||||
|  */ | ||||
| @SuppressWarnings("PMD.ThreadPoolCreationRule") | ||||
| public class EventDispatcher implements Closeable { | ||||
|      | ||||
|     private ExecutorService executor = null; | ||||
|      | ||||
|     private final BlockingQueue<ServiceInfo> changedServices = new LinkedBlockingQueue<ServiceInfo>(); | ||||
|      | ||||
|     private final ConcurrentMap<String, List<EventListener>> observerMap = new ConcurrentHashMap<String, List<EventListener>>(); | ||||
|      | ||||
|     private volatile boolean closed = false; | ||||
|      | ||||
|     public EventDispatcher() { | ||||
|          | ||||
|         this.executor = Executors.newSingleThreadExecutor(new ThreadFactory() { | ||||
|             @Override | ||||
|             public Thread newThread(Runnable r) { | ||||
|                 Thread thread = new Thread(r, "com.alibaba.nacos.naming.client.listener"); | ||||
|                 thread.setDaemon(true); | ||||
|                  | ||||
|                 return thread; | ||||
|             } | ||||
|         }); | ||||
|          | ||||
|         this.executor.execute(new Notifier()); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Add listener. | ||||
|      * | ||||
|      * @param serviceInfo service info | ||||
|      * @param clusters    clusters | ||||
|      * @param listener    listener | ||||
|      */ | ||||
|     public void addListener(ServiceInfo serviceInfo, String clusters, EventListener listener) { | ||||
|          | ||||
|         NAMING_LOGGER.info("[LISTENER] adding " + serviceInfo.getName() + " with " + clusters + " to listener map"); | ||||
|         List<EventListener> observers = Collections.synchronizedList(new ArrayList<EventListener>()); | ||||
|         observers.add(listener); | ||||
|          | ||||
|         observers = observerMap.putIfAbsent(ServiceInfo.getKey(serviceInfo.getName(), clusters), observers); | ||||
|         if (observers != null) { | ||||
|             observers.add(listener); | ||||
|         } | ||||
|          | ||||
|         serviceChanged(serviceInfo); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Remove listener. | ||||
|      * | ||||
|      * @param serviceName service name | ||||
|      * @param clusters    clusters | ||||
|      * @param listener    listener | ||||
|      */ | ||||
|     public void removeListener(String serviceName, String clusters, EventListener listener) { | ||||
|          | ||||
|         NAMING_LOGGER.info("[LISTENER] removing " + serviceName + " with " + clusters + " from listener map"); | ||||
|          | ||||
|         List<EventListener> observers = observerMap.get(ServiceInfo.getKey(serviceName, clusters)); | ||||
|         if (observers != null) { | ||||
|             Iterator<EventListener> iter = observers.iterator(); | ||||
|             while (iter.hasNext()) { | ||||
|                 EventListener oldListener = iter.next(); | ||||
|                 if (oldListener.equals(listener)) { | ||||
|                     iter.remove(); | ||||
|                 } | ||||
|             } | ||||
|             if (observers.isEmpty()) { | ||||
|                 observerMap.remove(ServiceInfo.getKey(serviceName, clusters)); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     public boolean isSubscribed(String serviceName, String clusters) { | ||||
|         return observerMap.containsKey(ServiceInfo.getKey(serviceName, clusters)); | ||||
|     } | ||||
|      | ||||
|     public List<ServiceInfo> getSubscribeServices() { | ||||
|         List<ServiceInfo> serviceInfos = new ArrayList<ServiceInfo>(); | ||||
|         for (String key : observerMap.keySet()) { | ||||
|             serviceInfos.add(ServiceInfo.fromKey(key)); | ||||
|         } | ||||
|         return serviceInfos; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Service changed. | ||||
|      * | ||||
|      * @param serviceInfo service info | ||||
|      */ | ||||
|     public void serviceChanged(ServiceInfo serviceInfo) { | ||||
|         if (serviceInfo == null) { | ||||
|             return; | ||||
|         } | ||||
|          | ||||
|         changedServices.add(serviceInfo); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public void shutdown() throws NacosException { | ||||
|         String className = this.getClass().getName(); | ||||
|         NAMING_LOGGER.info("{} do shutdown begin", className); | ||||
|         ThreadUtils.shutdownThreadPool(executor, NAMING_LOGGER); | ||||
|         closed = true; | ||||
|         NAMING_LOGGER.info("{} do shutdown stop", className); | ||||
|     } | ||||
|      | ||||
|     private class Notifier implements Runnable { | ||||
|          | ||||
|         @Override | ||||
|         public void run() { | ||||
|             while (!closed) { | ||||
|                  | ||||
|                 ServiceInfo serviceInfo = null; | ||||
|                 try { | ||||
|                     serviceInfo = changedServices.poll(5, TimeUnit.MINUTES); | ||||
|                 } catch (Exception ignore) { | ||||
|                 } | ||||
|                  | ||||
|                 if (serviceInfo == null) { | ||||
|                     continue; | ||||
|                 } | ||||
|                  | ||||
|                 try { | ||||
|                     List<EventListener> listeners = observerMap.get(serviceInfo.getKey()); | ||||
|                      | ||||
|                     if (!CollectionUtils.isEmpty(listeners)) { | ||||
|                         for (EventListener listener : listeners) { | ||||
|                             List<Instance> hosts = Collections.unmodifiableList(serviceInfo.getHosts()); | ||||
|                             listener.onEvent(new NamingEvent(serviceInfo.getName(), serviceInfo.getGroupName(), | ||||
|                                     serviceInfo.getClusters(), hosts)); | ||||
|                         } | ||||
|                     } | ||||
|                      | ||||
|                 } catch (Exception e) { | ||||
|                     NAMING_LOGGER.error("[NA] notify error for service: " + serviceInfo.getName() + ", clusters: " | ||||
|                             + serviceInfo.getClusters(), e); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,65 @@ | |||
| /* | ||||
|  * 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.client.naming.event; | ||||
| 
 | ||||
| import com.alibaba.nacos.api.naming.pojo.Instance; | ||||
| import com.alibaba.nacos.common.notify.Event; | ||||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| /** | ||||
|  * Instances change event. | ||||
|  * | ||||
|  * @author horizonzy | ||||
|  * @since 1.4.1 | ||||
|  */ | ||||
| public class InstancesChangeEvent extends Event { | ||||
|      | ||||
|     private static final long serialVersionUID = -8823087028212249603L; | ||||
|      | ||||
|     private final String serviceName; | ||||
|      | ||||
|     private final String groupName; | ||||
|      | ||||
|     private final String clusters; | ||||
|      | ||||
|     private final List<Instance> hosts; | ||||
|      | ||||
|     public InstancesChangeEvent(String serviceName, String groupName, String clusters, List<Instance> hosts) { | ||||
|         this.serviceName = serviceName; | ||||
|         this.groupName = groupName; | ||||
|         this.clusters = clusters; | ||||
|         this.hosts = hosts; | ||||
|     } | ||||
|      | ||||
|     public String getServiceName() { | ||||
|         return serviceName; | ||||
|     } | ||||
|      | ||||
|     public String getGroupName() { | ||||
|         return groupName; | ||||
|     } | ||||
|      | ||||
|     public String getClusters() { | ||||
|         return clusters; | ||||
|     } | ||||
|      | ||||
|     public List<Instance> getHosts() { | ||||
|         return hosts; | ||||
|     } | ||||
|      | ||||
| } | ||||
|  | @ -0,0 +1,140 @@ | |||
| /* | ||||
|  * 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.client.naming.event; | ||||
| 
 | ||||
| import com.alibaba.nacos.api.naming.listener.AbstractEventListener; | ||||
| import com.alibaba.nacos.api.naming.listener.EventListener; | ||||
| import com.alibaba.nacos.api.naming.listener.NamingEvent; | ||||
| import com.alibaba.nacos.api.naming.pojo.ServiceInfo; | ||||
| import com.alibaba.nacos.common.notify.Event; | ||||
| import com.alibaba.nacos.common.notify.listener.Subscriber; | ||||
| import com.alibaba.nacos.common.utils.CollectionUtils; | ||||
| import com.alibaba.nacos.common.utils.ConcurrentHashSet; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.concurrent.ConcurrentHashMap; | ||||
| 
 | ||||
| /** | ||||
|  * A subscriber to notify eventListener callback. | ||||
|  * | ||||
|  * @author horizonzy | ||||
|  * @since 1.4.1 | ||||
|  */ | ||||
| public class InstancesChangeNotifier extends Subscriber<InstancesChangeEvent> { | ||||
|      | ||||
|     private final Map<String, ConcurrentHashSet<EventListener>> listenerMap = new ConcurrentHashMap<String, ConcurrentHashSet<EventListener>>(); | ||||
|      | ||||
|     private final Object lock = new Object(); | ||||
|      | ||||
|     /** | ||||
|      * register listener. | ||||
|      * | ||||
|      * @param serviceName combineServiceName, such as 'xxx@@xxx' | ||||
|      * @param clusters    clusters, concat by ','. such as 'xxx,yyy' | ||||
|      * @param listener    custom listener | ||||
|      */ | ||||
|     public void registerListener(String serviceName, String clusters, EventListener listener) { | ||||
|         String key = ServiceInfo.getKey(serviceName, clusters); | ||||
|         ConcurrentHashSet<EventListener> eventListeners = listenerMap.get(key); | ||||
|         if (eventListeners == null) { | ||||
|             synchronized (lock) { | ||||
|                 eventListeners = listenerMap.get(key); | ||||
|                 if (eventListeners == null) { | ||||
|                     eventListeners = new ConcurrentHashSet<EventListener>(); | ||||
|                     listenerMap.put(key, eventListeners); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         eventListeners.add(listener); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * deregister listener. | ||||
|      * | ||||
|      * @param serviceName combineServiceName, such as 'xxx@@xxx' | ||||
|      * @param clusters    clusters, concat by ','. such as 'xxx,yyy' | ||||
|      * @param listener    custom listener | ||||
|      */ | ||||
|     public void deregisterListener(String serviceName, String clusters, EventListener listener) { | ||||
|         String key = ServiceInfo.getKey(serviceName, clusters); | ||||
|         ConcurrentHashSet<EventListener> eventListeners = listenerMap.get(key); | ||||
|         if (eventListeners == null) { | ||||
|             return; | ||||
|         } | ||||
|         eventListeners.remove(listener); | ||||
|         if (CollectionUtils.isEmpty(eventListeners)) { | ||||
|             listenerMap.remove(key); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * check serviceName,clusters is subscribed. | ||||
|      * | ||||
|      * @param serviceName combineServiceName, such as 'xxx@@xxx' | ||||
|      * @param clusters    clusters, concat by ','. such as 'xxx,yyy' | ||||
|      * @return is serviceName,clusters subscribed | ||||
|      */ | ||||
|     public boolean isSubscribed(String serviceName, String clusters) { | ||||
|         String key = ServiceInfo.getKey(serviceName, clusters); | ||||
|         ConcurrentHashSet<EventListener> eventListeners = listenerMap.get(key); | ||||
|         return CollectionUtils.isNotEmpty(eventListeners); | ||||
|     } | ||||
|      | ||||
|     public List<ServiceInfo> getSubscribeServices() { | ||||
|         List<ServiceInfo> serviceInfos = new ArrayList<ServiceInfo>(); | ||||
|         for (String key : listenerMap.keySet()) { | ||||
|             serviceInfos.add(ServiceInfo.fromKey(key)); | ||||
|         } | ||||
|         return serviceInfos; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public void onEvent(InstancesChangeEvent event) { | ||||
|         String key = ServiceInfo.getKey(event.getServiceName(), event.getClusters()); | ||||
|         ConcurrentHashSet<EventListener> eventListeners = listenerMap.get(key); | ||||
|         if (CollectionUtils.isEmpty(eventListeners)) { | ||||
|             return; | ||||
|         } | ||||
|         for (final EventListener listener : eventListeners) { | ||||
|             final com.alibaba.nacos.api.naming.listener.Event namingEvent = transferToNamingEvent(event); | ||||
|             if (listener instanceof AbstractEventListener && ((AbstractEventListener) listener).getExecutor() != null) { | ||||
|                 ((AbstractEventListener) listener).getExecutor().execute(new Runnable() { | ||||
|                     @Override | ||||
|                     public void run() { | ||||
|                         listener.onEvent(namingEvent); | ||||
|                     } | ||||
|                 }); | ||||
|                 continue; | ||||
|             } | ||||
|             listener.onEvent(namingEvent); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     private com.alibaba.nacos.api.naming.listener.Event transferToNamingEvent( | ||||
|             InstancesChangeEvent instancesChangeEvent) { | ||||
|         return new NamingEvent(instancesChangeEvent.getServiceName(), instancesChangeEvent.getGroupName(), | ||||
|                 instancesChangeEvent.getClusters(), instancesChangeEvent.getHosts()); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public Class<? extends Event> subscribeType() { | ||||
|         return InstancesChangeEvent.class; | ||||
|     } | ||||
|      | ||||
| } | ||||
|  | @ -50,6 +50,8 @@ import com.alibaba.nacos.common.http.client.NacosRestTemplate; | |||
| import com.alibaba.nacos.common.http.param.Header; | ||||
| import com.alibaba.nacos.common.http.param.Query; | ||||
| import com.alibaba.nacos.common.utils.HttpMethod; | ||||
| import com.alibaba.nacos.common.utils.IoUtils; | ||||
| import com.alibaba.nacos.common.utils.IPUtil; | ||||
| import com.alibaba.nacos.common.utils.JacksonUtils; | ||||
| import com.alibaba.nacos.common.utils.StringUtils; | ||||
| import com.alibaba.nacos.common.utils.ThreadUtils; | ||||
|  | @ -474,8 +476,8 @@ public class NamingHttpClientProxy implements NamingClientProxy { | |||
|         if (curServer.startsWith(UtilAndComs.HTTPS) || curServer.startsWith(UtilAndComs.HTTP)) { | ||||
|             url = curServer + api; | ||||
|         } else { | ||||
|             if (!curServer.contains(UtilAndComs.SERVER_ADDR_IP_SPLITER)) { | ||||
|                 curServer = curServer + UtilAndComs.SERVER_ADDR_IP_SPLITER + serverPort; | ||||
|             if (!IPUtil.containsPort(curServer)) { | ||||
|                 curServer = curServer + IPUtil.IP_PORT_SPLITER + serverPort; | ||||
|             } | ||||
|             url = NamingHttpClientManager.getInstance().getPrefix() + curServer + api; | ||||
|         } | ||||
|  |  | |||
|  | @ -53,8 +53,6 @@ public class UtilAndComs { | |||
|      | ||||
|     public static final String NACOS_NAMING_LOG_LEVEL = "com.alibaba.nacos.naming.log.level"; | ||||
|      | ||||
|     public static final String SERVER_ADDR_IP_SPLITER = ":"; | ||||
|      | ||||
|     public static final int DEFAULT_CLIENT_BEAT_THREAD_COUNT = | ||||
|             Runtime.getRuntime().availableProcessors() > 1 ? Runtime.getRuntime().availableProcessors() / 2 : 1; | ||||
|      | ||||
|  |  | |||
|  | @ -41,7 +41,7 @@ public class DiskCacheTest { | |||
|     @Before | ||||
|     public void setUp() throws Exception { | ||||
|         System.out.println(CACHE_DIR); | ||||
|         serviceInfo = new ServiceInfo("testName", "testClusters"); | ||||
|         serviceInfo = new ServiceInfo("G@@testName", "testClusters"); | ||||
|         instance = new Instance(); | ||||
|         instance.setClusterName("testClusters"); | ||||
|         instance.setIp("1.1.1.1"); | ||||
|  | @ -66,8 +66,8 @@ public class DiskCacheTest { | |||
|         DiskCache.write(serviceInfo, CACHE_DIR); | ||||
|         Map<String, ServiceInfo> actual = DiskCache.read(CACHE_DIR); | ||||
|         assertEquals(1, actual.size()); | ||||
|         assertTrue(actual.containsKey(serviceInfo.getKeyEncoded())); | ||||
|         assertServiceInfo(actual.get(serviceInfo.getKeyEncoded()), serviceInfo); | ||||
|         assertTrue(actual.containsKey(serviceInfo.getKey())); | ||||
|         assertServiceInfo(actual.get(serviceInfo.getKey()), serviceInfo); | ||||
|     } | ||||
|      | ||||
|     private void assertServiceInfo(ServiceInfo actual, ServiceInfo expected) { | ||||
|  |  | |||
|  | @ -18,8 +18,8 @@ package com.alibaba.nacos.common.http; | |||
| 
 | ||||
| import com.alibaba.nacos.common.http.client.NacosRestTemplate; | ||||
| import com.alibaba.nacos.common.http.client.request.DefaultHttpClientRequest; | ||||
| import org.apache.http.client.config.RequestConfig; | ||||
| import org.apache.http.impl.client.HttpClients; | ||||
| import org.apache.http.protocol.RequestContent; | ||||
| 
 | ||||
| /** | ||||
|  * apache http client factory implements. | ||||
|  | @ -31,9 +31,10 @@ public abstract class AbstractApacheHttpClientFactory extends AbstractHttpClient | |||
|     @Override | ||||
|     public final NacosRestTemplate createNacosRestTemplate() { | ||||
|         final HttpClientConfig originalRequestConfig = buildHttpClientConfig(); | ||||
|         final RequestConfig requestConfig = getRequestConfig(); | ||||
|         return new NacosRestTemplate(assignLogger(), new DefaultHttpClientRequest( | ||||
|                 HttpClients.custom().setDefaultRequestConfig(requestConfig) | ||||
|                 HttpClients.custom() | ||||
|                         .addInterceptorLast(new RequestContent(true)) | ||||
|                         .setDefaultRequestConfig(getRequestConfig()) | ||||
|                         .setUserAgent(originalRequestConfig.getUserAgent()) | ||||
|                         .setMaxConnTotal(originalRequestConfig.getMaxConnTotal()) | ||||
|                         .setMaxConnPerRoute(originalRequestConfig.getMaxConnPerRoute()) | ||||
|  |  | |||
|  | @ -27,6 +27,8 @@ import com.alibaba.nacos.common.tls.TlsSystemConfig; | |||
| import com.alibaba.nacos.common.utils.BiConsumer; | ||||
| import org.apache.http.client.config.RequestConfig; | ||||
| import org.apache.http.impl.nio.client.HttpAsyncClients; | ||||
| import org.apache.http.protocol.RequestContent; | ||||
| import org.apache.http.impl.nio.reactor.IOReactorConfig; | ||||
| import org.slf4j.Logger; | ||||
| 
 | ||||
| import javax.net.ssl.HostnameVerifier; | ||||
|  | @ -68,19 +70,27 @@ public abstract class AbstractHttpClientFactory implements HttpClientFactory { | |||
|     @Override | ||||
|     public NacosAsyncRestTemplate createNacosAsyncRestTemplate() { | ||||
|         final HttpClientConfig originalRequestConfig = buildHttpClientConfig(); | ||||
|         final RequestConfig requestConfig = getRequestConfig(); | ||||
|         return new NacosAsyncRestTemplate(assignLogger(), new DefaultAsyncHttpClientRequest( | ||||
|                 HttpAsyncClients.custom().setDefaultRequestConfig(requestConfig) | ||||
|                 HttpAsyncClients.custom() | ||||
|                         .addInterceptorLast(new RequestContent(true)) | ||||
|                         .setDefaultIOReactorConfig(getIoReactorConfig()) | ||||
|                         .setDefaultRequestConfig(getRequestConfig()) | ||||
|                         .setMaxConnTotal(originalRequestConfig.getMaxConnTotal()) | ||||
|                         .setMaxConnPerRoute(originalRequestConfig.getMaxConnPerRoute()) | ||||
|                         .setUserAgent(originalRequestConfig.getUserAgent()).build())); | ||||
|     } | ||||
|      | ||||
|     protected IOReactorConfig getIoReactorConfig() { | ||||
|         HttpClientConfig httpClientConfig = buildHttpClientConfig(); | ||||
|         return IOReactorConfig.custom().setIoThreadCount(httpClientConfig.getIoThreadCount()).build(); | ||||
|     } | ||||
|      | ||||
|     protected RequestConfig getRequestConfig() { | ||||
|         HttpClientConfig httpClientConfig = buildHttpClientConfig(); | ||||
|         return RequestConfig.custom().setConnectTimeout(httpClientConfig.getConTimeOutMillis()) | ||||
|                 .setSocketTimeout(httpClientConfig.getReadTimeOutMillis()) | ||||
|                 .setConnectionRequestTimeout(httpClientConfig.getConnectionRequestTimeout()) | ||||
|                 .setContentCompressionEnabled(httpClientConfig.getContentCompressionEnabled()) | ||||
|                 .setMaxRedirects(httpClientConfig.getMaxRedirects()).build(); | ||||
|     } | ||||
|      | ||||
|  |  | |||
|  | @ -18,10 +18,14 @@ package com.alibaba.nacos.common.http; | |||
| 
 | ||||
| import com.alibaba.nacos.common.http.client.NacosAsyncRestTemplate; | ||||
| import com.alibaba.nacos.common.http.client.NacosRestTemplate; | ||||
| import com.alibaba.nacos.common.utils.ExceptionUtil; | ||||
| import com.alibaba.nacos.common.utils.ThreadUtils; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| 
 | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| import java.util.concurrent.atomic.AtomicBoolean; | ||||
| 
 | ||||
| /** | ||||
|  * Create a rest template to ensure that each custom client config and rest template are in one-to-one correspondence. | ||||
|  | @ -30,11 +34,24 @@ import java.util.Map; | |||
|  */ | ||||
| public final class HttpClientBeanHolder { | ||||
|      | ||||
|     private static final Logger LOGGER = LoggerFactory.getLogger(HttpClientBeanHolder.class); | ||||
|      | ||||
|     private static final Map<String, NacosRestTemplate> SINGLETON_REST = new HashMap<String, NacosRestTemplate>(10); | ||||
|      | ||||
|     private static final Map<String, NacosAsyncRestTemplate> SINGLETON_ASYNC_REST = new HashMap<String, NacosAsyncRestTemplate>( | ||||
|             10); | ||||
|      | ||||
|     private static final AtomicBoolean ALREADY_SHUTDOWN = new AtomicBoolean(false); | ||||
|      | ||||
|     static { | ||||
|         ThreadUtils.addShutdownHook(new Runnable() { | ||||
|             @Override | ||||
|             public void run() { | ||||
|                 shutdown(); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|      | ||||
|     public static NacosRestTemplate getNacosRestTemplate(Logger logger) { | ||||
|         return getNacosRestTemplate(new DefaultHttpClientFactory(logger)); | ||||
|     } | ||||
|  | @ -81,6 +98,22 @@ public final class HttpClientBeanHolder { | |||
|         return nacosAsyncRestTemplate; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Shutdown common http client. | ||||
|      */ | ||||
|     private static void shutdown() { | ||||
|         if (!ALREADY_SHUTDOWN.compareAndSet(false, true)) { | ||||
|             return; | ||||
|         } | ||||
|         LOGGER.warn("[HttpClientBeanHolder] Start destroying common HttpClient"); | ||||
|         try { | ||||
|             shutdown(DefaultHttpClientFactory.class.getName()); | ||||
|         } catch (Exception ex) { | ||||
|             LOGGER.error("An exception occurred when the common HTTP client was closed : {}", ExceptionUtil.getStackTrace(ex)); | ||||
|         } | ||||
|         LOGGER.warn("[HttpClientBeanHolder] Destruction of the end"); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Shutdown http client holder and close remove template. | ||||
|      * | ||||
|  |  | |||
|  | @ -65,13 +65,24 @@ public class HttpClientConfig { | |||
|      */ | ||||
|     private final int maxConnPerRoute; | ||||
|      | ||||
|     /** | ||||
|      * is HTTP compression enabled. | ||||
|      */ | ||||
|     private final boolean contentCompressionEnabled; | ||||
|      | ||||
|     /** | ||||
|      * io thread count. | ||||
|      */ | ||||
|     private final int ioThreadCount; | ||||
|      | ||||
|     /** | ||||
|      * user agent. | ||||
|      */ | ||||
|     private final String userAgent; | ||||
|      | ||||
|     public HttpClientConfig(int conTimeOutMillis, int readTimeOutMillis, long connTimeToLive, TimeUnit timeUnit, | ||||
|             int connectionRequestTimeout, int maxRedirects, int maxConnTotal, int maxConnPerRoute, String userAgent) { | ||||
|             int connectionRequestTimeout, int maxRedirects, int maxConnTotal, int maxConnPerRoute, | ||||
|             boolean contentCompressionEnabled, int ioThreadCount, String userAgent) { | ||||
|         this.conTimeOutMillis = conTimeOutMillis; | ||||
|         this.readTimeOutMillis = readTimeOutMillis; | ||||
|         this.connTimeToLive = connTimeToLive; | ||||
|  | @ -80,6 +91,8 @@ public class HttpClientConfig { | |||
|         this.maxRedirects = maxRedirects; | ||||
|         this.maxConnTotal = maxConnTotal; | ||||
|         this.maxConnPerRoute = maxConnPerRoute; | ||||
|         this.contentCompressionEnabled = contentCompressionEnabled; | ||||
|         this.ioThreadCount = ioThreadCount; | ||||
|         this.userAgent = userAgent; | ||||
|     } | ||||
|      | ||||
|  | @ -115,6 +128,14 @@ public class HttpClientConfig { | |||
|         return maxConnPerRoute; | ||||
|     } | ||||
|      | ||||
|     public boolean getContentCompressionEnabled() { | ||||
|         return contentCompressionEnabled; | ||||
|     } | ||||
|      | ||||
|     public int getIoThreadCount() { | ||||
|         return ioThreadCount; | ||||
|     } | ||||
|      | ||||
|     public String getUserAgent() { | ||||
|         return userAgent; | ||||
|     } | ||||
|  | @ -141,6 +162,10 @@ public class HttpClientConfig { | |||
|          | ||||
|         private int maxConnPerRoute = 0; | ||||
|          | ||||
|         private boolean contentCompressionEnabled = true; | ||||
|          | ||||
|         private int ioThreadCount = Runtime.getRuntime().availableProcessors(); | ||||
|          | ||||
|         private String userAgent; | ||||
|          | ||||
|         public HttpClientConfigBuilder setConTimeOutMillis(int conTimeOutMillis) { | ||||
|  | @ -179,14 +204,30 @@ public class HttpClientConfig { | |||
|             return this; | ||||
|         } | ||||
|          | ||||
|         public HttpClientConfigBuilder setContentCompressionEnabled(boolean contentCompressionEnabled) { | ||||
|             this.contentCompressionEnabled = contentCompressionEnabled; | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         public HttpClientConfigBuilder setIoThreadCount(int ioThreadCount) { | ||||
|             this.ioThreadCount = ioThreadCount; | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         public HttpClientConfigBuilder setUserAgent(String userAgent) { | ||||
|             this.userAgent = userAgent; | ||||
|             return this; | ||||
|         } | ||||
|      | ||||
|         /** | ||||
|          * build http client config. | ||||
|          * | ||||
|          * @return HttpClientConfig | ||||
|          */ | ||||
|         public HttpClientConfig build() { | ||||
|             return new HttpClientConfig(conTimeOutMillis, readTimeOutMillis, connTimeToLive, connTimeToLiveTimeUnit, | ||||
|                     connectionRequestTimeout, maxRedirects, maxConnTotal, maxConnPerRoute, userAgent); | ||||
|                     connectionRequestTimeout, maxRedirects, maxConnTotal, maxConnPerRoute, contentCompressionEnabled, | ||||
|                     ioThreadCount, userAgent); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -27,12 +27,14 @@ import org.apache.http.HttpEntityEnclosingRequest; | |||
| import org.apache.http.NameValuePair; | ||||
| import org.apache.http.client.entity.UrlEncodedFormEntity; | ||||
| import org.apache.http.client.methods.HttpRequestBase; | ||||
| import org.apache.http.conn.ConnectTimeoutException; | ||||
| import org.apache.http.entity.ByteArrayEntity; | ||||
| import org.apache.http.entity.ContentType; | ||||
| import org.apache.http.entity.StringEntity; | ||||
| import org.apache.http.message.BasicNameValuePair; | ||||
| 
 | ||||
| import java.io.UnsupportedEncodingException; | ||||
| import java.net.SocketTimeoutException; | ||||
| import java.net.URI; | ||||
| import java.net.URISyntaxException; | ||||
| import java.net.URLDecoder; | ||||
|  | @ -42,6 +44,7 @@ import java.util.HashMap; | |||
| import java.util.Iterator; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.concurrent.TimeoutException; | ||||
| import java.util.regex.Matcher; | ||||
| import java.util.regex.Pattern; | ||||
| 
 | ||||
|  | @ -58,7 +61,7 @@ public final class HttpUtils { | |||
|      * Init http header. | ||||
|      * | ||||
|      * @param requestBase requestBase {@link HttpRequestBase} | ||||
|      * @param header header | ||||
|      * @param header      header | ||||
|      */ | ||||
|     public static void initRequestHeader(HttpRequestBase requestBase, Header header) { | ||||
|         Iterator<Map.Entry<String, String>> iterator = header.iterator(); | ||||
|  | @ -72,8 +75,8 @@ public final class HttpUtils { | |||
|      * Init http entity. | ||||
|      * | ||||
|      * @param requestBase requestBase {@link HttpRequestBase} | ||||
|      * @param body      body | ||||
|      * @param header    request header | ||||
|      * @param body        body | ||||
|      * @param header      request header | ||||
|      * @throws Exception exception | ||||
|      */ | ||||
|     public static void initRequestEntity(HttpRequestBase requestBase, Object body, Header header) throws Exception { | ||||
|  | @ -88,7 +91,8 @@ public final class HttpUtils { | |||
|             if (body instanceof byte[]) { | ||||
|                 entity = new ByteArrayEntity((byte[]) body, contentType); | ||||
|             } else { | ||||
|                 entity = new StringEntity(body instanceof String ? (String) body : JacksonUtils.toJson(body), contentType); | ||||
|                 entity = new StringEntity(body instanceof String ? (String) body : JacksonUtils.toJson(body), | ||||
|                         contentType); | ||||
|             } | ||||
|             request.setEntity(entity); | ||||
|         } | ||||
|  | @ -98,11 +102,12 @@ public final class HttpUtils { | |||
|      * Init request from entity map. | ||||
|      * | ||||
|      * @param requestBase requestBase {@link HttpRequestBase} | ||||
|      * @param body    body map | ||||
|      * @param charset charset of entity | ||||
|      * @param body        body map | ||||
|      * @param charset     charset of entity | ||||
|      * @throws Exception exception | ||||
|      */ | ||||
|     public static void initRequestFromEntity(HttpRequestBase requestBase, Map<String, String> body, String charset) throws Exception { | ||||
|     public static void initRequestFromEntity(HttpRequestBase requestBase, Map<String, String> body, String charset) | ||||
|             throws Exception { | ||||
|         if (body == null || body.isEmpty()) { | ||||
|             return; | ||||
|         } | ||||
|  | @ -244,6 +249,17 @@ public final class HttpUtils { | |||
|         return new URI(url); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * HTTP request exception is a timeout exception. | ||||
|      * | ||||
|      * @param throwable http request throwable | ||||
|      * @return boolean | ||||
|      */ | ||||
|     public static boolean isTimeoutException(Throwable throwable) { | ||||
|         return throwable instanceof SocketTimeoutException || throwable instanceof ConnectTimeoutException | ||||
|                 || throwable instanceof TimeoutException || throwable.getCause() instanceof TimeoutException; | ||||
|     } | ||||
|      | ||||
|     private static String innerDecode(String pre, String now, String encode) throws UnsupportedEncodingException { | ||||
|         // Because the data may be encoded by the URL more than once, | ||||
|         // it needs to be decoded recursively until it is fully successful | ||||
|  | @ -254,4 +270,5 @@ public final class HttpUtils { | |||
|         now = URLDecoder.decode(now, encode); | ||||
|         return innerDecode(pre, now, encode); | ||||
|     } | ||||
|      | ||||
| } | ||||
|  |  | |||
|  | @ -17,9 +17,9 @@ | |||
| package com.alibaba.nacos.common.notify; | ||||
| 
 | ||||
| import com.alibaba.nacos.common.notify.listener.Subscriber; | ||||
| import com.alibaba.nacos.common.utils.CollectionUtils; | ||||
| import com.alibaba.nacos.common.utils.ConcurrentHashSet; | ||||
| import com.alibaba.nacos.common.utils.ThreadUtils; | ||||
| import com.alibaba.nacos.common.utils.CollectionUtils; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| 
 | ||||
|  |  | |||
|  | @ -71,4 +71,5 @@ public interface EventPublisher extends Closeable { | |||
|      * @param event      {@link Event} | ||||
|      */ | ||||
|     void notifySubscriber(Subscriber subscriber, Event event); | ||||
|      | ||||
| } | ||||
|  | @ -171,7 +171,6 @@ public class NotifyCenter { | |||
|      * @param <T>      event type | ||||
|      */ | ||||
|     public static <T> void registerSubscriber(final Subscriber consumer) { | ||||
|         final Class<? extends Event> cls = consumer.subscribeType(); | ||||
|         // If you want to listen to multiple events, you do it separately, | ||||
|         // based on subclass's subscribeTypes method return list, it can register to publisher. | ||||
|         if (consumer instanceof SmartSubscriber) { | ||||
|  | @ -187,16 +186,17 @@ public class NotifyCenter { | |||
|             return; | ||||
|         } | ||||
|          | ||||
|         if (ClassUtils.isAssignableFrom(SlowEvent.class, cls)) { | ||||
|             INSTANCE.sharePublisher.addSubscriber(consumer, cls); | ||||
|         final Class<? extends Event> subscribeType = consumer.subscribeType(); | ||||
|         if (ClassUtils.isAssignableFrom(SlowEvent.class, subscribeType)) { | ||||
|             INSTANCE.sharePublisher.addSubscriber(consumer, subscribeType); | ||||
|             return; | ||||
|         } | ||||
|          | ||||
|         addSubscriber(consumer, consumer.subscribeType()); | ||||
|         addSubscriber(consumer, subscribeType); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Add a subscriber to pusblisher. | ||||
|      * Add a subscriber to publisher. | ||||
|      * | ||||
|      * @param consumer      subscriber instance. | ||||
|      * @param subscribeType subscribeType. | ||||
|  | @ -218,7 +218,6 @@ public class NotifyCenter { | |||
|      * @param consumer subscriber instance. | ||||
|      */ | ||||
|     public static <T> void deregisterSubscriber(final Subscriber consumer) { | ||||
|         final Class<? extends Event> cls = consumer.subscribeType(); | ||||
|         if (consumer instanceof SmartSubscriber) { | ||||
|             for (Class<? extends Event> subscribeType : ((SmartSubscriber) consumer).subscribeTypes()) { | ||||
|                 if (ClassUtils.isAssignableFrom(SlowEvent.class, subscribeType)) { | ||||
|  | @ -230,15 +229,16 @@ public class NotifyCenter { | |||
|             return; | ||||
|         } | ||||
|          | ||||
|         if (ClassUtils.isAssignableFrom(SlowEvent.class, cls)) { | ||||
|             INSTANCE.sharePublisher.removeSubscriber(consumer, cls); | ||||
|         final Class<? extends Event> subscribeType = consumer.subscribeType(); | ||||
|         if (ClassUtils.isAssignableFrom(SlowEvent.class, subscribeType)) { | ||||
|             INSTANCE.sharePublisher.removeSubscriber(consumer, subscribeType); | ||||
|             return; | ||||
|         } | ||||
|          | ||||
|         if (removeSubscriber(consumer, consumer.subscribeType())) { | ||||
|         if (removeSubscriber(consumer, subscribeType)) { | ||||
|             return; | ||||
|         } | ||||
|         throw new NoSuchElementException("The subcriber has no event publisher"); | ||||
|         throw new NoSuchElementException("The subscriber has no event publisher"); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|  | @ -251,12 +251,11 @@ public class NotifyCenter { | |||
|     private static boolean removeSubscriber(final Subscriber consumer, Class<? extends Event> subscribeType) { | ||||
|          | ||||
|         final String topic = ClassUtils.getCanonicalName(subscribeType); | ||||
|         if (INSTANCE.publisherMap.containsKey(topic)) { | ||||
|             EventPublisher publisher = INSTANCE.publisherMap.get(topic); | ||||
|             publisher.removeSubscriber(consumer); | ||||
|         EventPublisher eventPublisher = INSTANCE.publisherMap.get(topic); | ||||
|         if (eventPublisher != null) { | ||||
|             eventPublisher.removeSubscriber(consumer); | ||||
|             return true; | ||||
|         } | ||||
|          | ||||
|         return false; | ||||
|     } | ||||
|      | ||||
|  | @ -282,16 +281,16 @@ public class NotifyCenter { | |||
|      * @param event     event instance. | ||||
|      */ | ||||
|     private static boolean publishEvent(final Class<? extends Event> eventType, final Event event) { | ||||
|         final String topic = ClassUtils.getCanonicalName(eventType); | ||||
|         if (ClassUtils.isAssignableFrom(SlowEvent.class, eventType)) { | ||||
|             return INSTANCE.sharePublisher.publish(event); | ||||
|         } | ||||
|          | ||||
|         if (INSTANCE.publisherMap.containsKey(topic)) { | ||||
|             EventPublisher publisher = INSTANCE.publisherMap.get(topic); | ||||
|         final String topic = ClassUtils.getCanonicalName(eventType); | ||||
|          | ||||
|         EventPublisher publisher = INSTANCE.publisherMap.get(topic); | ||||
|         if (publisher != null) { | ||||
|             return publisher.publish(event); | ||||
|         } | ||||
|          | ||||
|         LOGGER.warn("There are no [{}] publishers for this event, please register", topic); | ||||
|         return false; | ||||
|     } | ||||
|  | @ -322,8 +321,7 @@ public class NotifyCenter { | |||
|             // MapUtils.computeIfAbsent is a unsafe method. | ||||
|             MapUtil.computeIfAbsent(INSTANCE.publisherMap, topic, publisherFactory, eventType, queueMaxSize); | ||||
|         } | ||||
|         EventPublisher publisher = INSTANCE.publisherMap.get(topic); | ||||
|         return publisher; | ||||
|         return INSTANCE.publisherMap.get(topic); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ | |||
| 
 | ||||
| package com.alibaba.nacos.common.tls; | ||||
| 
 | ||||
| import com.alibaba.nacos.common.utils.IpUtils; | ||||
| import com.alibaba.nacos.common.utils.IPUtil; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| 
 | ||||
|  | @ -38,7 +38,7 @@ public final class SelfHostnameVerifier implements HostnameVerifier { | |||
|      | ||||
|     private static ConcurrentHashMap<String, Boolean> hosts = new ConcurrentHashMap<String, Boolean>(); | ||||
|      | ||||
|     private static final String[] LOCALHOST_HOSTNAME = new String[] {"localhost", "127.0.0.1"}; | ||||
|     private static final String[] LOCALHOST_HOSTNAME = new String[] {"localhost", IPUtil.localHostIP()}; | ||||
|      | ||||
|     public SelfHostnameVerifier(HostnameVerifier hv) { | ||||
|         this.hv = hv; | ||||
|  | @ -49,22 +49,22 @@ public final class SelfHostnameVerifier implements HostnameVerifier { | |||
|         if (LOCALHOST_HOSTNAME[0].equalsIgnoreCase(hostname) || LOCALHOST_HOSTNAME[1].equals(hostname)) { | ||||
|             return true; | ||||
|         } | ||||
|         if (isIpv4(hostname)) { | ||||
|         if (isIP(hostname)) { | ||||
|             return true; | ||||
|         } | ||||
|         return hv.verify(hostname, session); | ||||
|     } | ||||
|      | ||||
|     private static boolean isIpv4(String host) { | ||||
|     private static boolean isIP(String host) { | ||||
|         if (host == null || host.isEmpty()) { | ||||
|             LOGGER.warn("host is empty, isIPv4 = false"); | ||||
|             LOGGER.warn("host is empty, isIP = false"); | ||||
|             return false; | ||||
|         } | ||||
|         Boolean cacheHostVerify = hosts.get(host); | ||||
|         if (cacheHostVerify != null) { | ||||
|             return cacheHostVerify; | ||||
|         } | ||||
|         boolean isIp = IpUtils.isIpv4(host); | ||||
|         boolean isIp = IPUtil.isIP(host); | ||||
|         hosts.putIfAbsent(host, isIp); | ||||
|         return isIp; | ||||
|     } | ||||
|  |  | |||
|  | @ -0,0 +1,222 @@ | |||
| /* | ||||
|  * 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.utils; | ||||
| 
 | ||||
| import java.net.InetAddress; | ||||
| import java.net.UnknownHostException; | ||||
| import java.util.regex.Matcher; | ||||
| import java.util.regex.Pattern; | ||||
| 
 | ||||
| /** | ||||
|  * ip tool. | ||||
|  * | ||||
|  * @author Nacos | ||||
|  */ | ||||
| @SuppressWarnings({"checkstyle:AbbreviationAsWordInName", "PMD.ClassNamingShouldBeCamelRule"}) | ||||
| public class IPUtil { | ||||
|      | ||||
|     public static final boolean PREFER_IPV6_ADDRESSES = Boolean.parseBoolean(System.getProperty("java.net.preferIPv6Addresses")); | ||||
|      | ||||
|     public static final String IPV6_START_MARK = "["; | ||||
|      | ||||
|     public static final String IPV6_END_MARK = "]"; | ||||
|      | ||||
|     public static final String ILLEGAL_IP_PREFIX = "illegal ip: "; | ||||
|      | ||||
|     public static final String IP_PORT_SPLITER = ":"; | ||||
|      | ||||
|     public static final int SPLIT_IP_PORT_RESULT_LENGTH = 2; | ||||
|      | ||||
|     public static final String PERCENT_SIGN_IN_IPV6 = "%"; | ||||
|      | ||||
|     private static final String LOCAL_HOST_IP_V4 = "127.0.0.1"; | ||||
|      | ||||
|     private static final String LOCAL_HOST_IP_V6 = "[::1]"; | ||||
|      | ||||
|     private static Pattern ipv4Pattern = Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"); | ||||
|      | ||||
|     private static final int IPV4_ADDRESS_LENGTH = 4; | ||||
|      | ||||
|     private static final int IPV6_ADDRESS_LENGTH = 16; | ||||
|      | ||||
|     private static final String CHECK_OK = "ok"; | ||||
|      | ||||
|     /** | ||||
|      * get localhost ip. | ||||
|      * @return java.lang.String | ||||
|      */ | ||||
|     public static String localHostIP() { | ||||
|         if (PREFER_IPV6_ADDRESSES) { | ||||
|             return LOCAL_HOST_IP_V6; | ||||
|         } | ||||
|         return LOCAL_HOST_IP_V4; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * check whether the ip address is IPv4. | ||||
|      * | ||||
|      * @param addr ip address | ||||
|      * @return boolean | ||||
|      */ | ||||
|     public static boolean isIPv4(String addr) { | ||||
|         try { | ||||
|             return InetAddress.getByName(addr).getAddress().length == IPV4_ADDRESS_LENGTH; | ||||
|         } catch (UnknownHostException e) { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * check whether the ip address is IPv6. | ||||
|      * | ||||
|      * @param addr ip address | ||||
|      * @return boolean | ||||
|      */ | ||||
|     public static boolean isIPv6(String addr) { | ||||
|         try { | ||||
|             return InetAddress.getByName(addr).getAddress().length == IPV6_ADDRESS_LENGTH; | ||||
|         } catch (UnknownHostException e) { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * check whether the str is ip address (IPv4 or IPv6). | ||||
|      * | ||||
|      * @param addr ip address str | ||||
|      * @return boolean | ||||
|      */ | ||||
|     public static boolean isIP(String addr) { | ||||
|         try { | ||||
|             InetAddress.getByName(addr); | ||||
|             return true; | ||||
|         } catch (UnknownHostException e) { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Check if the address contains a port. | ||||
|      * 2020/9/3 14:53 | ||||
|      * @param address address string | ||||
|      * @return boolean | ||||
|      */ | ||||
|     public static boolean containsPort(String address) { | ||||
|         return splitIPPortStr(address).length == SPLIT_IP_PORT_RESULT_LENGTH; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Split IP and port strings, support IPv4 and IPv6, IP in IPv6 must be enclosed with []. | ||||
|      * | ||||
|      * @param str ip and port string | ||||
|      * @return java.lang.String[] | ||||
|      */ | ||||
|     public static String[] splitIPPortStr(String str) { | ||||
|         if (StringUtils.isBlank(str)) { | ||||
|             throw new IllegalArgumentException("ip and port string cannot be empty!"); | ||||
|         } | ||||
|         String[] serverAddrArr; | ||||
|         if (str.startsWith(IPV6_START_MARK) && StringUtils.containsIgnoreCase(str, IPV6_END_MARK)) { | ||||
|             if (str.endsWith(IPV6_END_MARK)) { | ||||
|                 serverAddrArr = new String[1]; | ||||
|                 serverAddrArr[0] = str; | ||||
|             } else { | ||||
|                 serverAddrArr = new String[2]; | ||||
|                 serverAddrArr[0] = str.substring(0, (str.indexOf(IPV6_END_MARK) + 1)); | ||||
|                 serverAddrArr[1] = str.substring((str.indexOf(IPV6_END_MARK) + 2)); | ||||
|             } | ||||
|             if (!isIPv6(serverAddrArr[0])) { | ||||
|                 throw new IllegalArgumentException("The IPv6 address(\"" + serverAddrArr[0] + "\") is incorrect."); | ||||
|             } | ||||
|         } else { | ||||
|             serverAddrArr = str.split(":"); | ||||
|             if (serverAddrArr.length > SPLIT_IP_PORT_RESULT_LENGTH) { | ||||
|                 throw new IllegalArgumentException("The IP address(\"" + str | ||||
|                         + "\") is incorrect. If it is an IPv6 address, please use [] to enclose the IP part!"); | ||||
|             } | ||||
|             if (!isIPv4(serverAddrArr[0])) { | ||||
|                 throw new IllegalArgumentException("The IPv4 address(\"" + serverAddrArr[0] + "\") is incorrect."); | ||||
|             } | ||||
|         } | ||||
|         return serverAddrArr; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Resolve the IP from the string containing the IP address. | ||||
|      * @param str string containing IP address | ||||
|      * @return java.lang.String | ||||
|      */ | ||||
|     public static String getIPFromString(String str) { | ||||
|         if (StringUtils.isBlank(str)) { | ||||
|             return ""; | ||||
|         } | ||||
|         String result = ""; | ||||
|         if (StringUtils.containsIgnoreCase(str, IPV6_START_MARK) && StringUtils.containsIgnoreCase(str, IPV6_END_MARK)) { | ||||
|             result = str.substring(str.indexOf(IPV6_START_MARK), (str.indexOf(IPV6_END_MARK) + 1)); | ||||
|             if (!isIPv6(result)) { | ||||
|                 result = ""; | ||||
|             } | ||||
|         } else { | ||||
|             Matcher m = ipv4Pattern.matcher(str); | ||||
|             if (m.find()) { | ||||
|                 result = m.group(); | ||||
|                 if (!isIPv4(result)) { | ||||
|                     result = ""; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Check ips. | ||||
|      * | ||||
|      * @param ips ips | ||||
|      * @return 'ok' if check passed, otherwise illegal ip | ||||
|      */ | ||||
|     public static String checkIPs(String... ips) { | ||||
|          | ||||
|         if (ips == null || ips.length == 0) { | ||||
|              | ||||
|             return CHECK_OK; | ||||
|         } | ||||
|         // illegal response | ||||
|         StringBuilder illegalResponse = new StringBuilder(); | ||||
|         for (String ip : ips) { | ||||
|             if (IPUtil.isIP(ip)) { | ||||
|                 continue; | ||||
|             } | ||||
|             illegalResponse.append(ip + ","); | ||||
|         } | ||||
|          | ||||
|         if (illegalResponse.length() == 0) { | ||||
|             return CHECK_OK; | ||||
|         } | ||||
|          | ||||
|         return ILLEGAL_IP_PREFIX + illegalResponse.substring(0, illegalResponse.length() - 1); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Check whether checkIPs result is "ok". | ||||
|      * @param checkIPsResult checkIPs result | ||||
|      * @return boolean | ||||
|      */ | ||||
|     public static boolean checkOK(String checkIPsResult) { | ||||
|         return CHECK_OK.equals(checkIPsResult); | ||||
|     } | ||||
|      | ||||
| } | ||||
|  | @ -1,49 +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.common.utils; | ||||
| 
 | ||||
| import java.util.regex.Matcher; | ||||
| import java.util.regex.Pattern; | ||||
| 
 | ||||
| /** | ||||
|  * ip tool. | ||||
|  * | ||||
|  * @author Nacos | ||||
|  */ | ||||
| public class IpUtils { | ||||
|      | ||||
|     private static final Pattern IPV4_PATTERN = Pattern | ||||
|             .compile("^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$"); | ||||
|      | ||||
|     private static final Pattern IPV6_PATTERN = Pattern.compile("^([\\da-fA-F]{1,4}:){7}[\\da-fA-F]{1,4}$"); | ||||
|      | ||||
|     public static boolean isIpv4(String addr) { | ||||
|         return isMatch(addr, IPV4_PATTERN); | ||||
|     } | ||||
|      | ||||
|     public static boolean isIpv6(String addr) { | ||||
|         return isMatch(addr, IPV6_PATTERN); | ||||
|     } | ||||
|      | ||||
|     private static boolean isMatch(String data, Pattern pattern) { | ||||
|         if (StringUtils.isBlank(data)) { | ||||
|             return false; | ||||
|         } | ||||
|         Matcher mat = pattern.matcher(data); | ||||
|         return mat.find(); | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,120 @@ | |||
| /* | ||||
|  * 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.utils; | ||||
| 
 | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| /** | ||||
|  * test IpUtil. | ||||
|  * @ClassName: IpUtilTest | ||||
|  * @date 2020/9/3 10:31 | ||||
|  */ | ||||
| @SuppressWarnings("checkstyle:AbbreviationAsWordInName") | ||||
| public class IPUtilTest { | ||||
|      | ||||
|     @Test | ||||
|     public void testIsIPv4() { | ||||
|         Assert.assertTrue(IPUtil.isIPv4("127.0.0.1")); | ||||
|         Assert.assertFalse(IPUtil.isIPv4("[::1]")); | ||||
|         Assert.assertFalse(IPUtil.isIPv4("asdfasf")); | ||||
|         Assert.assertFalse(IPUtil.isIPv4("ffgertert")); | ||||
|     } | ||||
|      | ||||
|     @Test | ||||
|     public void testIsIPv6() { | ||||
|         Assert.assertTrue(IPUtil.isIPv6("[::1]")); | ||||
|         Assert.assertFalse(IPUtil.isIPv6("127.0.0.1")); | ||||
|         Assert.assertFalse(IPUtil.isIPv6("er34234")); | ||||
|     } | ||||
|      | ||||
|     @Test | ||||
|     public void testIsIP() { | ||||
|         Assert.assertTrue(IPUtil.isIP("[::1]")); | ||||
|         Assert.assertTrue(IPUtil.isIP("127.0.0.1")); | ||||
|         Assert.assertFalse(IPUtil.isIP("er34234")); | ||||
|     } | ||||
|      | ||||
|     @Test | ||||
|     public void testGetIPFromString() { | ||||
|         Assert.assertEquals("[::1]", IPUtil.getIPFromString("http://[::1]:666/xzdsfasdf/awerwef" + "?eewer=2&xxx=3")); | ||||
|         Assert.assertEquals("[::1]", IPUtil.getIPFromString( | ||||
|                 "jdbc:mysql://[::1]:3306/nacos_config_test?characterEncoding=utf8&connectTimeout=1000" | ||||
|                         + "&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC")); | ||||
|         Assert.assertEquals("127.0.0.1", | ||||
|                 IPUtil.getIPFromString("http://127.0.0.1:666/xzdsfasdf/awerwef" + "?eewer=2&xxx=3")); | ||||
|         Assert.assertEquals("127.0.0.1", IPUtil.getIPFromString( | ||||
|                 "jdbc:mysql://127.0.0.1:3306/nacos_config_test?characterEncoding=utf8&connectTimeout=1000" | ||||
|                         + "&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC")); | ||||
|      | ||||
|         Assert.assertEquals("", | ||||
|                 IPUtil.getIPFromString("http://[dddd]:666/xzdsfasdf/awerwef" + "?eewer=2&xxx=3")); | ||||
|         Assert.assertEquals("", IPUtil.getIPFromString( | ||||
|                 "jdbc:mysql://[127.0.0.1]:3306/nacos_config_test?characterEncoding=utf8&connectTimeout=1000" | ||||
|                         + "&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC")); | ||||
|         Assert.assertEquals("", IPUtil.getIPFromString( | ||||
|                 "jdbc:mysql://666.288.333.444:3306/nacos_config_test?characterEncoding=utf8&connectTimeout=1000" | ||||
|                         + "&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC")); | ||||
|     } | ||||
|      | ||||
|     @Test | ||||
|     public void testSplitIpPort() { | ||||
|         checkSplitIPPortStr("[::1]:88", false, "[::1]", "88"); | ||||
|         checkSplitIPPortStr("[::1]", false, "[::1]"); | ||||
|         checkSplitIPPortStr("127.0.0.1:88", false, "127.0.0.1", "88"); | ||||
|         checkSplitIPPortStr("127.0.0.1", false, "127.0.0.1"); | ||||
|         checkSplitIPPortStr("[2001:db8:0:0:1:0:0:1]:88", false, "[2001:db8:0:0:1:0:0:1]", "88"); | ||||
|         checkSplitIPPortStr("[2001:0db8:0:0:1:0:0:1]:88", false, "[2001:0db8:0:0:1:0:0:1]", "88"); | ||||
|         checkSplitIPPortStr("[2001:db8::1:0:0:1]:88", false, "[2001:db8::1:0:0:1]", "88"); | ||||
|         checkSplitIPPortStr("[2001:db8::0:1:0:0:1]:88", false, "[2001:db8::0:1:0:0:1]", "88"); | ||||
|         checkSplitIPPortStr("[2001:0db8::1:0:0:1]:88", false, "[2001:0db8::1:0:0:1]", "88"); | ||||
|         checkSplitIPPortStr("[2001:db8:0:0:1::1]:88", false, "[2001:db8:0:0:1::1]", "88"); | ||||
|         checkSplitIPPortStr("[2001:db8:0000:0:1::1]:88", false, "[2001:db8:0000:0:1::1]", "88"); | ||||
|         checkSplitIPPortStr("[2001:DB8:0:0:1::1]:88", false, "[2001:DB8:0:0:1::1]", "88"); | ||||
|         checkSplitIPPortStr("[fe80::3ce6:7132:808e:707a%19]:88", false, "[fe80::3ce6:7132:808e:707a%19]", "88"); | ||||
|      | ||||
|         checkSplitIPPortStr("::1:88", true); | ||||
|         checkSplitIPPortStr("[::1:88", true); | ||||
|         checkSplitIPPortStr("[127.0.0.1]:88", true); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * checkSplitIpPortStr. | ||||
|      * 2020/9/4 14:12 | ||||
|      * @param addr addr | ||||
|      * @param isEx isEx | ||||
|      * @param equalsStrs equalsStrs | ||||
|      */ | ||||
|     public static void checkSplitIPPortStr(String addr, boolean isEx, String... equalsStrs) { | ||||
|         try { | ||||
|             String[] array = IPUtil.splitIPPortStr(addr); | ||||
|             Assert.assertTrue(array.length == equalsStrs.length); | ||||
|             if (array.length > 1) { | ||||
|                 Assert.assertTrue(array[0].equals(equalsStrs[0])); | ||||
|                 Assert.assertTrue(array[1].equals(equalsStrs[1])); | ||||
|             } else { | ||||
|                 Assert.assertTrue(array[0].equals(equalsStrs[0])); | ||||
|             } | ||||
|         } catch (Exception ex) { | ||||
|             if (!isEx) { | ||||
|                 // No exception is expected here, but an exception has occurred | ||||
|                 Assert.assertTrue("Unexpected exception", false); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|      | ||||
| } | ||||
|  | @ -65,10 +65,6 @@ | |||
|             <groupId>commons-io</groupId> | ||||
|             <artifactId>commons-io</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>commons-lang</groupId> | ||||
|             <artifactId>commons-lang</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>mysql</groupId> | ||||
|             <artifactId>mysql-connector-java</artifactId> | ||||
|  |  | |||
|  | @ -18,9 +18,9 @@ package com.alibaba.nacos.config.server.auth; | |||
| 
 | ||||
| import com.alibaba.nacos.config.server.configuration.ConditionOnEmbeddedStorage; | ||||
| import com.alibaba.nacos.config.server.model.Page; | ||||
| import com.alibaba.nacos.config.server.service.repository.embedded.EmbeddedStoragePersistServiceImpl; | ||||
| import com.alibaba.nacos.config.server.service.repository.PaginationHelper; | ||||
| import com.alibaba.nacos.config.server.service.repository.embedded.DatabaseOperate; | ||||
| import com.alibaba.nacos.config.server.service.repository.embedded.EmbeddedStoragePersistServiceImpl; | ||||
| import com.alibaba.nacos.config.server.service.sql.EmbeddedStorageContextUtils; | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
|  | @ -28,6 +28,8 @@ import org.springframework.context.annotation.Conditional; | |||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static com.alibaba.nacos.config.server.service.repository.RowMapperManager.PERMISSION_ROW_MAPPER; | ||||
| 
 | ||||
|  | @ -52,14 +54,16 @@ public class EmbeddedPermissionPersistServiceImpl implements PermissionPersistSe | |||
|         String sqlCountRows = "select count(*) from permissions where "; | ||||
|         String sqlFetchRows = "select role,resource,action from permissions where "; | ||||
|      | ||||
|         String where = " role='" + role + "' "; | ||||
|          | ||||
|         if (StringUtils.isBlank(role)) { | ||||
|         String where = " role= ? "; | ||||
|         List<String> params = new ArrayList<>(); | ||||
|         if (StringUtils.isNotBlank(role)) { | ||||
|             params = Collections.singletonList(role); | ||||
|         } else { | ||||
|             where = " 1=1 "; | ||||
|         } | ||||
|          | ||||
|         Page<PermissionInfo> pageInfo = helper | ||||
|                 .fetchPage(sqlCountRows + where, sqlFetchRows + where, new ArrayList<String>().toArray(), pageNo, | ||||
|                 .fetchPage(sqlCountRows + where, sqlFetchRows + where, params.toArray(), pageNo, | ||||
|                         pageSize, PERMISSION_ROW_MAPPER); | ||||
|          | ||||
|         if (pageInfo == null) { | ||||
|  |  | |||
|  | @ -18,9 +18,9 @@ package com.alibaba.nacos.config.server.auth; | |||
| 
 | ||||
| import com.alibaba.nacos.config.server.configuration.ConditionOnEmbeddedStorage; | ||||
| import com.alibaba.nacos.config.server.model.Page; | ||||
| import com.alibaba.nacos.config.server.service.repository.embedded.EmbeddedStoragePersistServiceImpl; | ||||
| import com.alibaba.nacos.config.server.service.repository.PaginationHelper; | ||||
| import com.alibaba.nacos.config.server.service.repository.embedded.DatabaseOperate; | ||||
| import com.alibaba.nacos.config.server.service.repository.embedded.EmbeddedStoragePersistServiceImpl; | ||||
| import com.alibaba.nacos.config.server.service.sql.EmbeddedStorageContextUtils; | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
|  | @ -28,6 +28,7 @@ import org.springframework.context.annotation.Conditional; | |||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static com.alibaba.nacos.config.server.service.repository.RowMapperManager.ROLE_INFO_ROW_MAPPER; | ||||
|  | @ -75,13 +76,15 @@ public class EmbeddedRolePersistServiceImpl implements RolePersistService { | |||
|         String sqlCountRows = "select count(*) from roles where "; | ||||
|         String sqlFetchRows = "select role,username from roles where "; | ||||
|      | ||||
|         String where = " username='" + username + "' "; | ||||
|          | ||||
|         if (StringUtils.isBlank(username)) { | ||||
|         String where = " username= ? "; | ||||
|         List<String> params = new ArrayList<>(); | ||||
|         if (StringUtils.isNotBlank(username)) { | ||||
|             params = Collections.singletonList(username); | ||||
|         } else { | ||||
|             where = " 1=1 "; | ||||
|         } | ||||
|          | ||||
|         return helper.fetchPage(sqlCountRows + where, sqlFetchRows + where, new ArrayList<String>().toArray(), pageNo, | ||||
|         return helper.fetchPage(sqlCountRows + where, sqlFetchRows + where, params.toArray(), pageNo, | ||||
|                 pageSize, ROLE_INFO_ROW_MAPPER); | ||||
|          | ||||
|     } | ||||
|  |  | |||
|  | @ -18,8 +18,8 @@ package com.alibaba.nacos.config.server.auth; | |||
| 
 | ||||
| import com.alibaba.nacos.config.server.configuration.ConditionOnExternalStorage; | ||||
| import com.alibaba.nacos.config.server.model.Page; | ||||
| import com.alibaba.nacos.config.server.service.repository.extrnal.ExternalStoragePersistServiceImpl; | ||||
| import com.alibaba.nacos.config.server.service.repository.PaginationHelper; | ||||
| import com.alibaba.nacos.config.server.service.repository.extrnal.ExternalStoragePersistServiceImpl; | ||||
| import com.alibaba.nacos.config.server.utils.LogUtil; | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
|  | @ -30,6 +30,8 @@ import org.springframework.stereotype.Component; | |||
| 
 | ||||
| import javax.annotation.PostConstruct; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static com.alibaba.nacos.config.server.service.repository.RowMapperManager.PERMISSION_ROW_MAPPER; | ||||
| 
 | ||||
|  | @ -58,15 +60,17 @@ public class ExternalPermissionPersistServiceImpl implements PermissionPersistSe | |||
|         String sqlCountRows = "select count(*) from permissions where "; | ||||
|         String sqlFetchRows = "select role,resource,action from permissions where "; | ||||
|      | ||||
|         String where = " role='" + role + "' "; | ||||
|          | ||||
|         if (StringUtils.isBlank(role)) { | ||||
|         String where = " role= ? "; | ||||
|         List<String> params = new ArrayList<>(); | ||||
|         if (StringUtils.isNotBlank(role)) { | ||||
|             params = Collections.singletonList(role); | ||||
|         } else { | ||||
|             where = " 1=1 "; | ||||
|         } | ||||
|          | ||||
|         try { | ||||
|             Page<PermissionInfo> pageInfo = helper | ||||
|                     .fetchPage(sqlCountRows + where, sqlFetchRows + where, new ArrayList<String>().toArray(), pageNo, | ||||
|                     .fetchPage(sqlCountRows + where, sqlFetchRows + where, params.toArray(), pageNo, | ||||
|                             pageSize, PERMISSION_ROW_MAPPER); | ||||
|              | ||||
|             if (pageInfo == null) { | ||||
|  |  | |||
|  | @ -18,8 +18,8 @@ package com.alibaba.nacos.config.server.auth; | |||
| 
 | ||||
| import com.alibaba.nacos.config.server.configuration.ConditionOnExternalStorage; | ||||
| import com.alibaba.nacos.config.server.model.Page; | ||||
| import com.alibaba.nacos.config.server.service.repository.extrnal.ExternalStoragePersistServiceImpl; | ||||
| import com.alibaba.nacos.config.server.service.repository.PaginationHelper; | ||||
| import com.alibaba.nacos.config.server.service.repository.extrnal.ExternalStoragePersistServiceImpl; | ||||
| import com.alibaba.nacos.config.server.utils.LogUtil; | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
|  | @ -33,6 +33,7 @@ import javax.annotation.PostConstruct; | |||
| import java.sql.ResultSet; | ||||
| import java.sql.SQLException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import static com.alibaba.nacos.config.server.service.repository.RowMapperManager.ROLE_INFO_ROW_MAPPER; | ||||
|  | @ -88,16 +89,17 @@ public class ExternalRolePersistServiceImpl implements RolePersistService { | |||
|         String sqlCountRows = "select count(*) from roles where "; | ||||
|         String sqlFetchRows = "select role,username from roles where "; | ||||
|          | ||||
|         String where = " username='" + username + "' "; | ||||
|          | ||||
|         if (StringUtils.isBlank(username)) { | ||||
|         String where = " username= ? "; | ||||
|         List<String> params = new ArrayList<>(); | ||||
|         if (StringUtils.isNotBlank(username)) { | ||||
|             params = Collections.singletonList(username); | ||||
|         } else { | ||||
|             where = " 1=1 "; | ||||
|         } | ||||
|          | ||||
|         try { | ||||
|             return helper | ||||
|                     .fetchPage(sqlCountRows + where, sqlFetchRows + where, new ArrayList<String>().toArray(), pageNo, | ||||
|                             pageSize, ROLE_INFO_ROW_MAPPER); | ||||
|             return helper.fetchPage(sqlCountRows + where, sqlFetchRows + where, params.toArray(), pageNo, pageSize, | ||||
|                     ROLE_INFO_ROW_MAPPER); | ||||
|         } catch (CannotGetJdbcConnectionException e) { | ||||
|             LogUtil.FATAL_LOG.error("[db-error] " + e.toString(), e); | ||||
|             throw e; | ||||
|  | @ -107,7 +109,7 @@ public class ExternalRolePersistServiceImpl implements RolePersistService { | |||
|     /** | ||||
|      * Execute add role operation. | ||||
|      * | ||||
|      * @param role role string value. | ||||
|      * @param role     role string value. | ||||
|      * @param userName username string value. | ||||
|      */ | ||||
|     public void addRole(String role, String userName) { | ||||
|  | @ -140,7 +142,7 @@ public class ExternalRolePersistServiceImpl implements RolePersistService { | |||
|     /** | ||||
|      * Execute delete role operation. | ||||
|      * | ||||
|      * @param role role string value. | ||||
|      * @param role     role string value. | ||||
|      * @param username username string value. | ||||
|      */ | ||||
|     public void deleteRole(String role, String username) { | ||||
|  | @ -156,7 +158,7 @@ public class ExternalRolePersistServiceImpl implements RolePersistService { | |||
|     @Override | ||||
|     public List<String> findRolesLikeRoleName(String role) { | ||||
|         String sql = "SELECT role FROM roles WHERE role like '%' ? '%'"; | ||||
|         List<String> users = this.jt.queryForList(sql, new String[]{role}, String.class); | ||||
|         List<String> users = this.jt.queryForList(sql, new String[] {role}, String.class); | ||||
|         return users; | ||||
|     } | ||||
|      | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ | |||
| 
 | ||||
| package com.alibaba.nacos.config.server.controller; | ||||
| 
 | ||||
| import com.alibaba.nacos.api.config.ConfigType; | ||||
| import com.alibaba.nacos.api.exception.NacosException; | ||||
| import com.alibaba.nacos.auth.annotation.Secured; | ||||
| import com.alibaba.nacos.auth.common.ActionTypes; | ||||
|  | @ -134,6 +135,10 @@ public class ConfigController { | |||
|         final String srcIp = RequestUtil.getRemoteIp(request); | ||||
|         final String requestIpApp = RequestUtil.getAppName(request); | ||||
|         srcUser = RequestUtil.getSrcUserName(request); | ||||
|         //check type | ||||
|         if (!ConfigType.isValidType(type)) { | ||||
|             type = ConfigType.getDefaultType().getType(); | ||||
|         } | ||||
|         // check tenant | ||||
|         ParamUtils.checkTenant(tenant); | ||||
|         ParamUtils.checkParam(dataId, group, "datumId", content); | ||||
|  |  | |||
|  | @ -0,0 +1,84 @@ | |||
| /* | ||||
|  * 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.config.server.service.datasource; | ||||
| 
 | ||||
| import com.zaxxer.hikari.HikariDataSource; | ||||
| import org.springframework.boot.context.properties.bind.Bindable; | ||||
| import org.springframework.boot.context.properties.bind.Binder; | ||||
| import org.springframework.core.env.Environment; | ||||
| 
 | ||||
| import java.util.concurrent.TimeUnit; | ||||
| 
 | ||||
| /** | ||||
|  * DataSource pool properties. | ||||
|  * | ||||
|  * <p>Nacos server use HikariCP as the datasource pool. So the basic pool properties will based on {@link | ||||
|  * com.zaxxer.hikari.HikariDataSource}. | ||||
|  * | ||||
|  * @author xiweng.yy | ||||
|  */ | ||||
| public class DataSourcePoolProperties { | ||||
|      | ||||
|     public static final long DEFAULT_CONNECTION_TIMEOUT = TimeUnit.SECONDS.toMillis(30L); | ||||
|      | ||||
|     public static final long DEFAULT_VALIDATION_TIMEOUT = TimeUnit.SECONDS.toMillis(10L); | ||||
|      | ||||
|     public static final int DEFAULT_MAX_POOL_SIZE = 20; | ||||
|      | ||||
|     public static final int DEFAULT_MINIMUM_IDLE = 2; | ||||
|      | ||||
|     private final HikariDataSource dataSource; | ||||
|      | ||||
|     private DataSourcePoolProperties() { | ||||
|         dataSource = new HikariDataSource(); | ||||
|         dataSource.setConnectionTimeout(DEFAULT_CONNECTION_TIMEOUT); | ||||
|         dataSource.setValidationTimeout(DEFAULT_VALIDATION_TIMEOUT); | ||||
|         dataSource.setMaximumPoolSize(DEFAULT_MAX_POOL_SIZE); | ||||
|         dataSource.setMinimumIdle(DEFAULT_MINIMUM_IDLE); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Build new Hikari config. | ||||
|      * | ||||
|      * @return new hikari config | ||||
|      */ | ||||
|     public static DataSourcePoolProperties build(Environment environment) { | ||||
|         DataSourcePoolProperties result = new DataSourcePoolProperties(); | ||||
|         Binder.get(environment).bind("db.pool.config", Bindable.ofInstance(result.getDataSource())); | ||||
|         return result; | ||||
|     } | ||||
|      | ||||
|     public void setDriverClassName(final String driverClassName) { | ||||
|         dataSource.setDriverClassName(driverClassName); | ||||
|     } | ||||
|      | ||||
|     public void setJdbcUrl(final String jdbcUrl) { | ||||
|         dataSource.setJdbcUrl(jdbcUrl); | ||||
|     } | ||||
|      | ||||
|     public void setUsername(final String username) { | ||||
|         dataSource.setUsername(username); | ||||
|     } | ||||
|      | ||||
|     public void setPassword(final String password) { | ||||
|         dataSource.setPassword(password); | ||||
|     } | ||||
|      | ||||
|     public HikariDataSource getDataSource() { | ||||
|         return dataSource; | ||||
|     } | ||||
| } | ||||
|  | @ -13,20 +13,18 @@ | |||
| 
 | ||||
| package com.alibaba.nacos.config.server.service.datasource; | ||||
| 
 | ||||
| import static com.alibaba.nacos.common.utils.CollectionUtils.getOrDefault; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Objects; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| 
 | ||||
| import com.google.common.base.Preconditions; | ||||
| import com.zaxxer.hikari.HikariDataSource; | ||||
| import org.apache.commons.collections.CollectionUtils; | ||||
| import org.springframework.boot.context.properties.bind.Bindable; | ||||
| import org.springframework.boot.context.properties.bind.Binder; | ||||
| import org.springframework.core.env.Environment; | ||||
| 
 | ||||
| import com.google.common.base.Preconditions; | ||||
| import com.zaxxer.hikari.HikariDataSource; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Objects; | ||||
| 
 | ||||
| import static com.alibaba.nacos.common.utils.CollectionUtils.getOrDefault; | ||||
| 
 | ||||
| /** | ||||
|  * Properties of external DataSource. | ||||
|  | @ -37,15 +35,7 @@ public class ExternalDataSourceProperties { | |||
|      | ||||
|     private static final String JDBC_DRIVER_NAME = "com.mysql.cj.jdbc.Driver"; | ||||
|      | ||||
|     public static final long CONNECTION_TIMEOUT_MS = 3000L; | ||||
|      | ||||
|     public static final long VALIDATION_TIMEOUT = 10L; | ||||
|      | ||||
|     public static final String TEST_QUERY = "SELECT 1 FROM dual"; | ||||
|      | ||||
|     public static final int DEFAULT_MAX_POOL_SIZE = 20; | ||||
|      | ||||
|     public static final int DEFAULT_MINIMUM_IDLE = 20; | ||||
|     private static final String TEST_QUERY = "SELECT 1"; | ||||
|      | ||||
|     private Integer num; | ||||
|      | ||||
|  | @ -55,10 +45,6 @@ public class ExternalDataSourceProperties { | |||
|      | ||||
|     private List<String> password = new ArrayList<>(); | ||||
|      | ||||
|     private List<Integer> maxPoolSize = new ArrayList<>(); | ||||
|      | ||||
|     private List<Integer> minIdle = new ArrayList<>(); | ||||
|      | ||||
|     public void setNum(Integer num) { | ||||
|         this.num = num; | ||||
|     } | ||||
|  | @ -75,14 +61,6 @@ public class ExternalDataSourceProperties { | |||
|         this.password = password; | ||||
|     } | ||||
|      | ||||
|     public void setMaxPoolSize(List<Integer> maxPoolSize) { | ||||
|         this.maxPoolSize = maxPoolSize; | ||||
|     } | ||||
|      | ||||
|     public void setMinIdle(List<Integer> minIdle) { | ||||
|         this.minIdle = minIdle; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Build serveral HikariDataSource. | ||||
|      * | ||||
|  | @ -99,16 +77,12 @@ public class ExternalDataSourceProperties { | |||
|         for (int index = 0; index < num; index++) { | ||||
|             int currentSize = index + 1; | ||||
|             Preconditions.checkArgument(url.size() >= currentSize, "db.url.%s is null", index); | ||||
|             HikariDataSource ds = new HikariDataSource(); | ||||
|             ds.setDriverClassName(JDBC_DRIVER_NAME); | ||||
|             ds.setJdbcUrl(url.get(index).trim()); | ||||
|             ds.setUsername(getOrDefault(user, index, user.get(0)).trim()); | ||||
|             ds.setPassword(getOrDefault(password, index, password.get(0)).trim()); | ||||
|             ds.setConnectionTimeout(CONNECTION_TIMEOUT_MS); | ||||
|             ds.setMaximumPoolSize(getOrDefault(maxPoolSize, index, DEFAULT_MAX_POOL_SIZE)); | ||||
|             ds.setMinimumIdle(getOrDefault(minIdle, index, DEFAULT_MINIMUM_IDLE)); | ||||
|             // Check the connection pool every 10 minutes | ||||
|             ds.setValidationTimeout(TimeUnit.MINUTES.toMillis(VALIDATION_TIMEOUT)); | ||||
|             DataSourcePoolProperties poolProperties = DataSourcePoolProperties.build(environment); | ||||
|             poolProperties.setDriverClassName(JDBC_DRIVER_NAME); | ||||
|             poolProperties.setJdbcUrl(url.get(index).trim()); | ||||
|             poolProperties.setUsername(getOrDefault(user, index, user.get(0)).trim()); | ||||
|             poolProperties.setPassword(getOrDefault(password, index, password.get(0)).trim()); | ||||
|             HikariDataSource ds = poolProperties.getDataSource(); | ||||
|             ds.setConnectionTestQuery(TEST_QUERY); | ||||
|             dataSources.add(ds); | ||||
|             callback.accept(ds); | ||||
|  |  | |||
|  | @ -16,34 +16,29 @@ | |||
| 
 | ||||
| package com.alibaba.nacos.config.server.service.datasource; | ||||
| 
 | ||||
| import static com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_INFO4BETA_ROW_MAPPER; | ||||
| import static com.alibaba.nacos.config.server.utils.LogUtil.DEFAULT_LOG; | ||||
| import static com.alibaba.nacos.config.server.utils.LogUtil.FATAL_LOG; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import java.util.regex.Matcher; | ||||
| import java.util.regex.Pattern; | ||||
| 
 | ||||
| import javax.sql.DataSource; | ||||
| 
 | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| import org.springframework.dao.DataAccessException; | ||||
| import org.springframework.jdbc.CannotGetJdbcConnectionException; | ||||
| import org.springframework.jdbc.core.JdbcTemplate; | ||||
| import org.springframework.jdbc.datasource.DataSourceTransactionManager; | ||||
| import org.springframework.transaction.support.TransactionTemplate; | ||||
| 
 | ||||
| import com.alibaba.nacos.common.utils.ConvertUtils; | ||||
| import com.alibaba.nacos.common.utils.IPUtil; | ||||
| import com.alibaba.nacos.common.utils.StringUtils; | ||||
| import com.alibaba.nacos.config.server.monitor.MetricsMonitor; | ||||
| import com.alibaba.nacos.config.server.utils.ConfigExecutor; | ||||
| import com.alibaba.nacos.config.server.utils.PropertyUtil; | ||||
| import com.alibaba.nacos.sys.utils.ApplicationUtils; | ||||
| import com.zaxxer.hikari.HikariDataSource; | ||||
| import org.springframework.dao.DataAccessException; | ||||
| import org.springframework.jdbc.CannotGetJdbcConnectionException; | ||||
| import org.springframework.jdbc.core.JdbcTemplate; | ||||
| import org.springframework.jdbc.datasource.DataSourceTransactionManager; | ||||
| import org.springframework.transaction.support.TransactionTemplate; | ||||
| 
 | ||||
| import javax.sql.DataSource; | ||||
| import java.io.IOException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| 
 | ||||
| import static com.alibaba.nacos.config.server.service.repository.RowMapperManager.CONFIG_INFO4BETA_ROW_MAPPER; | ||||
| import static com.alibaba.nacos.config.server.utils.LogUtil.DEFAULT_LOG; | ||||
| import static com.alibaba.nacos.config.server.utils.LogUtil.FATAL_LOG; | ||||
| 
 | ||||
| /** | ||||
|  * Base data source. | ||||
|  | @ -52,10 +47,6 @@ import com.zaxxer.hikari.HikariDataSource; | |||
|  */ | ||||
| public class ExternalDataSourceServiceImpl implements DataSourceService { | ||||
|      | ||||
|     private static final Logger LOGGER = LoggerFactory.getLogger(ExternalDataSourceServiceImpl.class); | ||||
|      | ||||
|     private static final String JDBC_DRIVER_NAME = "com.mysql.cj.jdbc.Driver"; | ||||
|      | ||||
|     /** | ||||
|      * JDBC execute timeout value, unit:second. | ||||
|      */ | ||||
|  | @ -83,8 +74,6 @@ public class ExternalDataSourceServiceImpl implements DataSourceService { | |||
|      | ||||
|     private volatile int masterIndex; | ||||
|      | ||||
|     private static Pattern ipPattern = Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"); | ||||
|      | ||||
|     @Override | ||||
|     public void init() { | ||||
|         queryTimeout = ConvertUtils.toInt(System.getProperty("QUERYTIMEOUT"), 3); | ||||
|  | @ -190,10 +179,10 @@ public class ExternalDataSourceServiceImpl implements DataSourceService { | |||
|             if (!isHealthList.get(i)) { | ||||
|                 if (i == masterIndex) { | ||||
|                     // The master is unhealthy. | ||||
|                     return "DOWN:" + getIpFromUrl(dataSourceList.get(i).getJdbcUrl()); | ||||
|                     return "DOWN:" + IPUtil.getIPFromString(dataSourceList.get(i).getJdbcUrl()); | ||||
|                 } else { | ||||
|                     // The slave  is unhealthy. | ||||
|                     return "WARN:" + getIpFromUrl(dataSourceList.get(i).getJdbcUrl()); | ||||
|                     return "WARN:" + IPUtil.getIPFromString(dataSourceList.get(i).getJdbcUrl()); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | @ -201,20 +190,6 @@ public class ExternalDataSourceServiceImpl implements DataSourceService { | |||
|         return "UP"; | ||||
|     } | ||||
|      | ||||
|     private String getIpFromUrl(String url) { | ||||
|          | ||||
|         Matcher m = ipPattern.matcher(url); | ||||
|         if (m.find()) { | ||||
|             return m.group(); | ||||
|         } | ||||
|          | ||||
|         return ""; | ||||
|     } | ||||
|      | ||||
|     static String defaultIfNull(String value, String defaultValue) { | ||||
|         return null == value ? defaultValue : value; | ||||
|     } | ||||
|      | ||||
|     class SelectMasterTask implements Runnable { | ||||
|          | ||||
|         @Override | ||||
|  | @ -269,10 +244,10 @@ public class ExternalDataSourceServiceImpl implements DataSourceService { | |||
|                 } catch (DataAccessException e) { | ||||
|                     if (i == masterIndex) { | ||||
|                         FATAL_LOG.error("[db-error] master db {} down.", | ||||
|                                 getIpFromUrl(dataSourceList.get(i).getJdbcUrl())); | ||||
|                                 IPUtil.getIPFromString(dataSourceList.get(i).getJdbcUrl())); | ||||
|                     } else { | ||||
|                         FATAL_LOG.error("[db-error] slave db {} down.", | ||||
|                                 getIpFromUrl(dataSourceList.get(i).getJdbcUrl())); | ||||
|                                 IPUtil.getIPFromString(dataSourceList.get(i).getJdbcUrl())); | ||||
|                     } | ||||
|                     isHealthList.set(i, Boolean.FALSE); | ||||
|                      | ||||
|  |  | |||
|  | @ -24,7 +24,13 @@ import com.alibaba.nacos.config.server.utils.PropertyUtil; | |||
| import com.alibaba.nacos.sys.utils.ApplicationUtils; | ||||
| import com.alibaba.nacos.sys.utils.DiskUtils; | ||||
| import com.zaxxer.hikari.HikariDataSource; | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.jdbc.core.JdbcTemplate; | ||||
| import org.springframework.jdbc.datasource.DataSourceTransactionManager; | ||||
| import org.springframework.transaction.support.TransactionTemplate; | ||||
| 
 | ||||
| import javax.annotation.PostConstruct; | ||||
| import javax.sql.DataSource; | ||||
| import java.io.File; | ||||
| import java.io.FileInputStream; | ||||
| import java.io.InputStream; | ||||
|  | @ -36,13 +42,6 @@ import java.sql.Statement; | |||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.concurrent.Callable; | ||||
| import javax.annotation.PostConstruct; | ||||
| import javax.sql.DataSource; | ||||
| 
 | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.jdbc.core.JdbcTemplate; | ||||
| import org.springframework.jdbc.datasource.DataSourceTransactionManager; | ||||
| import org.springframework.transaction.support.TransactionTemplate; | ||||
| 
 | ||||
| /** | ||||
|  * local data source. | ||||
|  | @ -121,7 +120,7 @@ public class LocalDataSourceServiceImpl implements DataSourceService { | |||
|     /** | ||||
|      * Restore derby. | ||||
|      * | ||||
|      * @param jdbcUrl jdbcUrl string value. | ||||
|      * @param jdbcUrl  jdbcUrl string value. | ||||
|      * @param callable callable. | ||||
|      * @throws Exception exception. | ||||
|      */ | ||||
|  | @ -145,14 +144,12 @@ public class LocalDataSourceServiceImpl implements DataSourceService { | |||
|     } | ||||
|      | ||||
|     private synchronized void initialize(String jdbcUrl) { | ||||
|         HikariDataSource ds = new HikariDataSource(); | ||||
|         ds.setDriverClassName(jdbcDriverName); | ||||
|         ds.setJdbcUrl(jdbcUrl); | ||||
|         ds.setUsername(userName); | ||||
|         ds.setPassword(password); | ||||
|         ds.setIdleTimeout(30_000L); | ||||
|         ds.setMaximumPoolSize(80); | ||||
|         ds.setConnectionTimeout(10000L); | ||||
|         DataSourcePoolProperties poolProperties = DataSourcePoolProperties.build(ApplicationUtils.getEnvironment()); | ||||
|         poolProperties.setDriverClassName(jdbcDriverName); | ||||
|         poolProperties.setJdbcUrl(jdbcUrl); | ||||
|         poolProperties.setUsername(userName); | ||||
|         poolProperties.setPassword(password); | ||||
|         HikariDataSource ds = poolProperties.getDataSource(); | ||||
|         DataSourceTransactionManager tm = new DataSourceTransactionManager(); | ||||
|         tm.setDataSource(ds); | ||||
|         if (jdbcTemplateInit) { | ||||
|  |  | |||
|  | @ -48,10 +48,10 @@ import com.alibaba.nacos.config.server.utils.LogUtil; | |||
| import com.alibaba.nacos.consistency.SerializeFactory; | ||||
| import com.alibaba.nacos.consistency.Serializer; | ||||
| import com.alibaba.nacos.consistency.cp.CPProtocol; | ||||
| import com.alibaba.nacos.consistency.cp.LogProcessor4CP; | ||||
| import com.alibaba.nacos.consistency.entity.GetRequest; | ||||
| import com.alibaba.nacos.consistency.entity.Log; | ||||
| import com.alibaba.nacos.consistency.cp.RequestProcessor4CP; | ||||
| import com.alibaba.nacos.consistency.entity.ReadRequest; | ||||
| import com.alibaba.nacos.consistency.entity.Response; | ||||
| import com.alibaba.nacos.consistency.entity.WriteRequest; | ||||
| import com.alibaba.nacos.consistency.exception.ConsistencyException; | ||||
| import com.alibaba.nacos.consistency.snapshot.SnapshotOperation; | ||||
| import com.alibaba.nacos.core.cluster.ServerMemberManager; | ||||
|  | @ -142,7 +142,7 @@ import java.util.stream.Collectors; | |||
| @Conditional(ConditionDistributedEmbedStorage.class) | ||||
| @Component | ||||
| @SuppressWarnings({"unchecked"}) | ||||
| public class DistributedDatabaseOperateImpl extends LogProcessor4CP implements BaseDatabaseOperate { | ||||
| public class DistributedDatabaseOperateImpl extends RequestProcessor4CP implements BaseDatabaseOperate { | ||||
|      | ||||
|     /** | ||||
|      * The data import operation is dedicated key, which ACTS as an identifier. | ||||
|  | @ -227,7 +227,7 @@ public class DistributedDatabaseOperateImpl extends LogProcessor4CP implements B | |||
|                     .containsExtendInfo(Constants.EXTEND_NEED_READ_UNTIL_HAVE_DATA); | ||||
|              | ||||
|             Response response = innerRead( | ||||
|                     GetRequest.newBuilder().setGroup(group()).setData(ByteString.copyFrom(data)).build(), blockRead); | ||||
|                     ReadRequest.newBuilder().setGroup(group()).setData(ByteString.copyFrom(data)).build(), blockRead); | ||||
|             if (response.getSuccess()) { | ||||
|                 return serializer.deserialize(response.getData().toByteArray(), cls); | ||||
|             } | ||||
|  | @ -251,7 +251,7 @@ public class DistributedDatabaseOperateImpl extends LogProcessor4CP implements B | |||
|                     .containsExtendInfo(Constants.EXTEND_NEED_READ_UNTIL_HAVE_DATA); | ||||
|              | ||||
|             Response response = innerRead( | ||||
|                     GetRequest.newBuilder().setGroup(group()).setData(ByteString.copyFrom(data)).build(), blockRead); | ||||
|                     ReadRequest.newBuilder().setGroup(group()).setData(ByteString.copyFrom(data)).build(), blockRead); | ||||
|             if (response.getSuccess()) { | ||||
|                 return serializer.deserialize(response.getData().toByteArray(), cls); | ||||
|             } | ||||
|  | @ -275,7 +275,7 @@ public class DistributedDatabaseOperateImpl extends LogProcessor4CP implements B | |||
|                     .containsExtendInfo(Constants.EXTEND_NEED_READ_UNTIL_HAVE_DATA); | ||||
|              | ||||
|             Response response = innerRead( | ||||
|                     GetRequest.newBuilder().setGroup(group()).setData(ByteString.copyFrom(data)).build(), blockRead); | ||||
|                     ReadRequest.newBuilder().setGroup(group()).setData(ByteString.copyFrom(data)).build(), blockRead); | ||||
|             if (response.getSuccess()) { | ||||
|                 return serializer.deserialize(response.getData().toByteArray(), | ||||
|                         ClassUtils.resolveGenericTypeByInterface(mapper.getClass())); | ||||
|  | @ -300,7 +300,7 @@ public class DistributedDatabaseOperateImpl extends LogProcessor4CP implements B | |||
|                     .containsExtendInfo(Constants.EXTEND_NEED_READ_UNTIL_HAVE_DATA); | ||||
|              | ||||
|             Response response = innerRead( | ||||
|                     GetRequest.newBuilder().setGroup(group()).setData(ByteString.copyFrom(data)).build(), blockRead); | ||||
|                     ReadRequest.newBuilder().setGroup(group()).setData(ByteString.copyFrom(data)).build(), blockRead); | ||||
|             if (response.getSuccess()) { | ||||
|                 return serializer.deserialize(response.getData().toByteArray(), List.class); | ||||
|             } | ||||
|  | @ -324,7 +324,7 @@ public class DistributedDatabaseOperateImpl extends LogProcessor4CP implements B | |||
|                     .containsExtendInfo(Constants.EXTEND_NEED_READ_UNTIL_HAVE_DATA); | ||||
|              | ||||
|             Response response = innerRead( | ||||
|                     GetRequest.newBuilder().setGroup(group()).setData(ByteString.copyFrom(data)).build(), blockRead); | ||||
|                     ReadRequest.newBuilder().setGroup(group()).setData(ByteString.copyFrom(data)).build(), blockRead); | ||||
|             if (response.getSuccess()) { | ||||
|                 return serializer.deserialize(response.getData().toByteArray(), List.class); | ||||
|             } | ||||
|  | @ -348,7 +348,7 @@ public class DistributedDatabaseOperateImpl extends LogProcessor4CP implements B | |||
|                     .containsExtendInfo(Constants.EXTEND_NEED_READ_UNTIL_HAVE_DATA); | ||||
|              | ||||
|             Response response = innerRead( | ||||
|                     GetRequest.newBuilder().setGroup(group()).setData(ByteString.copyFrom(data)).build(), blockRead); | ||||
|                     ReadRequest.newBuilder().setGroup(group()).setData(ByteString.copyFrom(data)).build(), blockRead); | ||||
|             if (response.getSuccess()) { | ||||
|                 return serializer.deserialize(response.getData().toByteArray(), List.class); | ||||
|             } | ||||
|  | @ -362,12 +362,12 @@ public class DistributedDatabaseOperateImpl extends LogProcessor4CP implements B | |||
|     /** | ||||
|      * In some business situations, you need to avoid the timeout issue, so blockRead is used to determine this. | ||||
|      * | ||||
|      * @param request   {@link GetRequest} | ||||
|      * @param request   {@link ReadRequest} | ||||
|      * @param blockRead is async read operation | ||||
|      * @return {@link Response} | ||||
|      * @throws Exception Exception | ||||
|      */ | ||||
|     private Response innerRead(GetRequest request, boolean blockRead) throws Exception { | ||||
|     private Response innerRead(ReadRequest request, boolean blockRead) throws Exception { | ||||
|         if (blockRead) { | ||||
|             return (Response) protocol.aGetData(request).join(); | ||||
|         } | ||||
|  | @ -390,7 +390,7 @@ public class DistributedDatabaseOperateImpl extends LogProcessor4CP implements B | |||
|                     if (submit) { | ||||
|                         List<ModifyRequest> requests = batchUpdate.stream().map(ModifyRequest::new) | ||||
|                                 .collect(Collectors.toList()); | ||||
|                         CompletableFuture<Response> future = protocol.submitAsync(Log.newBuilder().setGroup(group()) | ||||
|                         CompletableFuture<Response> future = protocol.submitAsync(WriteRequest.newBuilder().setGroup(group()) | ||||
|                                 .setData(ByteString.copyFrom(serializer.serialize(requests))) | ||||
|                                 .putExtendInfo(DATA_IMPORT_KEY, Boolean.TRUE.toString()).build()); | ||||
|                         futures.add(future); | ||||
|  | @ -427,19 +427,19 @@ public class DistributedDatabaseOperateImpl extends LogProcessor4CP implements B | |||
|             final String key = | ||||
|                     System.currentTimeMillis() + "-" + group() + "-" + memberManager.getSelf().getAddress() + "-" | ||||
|                             + MD5Utils.md5Hex(sqlContext.toString(), Constants.ENCODE); | ||||
|             Log log = Log.newBuilder().setGroup(group()).setKey(key) | ||||
|             WriteRequest request = WriteRequest.newBuilder().setGroup(group()).setKey(key) | ||||
|                     .setData(ByteString.copyFrom(serializer.serialize(sqlContext))) | ||||
|                     .putAllExtendInfo(EmbeddedStorageContextUtils.getCurrentExtendInfo()) | ||||
|                     .setType(sqlContext.getClass().getCanonicalName()).build(); | ||||
|             if (Objects.isNull(consumer)) { | ||||
|                 Response response = this.protocol.submit(log); | ||||
|                 Response response = this.protocol.submit(request); | ||||
|                 if (response.getSuccess()) { | ||||
|                     return true; | ||||
|                 } | ||||
|                 LogUtil.DEFAULT_LOG.error("execute sql modify operation failed : {}", response.getErrMsg()); | ||||
|                 return false; | ||||
|             } else { | ||||
|                 this.protocol.submitAsync(log).whenComplete((BiConsumer<Response, Throwable>) (response, ex) -> { | ||||
|                 this.protocol.submitAsync(request).whenComplete((BiConsumer<Response, Throwable>) (response, ex) -> { | ||||
|                     String errMsg = Objects.isNull(ex) ? response.getErrMsg() : ExceptionUtil.getCause(ex).getMessage(); | ||||
|                     consumer.accept(response.getSuccess(), | ||||
|                             StringUtils.isBlank(errMsg) ? null : new NJdbcException(errMsg)); | ||||
|  | @ -462,7 +462,7 @@ public class DistributedDatabaseOperateImpl extends LogProcessor4CP implements B | |||
|      | ||||
|     @SuppressWarnings("all") | ||||
|     @Override | ||||
|     public Response onRequest(final GetRequest request) { | ||||
|     public Response onRequest(final ReadRequest request) { | ||||
|         final SelectRequest selectRequest = serializer | ||||
|                 .deserialize(request.getData().toByteArray(), SelectRequest.class); | ||||
|          | ||||
|  | @ -511,7 +511,7 @@ public class DistributedDatabaseOperateImpl extends LogProcessor4CP implements B | |||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public Response onApply(Log log) { | ||||
|     public Response onApply(WriteRequest log) { | ||||
|         LoggerUtils.printIfDebugEnabled(LogUtil.DEFAULT_LOG, "onApply info : log : {}", log); | ||||
|         final ByteString byteString = log.getData(); | ||||
|         Preconditions.checkArgument(byteString != null, "Log.getData() must not null"); | ||||
|  |  | |||
|  | @ -18,8 +18,8 @@ package com.alibaba.nacos.config.server.service.repository.embedded; | |||
| 
 | ||||
| import com.alibaba.nacos.api.exception.NacosException; | ||||
| import com.alibaba.nacos.api.exception.runtime.NacosRuntimeException; | ||||
| import com.alibaba.nacos.common.utils.MD5Utils; | ||||
| import com.alibaba.nacos.common.notify.NotifyCenter; | ||||
| import com.alibaba.nacos.common.utils.MD5Utils; | ||||
| import com.alibaba.nacos.config.server.configuration.ConditionOnEmbeddedStorage; | ||||
| import com.alibaba.nacos.config.server.constant.Constants; | ||||
| import com.alibaba.nacos.config.server.enums.FileTypeEnum; | ||||
|  | @ -53,7 +53,7 @@ import com.alibaba.nacos.core.distributed.id.IdGeneratorManager; | |||
| import com.google.common.base.Joiner; | ||||
| import com.google.common.collect.Lists; | ||||
| import org.apache.commons.collections.CollectionUtils; | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| import org.springframework.context.annotation.Conditional; | ||||
| import org.springframework.jdbc.core.JdbcTemplate; | ||||
| import org.springframework.stereotype.Component; | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ | |||
| 
 | ||||
| package com.alibaba.nacos.config.server.utils; | ||||
| 
 | ||||
| import com.alibaba.nacos.common.utils.IPUtil; | ||||
| import org.apache.commons.lang3.StringUtils; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
|  | @ -40,7 +41,7 @@ public class SystemConfig { | |||
|         if (StringUtils.isNotEmpty(address)) { | ||||
|             return address; | ||||
|         } else { | ||||
|             address = "127.0.0.1"; | ||||
|             address = IPUtil.localHostIP(); | ||||
|         } | ||||
|         try { | ||||
|             Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); | ||||
|  |  | |||
|  | @ -0,0 +1,68 @@ | |||
| /* | ||||
|  * 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.config.server.service.datasource; | ||||
| 
 | ||||
| import com.zaxxer.hikari.HikariDataSource; | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| import org.springframework.mock.env.MockEnvironment; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| 
 | ||||
| public class DataSourcePoolPropertiesTest { | ||||
|      | ||||
|     private static final String JDBC_URL = "jdbc:derby://127.0.0.1:3306/nacos_devtest?characterEncoding=utf8&serverTimezone=UTC"; | ||||
|      | ||||
|     private static final String JDBC_DRIVER_CLASS_NAME = "org.apache.derby.jdbc.EmbeddedDriver"; | ||||
|      | ||||
|     private static final String PASSWORD = "nacos"; | ||||
|      | ||||
|     private static final String USERNAME = "nacos_devtest"; | ||||
|      | ||||
|     private static final Long CONNECTION_TIMEOUT = 10000L; | ||||
|      | ||||
|     private static final Integer MAX_POOL_SIZE = 50; | ||||
|      | ||||
|     private MockEnvironment environment; | ||||
|      | ||||
|     @Before | ||||
|     public void setUp() throws Exception { | ||||
|         environment = new MockEnvironment(); | ||||
|         environment.setProperty("db.user", USERNAME); | ||||
|         environment.setProperty("db.password", PASSWORD); | ||||
|         environment.setProperty("db.pool.config.connectionTimeout", CONNECTION_TIMEOUT.toString()); | ||||
|         environment.setProperty("db.pool.config.maximumPoolSize", MAX_POOL_SIZE.toString()); | ||||
|     } | ||||
|      | ||||
|     @Test | ||||
|     public void testBuild() { | ||||
|         DataSourcePoolProperties poolProperties = DataSourcePoolProperties.build(environment); | ||||
|         poolProperties.setJdbcUrl(JDBC_URL); | ||||
|         poolProperties.setDriverClassName(JDBC_DRIVER_CLASS_NAME); | ||||
|         poolProperties.setUsername(USERNAME); | ||||
|         poolProperties.setPassword(PASSWORD); | ||||
|         HikariDataSource actual = poolProperties.getDataSource(); | ||||
|         assertEquals(JDBC_URL, actual.getJdbcUrl()); | ||||
|         assertEquals(JDBC_DRIVER_CLASS_NAME, actual.getDriverClassName()); | ||||
|         assertEquals(USERNAME, actual.getUsername()); | ||||
|         assertEquals(PASSWORD, actual.getPassword()); | ||||
|         assertEquals(CONNECTION_TIMEOUT.longValue(), actual.getConnectionTimeout()); | ||||
|         assertEquals(DataSourcePoolProperties.DEFAULT_VALIDATION_TIMEOUT, actual.getValidationTimeout()); | ||||
|         assertEquals(MAX_POOL_SIZE.intValue(), actual.getMaximumPoolSize()); | ||||
|         assertEquals(DataSourcePoolProperties.DEFAULT_MINIMUM_IDLE, actual.getMinimumIdle()); | ||||
|     } | ||||
| } | ||||
|  | @ -107,7 +107,7 @@ public class ExternalDataSourcePropertiesTest { | |||
|         environment.setProperty("db.url.0", JDBC_URL); | ||||
|         List<HikariDataSource> dataSources = new ExternalDataSourceProperties().build(environment, (dataSource -> { | ||||
|             dataSource.validate(); | ||||
|             Assert.assertEquals(dataSource.getMinimumIdle(), ExternalDataSourceProperties.DEFAULT_MINIMUM_IDLE); | ||||
|             Assert.assertEquals(dataSource.getMinimumIdle(), DataSourcePoolProperties.DEFAULT_MINIMUM_IDLE); | ||||
|         })); | ||||
|         Assert.assertEquals(dataSources.size(), 1); | ||||
|     } | ||||
|  |  | |||
|  | @ -1,16 +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. | ||||
| # | ||||
| 
 | ||||
|  | @ -30,32 +30,32 @@ | |||
|         </extensions> | ||||
|         <plugins> | ||||
|             <!--            Grpc coding plug-in--> | ||||
|             <!--            <plugin>--> | ||||
|             <!--                <groupId>org.xolstice.maven.plugins</groupId>--> | ||||
|             <!--                <artifactId>protobuf-maven-plugin</artifactId>--> | ||||
|             <!--                <version>0.5.0</version>--> | ||||
|             <!--                <configuration>--> | ||||
|             <!--                    <protocArtifact>com.google.protobuf:protoc:${protobuf-java.version}:exe:${os.detected.classifier}</protocArtifact>--> | ||||
|             <!--                    <pluginId>grpc-java</pluginId>--> | ||||
|             <!--                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc-java.version}:exe:${os.detected.classifier}</pluginArtifact>--> | ||||
|             <!--                </configuration>--> | ||||
|             <!--                <executions>--> | ||||
|             <!--                    <execution>--> | ||||
|             <!--                        <goals>--> | ||||
|             <!--                            <goal>compile</goal>--> | ||||
|             <!--                            <goal>compile-custom</goal>--> | ||||
|             <!--                        </goals>--> | ||||
|             <!--                    </execution>--> | ||||
|             <!--                </executions>--> | ||||
|             <!--            </plugin>--> | ||||
|             <!--            <plugin>--> | ||||
|             <!--                <groupId>org.apache.maven.plugins</groupId>--> | ||||
|             <!--                <artifactId>maven-compiler-plugin</artifactId>--> | ||||
|             <!--                <configuration>--> | ||||
|             <!--                    <source>8</source>--> | ||||
|             <!--                    <target>8</target>--> | ||||
|             <!--                </configuration>--> | ||||
|             <!--            </plugin>--> | ||||
|                         <plugin> | ||||
|                             <groupId>org.xolstice.maven.plugins</groupId> | ||||
|                             <artifactId>protobuf-maven-plugin</artifactId> | ||||
|                             <version>0.5.0</version> | ||||
|                             <configuration> | ||||
|                                 <protocArtifact>com.google.protobuf:protoc:${protobuf-java.version}:exe:${os.detected.classifier}</protocArtifact> | ||||
|                                 <pluginId>grpc-java</pluginId> | ||||
|                                 <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc-java.version}:exe:${os.detected.classifier}</pluginArtifact> | ||||
|                             </configuration> | ||||
|                             <executions> | ||||
|                                 <execution> | ||||
|                                     <goals> | ||||
|                                         <goal>compile</goal> | ||||
|                                         <goal>compile-custom</goal> | ||||
|                                     </goals> | ||||
|                                 </execution> | ||||
|                             </executions> | ||||
|                         </plugin> | ||||
|                         <plugin> | ||||
|                             <groupId>org.apache.maven.plugins</groupId> | ||||
|                             <artifactId>maven-compiler-plugin</artifactId> | ||||
|                             <configuration> | ||||
|                                 <source>8</source> | ||||
|                                 <target>8</target> | ||||
|                             </configuration> | ||||
|                         </plugin> | ||||
|         </plugins> | ||||
|     </build> | ||||
|      | ||||
|  |  | |||
|  | @ -22,7 +22,7 @@ import java.util.Set; | |||
| /** | ||||
|  * Consistent protocol related configuration objects. | ||||
|  * | ||||
|  * <p>{@link LogProcessor} : The consistency protocol provides services for all businesses, but each business only cares | ||||
|  * <p>{@link RequestProcessor} : The consistency protocol provides services for all businesses, but each business only cares | ||||
|  * about the transaction information belonging to that business, and the transaction processing between the various | ||||
|  * services should not block each other. Therefore, the LogProcessor is abstracted to implement the parallel processing | ||||
|  * of transactions of different services. Corresponding LogProcessor sub-interface: LogProcessor4AP or LogProcessor4CP, | ||||
|  | @ -30,7 +30,7 @@ import java.util.Set; | |||
|  * | ||||
|  * @author <a href="mailto:liaochuntao@live.com">liaochuntao</a> | ||||
|  */ | ||||
| public interface Config<L extends LogProcessor> extends Serializable { | ||||
| public interface Config<L extends RequestProcessor> extends Serializable { | ||||
|      | ||||
|     /** | ||||
|      * Set the cluster node information to initialize,like [ip:port, ip:port, ip:port]. | ||||
|  |  | |||
|  | @ -16,9 +16,9 @@ | |||
| 
 | ||||
| package com.alibaba.nacos.consistency; | ||||
| 
 | ||||
| import com.alibaba.nacos.consistency.entity.GetRequest; | ||||
| import com.alibaba.nacos.consistency.entity.Log; | ||||
| import com.alibaba.nacos.consistency.entity.ReadRequest; | ||||
| import com.alibaba.nacos.consistency.entity.Response; | ||||
| import com.alibaba.nacos.consistency.entity.WriteRequest; | ||||
| 
 | ||||
| import java.util.Collection; | ||||
| import java.util.Set; | ||||
|  | @ -37,7 +37,7 @@ import java.util.concurrent.CompletableFuture; | |||
|  * | ||||
|  * @author <a href="mailto:liaochuntao@live.com">liaochuntao</a> | ||||
|  */ | ||||
| public interface ConsistencyProtocol<T extends Config, P extends LogProcessor> extends CommandOperations { | ||||
| public interface ConsistencyProtocol<T extends Config, P extends RequestProcessor> extends CommandOperations { | ||||
|      | ||||
|     /** | ||||
|      * Consistency protocol initialization: perform initialization operations based on the incoming. | ||||
|  | @ -50,7 +50,7 @@ public interface ConsistencyProtocol<T extends Config, P extends LogProcessor> e | |||
|     /** | ||||
|      * Add a log handler. | ||||
|      * | ||||
|      * @param processors {@link LogProcessor} | ||||
|      * @param processors {@link RequestProcessor} | ||||
|      */ | ||||
|     void addLogProcessors(Collection<P> processors); | ||||
|      | ||||
|  | @ -69,7 +69,7 @@ public interface ConsistencyProtocol<T extends Config, P extends LogProcessor> e | |||
|      * @return data {@link Response} | ||||
|      * @throws Exception {@link Exception} | ||||
|      */ | ||||
|     Response getData(GetRequest request) throws Exception; | ||||
|     Response getData(ReadRequest request) throws Exception; | ||||
|      | ||||
|     /** | ||||
|      * Get data asynchronously. | ||||
|  | @ -77,27 +77,27 @@ public interface ConsistencyProtocol<T extends Config, P extends LogProcessor> e | |||
|      * @param request request | ||||
|      * @return data {@link CompletableFuture} | ||||
|      */ | ||||
|     CompletableFuture<Response> aGetData(GetRequest request); | ||||
|     CompletableFuture<Response> aGetData(ReadRequest request); | ||||
|      | ||||
|     /** | ||||
|      * Data operation, returning submission results synchronously. | ||||
|      * 同步数据提交,在 Datum 中已携带相应的数据操作信息 | ||||
|      * | ||||
|      * @param data {@link Log} | ||||
|      * @param request {@link com.alibaba.nacos.consistency.entity.WriteRequest} | ||||
|      * @return submit operation result {@link Response} | ||||
|      * @throws Exception {@link Exception} | ||||
|      */ | ||||
|     Response submit(Log data) throws Exception; | ||||
|     Response submit(WriteRequest request) throws Exception; | ||||
|      | ||||
|     /** | ||||
|      * Data submission operation, returning submission results asynchronously. | ||||
|      * 异步数据提交,在 Datum中已携带相应的数据操作信息,返回一个Future,自行操作,提交发生的异常会在CompleteFuture中 | ||||
|      * | ||||
|      * @param data {@link Log} | ||||
|      * @param request {@link com.alibaba.nacos.consistency.entity.WriteRequest} | ||||
|      * @return {@link CompletableFuture} submit result | ||||
|      * @throws Exception when submit throw Exception | ||||
|      */ | ||||
|     CompletableFuture<Response> submitAsync(Log data); | ||||
|     CompletableFuture<Response> submitAsync(WriteRequest request); | ||||
|      | ||||
|     /** | ||||
|      * New member list . | ||||
|  |  | |||
|  | @ -0,0 +1,97 @@ | |||
| /* | ||||
|  *  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.consistency; | ||||
| 
 | ||||
| import com.alibaba.nacos.consistency.entity.GetRequest; | ||||
| import com.alibaba.nacos.consistency.entity.Log; | ||||
| import com.alibaba.nacos.consistency.entity.ReadRequest; | ||||
| import com.alibaba.nacos.consistency.entity.WriteRequest; | ||||
| import com.alibaba.nacos.consistency.exception.ConsistencyException; | ||||
| import com.google.protobuf.Message; | ||||
| 
 | ||||
| /** | ||||
|  * protobuf message utils. | ||||
|  * | ||||
|  * @author <a href="mailto:liaochuntao@live.com">liaochuntao</a> | ||||
|  */ | ||||
| public class ProtoMessageUtil { | ||||
|      | ||||
|     /** | ||||
|      * Converts the byte array to a specific Protobuf object. | ||||
|      * Internally, the protobuf new and old objects are compatible. | ||||
|      * | ||||
|      * @param bytes An array of bytes | ||||
|      * @return Message | ||||
|      */ | ||||
|     public static Message parse(byte[] bytes) { | ||||
|         Message result; | ||||
|         try { | ||||
|             result = WriteRequest.parseFrom(bytes); | ||||
|             return result; | ||||
|         } catch (Throwable ignore) { | ||||
|         } | ||||
|         try { | ||||
|             result = ReadRequest.parseFrom(bytes); | ||||
|             return result; | ||||
|         } catch (Throwable ignore) { | ||||
|         } | ||||
|          | ||||
|         // old consistency entity, will be @Deprecated in future | ||||
|         try { | ||||
|             Log log = Log.parseFrom(bytes); | ||||
|             return convertToWriteRequest(log); | ||||
|         } catch (Throwable ignore) { | ||||
|         } | ||||
|          | ||||
|         try { | ||||
|             GetRequest request = GetRequest.parseFrom(bytes); | ||||
|             return convertToReadRequest(request); | ||||
|         } catch (Throwable ignore) { | ||||
|         } | ||||
|          | ||||
|         throw new ConsistencyException("The current array cannot be serialized to the corresponding object"); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * convert Log to WriteRequest. | ||||
|      * | ||||
|      * @param log log | ||||
|      * @return {@link WriteRequest} | ||||
|      */ | ||||
|     public static WriteRequest convertToWriteRequest(Log log) { | ||||
|         return WriteRequest.newBuilder().setKey(log.getKey()).setGroup(log.getGroup()) | ||||
|                 .setData(log.getData()) | ||||
|                 .setType(log.getType()) | ||||
|                 .setOperation(log.getOperation()) | ||||
|                 .putAllExtendInfo(log.getExtendInfoMap()) | ||||
|                 .build(); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * convert Log to ReadRequest. | ||||
|      * | ||||
|      * @param request request | ||||
|      * @return {@link ReadRequest} | ||||
|      */ | ||||
|     public static ReadRequest convertToReadRequest(GetRequest request) { | ||||
|         return ReadRequest.newBuilder() | ||||
|                 .setGroup(request.getGroup()) | ||||
|                 .setData(request.getData()) | ||||
|                 .putAllExtendInfo(request.getExtendInfoMap()) | ||||
|                 .build(); | ||||
|     } | ||||
| } | ||||
|  | @ -16,9 +16,9 @@ | |||
| 
 | ||||
| package com.alibaba.nacos.consistency; | ||||
| 
 | ||||
| import com.alibaba.nacos.consistency.entity.GetRequest; | ||||
| import com.alibaba.nacos.consistency.entity.Log; | ||||
| import com.alibaba.nacos.consistency.entity.ReadRequest; | ||||
| import com.alibaba.nacos.consistency.entity.Response; | ||||
| import com.alibaba.nacos.consistency.entity.WriteRequest; | ||||
| 
 | ||||
| /** | ||||
|  * Can be discovered through SPI or Spring, This interface is just a function definition interface. Different | ||||
|  | @ -27,23 +27,23 @@ import com.alibaba.nacos.consistency.entity.Response; | |||
|  * @author <a href="mailto:liaochuntao@live.com">liaochuntao</a> | ||||
|  */ | ||||
| @SuppressWarnings("PMD.AbstractClassShouldStartWithAbstractNamingRule") | ||||
| public abstract class LogProcessor { | ||||
| public abstract class RequestProcessor { | ||||
|      | ||||
|     /** | ||||
|      * get data by key. | ||||
|      * | ||||
|      * @param request request {@link GetRequest} | ||||
|      * @param request request {@link com.alibaba.nacos.consistency.entity.ReadRequest} | ||||
|      * @return target type data | ||||
|      */ | ||||
|     public abstract Response onRequest(GetRequest request); | ||||
|     public abstract Response onRequest(ReadRequest request); | ||||
|      | ||||
|     /** | ||||
|      * Process Submitted Log. | ||||
|      * | ||||
|      * @param log {@link Log} | ||||
|      * @param log {@link WriteRequest} | ||||
|      * @return {@link boolean} | ||||
|      */ | ||||
|     public abstract Response onApply(Log log); | ||||
|     public abstract Response onApply(WriteRequest log); | ||||
|      | ||||
|     /** | ||||
|      * Irremediable errors that need to trigger business price cuts. | ||||
|  | @ -25,6 +25,6 @@ import com.alibaba.nacos.consistency.ConsistencyProtocol; | |||
|  * @author <a href="mailto:liaochuntao@live.com">liaochuntao</a> | ||||
|  */ | ||||
| @SuppressWarnings("all") | ||||
| public interface APProtocol<C extends Config, P extends LogProcessor4AP> extends ConsistencyProtocol<C, P> { | ||||
| public interface APProtocol<C extends Config, P extends RequestProcessor4AP> extends ConsistencyProtocol<C, P> { | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ | |||
| 
 | ||||
| package com.alibaba.nacos.consistency.ap; | ||||
| 
 | ||||
| import com.alibaba.nacos.consistency.LogProcessor; | ||||
| import com.alibaba.nacos.consistency.RequestProcessor; | ||||
| 
 | ||||
| /** | ||||
|  * log processor for ap. | ||||
|  | @ -24,6 +24,6 @@ import com.alibaba.nacos.consistency.LogProcessor; | |||
|  * @author <a href="mailto:liaochuntao@live.com">liaochuntao</a> | ||||
|  */ | ||||
| @SuppressWarnings("all") | ||||
| public abstract class LogProcessor4AP extends LogProcessor { | ||||
| public abstract class RequestProcessor4AP extends RequestProcessor { | ||||
| 
 | ||||
| } | ||||
|  | @ -25,7 +25,7 @@ import com.alibaba.nacos.consistency.ConsistencyProtocol; | |||
|  * @author <a href="mailto:liaochuntao@live.com">liaochuntao</a> | ||||
|  */ | ||||
| @SuppressWarnings("all") | ||||
| public interface CPProtocol<C extends Config, P extends LogProcessor4CP> extends ConsistencyProtocol<C, P> { | ||||
| public interface CPProtocol<C extends Config, P extends RequestProcessor4CP> extends ConsistencyProtocol<C, P> { | ||||
|      | ||||
|     /** | ||||
|      * Returns whether this node is a leader node | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ | |||
| 
 | ||||
| package com.alibaba.nacos.consistency.cp; | ||||
| 
 | ||||
| import com.alibaba.nacos.consistency.LogProcessor; | ||||
| import com.alibaba.nacos.consistency.RequestProcessor; | ||||
| import com.alibaba.nacos.consistency.snapshot.SnapshotOperation; | ||||
| 
 | ||||
| import java.util.Collections; | ||||
|  | @ -28,7 +28,7 @@ import java.util.List; | |||
|  * @author <a href="mailto:liaochuntao@live.com">liaochuntao</a> | ||||
|  */ | ||||
| @SuppressWarnings("all") | ||||
| public abstract class LogProcessor4CP extends LogProcessor { | ||||
| public abstract class RequestProcessor4CP extends RequestProcessor { | ||||
|      | ||||
|      | ||||
|     /** | ||||
|  | @ -1,95 +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. | ||||
|  */ | ||||
| 
 | ||||
| // Generated by the protocol buffer compiler.  DO NOT EDIT! | ||||
| // source: Data.proto | ||||
| 
 | ||||
| package com.alibaba.nacos.consistency.entity; | ||||
| 
 | ||||
| @SuppressWarnings("all") | ||||
| public final class Data { | ||||
|      | ||||
|     static final com.google.protobuf.Descriptors.Descriptor internal_static_Log_descriptor; | ||||
|      | ||||
|     static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_Log_fieldAccessorTable; | ||||
|      | ||||
|     static final com.google.protobuf.Descriptors.Descriptor internal_static_Log_ExtendInfoEntry_descriptor; | ||||
|      | ||||
|     static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_Log_ExtendInfoEntry_fieldAccessorTable; | ||||
|      | ||||
|     static final com.google.protobuf.Descriptors.Descriptor internal_static_GetRequest_descriptor; | ||||
|      | ||||
|     static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_GetRequest_fieldAccessorTable; | ||||
|      | ||||
|     static final com.google.protobuf.Descriptors.Descriptor internal_static_GetRequest_ExtendInfoEntry_descriptor; | ||||
|      | ||||
|     static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_GetRequest_ExtendInfoEntry_fieldAccessorTable; | ||||
|      | ||||
|     static final com.google.protobuf.Descriptors.Descriptor internal_static_Response_descriptor; | ||||
|      | ||||
|     static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_Response_fieldAccessorTable; | ||||
|      | ||||
|     private static com.google.protobuf.Descriptors.FileDescriptor descriptor; | ||||
|      | ||||
|     static { | ||||
|         String[] descriptorData = {"\n\nData.proto\"\255\001\n\003Log\022\r\n\005group\030\001 \001(\t\022\013\n\003k" | ||||
|                 + "ey\030\002 \001(\t\022\014\n\004data\030\003 \001(\014\022\014\n\004type\030\004 \001(\t\022\021\n\t" | ||||
|                 + "operation\030\005 \001(\t\022(\n\nextendInfo\030\006 \003(\0132\024.Lo" | ||||
|                 + "g.ExtendInfoEntry\0321\n\017ExtendInfoEntry\022\013\n\003" | ||||
|                 + "key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"\215\001\n\nGetRequ" | ||||
|                 + "est\022\r\n\005group\030\001 \001(\t\022\014\n\004data\030\002 \001(\014\022/\n\nexte" | ||||
|                 + "ndInfo\030\003 \003(\0132\033.GetRequest.ExtendInfoEntr" | ||||
|                 + "y\0321\n\017ExtendInfoEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005val" | ||||
|                 + "ue\030\002 \001(\t:\0028\001\"9\n\010Response\022\014\n\004data\030\001 \001(\014\022\016" | ||||
|                 + "\n\006errMsg\030\002 \001(\t\022\017\n\007success\030\003 \001(\010B(\n$com.a" | ||||
|                 + "libaba.nacos.consistency.entityP\001b\006proto" + "3"}; | ||||
|         descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData, | ||||
|                 new com.google.protobuf.Descriptors.FileDescriptor[] {}); | ||||
|         internal_static_Log_descriptor = getDescriptor().getMessageTypes().get(0); | ||||
|         internal_static_Log_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( | ||||
|                 internal_static_Log_descriptor, | ||||
|                 new String[] {"Group", "Key", "Data", "Type", "Operation", "ExtendInfo",}); | ||||
|         internal_static_Log_ExtendInfoEntry_descriptor = internal_static_Log_descriptor.getNestedTypes().get(0); | ||||
|         internal_static_Log_ExtendInfoEntry_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( | ||||
|                 internal_static_Log_ExtendInfoEntry_descriptor, new String[] {"Key", "Value",}); | ||||
|         internal_static_GetRequest_descriptor = getDescriptor().getMessageTypes().get(1); | ||||
|         internal_static_GetRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( | ||||
|                 internal_static_GetRequest_descriptor, new String[] {"Group", "Data", "ExtendInfo",}); | ||||
|         internal_static_GetRequest_ExtendInfoEntry_descriptor = internal_static_GetRequest_descriptor.getNestedTypes() | ||||
|                 .get(0); | ||||
|         internal_static_GetRequest_ExtendInfoEntry_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( | ||||
|                 internal_static_GetRequest_ExtendInfoEntry_descriptor, new String[] {"Key", "Value",}); | ||||
|         internal_static_Response_descriptor = getDescriptor().getMessageTypes().get(2); | ||||
|         internal_static_Response_fieldAccessorTable = new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( | ||||
|                 internal_static_Response_descriptor, new String[] {"Data", "ErrMsg", "Success",}); | ||||
|     } | ||||
|      | ||||
|     private Data() { | ||||
|     } | ||||
|      | ||||
|     public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) { | ||||
|     } | ||||
|      | ||||
|     public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) { | ||||
|         registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry); | ||||
|     } | ||||
|      | ||||
|     public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { | ||||
|         return descriptor; | ||||
|     } | ||||
|      | ||||
|     // @@protoc_insertion_point(outer_class_scope) | ||||
| } | ||||
|  | @ -1,884 +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. | ||||
|  */ | ||||
| 
 | ||||
| // Generated by the protocol buffer compiler.  DO NOT EDIT! | ||||
| // source: Data.proto | ||||
| 
 | ||||
| package com.alibaba.nacos.consistency.entity; | ||||
| 
 | ||||
| /** | ||||
|  * Protobuf type {@code GetRequest}. | ||||
|  */ | ||||
| @SuppressWarnings("all") | ||||
| public final class GetRequest extends com.google.protobuf.GeneratedMessageV3 implements | ||||
|         // @@protoc_insertion_point(message_implements:GetRequest) | ||||
|         GetRequestOrBuilder { | ||||
|      | ||||
|     public static final int GROUP_FIELD_NUMBER = 1; | ||||
|      | ||||
|     public static final int DATA_FIELD_NUMBER = 2; | ||||
|      | ||||
|     public static final int EXTENDINFO_FIELD_NUMBER = 3; | ||||
|      | ||||
|     private static final long serialVersionUID = 0L; | ||||
|      | ||||
|     // @@protoc_insertion_point(class_scope:GetRequest) | ||||
|     private static final GetRequest DEFAULT_INSTANCE; | ||||
|      | ||||
|     private static final com.google.protobuf.Parser<GetRequest> PARSER = new com.google.protobuf.AbstractParser<GetRequest>() { | ||||
|         @Override | ||||
|         public GetRequest parsePartialFrom(com.google.protobuf.CodedInputStream input, | ||||
|                 com.google.protobuf.ExtensionRegistryLite extensionRegistry) | ||||
|                 throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|             return new GetRequest(input, extensionRegistry); | ||||
|         } | ||||
|     }; | ||||
|      | ||||
|     static { | ||||
|         DEFAULT_INSTANCE = new GetRequest(); | ||||
|     } | ||||
|      | ||||
|     private volatile Object group_; | ||||
|      | ||||
|     private com.google.protobuf.ByteString data_; | ||||
|      | ||||
|     private com.google.protobuf.MapField<String, String> extendInfo_; | ||||
|      | ||||
|     private byte memoizedIsInitialized = -1; | ||||
|      | ||||
|     // Use GetRequest.newBuilder() to construct. | ||||
|     private GetRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) { | ||||
|         super(builder); | ||||
|     } | ||||
|      | ||||
|     private GetRequest() { | ||||
|         group_ = ""; | ||||
|         data_ = com.google.protobuf.ByteString.EMPTY; | ||||
|     } | ||||
|      | ||||
|     private GetRequest(com.google.protobuf.CodedInputStream input, | ||||
|             com.google.protobuf.ExtensionRegistryLite extensionRegistry) | ||||
|             throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         this(); | ||||
|         if (extensionRegistry == null) { | ||||
|             throw new NullPointerException(); | ||||
|         } | ||||
|         int mutable_bitField0_ = 0; | ||||
|         com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); | ||||
|         try { | ||||
|             boolean done = false; | ||||
|             while (!done) { | ||||
|                 int tag = input.readTag(); | ||||
|                 switch (tag) { | ||||
|                     case 0: | ||||
|                         done = true; | ||||
|                         break; | ||||
|                     case 10: { | ||||
|                         String s = input.readStringRequireUtf8(); | ||||
|                          | ||||
|                         group_ = s; | ||||
|                         break; | ||||
|                     } | ||||
|                     case 18: { | ||||
|                          | ||||
|                         data_ = input.readBytes(); | ||||
|                         break; | ||||
|                     } | ||||
|                     case 26: { | ||||
|                         if (!((mutable_bitField0_ & 0x00000001) != 0)) { | ||||
|                             extendInfo_ = com.google.protobuf.MapField | ||||
|                                     .newMapField(ExtendInfoDefaultEntryHolder.defaultEntry); | ||||
|                             mutable_bitField0_ |= 0x00000001; | ||||
|                         } | ||||
|                         com.google.protobuf.MapEntry<String, String> extendInfo__ = input | ||||
|                                 .readMessage(ExtendInfoDefaultEntryHolder.defaultEntry.getParserForType(), | ||||
|                                         extensionRegistry); | ||||
|                         extendInfo_.getMutableMap().put(extendInfo__.getKey(), extendInfo__.getValue()); | ||||
|                         break; | ||||
|                     } | ||||
|                     default: { | ||||
|                         if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { | ||||
|                             done = true; | ||||
|                         } | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } catch (com.google.protobuf.InvalidProtocolBufferException e) { | ||||
|             throw e.setUnfinishedMessage(this); | ||||
|         } catch (java.io.IOException e) { | ||||
|             throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); | ||||
|         } finally { | ||||
|             this.unknownFields = unknownFields.build(); | ||||
|             makeExtensionsImmutable(); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { | ||||
|         return Data.internal_static_GetRequest_descriptor; | ||||
|     } | ||||
|      | ||||
|     public static GetRequest parseFrom(java.nio.ByteBuffer data) | ||||
|             throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         return PARSER.parseFrom(data); | ||||
|     } | ||||
|      | ||||
|     public static GetRequest parseFrom(java.nio.ByteBuffer data, | ||||
|             com.google.protobuf.ExtensionRegistryLite extensionRegistry) | ||||
|             throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         return PARSER.parseFrom(data, extensionRegistry); | ||||
|     } | ||||
|      | ||||
|     public static GetRequest parseFrom(com.google.protobuf.ByteString data) | ||||
|             throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         return PARSER.parseFrom(data); | ||||
|     } | ||||
|      | ||||
|     public static GetRequest parseFrom(com.google.protobuf.ByteString data, | ||||
|             com.google.protobuf.ExtensionRegistryLite extensionRegistry) | ||||
|             throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         return PARSER.parseFrom(data, extensionRegistry); | ||||
|     } | ||||
|      | ||||
|     public static GetRequest parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         return PARSER.parseFrom(data); | ||||
|     } | ||||
|      | ||||
|     public static GetRequest parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) | ||||
|             throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         return PARSER.parseFrom(data, extensionRegistry); | ||||
|     } | ||||
|      | ||||
|     public static GetRequest parseFrom(java.io.InputStream input) throws java.io.IOException { | ||||
|         return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); | ||||
|     } | ||||
|      | ||||
|     public static GetRequest parseFrom(java.io.InputStream input, | ||||
|             com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { | ||||
|         return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); | ||||
|     } | ||||
|      | ||||
|     public static GetRequest parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { | ||||
|         return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); | ||||
|     } | ||||
|      | ||||
|     public static GetRequest parseDelimitedFrom(java.io.InputStream input, | ||||
|             com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { | ||||
|         return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); | ||||
|     } | ||||
|      | ||||
|     public static GetRequest parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { | ||||
|         return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); | ||||
|     } | ||||
|      | ||||
|     public static GetRequest parseFrom(com.google.protobuf.CodedInputStream input, | ||||
|             com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { | ||||
|         return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); | ||||
|     } | ||||
|      | ||||
|     public static Builder newBuilder() { | ||||
|         return DEFAULT_INSTANCE.toBuilder(); | ||||
|     } | ||||
|      | ||||
|     public static Builder newBuilder(GetRequest prototype) { | ||||
|         return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); | ||||
|     } | ||||
|      | ||||
|     public static GetRequest getDefaultInstance() { | ||||
|         return DEFAULT_INSTANCE; | ||||
|     } | ||||
|      | ||||
|     public static com.google.protobuf.Parser<GetRequest> parser() { | ||||
|         return PARSER; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     @SuppressWarnings({"unused"}) | ||||
|     protected Object newInstance(UnusedPrivateParameter unused) { | ||||
|         return new GetRequest(); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public final com.google.protobuf.UnknownFieldSet getUnknownFields() { | ||||
|         return this.unknownFields; | ||||
|     } | ||||
|      | ||||
|     @SuppressWarnings({"rawtypes"}) | ||||
|     @Override | ||||
|     protected com.google.protobuf.MapField internalGetMapField(int number) { | ||||
|         switch (number) { | ||||
|             case 3: | ||||
|                 return internalGetExtendInfo(); | ||||
|             default: | ||||
|                 throw new RuntimeException("Invalid map field number: " + number); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     protected FieldAccessorTable internalGetFieldAccessorTable() { | ||||
|         return Data.internal_static_GetRequest_fieldAccessorTable | ||||
|                 .ensureFieldAccessorsInitialized(GetRequest.class, GetRequest.Builder.class); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * <code>string group = 1;</code> | ||||
|      */ | ||||
|     public String getGroup() { | ||||
|         Object ref = group_; | ||||
|         if (ref instanceof String) { | ||||
|             return (String) ref; | ||||
|         } else { | ||||
|             com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; | ||||
|             String s = bs.toStringUtf8(); | ||||
|             group_ = s; | ||||
|             return s; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * <code>string group = 1;</code> | ||||
|      */ | ||||
|     public com.google.protobuf.ByteString getGroupBytes() { | ||||
|         Object ref = group_; | ||||
|         if (ref instanceof String) { | ||||
|             com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((String) ref); | ||||
|             group_ = b; | ||||
|             return b; | ||||
|         } else { | ||||
|             return (com.google.protobuf.ByteString) ref; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * <code>bytes data = 2;</code> | ||||
|      */ | ||||
|     public com.google.protobuf.ByteString getData() { | ||||
|         return data_; | ||||
|     } | ||||
|      | ||||
|     private com.google.protobuf.MapField<String, String> internalGetExtendInfo() { | ||||
|         if (extendInfo_ == null) { | ||||
|             return com.google.protobuf.MapField.emptyMapField(ExtendInfoDefaultEntryHolder.defaultEntry); | ||||
|         } | ||||
|         return extendInfo_; | ||||
|     } | ||||
|      | ||||
|     public int getExtendInfoCount() { | ||||
|         return internalGetExtendInfo().getMap().size(); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 3;</code> | ||||
|      */ | ||||
|      | ||||
|     public boolean containsExtendInfo(String key) { | ||||
|         if (key == null) { | ||||
|             throw new NullPointerException(); | ||||
|         } | ||||
|         return internalGetExtendInfo().getMap().containsKey(key); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Use {@link #getExtendInfoMap()} instead. | ||||
|      */ | ||||
|     @Deprecated | ||||
|     public java.util.Map<String, String> getExtendInfo() { | ||||
|         return getExtendInfoMap(); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 3;</code> | ||||
|      */ | ||||
|      | ||||
|     public java.util.Map<String, String> getExtendInfoMap() { | ||||
|         return internalGetExtendInfo().getMap(); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 3;</code> | ||||
|      */ | ||||
|      | ||||
|     public String getExtendInfoOrDefault(String key, String defaultValue) { | ||||
|         if (key == null) { | ||||
|             throw new NullPointerException(); | ||||
|         } | ||||
|         java.util.Map<String, String> map = internalGetExtendInfo().getMap(); | ||||
|         return map.containsKey(key) ? map.get(key) : defaultValue; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 3;</code> | ||||
|      */ | ||||
|      | ||||
|     public String getExtendInfoOrThrow(String key) { | ||||
|         if (key == null) { | ||||
|             throw new NullPointerException(); | ||||
|         } | ||||
|         java.util.Map<String, String> map = internalGetExtendInfo().getMap(); | ||||
|         if (!map.containsKey(key)) { | ||||
|             throw new IllegalArgumentException(); | ||||
|         } | ||||
|         return map.get(key); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public final boolean isInitialized() { | ||||
|         byte isInitialized = memoizedIsInitialized; | ||||
|         if (isInitialized == 1) { | ||||
|             return true; | ||||
|         } | ||||
|         if (isInitialized == 0) { | ||||
|             return false; | ||||
|         } | ||||
|          | ||||
|         memoizedIsInitialized = 1; | ||||
|         return true; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { | ||||
|         if (!getGroupBytes().isEmpty()) { | ||||
|             com.google.protobuf.GeneratedMessageV3.writeString(output, 1, group_); | ||||
|         } | ||||
|         if (!data_.isEmpty()) { | ||||
|             output.writeBytes(2, data_); | ||||
|         } | ||||
|         com.google.protobuf.GeneratedMessageV3 | ||||
|                 .serializeStringMapTo(output, internalGetExtendInfo(), ExtendInfoDefaultEntryHolder.defaultEntry, 3); | ||||
|         unknownFields.writeTo(output); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public int getSerializedSize() { | ||||
|         int size = memoizedSize; | ||||
|         if (size != -1) { | ||||
|             return size; | ||||
|         } | ||||
|          | ||||
|         size = 0; | ||||
|         if (!getGroupBytes().isEmpty()) { | ||||
|             size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, group_); | ||||
|         } | ||||
|         if (!data_.isEmpty()) { | ||||
|             size += com.google.protobuf.CodedOutputStream.computeBytesSize(2, data_); | ||||
|         } | ||||
|         for (java.util.Map.Entry<String, String> entry : internalGetExtendInfo().getMap().entrySet()) { | ||||
|             com.google.protobuf.MapEntry<String, String> extendInfo__ = ExtendInfoDefaultEntryHolder.defaultEntry | ||||
|                     .newBuilderForType().setKey(entry.getKey()).setValue(entry.getValue()).build(); | ||||
|             size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, extendInfo__); | ||||
|         } | ||||
|         size += unknownFields.getSerializedSize(); | ||||
|         memoizedSize = size; | ||||
|         return size; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public boolean equals(final Object obj) { | ||||
|         if (obj == this) { | ||||
|             return true; | ||||
|         } | ||||
|         if (!(obj instanceof GetRequest)) { | ||||
|             return super.equals(obj); | ||||
|         } | ||||
|         GetRequest other = (GetRequest) obj; | ||||
|          | ||||
|         if (!getGroup().equals(other.getGroup())) { | ||||
|             return false; | ||||
|         } | ||||
|         if (!getData().equals(other.getData())) { | ||||
|             return false; | ||||
|         } | ||||
|         if (!internalGetExtendInfo().equals(other.internalGetExtendInfo())) { | ||||
|             return false; | ||||
|         } | ||||
|         if (!unknownFields.equals(other.unknownFields)) { | ||||
|             return false; | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         if (memoizedHashCode != 0) { | ||||
|             return memoizedHashCode; | ||||
|         } | ||||
|         int hash = 41; | ||||
|         hash = (19 * hash) + getDescriptor().hashCode(); | ||||
|         hash = (37 * hash) + GROUP_FIELD_NUMBER; | ||||
|         hash = (53 * hash) + getGroup().hashCode(); | ||||
|         hash = (37 * hash) + DATA_FIELD_NUMBER; | ||||
|         hash = (53 * hash) + getData().hashCode(); | ||||
|         if (!internalGetExtendInfo().getMap().isEmpty()) { | ||||
|             hash = (37 * hash) + EXTENDINFO_FIELD_NUMBER; | ||||
|             hash = (53 * hash) + internalGetExtendInfo().hashCode(); | ||||
|         } | ||||
|         hash = (29 * hash) + unknownFields.hashCode(); | ||||
|         memoizedHashCode = hash; | ||||
|         return hash; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public Builder newBuilderForType() { | ||||
|         return newBuilder(); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public Builder toBuilder() { | ||||
|         return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     protected Builder newBuilderForType(BuilderParent parent) { | ||||
|         Builder builder = new Builder(parent); | ||||
|         return builder; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public com.google.protobuf.Parser<GetRequest> getParserForType() { | ||||
|         return PARSER; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public GetRequest getDefaultInstanceForType() { | ||||
|         return DEFAULT_INSTANCE; | ||||
|     } | ||||
|      | ||||
|     private static final class ExtendInfoDefaultEntryHolder { | ||||
|          | ||||
|         static final com.google.protobuf.MapEntry<String, String> defaultEntry = com.google.protobuf.MapEntry.<String, String>newDefaultInstance( | ||||
|                 Data.internal_static_GetRequest_ExtendInfoEntry_descriptor, | ||||
|                 com.google.protobuf.WireFormat.FieldType.STRING, "", com.google.protobuf.WireFormat.FieldType.STRING, | ||||
|                 ""); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Protobuf type {@code GetRequest} | ||||
|      */ | ||||
|     public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements | ||||
|             // @@protoc_insertion_point(builder_implements:GetRequest) | ||||
|             GetRequestOrBuilder { | ||||
|          | ||||
|         private int bitField0_; | ||||
|          | ||||
|         private Object group_ = ""; | ||||
|          | ||||
|         private com.google.protobuf.ByteString data_ = com.google.protobuf.ByteString.EMPTY; | ||||
|          | ||||
|         private com.google.protobuf.MapField<String, String> extendInfo_; | ||||
|          | ||||
|         // Construct using com.alibaba.nacos.consistency.entity.GetRequest.newBuilder() | ||||
|         private Builder() { | ||||
|             maybeForceBuilderInitialization(); | ||||
|         } | ||||
|          | ||||
|         private Builder(BuilderParent parent) { | ||||
|             super(parent); | ||||
|             maybeForceBuilderInitialization(); | ||||
|         } | ||||
|          | ||||
|         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { | ||||
|             return Data.internal_static_GetRequest_descriptor; | ||||
|         } | ||||
|          | ||||
|         @SuppressWarnings({"rawtypes"}) | ||||
|         protected com.google.protobuf.MapField internalGetMapField(int number) { | ||||
|             switch (number) { | ||||
|                 case 3: | ||||
|                     return internalGetExtendInfo(); | ||||
|                 default: | ||||
|                     throw new RuntimeException("Invalid map field number: " + number); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         @SuppressWarnings({"rawtypes"}) | ||||
|         protected com.google.protobuf.MapField internalGetMutableMapField(int number) { | ||||
|             switch (number) { | ||||
|                 case 3: | ||||
|                     return internalGetMutableExtendInfo(); | ||||
|                 default: | ||||
|                     throw new RuntimeException("Invalid map field number: " + number); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         protected FieldAccessorTable internalGetFieldAccessorTable() { | ||||
|             return Data.internal_static_GetRequest_fieldAccessorTable | ||||
|                     .ensureFieldAccessorsInitialized(GetRequest.class, GetRequest.Builder.class); | ||||
|         } | ||||
|          | ||||
|         private void maybeForceBuilderInitialization() { | ||||
|             if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder clear() { | ||||
|             super.clear(); | ||||
|             group_ = ""; | ||||
|              | ||||
|             data_ = com.google.protobuf.ByteString.EMPTY; | ||||
|              | ||||
|             internalGetMutableExtendInfo().clear(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { | ||||
|             return Data.internal_static_GetRequest_descriptor; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public GetRequest getDefaultInstanceForType() { | ||||
|             return GetRequest.getDefaultInstance(); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public GetRequest build() { | ||||
|             GetRequest result = buildPartial(); | ||||
|             if (!result.isInitialized()) { | ||||
|                 throw newUninitializedMessageException(result); | ||||
|             } | ||||
|             return result; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public GetRequest buildPartial() { | ||||
|             GetRequest result = new GetRequest(this); | ||||
|             int from_bitField0_ = bitField0_; | ||||
|             result.group_ = group_; | ||||
|             result.data_ = data_; | ||||
|             result.extendInfo_ = internalGetExtendInfo(); | ||||
|             result.extendInfo_.makeImmutable(); | ||||
|             onBuilt(); | ||||
|             return result; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder clone() { | ||||
|             return super.clone(); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, Object value) { | ||||
|             return super.setField(field, value); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { | ||||
|             return super.clearField(field); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { | ||||
|             return super.clearOneof(oneof); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, | ||||
|                 Object value) { | ||||
|             return super.setRepeatedField(field, index, value); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, Object value) { | ||||
|             return super.addRepeatedField(field, value); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder mergeFrom(com.google.protobuf.Message other) { | ||||
|             if (other instanceof GetRequest) { | ||||
|                 return mergeFrom((GetRequest) other); | ||||
|             } else { | ||||
|                 super.mergeFrom(other); | ||||
|                 return this; | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         public Builder mergeFrom(GetRequest other) { | ||||
|             if (other == GetRequest.getDefaultInstance()) { | ||||
|                 return this; | ||||
|             } | ||||
|             if (!other.getGroup().isEmpty()) { | ||||
|                 group_ = other.group_; | ||||
|                 onChanged(); | ||||
|             } | ||||
|             if (other.getData() != com.google.protobuf.ByteString.EMPTY) { | ||||
|                 setData(other.getData()); | ||||
|             } | ||||
|             internalGetMutableExtendInfo().mergeFrom(other.internalGetExtendInfo()); | ||||
|             this.mergeUnknownFields(other.unknownFields); | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public final boolean isInitialized() { | ||||
|             return true; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder mergeFrom(com.google.protobuf.CodedInputStream input, | ||||
|                 com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { | ||||
|             GetRequest parsedMessage = null; | ||||
|             try { | ||||
|                 parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); | ||||
|             } catch (com.google.protobuf.InvalidProtocolBufferException e) { | ||||
|                 parsedMessage = (GetRequest) e.getUnfinishedMessage(); | ||||
|                 throw e.unwrapIOException(); | ||||
|             } finally { | ||||
|                 if (parsedMessage != null) { | ||||
|                     mergeFrom(parsedMessage); | ||||
|                 } | ||||
|             } | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>string group = 1;</code> | ||||
|          */ | ||||
|         public String getGroup() { | ||||
|             Object ref = group_; | ||||
|             if (!(ref instanceof String)) { | ||||
|                 com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; | ||||
|                 String s = bs.toStringUtf8(); | ||||
|                 group_ = s; | ||||
|                 return s; | ||||
|             } else { | ||||
|                 return (String) ref; | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>string group = 1;</code> | ||||
|          */ | ||||
|         public Builder setGroup(String value) { | ||||
|             if (value == null) { | ||||
|                 throw new NullPointerException(); | ||||
|             } | ||||
|              | ||||
|             group_ = value; | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>string group = 1;</code> | ||||
|          */ | ||||
|         public com.google.protobuf.ByteString getGroupBytes() { | ||||
|             Object ref = group_; | ||||
|             if (ref instanceof String) { | ||||
|                 com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((String) ref); | ||||
|                 group_ = b; | ||||
|                 return b; | ||||
|             } else { | ||||
|                 return (com.google.protobuf.ByteString) ref; | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>string group = 1;</code> | ||||
|          */ | ||||
|         public Builder setGroupBytes(com.google.protobuf.ByteString value) { | ||||
|             if (value == null) { | ||||
|                 throw new NullPointerException(); | ||||
|             } | ||||
|             checkByteStringIsUtf8(value); | ||||
|              | ||||
|             group_ = value; | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>string group = 1;</code> | ||||
|          */ | ||||
|         public Builder clearGroup() { | ||||
|              | ||||
|             group_ = getDefaultInstance().getGroup(); | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>bytes data = 2;</code> | ||||
|          */ | ||||
|         public com.google.protobuf.ByteString getData() { | ||||
|             return data_; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>bytes data = 2;</code> | ||||
|          */ | ||||
|         public Builder setData(com.google.protobuf.ByteString value) { | ||||
|             if (value == null) { | ||||
|                 throw new NullPointerException(); | ||||
|             } | ||||
|              | ||||
|             data_ = value; | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>bytes data = 2;</code> | ||||
|          */ | ||||
|         public Builder clearData() { | ||||
|              | ||||
|             data_ = getDefaultInstance().getData(); | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         private com.google.protobuf.MapField<String, String> internalGetExtendInfo() { | ||||
|             if (extendInfo_ == null) { | ||||
|                 return com.google.protobuf.MapField.emptyMapField(ExtendInfoDefaultEntryHolder.defaultEntry); | ||||
|             } | ||||
|             return extendInfo_; | ||||
|         } | ||||
|          | ||||
|         private com.google.protobuf.MapField<String, String> internalGetMutableExtendInfo() { | ||||
|             onChanged(); | ||||
|             ; | ||||
|             if (extendInfo_ == null) { | ||||
|                 extendInfo_ = com.google.protobuf.MapField.newMapField(ExtendInfoDefaultEntryHolder.defaultEntry); | ||||
|             } | ||||
|             if (!extendInfo_.isMutable()) { | ||||
|                 extendInfo_ = extendInfo_.copy(); | ||||
|             } | ||||
|             return extendInfo_; | ||||
|         } | ||||
|          | ||||
|         public int getExtendInfoCount() { | ||||
|             return internalGetExtendInfo().getMap().size(); | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>map<string, string> extendInfo = 3;</code> | ||||
|          */ | ||||
|          | ||||
|         public boolean containsExtendInfo(String key) { | ||||
|             if (key == null) { | ||||
|                 throw new NullPointerException(); | ||||
|             } | ||||
|             return internalGetExtendInfo().getMap().containsKey(key); | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * Use {@link #getExtendInfoMap()} instead. | ||||
|          */ | ||||
|         @Deprecated | ||||
|         public java.util.Map<String, String> getExtendInfo() { | ||||
|             return getExtendInfoMap(); | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>map<string, string> extendInfo = 3;</code> | ||||
|          */ | ||||
|          | ||||
|         public java.util.Map<String, String> getExtendInfoMap() { | ||||
|             return internalGetExtendInfo().getMap(); | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>map<string, string> extendInfo = 3;</code> | ||||
|          */ | ||||
|          | ||||
|         public String getExtendInfoOrDefault(String key, String defaultValue) { | ||||
|             if (key == null) { | ||||
|                 throw new NullPointerException(); | ||||
|             } | ||||
|             java.util.Map<String, String> map = internalGetExtendInfo().getMap(); | ||||
|             return map.containsKey(key) ? map.get(key) : defaultValue; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>map<string, string> extendInfo = 3;</code> | ||||
|          */ | ||||
|          | ||||
|         public String getExtendInfoOrThrow(String key) { | ||||
|             if (key == null) { | ||||
|                 throw new NullPointerException(); | ||||
|             } | ||||
|             java.util.Map<String, String> map = internalGetExtendInfo().getMap(); | ||||
|             if (!map.containsKey(key)) { | ||||
|                 throw new IllegalArgumentException(); | ||||
|             } | ||||
|             return map.get(key); | ||||
|         } | ||||
|          | ||||
|         public Builder clearExtendInfo() { | ||||
|             internalGetMutableExtendInfo().getMutableMap().clear(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>map<string, string> extendInfo = 3;</code> | ||||
|          */ | ||||
|          | ||||
|         public Builder removeExtendInfo(String key) { | ||||
|             if (key == null) { | ||||
|                 throw new NullPointerException(); | ||||
|             } | ||||
|             internalGetMutableExtendInfo().getMutableMap().remove(key); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * Use alternate mutation accessors instead. | ||||
|          */ | ||||
|         @Deprecated | ||||
|         public java.util.Map<String, String> getMutableExtendInfo() { | ||||
|             return internalGetMutableExtendInfo().getMutableMap(); | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>map<string, string> extendInfo = 3;</code> | ||||
|          */ | ||||
|         public Builder putExtendInfo(String key, String value) { | ||||
|             if (key == null) { | ||||
|                 throw new NullPointerException(); | ||||
|             } | ||||
|             if (value == null) { | ||||
|                 throw new NullPointerException(); | ||||
|             } | ||||
|             internalGetMutableExtendInfo().getMutableMap().put(key, value); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>map<string, string> extendInfo = 3;</code> | ||||
|          */ | ||||
|          | ||||
|         public Builder putAllExtendInfo(java.util.Map<String, String> values) { | ||||
|             internalGetMutableExtendInfo().getMutableMap().putAll(values); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { | ||||
|             return super.setUnknownFields(unknownFields); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { | ||||
|             return super.mergeUnknownFields(unknownFields); | ||||
|         } | ||||
|          | ||||
|         // @@protoc_insertion_point(builder_scope:GetRequest) | ||||
|     } | ||||
|      | ||||
| } | ||||
| 
 | ||||
|  | @ -1,74 +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. | ||||
|  */ | ||||
| 
 | ||||
| // Generated by the protocol buffer compiler.  DO NOT EDIT! | ||||
| // source: Data.proto | ||||
| 
 | ||||
| package com.alibaba.nacos.consistency.entity; | ||||
| 
 | ||||
| @SuppressWarnings("all") | ||||
| public interface GetRequestOrBuilder extends | ||||
|         // @@protoc_insertion_point(interface_extends:GetRequest) | ||||
|         com.google.protobuf.MessageOrBuilder { | ||||
|      | ||||
|     /** | ||||
|      * <code>string group = 1;</code> | ||||
|      */ | ||||
|     String getGroup(); | ||||
|      | ||||
|     /** | ||||
|      * <code>string group = 1;</code> | ||||
|      */ | ||||
|     com.google.protobuf.ByteString getGroupBytes(); | ||||
|      | ||||
|     /** | ||||
|      * <code>bytes data = 2;</code> | ||||
|      */ | ||||
|     com.google.protobuf.ByteString getData(); | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 3;</code> | ||||
|      */ | ||||
|     int getExtendInfoCount(); | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 3;</code> | ||||
|      */ | ||||
|     boolean containsExtendInfo(String key); | ||||
|      | ||||
|     /** | ||||
|      * Use {@link #getExtendInfoMap()} instead. | ||||
|      */ | ||||
|     @Deprecated | ||||
|     java.util.Map<String, String> getExtendInfo(); | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 3;</code> | ||||
|      */ | ||||
|     java.util.Map<String, String> getExtendInfoMap(); | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 3;</code> | ||||
|      */ | ||||
|      | ||||
|     String getExtendInfoOrDefault(String key, String defaultValue); | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 3;</code> | ||||
|      */ | ||||
|      | ||||
|     String getExtendInfoOrThrow(String key); | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,104 +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. | ||||
|  */ | ||||
| 
 | ||||
| // Generated by the protocol buffer compiler.  DO NOT EDIT! | ||||
| // source: Data.proto | ||||
| 
 | ||||
| package com.alibaba.nacos.consistency.entity; | ||||
| 
 | ||||
| @SuppressWarnings("all") | ||||
| public interface LogOrBuilder extends | ||||
|         // @@protoc_insertion_point(interface_extends:Log) | ||||
|         com.google.protobuf.MessageOrBuilder { | ||||
|      | ||||
|     /** | ||||
|      * <code>string group = 1;</code> | ||||
|      */ | ||||
|     String getGroup(); | ||||
|      | ||||
|     /** | ||||
|      * <code>string group = 1;</code> | ||||
|      */ | ||||
|     com.google.protobuf.ByteString getGroupBytes(); | ||||
|      | ||||
|     /** | ||||
|      * <code>string key = 2;</code> | ||||
|      */ | ||||
|     String getKey(); | ||||
|      | ||||
|     /** | ||||
|      * <code>string key = 2;</code> | ||||
|      */ | ||||
|     com.google.protobuf.ByteString getKeyBytes(); | ||||
|      | ||||
|     /** | ||||
|      * <code>bytes data = 3;</code> | ||||
|      */ | ||||
|     com.google.protobuf.ByteString getData(); | ||||
|      | ||||
|     /** | ||||
|      * <code>string type = 4;</code> | ||||
|      */ | ||||
|     String getType(); | ||||
|      | ||||
|     /** | ||||
|      * <code>string type = 4;</code> | ||||
|      */ | ||||
|     com.google.protobuf.ByteString getTypeBytes(); | ||||
|      | ||||
|     /** | ||||
|      * <code>string operation = 5;</code> | ||||
|      */ | ||||
|     String getOperation(); | ||||
|      | ||||
|     /** | ||||
|      * <code>string operation = 5;</code> | ||||
|      */ | ||||
|     com.google.protobuf.ByteString getOperationBytes(); | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 6;</code> | ||||
|      */ | ||||
|     int getExtendInfoCount(); | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 6;</code> | ||||
|      */ | ||||
|     boolean containsExtendInfo(String key); | ||||
|      | ||||
|     /** | ||||
|      * Use {@link #getExtendInfoMap()} instead. | ||||
|      */ | ||||
|     @Deprecated | ||||
|     java.util.Map<String, String> getExtendInfo(); | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 6;</code> | ||||
|      */ | ||||
|     java.util.Map<String, String> getExtendInfoMap(); | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 6;</code> | ||||
|      */ | ||||
|      | ||||
|     String getExtendInfoOrDefault(String key, String defaultValue); | ||||
|      | ||||
|     /** | ||||
|      * <code>map<string, string> extendInfo = 6;</code> | ||||
|      */ | ||||
|      | ||||
|     String getExtendInfoOrThrow(String key); | ||||
| } | ||||
|  | @ -1,677 +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. | ||||
|  */ | ||||
| 
 | ||||
| // Generated by the protocol buffer compiler.  DO NOT EDIT! | ||||
| // source: Data.proto | ||||
| 
 | ||||
| package com.alibaba.nacos.consistency.entity; | ||||
| 
 | ||||
| /** | ||||
|  * Protobuf type {@code Response}. | ||||
|  */ | ||||
| @SuppressWarnings("all") | ||||
| public final class Response extends com.google.protobuf.GeneratedMessageV3 implements | ||||
|         // @@protoc_insertion_point(message_implements:Response) | ||||
|         ResponseOrBuilder { | ||||
|      | ||||
|     public static final int DATA_FIELD_NUMBER = 1; | ||||
|      | ||||
|     public static final int ERRMSG_FIELD_NUMBER = 2; | ||||
|      | ||||
|     public static final int SUCCESS_FIELD_NUMBER = 3; | ||||
|      | ||||
|     private static final long serialVersionUID = 0L; | ||||
|      | ||||
|     // @@protoc_insertion_point(class_scope:Response) | ||||
|     private static final Response DEFAULT_INSTANCE; | ||||
|      | ||||
|     private static final com.google.protobuf.Parser<Response> PARSER = new com.google.protobuf.AbstractParser<Response>() { | ||||
|         @Override | ||||
|         public Response parsePartialFrom(com.google.protobuf.CodedInputStream input, | ||||
|                 com.google.protobuf.ExtensionRegistryLite extensionRegistry) | ||||
|                 throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|             return new Response(input, extensionRegistry); | ||||
|         } | ||||
|     }; | ||||
|      | ||||
|     static { | ||||
|         DEFAULT_INSTANCE = new Response(); | ||||
|     } | ||||
|      | ||||
|     private com.google.protobuf.ByteString data_; | ||||
|      | ||||
|     private volatile Object errMsg_; | ||||
|      | ||||
|     private boolean success_; | ||||
|      | ||||
|     private byte memoizedIsInitialized = -1; | ||||
|      | ||||
|     // Use Response.newBuilder() to construct. | ||||
|     private Response(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) { | ||||
|         super(builder); | ||||
|     } | ||||
|      | ||||
|     private Response() { | ||||
|         data_ = com.google.protobuf.ByteString.EMPTY; | ||||
|         errMsg_ = ""; | ||||
|     } | ||||
|      | ||||
|     private Response(com.google.protobuf.CodedInputStream input, | ||||
|             com.google.protobuf.ExtensionRegistryLite extensionRegistry) | ||||
|             throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         this(); | ||||
|         if (extensionRegistry == null) { | ||||
|             throw new NullPointerException(); | ||||
|         } | ||||
|         com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); | ||||
|         try { | ||||
|             boolean done = false; | ||||
|             while (!done) { | ||||
|                 int tag = input.readTag(); | ||||
|                 switch (tag) { | ||||
|                     case 0: | ||||
|                         done = true; | ||||
|                         break; | ||||
|                     case 10: { | ||||
|                          | ||||
|                         data_ = input.readBytes(); | ||||
|                         break; | ||||
|                     } | ||||
|                     case 18: { | ||||
|                         String s = input.readStringRequireUtf8(); | ||||
|                          | ||||
|                         errMsg_ = s; | ||||
|                         break; | ||||
|                     } | ||||
|                     case 24: { | ||||
|                          | ||||
|                         success_ = input.readBool(); | ||||
|                         break; | ||||
|                     } | ||||
|                     default: { | ||||
|                         if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) { | ||||
|                             done = true; | ||||
|                         } | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } catch (com.google.protobuf.InvalidProtocolBufferException e) { | ||||
|             throw e.setUnfinishedMessage(this); | ||||
|         } catch (java.io.IOException e) { | ||||
|             throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(this); | ||||
|         } finally { | ||||
|             this.unknownFields = unknownFields.build(); | ||||
|             makeExtensionsImmutable(); | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { | ||||
|         return Data.internal_static_Response_descriptor; | ||||
|     } | ||||
|      | ||||
|     public static Response parseFrom(java.nio.ByteBuffer data) | ||||
|             throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         return PARSER.parseFrom(data); | ||||
|     } | ||||
|      | ||||
|     public static Response parseFrom(java.nio.ByteBuffer data, | ||||
|             com.google.protobuf.ExtensionRegistryLite extensionRegistry) | ||||
|             throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         return PARSER.parseFrom(data, extensionRegistry); | ||||
|     } | ||||
|      | ||||
|     public static Response parseFrom(com.google.protobuf.ByteString data) | ||||
|             throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         return PARSER.parseFrom(data); | ||||
|     } | ||||
|      | ||||
|     public static Response parseFrom(com.google.protobuf.ByteString data, | ||||
|             com.google.protobuf.ExtensionRegistryLite extensionRegistry) | ||||
|             throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         return PARSER.parseFrom(data, extensionRegistry); | ||||
|     } | ||||
|      | ||||
|     public static Response parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         return PARSER.parseFrom(data); | ||||
|     } | ||||
|      | ||||
|     public static Response parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) | ||||
|             throws com.google.protobuf.InvalidProtocolBufferException { | ||||
|         return PARSER.parseFrom(data, extensionRegistry); | ||||
|     } | ||||
|      | ||||
|     public static Response parseFrom(java.io.InputStream input) throws java.io.IOException { | ||||
|         return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); | ||||
|     } | ||||
|      | ||||
|     public static Response parseFrom(java.io.InputStream input, | ||||
|             com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { | ||||
|         return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); | ||||
|     } | ||||
|      | ||||
|     public static Response parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { | ||||
|         return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); | ||||
|     } | ||||
|      | ||||
|     public static Response parseDelimitedFrom(java.io.InputStream input, | ||||
|             com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { | ||||
|         return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input, extensionRegistry); | ||||
|     } | ||||
|      | ||||
|     public static Response parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { | ||||
|         return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); | ||||
|     } | ||||
|      | ||||
|     public static Response parseFrom(com.google.protobuf.CodedInputStream input, | ||||
|             com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { | ||||
|         return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input, extensionRegistry); | ||||
|     } | ||||
|      | ||||
|     public static Builder newBuilder() { | ||||
|         return DEFAULT_INSTANCE.toBuilder(); | ||||
|     } | ||||
|      | ||||
|     public static Builder newBuilder(Response prototype) { | ||||
|         return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); | ||||
|     } | ||||
|      | ||||
|     public static Response getDefaultInstance() { | ||||
|         return DEFAULT_INSTANCE; | ||||
|     } | ||||
|      | ||||
|     public static com.google.protobuf.Parser<Response> parser() { | ||||
|         return PARSER; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     @SuppressWarnings({"unused"}) | ||||
|     protected Object newInstance(UnusedPrivateParameter unused) { | ||||
|         return new Response(); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public final com.google.protobuf.UnknownFieldSet getUnknownFields() { | ||||
|         return this.unknownFields; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     protected FieldAccessorTable internalGetFieldAccessorTable() { | ||||
|         return Data.internal_static_Response_fieldAccessorTable | ||||
|                 .ensureFieldAccessorsInitialized(Response.class, Response.Builder.class); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * <code>bytes data = 1;</code> | ||||
|      */ | ||||
|     public com.google.protobuf.ByteString getData() { | ||||
|         return data_; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * <code>string errMsg = 2;</code> | ||||
|      */ | ||||
|     public String getErrMsg() { | ||||
|         Object ref = errMsg_; | ||||
|         if (ref instanceof String) { | ||||
|             return (String) ref; | ||||
|         } else { | ||||
|             com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; | ||||
|             String s = bs.toStringUtf8(); | ||||
|             errMsg_ = s; | ||||
|             return s; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * <code>string errMsg = 2;</code> | ||||
|      */ | ||||
|     public com.google.protobuf.ByteString getErrMsgBytes() { | ||||
|         Object ref = errMsg_; | ||||
|         if (ref instanceof String) { | ||||
|             com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((String) ref); | ||||
|             errMsg_ = b; | ||||
|             return b; | ||||
|         } else { | ||||
|             return (com.google.protobuf.ByteString) ref; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * <code>bool success = 3;</code> | ||||
|      */ | ||||
|     public boolean getSuccess() { | ||||
|         return success_; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public final boolean isInitialized() { | ||||
|         byte isInitialized = memoizedIsInitialized; | ||||
|         if (isInitialized == 1) { | ||||
|             return true; | ||||
|         } | ||||
|         if (isInitialized == 0) { | ||||
|             return false; | ||||
|         } | ||||
|          | ||||
|         memoizedIsInitialized = 1; | ||||
|         return true; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { | ||||
|         if (!data_.isEmpty()) { | ||||
|             output.writeBytes(1, data_); | ||||
|         } | ||||
|         if (!getErrMsgBytes().isEmpty()) { | ||||
|             com.google.protobuf.GeneratedMessageV3.writeString(output, 2, errMsg_); | ||||
|         } | ||||
|         if (success_ != false) { | ||||
|             output.writeBool(3, success_); | ||||
|         } | ||||
|         unknownFields.writeTo(output); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public int getSerializedSize() { | ||||
|         int size = memoizedSize; | ||||
|         if (size != -1) { | ||||
|             return size; | ||||
|         } | ||||
|          | ||||
|         size = 0; | ||||
|         if (!data_.isEmpty()) { | ||||
|             size += com.google.protobuf.CodedOutputStream.computeBytesSize(1, data_); | ||||
|         } | ||||
|         if (!getErrMsgBytes().isEmpty()) { | ||||
|             size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, errMsg_); | ||||
|         } | ||||
|         if (success_ != false) { | ||||
|             size += com.google.protobuf.CodedOutputStream.computeBoolSize(3, success_); | ||||
|         } | ||||
|         size += unknownFields.getSerializedSize(); | ||||
|         memoizedSize = size; | ||||
|         return size; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public boolean equals(final Object obj) { | ||||
|         if (obj == this) { | ||||
|             return true; | ||||
|         } | ||||
|         if (!(obj instanceof Response)) { | ||||
|             return super.equals(obj); | ||||
|         } | ||||
|         Response other = (Response) obj; | ||||
|          | ||||
|         if (!getData().equals(other.getData())) { | ||||
|             return false; | ||||
|         } | ||||
|         if (!getErrMsg().equals(other.getErrMsg())) { | ||||
|             return false; | ||||
|         } | ||||
|         if (getSuccess() != other.getSuccess()) { | ||||
|             return false; | ||||
|         } | ||||
|         if (!unknownFields.equals(other.unknownFields)) { | ||||
|             return false; | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public int hashCode() { | ||||
|         if (memoizedHashCode != 0) { | ||||
|             return memoizedHashCode; | ||||
|         } | ||||
|         int hash = 41; | ||||
|         hash = (19 * hash) + getDescriptor().hashCode(); | ||||
|         hash = (37 * hash) + DATA_FIELD_NUMBER; | ||||
|         hash = (53 * hash) + getData().hashCode(); | ||||
|         hash = (37 * hash) + ERRMSG_FIELD_NUMBER; | ||||
|         hash = (53 * hash) + getErrMsg().hashCode(); | ||||
|         hash = (37 * hash) + SUCCESS_FIELD_NUMBER; | ||||
|         hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getSuccess()); | ||||
|         hash = (29 * hash) + unknownFields.hashCode(); | ||||
|         memoizedHashCode = hash; | ||||
|         return hash; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public Builder newBuilderForType() { | ||||
|         return newBuilder(); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public Builder toBuilder() { | ||||
|         return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     protected Builder newBuilderForType(BuilderParent parent) { | ||||
|         Builder builder = new Builder(parent); | ||||
|         return builder; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public com.google.protobuf.Parser<Response> getParserForType() { | ||||
|         return PARSER; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public Response getDefaultInstanceForType() { | ||||
|         return DEFAULT_INSTANCE; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Protobuf type {@code Response} | ||||
|      */ | ||||
|     public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements | ||||
|             // @@protoc_insertion_point(builder_implements:Response) | ||||
|             ResponseOrBuilder { | ||||
|          | ||||
|         private com.google.protobuf.ByteString data_ = com.google.protobuf.ByteString.EMPTY; | ||||
|          | ||||
|         private Object errMsg_ = ""; | ||||
|          | ||||
|         private boolean success_; | ||||
|          | ||||
|         // Construct using com.alibaba.nacos.consistency.entity.Response.newBuilder() | ||||
|         private Builder() { | ||||
|             maybeForceBuilderInitialization(); | ||||
|         } | ||||
|          | ||||
|         private Builder(BuilderParent parent) { | ||||
|             super(parent); | ||||
|             maybeForceBuilderInitialization(); | ||||
|         } | ||||
|          | ||||
|         public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { | ||||
|             return Data.internal_static_Response_descriptor; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         protected FieldAccessorTable internalGetFieldAccessorTable() { | ||||
|             return Data.internal_static_Response_fieldAccessorTable | ||||
|                     .ensureFieldAccessorsInitialized(Response.class, Response.Builder.class); | ||||
|         } | ||||
|          | ||||
|         private void maybeForceBuilderInitialization() { | ||||
|             if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder clear() { | ||||
|             super.clear(); | ||||
|             data_ = com.google.protobuf.ByteString.EMPTY; | ||||
|              | ||||
|             errMsg_ = ""; | ||||
|              | ||||
|             success_ = false; | ||||
|              | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { | ||||
|             return Data.internal_static_Response_descriptor; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Response getDefaultInstanceForType() { | ||||
|             return Response.getDefaultInstance(); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Response build() { | ||||
|             Response result = buildPartial(); | ||||
|             if (!result.isInitialized()) { | ||||
|                 throw newUninitializedMessageException(result); | ||||
|             } | ||||
|             return result; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Response buildPartial() { | ||||
|             Response result = new Response(this); | ||||
|             result.data_ = data_; | ||||
|             result.errMsg_ = errMsg_; | ||||
|             result.success_ = success_; | ||||
|             onBuilt(); | ||||
|             return result; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder clone() { | ||||
|             return super.clone(); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder setField(com.google.protobuf.Descriptors.FieldDescriptor field, Object value) { | ||||
|             return super.setField(field, value); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { | ||||
|             return super.clearField(field); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { | ||||
|             return super.clearOneof(oneof); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder setRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, int index, | ||||
|                 Object value) { | ||||
|             return super.setRepeatedField(field, index, value); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder addRepeatedField(com.google.protobuf.Descriptors.FieldDescriptor field, Object value) { | ||||
|             return super.addRepeatedField(field, value); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder mergeFrom(com.google.protobuf.Message other) { | ||||
|             if (other instanceof Response) { | ||||
|                 return mergeFrom((Response) other); | ||||
|             } else { | ||||
|                 super.mergeFrom(other); | ||||
|                 return this; | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         public Builder mergeFrom(Response other) { | ||||
|             if (other == Response.getDefaultInstance()) { | ||||
|                 return this; | ||||
|             } | ||||
|             if (other.getData() != com.google.protobuf.ByteString.EMPTY) { | ||||
|                 setData(other.getData()); | ||||
|             } | ||||
|             if (!other.getErrMsg().isEmpty()) { | ||||
|                 errMsg_ = other.errMsg_; | ||||
|                 onChanged(); | ||||
|             } | ||||
|             if (other.getSuccess() != false) { | ||||
|                 setSuccess(other.getSuccess()); | ||||
|             } | ||||
|             this.mergeUnknownFields(other.unknownFields); | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public final boolean isInitialized() { | ||||
|             return true; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public Builder mergeFrom(com.google.protobuf.CodedInputStream input, | ||||
|                 com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { | ||||
|             Response parsedMessage = null; | ||||
|             try { | ||||
|                 parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); | ||||
|             } catch (com.google.protobuf.InvalidProtocolBufferException e) { | ||||
|                 parsedMessage = (Response) e.getUnfinishedMessage(); | ||||
|                 throw e.unwrapIOException(); | ||||
|             } finally { | ||||
|                 if (parsedMessage != null) { | ||||
|                     mergeFrom(parsedMessage); | ||||
|                 } | ||||
|             } | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>bytes data = 1;</code> | ||||
|          */ | ||||
|         public com.google.protobuf.ByteString getData() { | ||||
|             return data_; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>bytes data = 1;</code> | ||||
|          */ | ||||
|         public Builder setData(com.google.protobuf.ByteString value) { | ||||
|             if (value == null) { | ||||
|                 throw new NullPointerException(); | ||||
|             } | ||||
|              | ||||
|             data_ = value; | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>bytes data = 1;</code> | ||||
|          */ | ||||
|         public Builder clearData() { | ||||
|              | ||||
|             data_ = getDefaultInstance().getData(); | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>string errMsg = 2;</code> | ||||
|          */ | ||||
|         public String getErrMsg() { | ||||
|             Object ref = errMsg_; | ||||
|             if (!(ref instanceof String)) { | ||||
|                 com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; | ||||
|                 String s = bs.toStringUtf8(); | ||||
|                 errMsg_ = s; | ||||
|                 return s; | ||||
|             } else { | ||||
|                 return (String) ref; | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>string errMsg = 2;</code> | ||||
|          */ | ||||
|         public Builder setErrMsg(String value) { | ||||
|             if (value == null) { | ||||
|                 throw new NullPointerException(); | ||||
|             } | ||||
|              | ||||
|             errMsg_ = value; | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>string errMsg = 2;</code> | ||||
|          */ | ||||
|         public com.google.protobuf.ByteString getErrMsgBytes() { | ||||
|             Object ref = errMsg_; | ||||
|             if (ref instanceof String) { | ||||
|                 com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((String) ref); | ||||
|                 errMsg_ = b; | ||||
|                 return b; | ||||
|             } else { | ||||
|                 return (com.google.protobuf.ByteString) ref; | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>string errMsg = 2;</code> | ||||
|          */ | ||||
|         public Builder setErrMsgBytes(com.google.protobuf.ByteString value) { | ||||
|             if (value == null) { | ||||
|                 throw new NullPointerException(); | ||||
|             } | ||||
|             checkByteStringIsUtf8(value); | ||||
|              | ||||
|             errMsg_ = value; | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>string errMsg = 2;</code> | ||||
|          */ | ||||
|         public Builder clearErrMsg() { | ||||
|              | ||||
|             errMsg_ = getDefaultInstance().getErrMsg(); | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>bool success = 3;</code> | ||||
|          */ | ||||
|         public boolean getSuccess() { | ||||
|             return success_; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>bool success = 3;</code> | ||||
|          */ | ||||
|         public Builder setSuccess(boolean value) { | ||||
|              | ||||
|             success_ = value; | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         /** | ||||
|          * <code>bool success = 3;</code> | ||||
|          */ | ||||
|         public Builder clearSuccess() { | ||||
|              | ||||
|             success_ = false; | ||||
|             onChanged(); | ||||
|             return this; | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { | ||||
|             return super.setUnknownFields(unknownFields); | ||||
|         } | ||||
|          | ||||
|         @Override | ||||
|         public final Builder mergeUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { | ||||
|             return super.mergeUnknownFields(unknownFields); | ||||
|         } | ||||
|          | ||||
|         // @@protoc_insertion_point(builder_scope:Response) | ||||
|     } | ||||
|      | ||||
| } | ||||
| 
 | ||||
|  | @ -1,46 +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. | ||||
|  */ | ||||
| 
 | ||||
| // Generated by the protocol buffer compiler.  DO NOT EDIT! | ||||
| // source: Data.proto | ||||
| 
 | ||||
| package com.alibaba.nacos.consistency.entity; | ||||
| 
 | ||||
| @SuppressWarnings("all") | ||||
| public interface ResponseOrBuilder extends | ||||
|         // @@protoc_insertion_point(interface_extends:Response) | ||||
|         com.google.protobuf.MessageOrBuilder { | ||||
|      | ||||
|     /** | ||||
|      * <code>bytes data = 1;</code> | ||||
|      */ | ||||
|     com.google.protobuf.ByteString getData(); | ||||
|      | ||||
|     /** | ||||
|      * <code>string errMsg = 2;</code> | ||||
|      */ | ||||
|     String getErrMsg(); | ||||
|      | ||||
|     /** | ||||
|      * <code>string errMsg = 2;</code> | ||||
|      */ | ||||
|     com.google.protobuf.ByteString getErrMsgBytes(); | ||||
|      | ||||
|     /** | ||||
|      * <code>bool success = 3;</code> | ||||
|      */ | ||||
|     boolean getSuccess(); | ||||
| } | ||||
|  | @ -19,6 +19,7 @@ syntax = "proto3"; | |||
| option java_multiple_files = true; | ||||
| option java_package = "com.alibaba.nacos.consistency.entity"; | ||||
| 
 | ||||
| //Deprecated | ||||
| message Log { | ||||
|   string group = 1; | ||||
|   string key = 2; | ||||
|  | @ -28,15 +29,10 @@ message Log { | |||
|   map<string, string> extendInfo = 6; | ||||
| } | ||||
| 
 | ||||
| //Deprecated | ||||
| message GetRequest { | ||||
|   string group = 1; | ||||
|   bytes data = 2; | ||||
|   map<string, string> extendInfo = 3; | ||||
| } | ||||
| 
 | ||||
| message Response { | ||||
|   bytes data = 1; | ||||
|   string errMsg = 2; | ||||
|   bool success = 3; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,42 @@ | |||
| /* | ||||
|  * 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. | ||||
|  */ | ||||
| 
 | ||||
| syntax = "proto3"; | ||||
| 
 | ||||
| option java_multiple_files = true; | ||||
| option java_package = "com.alibaba.nacos.consistency.entity"; | ||||
| 
 | ||||
| message WriteRequest { | ||||
|   string group = 1; | ||||
|   string key = 2; | ||||
|   bytes data = 3; | ||||
|   string type = 4; | ||||
|   string operation = 5; | ||||
|   map<string, string> extendInfo = 6; | ||||
| } | ||||
| 
 | ||||
| message ReadRequest { | ||||
|   string group = 1; | ||||
|   bytes data = 2; | ||||
|   map<string, string> extendInfo = 3; | ||||
| } | ||||
| 
 | ||||
| message Response { | ||||
|   bytes data = 1; | ||||
|   string errMsg = 2; | ||||
|   bool success = 3; | ||||
| } | ||||
| 
 | ||||
|  | @ -0,0 +1,37 @@ | |||
| /* | ||||
|  *  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.consistency; | ||||
| 
 | ||||
| import com.alibaba.nacos.consistency.entity.Log; | ||||
| import com.alibaba.nacos.consistency.entity.WriteRequest; | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class ProtoMessageUtilTest { | ||||
|      | ||||
|     @Test | ||||
|     public void testProto() throws Exception { | ||||
|         WriteRequest request = WriteRequest.newBuilder() | ||||
|                 .setKey("test-proto-new") | ||||
|                 .build(); | ||||
|          | ||||
|         byte[] bytes = request.toByteArray(); | ||||
|         Log log = Log.parseFrom(bytes); | ||||
|         Assert.assertEquals(request.getKey(), log.getKey()); | ||||
|     } | ||||
|      | ||||
| } | ||||
|  | @ -0,0 +1,50 @@ | |||
| # 开始项目 | ||||
| 国内访问 npm 比较慢,我们可以使用阿里的镜像, | ||||
| 在 npm 或者 yarn 命令后面加参数: | ||||
| > --registry=https://registry.npm.taobao.org | ||||
| 例:  | ||||
| ``` | ||||
| npm install --registry=https://registry.npm.taobao.org | ||||
| yarn --registry=https://registry.npm.taobao.org | ||||
| ``` | ||||
| [详情地址: http://npm.taobao.org/](http://npm.taobao.org/)  | ||||
| ## 安装依赖 | ||||
| ```sh | ||||
| yarn | ||||
| ``` | ||||
| 或 | ||||
| ``` | ||||
| npm install | ||||
| ``` | ||||
| 
 | ||||
| ## 启动 | ||||
| ```sh | ||||
| yarn start | ||||
| ``` | ||||
| 或 | ||||
| ``` | ||||
| npm start | ||||
| ``` | ||||
| 
 | ||||
| ## 构建打包 | ||||
| ```sh | ||||
| yarn build | ||||
| ``` | ||||
| 或 | ||||
| ``` | ||||
| npm run build | ||||
| ``` | ||||
| ##  | ||||
| 
 | ||||
| # 代理配置 | ||||
| `build/webpack.dev.conf.js` | ||||
| 修改proxy属性 | ||||
| 
 | ||||
| ``` | ||||
| proxy: [{ | ||||
|   context: ['/'], | ||||
|   changeOrigin: true, | ||||
|   secure: false, | ||||
|   target: 'http://ip:port', | ||||
| }], | ||||
| ``` | ||||
|  | @ -24,7 +24,7 @@ const styles = { | |||
| }; | ||||
| 
 | ||||
| const distPath = path.join(__dirname, '../dist/'); | ||||
| const rootPath = path.join(__dirname, '../../'); | ||||
| const rootPath = path.join(__dirname, '../../console/src/main/resources/static/'); | ||||
| 
 | ||||
| console.log('\n\n> Start copying the dist directory...\n'); | ||||
| 
 | ||||
|  | @ -19,7 +19,7 @@ const path = require('path'); | |||
| // 默认打包存放地址 | ||||
| const srcDir = path.join(__dirname, '../dist'); | ||||
| // 打包后文件存放地址 | ||||
| const destDir = path.join(__dirname, '../../'); | ||||
| const destDir = path.join(__dirname, '../../console/src/main/resources/static/'); | ||||
| 
 | ||||
| const mkdir = dir => { | ||||
|     if (!fs.existsSync(dir)) { | ||||
|  | @ -93,7 +93,7 @@ module.exports = { | |||
|     }), | ||||
|     new CopyWebpackPlugin([ | ||||
|       { | ||||
|         from: resolve('public'), | ||||
|         from: resolve('../console/src/main/resources/static/console-ui/public'), | ||||
|         to: './', | ||||
|         ignore: ['index.html'], | ||||
|       }, | ||||
|  | @ -18,6 +18,16 @@ const path = require('path'); | |||
| const webpack = require('webpack'); | ||||
| const base = require('./webpack.base.conf'); | ||||
| 
 | ||||
| const [cssLoader]  = base.module.rules; | ||||
| cssLoader.use.push({ | ||||
|   loader: '@alifd/next-theme-loader', | ||||
|   options: { | ||||
|     modifyVars: { | ||||
|       '$icon-font-path': '"/icons/icon-font"', | ||||
|       '$font-custom-path': '"/fonts/"' | ||||
|     } | ||||
|   } | ||||
| }) | ||||
| module.exports = Object.assign({}, base, { | ||||
|   output: { | ||||
|     filename: './js/[name].js', | ||||
|  | @ -26,8 +26,8 @@ cssLoader.use.push({ | |||
|   loader: '@alifd/next-theme-loader', | ||||
|   options: { | ||||
|     modifyVars: { | ||||
|       '$icon-font-path': '"/nacos/console-fe/public/icons/icon-font"', | ||||
|       '$font-custom-path': '"/nacos/console-fe/public/fonts/"' | ||||
|       '$icon-font-path': '"/nacos/console-ui/public/icons/icon-font"', | ||||
|       '$font-custom-path': '"/nacos/console-ui/public/fonts/"' | ||||
|     } | ||||
|   } | ||||
| }) | ||||
|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|   "name": "console-fe", | ||||
|   "name": "console-ui", | ||||
|   "version": "1.0.0", | ||||
|   "description": "console fe", | ||||
|   "description": "console ui", | ||||
|   "main": "index.js", | ||||
|   "scripts": { | ||||
|     "start": "cross-env NODE_ENV=development webpack-dev-server --config build/webpack.dev.conf.js", | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue