You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/09/08 02:28:54 UTC

[dubbo] branch 3.0 updated: Optimize some code of the cluster module (#8609)

This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new 18799e5  Optimize some code of the cluster module (#8609)
18799e5 is described below

commit 18799e51a9056a79aa8eeaee44db1dadeb1ddb86
Author: 灼华 <43...@users.noreply.github.com>
AuthorDate: Wed Sep 8 10:28:40 2021 +0800

    Optimize some code of the cluster module (#8609)
    
    * Optimize some code
    
    * Optimization
    
    * Fix the bug of incorrect use of atomic variables
    
    * Use util method to judge empty
    
    * Remove unused import
    
    * Adjust list sort
    
    * Judge Non , remove unused tagRouterRule in TagDynamicStateRouter
    
    * Extract constants
    
    * Remove unused imports
    
    * Remove unused method
---
 .../org/apache/dubbo/rpc/cluster/Constants.java    | 18 +++++++++++++-
 .../org/apache/dubbo/rpc/cluster/RouterChain.java  | 13 ++++------
 .../rpc/cluster/router/AbstractRouterRule.java     | 28 +++++++++++++++-------
 .../config/model/ConditionRouterRule.java          |  4 +++-
 .../cluster/router/tag/TagDynamicStateRouter.java  |  4 ++--
 .../dubbo/rpc/cluster/router/tag/TagRouter.java    |  2 +-
 .../cluster/router/tag/TagStaticStateRouter.java   | 20 ++--------------
 .../cluster/router/tag/model/TagRouterRule.java    |  4 +++-
 .../cluster/support/wrapper/AbstractCluster.java   |  5 ++--
 .../support/wrapper/MockClusterInvoker.java        | 25 +++++++++----------
 .../client/migration/model/MigrationRule.java      |  3 ++-
 .../client/migration/model/SubMigrationRule.java   |  4 +++-
 12 files changed, 71 insertions(+), 59 deletions(-)

diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Constants.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Constants.java
index 62a6b94..7af4210 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Constants.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Constants.java
@@ -32,6 +32,22 @@ public interface Constants {
 
     String FORCE_KEY = "force";
 
+    String RAW_RULE_KEY = "rawRule";
+
+    String VALID_KEY = "valid";
+
+    String ENABLED_KEY = "enabled";
+
+    String DYNAMIC_KEY = "dynamic";
+
+    String SCOPE_KEY = "scope";
+
+    String KEY_KEY = "key";
+
+    String CONDITIONS_KEY = "conditions";
+
+    String TAGS_KEY = "tags";
+
     /**
      * To decide whether to exclude unavailable invoker from the cluster
      */
@@ -95,7 +111,7 @@ public interface Constants {
     /**
      * The key for state router
      */
-    String STATE_ROUTER_KEY="stateRouter";
+    String STATE_ROUTER_KEY = "stateRouter";
     /**
      * The key name for reference URL in register center
      */
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java
index 5385ea1..3500ac2 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java
@@ -96,6 +96,7 @@ public class RouterChain<T> {
 
         List<Router> routers = extensionFactories.stream()
             .map(factory -> factory.getRouter(url))
+            .sorted(Router::compareTo)
             .collect(Collectors.toList());
 
         initWithRouters(routers);
@@ -120,7 +121,6 @@ public class RouterChain<T> {
     public void initWithRouters(List<Router> builtinRouters) {
         this.builtinRouters = builtinRouters;
         this.routers = new ArrayList<>(builtinRouters);
-        this.sort();
     }
 
     private void initWithStateRouters(List<StateRouter> builtinRouters) {
@@ -160,10 +160,6 @@ public class RouterChain<T> {
         return stateRouters;
     }
 
-    private void sort() {
-        Collections.sort(routers);
-    }
-
     /**
      * @param url
      * @param invocation
@@ -213,10 +209,10 @@ public class RouterChain<T> {
 
     /**
      * Build the asynchronous address cache for stateRouter.
-     * @param notify Whether the addresses in registry has changed.
+     * @param notify Whether the addresses in registry have changed.
      */
     private void buildCache(boolean notify) {
-        if (invokers == null || invokers.size() <= 0) {
+        if (CollectionUtils.isEmpty(invokers)) {
             return;
         }
         AddrCache<T> origin = cache.get();
@@ -272,8 +268,7 @@ public class RouterChain<T> {
      * @param notify Whether the addresses in registry has changed.
      */
     public void loop(boolean notify) {
-        if (firstBuildCache.get()) {
-            firstBuildCache.compareAndSet(true,false);
+        if (firstBuildCache.compareAndSet(true,false)) {
             buildCache(notify);
         }
         if (notify) {
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouterRule.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouterRule.java
index e12b8d8..ea65984 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouterRule.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouterRule.java
@@ -18,6 +18,16 @@ package org.apache.dubbo.rpc.cluster.router;
 
 import java.util.Map;
 
+import static org.apache.dubbo.rpc.cluster.Constants.DYNAMIC_KEY;
+import static org.apache.dubbo.rpc.cluster.Constants.ENABLED_KEY;
+import static org.apache.dubbo.rpc.cluster.Constants.FORCE_KEY;
+import static org.apache.dubbo.rpc.cluster.Constants.KEY_KEY;
+import static org.apache.dubbo.rpc.cluster.Constants.PRIORITY_KEY;
+import static org.apache.dubbo.rpc.cluster.Constants.RAW_RULE_KEY;
+import static org.apache.dubbo.rpc.cluster.Constants.RUNTIME_KEY;
+import static org.apache.dubbo.rpc.cluster.Constants.SCOPE_KEY;
+import static org.apache.dubbo.rpc.cluster.Constants.VALID_KEY;
+
 /**
  * TODO Extract more code here if necessary
  */
@@ -34,40 +44,40 @@ public abstract class AbstractRouterRule {
     private String key;
 
     protected void parseFromMap0(Map<String, Object> map) {
-        setRawRule((String) map.get("rawRule"));
+        setRawRule((String) map.get(RAW_RULE_KEY));
 
-        Object runtime = map.get("runtime");
+        Object runtime = map.get(RUNTIME_KEY);
         if (runtime != null) {
             setRuntime(Boolean.parseBoolean(runtime.toString()));
         }
 
-        Object force = map.get("force");
+        Object force = map.get(FORCE_KEY);
         if (force != null) {
             setForce(Boolean.parseBoolean(force.toString()));
         }
 
-        Object valid = map.get("valid");
+        Object valid = map.get(VALID_KEY);
         if (valid != null) {
             setValid(Boolean.parseBoolean(valid.toString()));
         }
 
-        Object enabled = map.get("enabled");
+        Object enabled = map.get(ENABLED_KEY);
         if (enabled != null) {
             setEnabled(Boolean.parseBoolean(enabled.toString()));
         }
 
-        Object priority = map.get("priority");
+        Object priority = map.get(PRIORITY_KEY);
         if (priority != null) {
             setPriority(Integer.parseInt(priority.toString()));
         }
 
-        Object dynamic = map.get("dynamic");
+        Object dynamic = map.get(DYNAMIC_KEY);
         if (dynamic != null) {
             setDynamic(Boolean.parseBoolean(dynamic.toString()));
         }
 
-        setScope((String) map.get("scope"));
-        setKey((String) map.get("key"));
+        setScope((String) map.get(SCOPE_KEY));
+        setKey((String) map.get(KEY_KEY));
     }
 
     public String getRawRule() {
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/model/ConditionRouterRule.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/model/ConditionRouterRule.java
index b94a5ce..0b2aa42 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/model/ConditionRouterRule.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/model/ConditionRouterRule.java
@@ -22,6 +22,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import static org.apache.dubbo.rpc.cluster.Constants.CONDITIONS_KEY;
+
 /**
  *
  */
@@ -33,7 +35,7 @@ public class ConditionRouterRule extends AbstractRouterRule {
         ConditionRouterRule conditionRouterRule = new ConditionRouterRule();
         conditionRouterRule.parseFromMap0(map);
 
-        Object conditions = map.get("conditions");
+        Object conditions = map.get(CONDITIONS_KEY);
         if (conditions != null && List.class.isAssignableFrom(conditions.getClass())) {
             conditionRouterRule.setConditions(((List<Object>) conditions).stream()
                     .map(String::valueOf).collect(Collectors.toList()));
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagDynamicStateRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagDynamicStateRouter.java
index 347d1fd..cebd0e0 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagDynamicStateRouter.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagDynamicStateRouter.java
@@ -121,7 +121,7 @@ public class TagDynamicStateRouter extends AbstractStateRouter implements Config
 
     @Override
     public boolean isEnable() {
-        return true;
+        return tagRouterRule != null && tagRouterRule.isEnabled();
     }
 
     @Override
@@ -240,7 +240,7 @@ public class TagDynamicStateRouter extends AbstractStateRouter implements Config
 
         synchronized (this) {
             if (!providerApplication.equals(application)) {
-                if (!StringUtils.isEmpty(application)) {
+                if (StringUtils.isNotEmpty(application)) {
                     ruleRepository.removeListener(application + RULE_SUFFIX, this);
                 }
                 String key = providerApplication + RULE_SUFFIX;
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
index 2ffd318..e667d92 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
@@ -241,7 +241,7 @@ public class TagRouter extends AbstractRouter implements ConfigurationListener {
 
         synchronized (this) {
             if (!providerApplication.equals(application)) {
-                if (!StringUtils.isEmpty(application)) {
+                if (StringUtils.isNotEmpty(application)) {
                     this.getRuleRepository().removeListener(application + RULE_SUFFIX, this);
                 }
                 String key = providerApplication + RULE_SUFFIX;
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagStaticStateRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagStaticStateRouter.java
index d15745f..34317ab 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagStaticStateRouter.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagStaticStateRouter.java
@@ -22,8 +22,6 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.logger.Logger;
-import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.rpc.Invocation;
@@ -33,7 +31,6 @@ import org.apache.dubbo.rpc.cluster.RouterChain;
 import org.apache.dubbo.rpc.cluster.router.state.AbstractStateRouter;
 import org.apache.dubbo.rpc.cluster.router.state.BitList;
 import org.apache.dubbo.rpc.cluster.router.state.RouterCache;
-import org.apache.dubbo.rpc.cluster.router.tag.model.TagRouterRule;
 import static org.apache.dubbo.common.constants.CommonConstants.TAG_KEY;
 
 /**
@@ -42,11 +39,8 @@ import static org.apache.dubbo.common.constants.CommonConstants.TAG_KEY;
 public class TagStaticStateRouter extends AbstractStateRouter {
     public static final String NAME = "TAG_ROUTER";
     private static final int TAG_ROUTER_DEFAULT_PRIORITY = 100;
-    private static final Logger logger = LoggerFactory.getLogger(TagStaticStateRouter.class);
     private static final String NO_TAG = "noTag";
 
-    private TagRouterRule tagRouterRule;
-
     public TagStaticStateRouter(URL url, RouterChain chain) {
         super(url, chain);
         this.priority = TAG_ROUTER_DEFAULT_PRIORITY;
@@ -87,10 +81,6 @@ public class TagStaticStateRouter extends AbstractStateRouter {
         return tags;
     }
 
-    @Override
-    public boolean isRuntime() {
-        return tagRouterRule != null && tagRouterRule.isRuntime();
-    }
 
     @Override
     public boolean isEnable() {
@@ -123,16 +113,10 @@ public class TagStaticStateRouter extends AbstractStateRouter {
             Invoker<T> invoker = invokers.get(index);
             String tag = invoker.getUrl().getParameter(TAG_KEY);
             if (StringUtils.isEmpty(tag)) {
-                BitList<Invoker<T>> noTagList = addrPool.putIfAbsent(NO_TAG, new BitList<>(invokers, true));
-                if (noTagList == null) {
-                    noTagList = addrPool.get(NO_TAG);
-                }
+                BitList<Invoker<T>> noTagList = addrPool.computeIfAbsent(NO_TAG, k -> new BitList<>(invokers, true));
                 noTagList.addIndex(index);
             } else {
-                BitList<Invoker<T>> list = addrPool.putIfAbsent(tag, new BitList<>(invokers, true));
-                if (list == null) {
-                    list = addrPool.get(tag);
-                }
+                BitList<Invoker<T>> list = addrPool.computeIfAbsent(tag, k -> new BitList<>(invokers, true));
                 list.addIndex(index);
             }
         }
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/TagRouterRule.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/TagRouterRule.java
index 259456e..2c01c02 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/TagRouterRule.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/TagRouterRule.java
@@ -25,6 +25,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import static org.apache.dubbo.rpc.cluster.Constants.TAGS_KEY;
+
 /**
  * %YAML1.2
  * ---
@@ -51,7 +53,7 @@ public class TagRouterRule extends AbstractRouterRule {
         TagRouterRule tagRouterRule = new TagRouterRule();
         tagRouterRule.parseFromMap0(map);
 
-        Object tags = map.get("tags");
+        Object tags = map.get(TAGS_KEY);
         if (tags != null && List.class.isAssignableFrom(tags.getClass())) {
             tagRouterRule.setTags(((List<Map<String, Object>>) tags).stream()
                     .map(Tag::parseFromMap).collect(Collectors.toList()));
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/wrapper/AbstractCluster.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/wrapper/AbstractCluster.java
index d2a6ea3..fe08884 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/wrapper/AbstractCluster.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/wrapper/AbstractCluster.java
@@ -40,11 +40,10 @@ import java.util.List;
 import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_INTERCEPTOR_COMPATIBLE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.INVOCATION_INTERCEPTOR_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.REFERENCE_FILTER_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.REFERENCE_INTERCEPTOR_KEY;
 
 public abstract class AbstractCluster implements Cluster {
 
-    private <T> Invoker<T> buildClusterInterceptors(AbstractClusterInvoker<T> clusterInvoker, String key) {
+    private <T> Invoker<T> buildClusterInterceptors(AbstractClusterInvoker<T> clusterInvoker) {
 //        AbstractClusterInvoker<T> last = clusterInvoker;
         AbstractClusterInvoker<T> last = buildInterceptorInvoker(new ClusterFilterInvoker<>(clusterInvoker));
 
@@ -59,7 +58,7 @@ public abstract class AbstractCluster implements Cluster {
         if (directory instanceof StaticDirectory) {
             return doJoin(directory);
         }
-        return buildClusterInterceptors(doJoin(directory), directory.getUrl().getParameter(REFERENCE_INTERCEPTOR_KEY));
+        return buildClusterInterceptors(doJoin(directory));
     }
 
     private <T> AbstractClusterInvoker<T> buildInterceptorInvoker(AbstractClusterInvoker<T> invoker) {
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/wrapper/MockClusterInvoker.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/wrapper/MockClusterInvoker.java
index 8dbf6f5..a5b5200 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/wrapper/MockClusterInvoker.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/wrapper/MockClusterInvoker.java
@@ -34,6 +34,7 @@ import org.apache.dubbo.rpc.support.MockInvoker;
 import java.util.List;
 
 import static org.apache.dubbo.rpc.Constants.MOCK_KEY;
+import static org.apache.dubbo.rpc.cluster.Constants.FORCE_KEY;
 import static org.apache.dubbo.rpc.cluster.Constants.INVOCATION_NEED_MOCK;
 
 public class MockClusterInvoker<T> implements ClusterInvoker<T> {
@@ -85,13 +86,13 @@ public class MockClusterInvoker<T> implements ClusterInvoker<T> {
 
     @Override
     public Result invoke(Invocation invocation) throws RpcException {
-        Result result = null;
+        Result result;
 
         String value = getUrl().getMethodParameter(invocation.getMethodName(), MOCK_KEY, Boolean.FALSE.toString()).trim();
         if (value.length() == 0 || "false".equalsIgnoreCase(value)) {
             //no mock
             result = this.invoker.invoke(invocation);
-        } else if (value.startsWith("force")) {
+        } else if (value.startsWith(FORCE_KEY)) {
             if (logger.isWarnEnabled()) {
                 logger.warn("force-mock: " + invocation.getMethodName() + " force-mock enabled , url : " + getUrl());
             }
@@ -128,22 +129,22 @@ public class MockClusterInvoker<T> implements ClusterInvoker<T> {
 
     @SuppressWarnings({"unchecked", "rawtypes"})
     private Result doMockInvoke(Invocation invocation, RpcException e) {
-        Result result = null;
-        Invoker<T> minvoker;
+        Result result;
+        Invoker<T> mockInvoker;
 
         List<Invoker<T>> mockInvokers = selectMockInvoker(invocation);
         if (CollectionUtils.isEmpty(mockInvokers)) {
-            minvoker = (Invoker<T>) new MockInvoker(getUrl(), directory.getInterface());
+            mockInvoker = (Invoker<T>) new MockInvoker(getUrl(), directory.getInterface());
         } else {
-            minvoker = mockInvokers.get(0);
+            mockInvoker = mockInvokers.get(0);
         }
         try {
-            result = minvoker.invoke(invocation);
-        } catch (RpcException me) {
-            if (me.isBiz()) {
-                result = AsyncRpcResult.newDefaultAsyncResult(me.getCause(), invocation);
+            result = mockInvoker.invoke(invocation);
+        } catch (RpcException mockException) {
+            if (mockException.isBiz()) {
+                result = AsyncRpcResult.newDefaultAsyncResult(mockException.getCause(), invocation);
             } else {
-                throw new RpcException(me.getCode(), getMockExceptionMessage(e, me), me.getCause());
+                throw new RpcException(mockException.getCode(), getMockExceptionMessage(e, mockException), mockException.getCause());
             }
         } catch (Throwable me) {
             throw new RpcException(getMockExceptionMessage(e, me), me.getCause());
@@ -173,7 +174,7 @@ public class MockClusterInvoker<T> implements ClusterInvoker<T> {
         //TODO generic invoker?
         if (invocation instanceof RpcInvocation) {
             //Note the implicit contract (although the description is added to the interface declaration, but extensibility is a problem. The practice placed in the attachment needs to be improved)
-            ((RpcInvocation) invocation).setAttachment(INVOCATION_NEED_MOCK, Boolean.TRUE.toString());
+            invocation.setAttachment(INVOCATION_NEED_MOCK, Boolean.TRUE.toString());
             //directory will return a list of normal invokers if Constants.INVOCATION_NEED_MOCK is absent or not true in invocation, otherwise, a list of mock invokers will return.
             try {
                 invokers = directory.list(invocation);
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/model/MigrationRule.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/model/MigrationRule.java
index 27a51fc..14d5c06 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/model/MigrationRule.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/model/MigrationRule.java
@@ -37,6 +37,7 @@ import static org.apache.dubbo.registry.Constants.MIGRATION_PROMOTION_KEY;
 import static org.apache.dubbo.registry.Constants.MIGRATION_STEP_KEY;
 import static org.apache.dubbo.registry.Constants.MIGRATION_THRESHOLD_KEY;
 import static org.apache.dubbo.registry.client.migration.MigrationRuleHandler.DUBBO_SERVICEDISCOVERY_MIGRATION;
+import static org.apache.dubbo.rpc.cluster.Constants.FORCE_KEY;
 
 /**
  * # key = demo-consumer.migration
@@ -105,7 +106,7 @@ public class MigrationRule {
             migrationRule.setDelay(Integer.valueOf(delay.toString()));
         }
 
-        Object force = map.get("force");
+        Object force = map.get(FORCE_KEY);
         if (force != null) {
             migrationRule.setForce(Boolean.valueOf(force.toString()));
         }
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/model/SubMigrationRule.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/model/SubMigrationRule.java
index c64c9c9..b9cd505 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/model/SubMigrationRule.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/model/SubMigrationRule.java
@@ -18,6 +18,8 @@ package org.apache.dubbo.registry.client.migration.model;
 
 import java.util.Map;
 
+import static org.apache.dubbo.rpc.cluster.Constants.FORCE_KEY;
+
 public class SubMigrationRule {
     private String serviceKey;
     private MigrationStep step;
@@ -50,7 +52,7 @@ public class SubMigrationRule {
             interfaceMigrationRule.setDelay(Integer.valueOf(delay.toString()));
         }
 
-        Object force = map.get("force");
+        Object force = map.get(FORCE_KEY);
         if (force != null) {
             interfaceMigrationRule.setForce(Boolean.valueOf(force.toString()));
         }