diff --git a/ons-core/ons-auth4client/src/main/java/org/apache/rocketmq/ons/api/impl/authority/SessionCredentials.java b/ons-core/ons-auth4client/src/main/java/org/apache/rocketmq/ons/api/impl/authority/SessionCredentials.java
index fdbac11..854c093 100644
--- a/ons-core/ons-auth4client/src/main/java/org/apache/rocketmq/ons/api/impl/authority/SessionCredentials.java
+++ b/ons-core/ons-auth4client/src/main/java/org/apache/rocketmq/ons/api/impl/authority/SessionCredentials.java
@@ -46,7 +46,7 @@
     private String securityToken;
     private String signature;
     private String signatureMethod;
-    private ONSChannel onsChannel = ONSChannel.ALIYUN;
+    private ONSChannel onsChannel = ONSChannel.CLOUD;
 
     public SessionCredentials() {
         String keyContent = null;
diff --git a/ons-core/ons-client/src/main/java/org/apache/rocketmq/ons/api/impl/rocketmq/ONSClientAbstract.java b/ons-core/ons-client/src/main/java/org/apache/rocketmq/ons/api/impl/rocketmq/ONSClientAbstract.java
index 2cc4d9c..74735e6 100644
--- a/ons-core/ons-client/src/main/java/org/apache/rocketmq/ons/api/impl/rocketmq/ONSClientAbstract.java
+++ b/ons-core/ons-client/src/main/java/org/apache/rocketmq/ons/api/impl/rocketmq/ONSClientAbstract.java
@@ -23,23 +23,20 @@
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
-
 import javax.annotation.Generated;
-
-import org.apache.rocketmq.ons.open.trace.core.dispatch.AsyncDispatcher;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.rocketmq.client.exception.MQClientException;
 import org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl;
 import org.apache.rocketmq.common.UtilAll;
 import org.apache.rocketmq.common.namesrv.TopAddressing;
 import org.apache.rocketmq.logging.InternalLogger;
-
 import org.apache.rocketmq.ons.api.Admin;
 import org.apache.rocketmq.ons.api.PropertyKeyConst;
 import org.apache.rocketmq.ons.api.exception.ONSClientException;
 import org.apache.rocketmq.ons.api.impl.authority.SessionCredentials;
 import org.apache.rocketmq.ons.api.impl.util.ClientLoggerUtil;
 import org.apache.rocketmq.ons.api.impl.util.NameAddrUtils;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.rocketmq.ons.open.trace.core.dispatch.AsyncDispatcher;
 
 import static org.apache.rocketmq.common.UtilAll.getPid;
 
@@ -54,7 +51,7 @@
     protected static final long WSADDR_INTERNAL_TIMEOUTMILLS =
         Long.parseLong(System.getProperty("com.aliyun.openservices.ons.addr.internal.timeoutmills", "3000"));
     protected static final long WSADDR_INTERNET_TIMEOUTMILLS =
-            Long.parseLong(System.getProperty("com.aliyun.openservices.ons.addr.internet.timeoutmills", "5000"));
+        Long.parseLong(System.getProperty("com.aliyun.openservices.ons.addr.internet.timeoutmills", "5000"));
     private final static InternalLogger LOGGER = ClientLoggerUtil.getClientLogger();
     protected final Properties properties;
     protected final SessionCredentials sessionCredentials = new SessionCredentials();
@@ -75,11 +72,13 @@
     public ONSClientAbstract(Properties properties) {
         this.properties = properties;
         this.sessionCredentials.updateContent(properties);
-        if (null == this.sessionCredentials.getAccessKey() || "".equals(this.sessionCredentials.getAccessKey())) {
+        if (this.sessionCredentials.getOnsChannel().equals(ONSChannel.ALIYUN) &&
+            (null == this.sessionCredentials.getAccessKey() || "".equals(this.sessionCredentials.getAccessKey()))) {
             throw new ONSClientException("please set access key");
         }
 
-        if (null == this.sessionCredentials.getSecretKey() || "".equals(this.sessionCredentials.getSecretKey())) {
+        if (this.sessionCredentials.getOnsChannel().equals(ONSChannel.ALIYUN) &&
+            (null == this.sessionCredentials.getSecretKey() || "".equals(this.sessionCredentials.getSecretKey()))) {
             throw new ONSClientException("please set secret key");
         }
 
@@ -87,12 +86,13 @@
             throw new ONSClientException("please set ons channel");
         }
 
-
-
         this.nameServerAddr = getNameSrvAddrFromProperties();
         if (nameServerAddr != null) {
             return;
         }
+        if (nameServerAddr == null && !this.sessionCredentials.getOnsChannel().equals(ONSChannel.ALIYUN)) {
+            return;
+        }
         this.nameServerAddr = fetchNameServerAddr();
         if (null == nameServerAddr) {
             throw new ONSClientException(FAQ.errorMessage("Can not find name server, May be your network problem.", FAQ.FIND_NS_FAILED));
@@ -131,7 +131,6 @@
     private String fetchNameServerAddr() {
         String nsAddrs;
 
-
         {
             String property = this.properties.getProperty(PropertyKeyConst.ONSAddr);
             if (property != null) {
@@ -145,7 +144,6 @@
             }
         }
 
-
         {
             TopAddressing top = new TopAddressing(WSADDR_INTERNAL);
             nsAddrs = top.fetchNSAddr(false, WSADDR_INTERNAL_TIMEOUTMILLS);
@@ -155,7 +153,6 @@
             }
         }
 
-
         {
             TopAddressing top = new TopAddressing(WSADDR_INTERNET);
             nsAddrs = top.fetchNSAddr(false, WSADDR_INTERNET_TIMEOUTMILLS);
@@ -172,16 +169,21 @@
     }
 
     protected String buildIntanceName() {
-        return Integer.toString(UtilAll.getPid())
-            + "#" + this.nameServerAddr.hashCode()
-            + "#" + this.sessionCredentials.getAccessKey().hashCode()
-            + "#" + System.nanoTime();
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append(Integer.toString(UtilAll.getPid())).append("#");
+        if (this.nameServerAddr != null) {
+            stringBuilder.append(this.nameServerAddr.hashCode()).append("#");
+        }
+        if (this.sessionCredentials.getAccessKey() != null) {
+            stringBuilder.append(this.sessionCredentials.getAccessKey().hashCode()).append("#");
+        }
+        stringBuilder.append(System.nanoTime());
+        return stringBuilder.toString();
     }
 
     protected String getNamespace() {
         String namespace = null;
 
-
         {
             String nameserverAddr = this.properties.getProperty(PropertyKeyConst.NAMESRV_ADDR);
             if (StringUtils.isNotEmpty(nameserverAddr)) {
@@ -192,7 +194,6 @@
             }
         }
 
-
         {
             String namespaceFromProperty = this.properties.getProperty(PropertyKeyConst.INSTANCE_ID, null);
             if (StringUtils.isNotEmpty(namespaceFromProperty)) {
@@ -236,13 +237,15 @@
 
     @Override
     public void updateCredential(Properties credentialProperties) {
-        if (null == credentialProperties.getProperty(SessionCredentials.AccessKey)
-                || "".equals(credentialProperties.getProperty(SessionCredentials.AccessKey))) {
+        if (this.sessionCredentials.getOnsChannel().equals(ONSChannel.ALIYUN) &&
+            (null == credentialProperties.getProperty(SessionCredentials.AccessKey)
+                || "".equals(credentialProperties.getProperty(SessionCredentials.AccessKey)))) {
             throw new ONSClientException("update credential failed. please set access key.");
         }
 
-        if (null == credentialProperties.getProperty(SessionCredentials.SecretKey)
-                || "".equals(credentialProperties.getProperty(SessionCredentials.SecretKey))) {
+        if (this.sessionCredentials.getOnsChannel().equals(ONSChannel.ALIYUN) &&
+            (null == credentialProperties.getProperty(SessionCredentials.SecretKey)
+                || "".equals(credentialProperties.getProperty(SessionCredentials.SecretKey)))) {
             throw new ONSClientException("update credential failed. please set secret key");
         }
         this.sessionCredentials.updateContent(credentialProperties);
