Skip to content

Commit

Permalink
feat(alibaba#5608): When the custom instance id is empty, the id will…
Browse files Browse the repository at this point in the history
… be automatically generated.
  • Loading branch information
Bo-Qiu committed Jul 15, 2023
1 parent 156cd62 commit 010ed46
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 0 deletions.
17 changes: 17 additions & 0 deletions api/src/main/java/com/alibaba/nacos/api/naming/pojo/Instance.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,15 @@
import com.alibaba.nacos.api.common.Constants;
import com.alibaba.nacos.api.naming.PreservedMetadataKeys;
import com.alibaba.nacos.api.naming.utils.NamingUtils;
import com.alibaba.nacos.api.utils.StringUtils;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicLong;

/**
* Instance.
Expand All @@ -35,6 +37,11 @@
@JsonInclude(Include.NON_NULL)
public class Instance implements Serializable {

/**
* Instance auto-increment index, used to generate instance ID.
*/
private static final AtomicLong AUTO_INCREMENT_ID = new AtomicLong();

private static final long serialVersionUID = -742906310567291979L;

/**
Expand Down Expand Up @@ -264,4 +271,14 @@ private String getMetaDataByKeyWithDefault(final String key, final String defaul
return getMetadata().get(key);
}

/**
* Generate and set the instance id when the instance id is empty.
*/
public void setInstanceIdIfNeeded() {
if (StringUtils.isEmpty(this.instanceId)) {
long curIndex = AUTO_INCREMENT_ID.getAndIncrement();
this.instanceId = ip + Constants.COLON + port + Constants.NAMING_INSTANCE_ID_SPLITTER + curIndex
+ Constants.NAMING_INSTANCE_ID_SPLITTER + System.currentTimeMillis();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -184,4 +184,24 @@ public static void batchCheckInstanceIsLegal(List<Instance> instances) throws Na
public static boolean isNumber(String str) {
return !StringUtils.isEmpty(str) && NUMBER_PATTERN.matcher(str).matches();
}

/**
* Set instanceId if needed.
*
* @param instance Instance to be registered
*/
public static void setInstanceIdIfNeeded(Instance instance) {
instance.setInstanceIdIfNeeded();
}

/**
* Batch set instanceId if needed.
*
* @param instances List of instances to be registered
*/
public static void batchSetInstanceIdIfNeeded(List<Instance> instances) {
for (Instance instance : instances) {
instance.setInstanceIdIfNeeded();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
import java.util.Map;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

public class NamingUtilsTest {
Expand Down Expand Up @@ -240,4 +242,56 @@ public void testIsNumber() {
String str2 = "123456";
assertTrue(NamingUtils.isNumber(str2));
}

@Test
public void testSetInstanceIdIfNeeded() {
Instance instance = new Instance();
NamingUtils.setInstanceIdIfNeeded(instance);
assertNotNull(instance.getInstanceId());
String customInsId = "customId_1";
instance.setInstanceId(customInsId);
assertEquals(customInsId, instance.getInstanceId());

Instance instance1 = new Instance();
Instance instance2 = new Instance();
Instance instance3 = new Instance();

NamingUtils.setInstanceIdIfNeeded(instance1);
NamingUtils.setInstanceIdIfNeeded(instance2);
NamingUtils.setInstanceIdIfNeeded(instance3);

assertNotNull(instance1.getInstanceId());
assertNotNull(instance2.getInstanceId());
assertNotNull(instance3.getInstanceId());

assertNotEquals(instance1.getInstanceId(), instance2.getInstanceId());
assertNotEquals(instance1.getInstanceId(), instance3.getInstanceId());
assertNotEquals(instance2.getInstanceId(), instance3.getInstanceId());
}

@Test
public void testBatchSetInstanceIdIfNeeded() {
List<Instance> instances = new ArrayList<>();
Instance instance1 = new Instance();
String customInsId = "customId_1";
instance1.setInstanceId(customInsId);
Instance instance2 = new Instance();
Instance instance3 = new Instance();

instances.add(instance1);
instances.add(instance2);
instances.add(instance3);

NamingUtils.batchSetInstanceIdIfNeeded(instances);

assertNotNull(instance1.getInstanceId());
assertNotNull(instance2.getInstanceId());
assertNotNull(instance3.getInstanceId());

assertEquals(customInsId, instance1.getInstanceId());

assertNotEquals(instance1.getInstanceId(), instance2.getInstanceId());
assertNotEquals(instance1.getInstanceId(), instance3.getInstanceId());
assertNotEquals(instance2.getInstanceId(), instance3.getInstanceId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -140,13 +140,15 @@ public void registerInstance(String serviceName, Instance instance) throws Nacos
@Override
public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {
NamingUtils.checkInstanceIsLegal(instance);
NamingUtils.setInstanceIdIfNeeded(instance);
clientProxy.registerService(serviceName, groupName, instance);
}

@Override
public void batchRegisterInstance(String serviceName, String groupName, List<Instance> instances)
throws NacosException {
NamingUtils.batchCheckInstanceIsLegal(instances);
NamingUtils.batchSetInstanceIdIfNeeded(instances);
clientProxy.batchRegisterService(serviceName, groupName, instances);
}

Expand Down

0 comments on commit 010ed46

Please sign in to comment.