rename package & change route path
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/RouteRule.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/RouteUtils.java
similarity index 86%
rename from dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/RouteRule.java
rename to dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/RouteUtils.java
index 7c48e14..cb2c759 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/RouteRule.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/RouteUtils.java
@@ -37,7 +37,7 @@
  * The meaning of Rule: If a request matches When Condition, then use Then Condition to filter providers (only providers match Then Condition will be returned). <br>
  * The process of using Conditions to match consumers and providers is called `Filter`.
  * When Condition are used to filter ConsumersController, while Then Condition are used to filter ProvidersController.
- * RouteRule performs like this: If a Consumer matches When Condition, then only return the ProvidersController matches Then Condition. This means RouteRule should be applied to current Consumer and the providers returned are filtered by RouteRule.<br>
+ * RouteUtils performs like this: If a Consumer matches When Condition, then only return the ProvidersController matches Then Condition. This means RouteUtils should be applied to current Consumer and the providers returned are filtered by RouteUtils.<br>
  *
  * An example of ConditionRoute Rule:<code>
  * key1 = value11,value12 & key2 = value21 & key2 != value22 => key3 = value3 & key4 = value41,vlaue42 & key5 !=value51
@@ -47,9 +47,9 @@
  * Value object, thread safe.
  *
  */
-public class RouteRule {
+public class RouteUtils {
     @SuppressWarnings("unchecked")
-    static RouteRule EMPTY = new RouteRule(Collections.EMPTY_MAP, Collections.EMPTY_MAP);
+    static RouteUtils EMPTY = new RouteUtils(Collections.EMPTY_MAP, Collections.EMPTY_MAP);
     private static Pattern ROUTE_PATTERN = Pattern.compile("([&!=,]*)\\s*([^&!=,\\s]+)");
     private static Pattern CONDITION_SEPERATOR = Pattern.compile("(.*)=>(.*)");
     private static Pattern VALUE_LIST_SEPARATOR = Pattern.compile("\\s*,\\s*");
@@ -58,7 +58,7 @@
     private volatile String tostring = null;
 
     // FIXME
-    private RouteRule(Map<String, MatchPair> when, Map<String, MatchPair> then) {
+    private RouteUtils(Map<String, MatchPair> when, Map<String, MatchPair> then) {
         for (Map.Entry<String, MatchPair> entry : when.entrySet()) {
             entry.getValue().freeze();
         }
@@ -140,16 +140,16 @@
     }
 
     /**
-     * Parse the RouteRule as a string into an object.
+     * Parse the RouteUtils as a string into an object.
      *
-     * @throws ParseException RouteRule string format is wrong. The following input conditions, RouteRule are illegal.
+     * @throws ParseException RouteUtils string format is wrong. The following input conditions, RouteUtils are illegal.
      * <ul> <li> input is <code>null</code>。
      * <li> input is "" or " "。
      * <li> input Rule doesn't have a When Condition
      * <li> input Rule doesn't have a Then Condition
      * </ul>
      */
-    public static RouteRule parse(Route conditionRoute) throws ParseException {
+    public static RouteUtils parse(Route conditionRoute) throws ParseException {
         if (conditionRoute == null)
             throw new ParseException("null conditionRoute!", 0);
 
@@ -160,7 +160,7 @@
         return parse(conditionRoute == null ? null : conditionRoute.getMatchRule(), conditionRoute == null ? null : conditionRoute.getFilterRule());
     }
 
-    public static RouteRule parse(String whenRule, String thenRule) throws ParseException {
+    public static RouteUtils parse(String whenRule, String thenRule) throws ParseException {
         /*if (whenRule == null || whenRule.trim().length() == 0) {
             throw new ParseException("Illegal route rule without when express", 0);
     	}*/
@@ -169,10 +169,10 @@
         }
         Map<String, MatchPair> when = parseRule(whenRule.trim());
         Map<String, MatchPair> then = parseRule(thenRule.trim());
-        return new RouteRule(when, then);
+        return new RouteUtils(when, then);
     }
 
-    public static RouteRule parse(String rule) throws ParseException {
+    public static RouteUtils parse(String rule) throws ParseException {
         if (StringUtils.isBlank(rule)) {
             throw new ParseException("Illegal blank route rule", 0);
         }
@@ -187,7 +187,7 @@
      * @see #parse(String)
      * @throws RuntimeException This is an wrapper exception for the {@link ParseException} thrown by the {@link #parse (String)} method.
      */
-    public static RouteRule parseQuitely(Route conditionRoute) {
+    public static RouteUtils parseQuitely(Route conditionRoute) {
         try {
             return parse(conditionRoute);
         } catch (ParseException e) {
@@ -235,15 +235,10 @@
         existRule.setPriority(conditionRoute.getPriority());
         return existRule;
     }
-    public static BlackWhiteList convertToBlackWhiteList(AccessDTO accessDTO) {
+    public static List<String> convertToBlackWhiteList(AccessDTO accessDTO) {
         if (accessDTO == null) {
             return null;
         }
-        BlackWhiteList blackWhiteList = new BlackWhiteList();
-//        if (StringUtils.isNoneEmpty(accessDTO.getApplication())) {
-//            blackWhiteList.set
-//        }
-//        AccessDTO storeDTO = ConvertUtil.convertDTOtoStore(accessDTO);
 
         Set<String> whiteList = accessDTO.getWhitelist();
         Set<String> blackList = accessDTO.getBlacklist();
@@ -268,11 +263,38 @@
             sb.append(" =>");
             conditions.add(sb.toString());
         }
-        blackWhiteList.setConditions(conditions);
-        return blackWhiteList;
+        return conditions;
     }
 
-    public static AccessDTO convertToAccessDTO(BlackWhiteList blackWhiteList, String scope, String key) {
+    public static List<String> filterBlackWhiteListFromConditions(List<String> conditions) {
+        List<String> result = new ArrayList<>();
+        if (conditions == null || conditions.isEmpty()) {
+            return result;
+        }
+        for (String condition : conditions) {
+            if (isBlackList(condition)) {
+                result.add(condition);
+            } else if (isWhiteList(condition)) {
+                result.add(condition);
+            }
+        }
+        return result;
+    }
+
+    public static List<String> filterConditionRuleFromConditions(List<String> conditions) {
+        List<String> result = new ArrayList<>();
+        if (conditions == null || conditions.isEmpty()) {
+            return result;
+        }
+        for (String condition : conditions) {
+            if (!isBlackList(condition) && !isWhiteList(condition)) {
+                result.add(condition);
+            }
+        }
+        return result;
+    }
+
+    public static AccessDTO convertToAccessDTO(List<String> blackWhiteList, String scope, String key) {
         if (blackWhiteList == null) {
             return null;
         }
@@ -282,8 +304,8 @@
         } else {
             accessDTO.setService(key);
         }
-        if (blackWhiteList.getConditions() != null) {
-            for (String condition : blackWhiteList.getConditions()) {
+        if (blackWhiteList != null) {
+            for (String condition : blackWhiteList) {
                 if (condition.contains("host != ")) {
                     //white list
                     condition = org.apache.commons.lang3.StringUtils.substringBetween(condition, "host !=", " =>").trim();
@@ -306,8 +328,8 @@
         route.setFilterRule("false");
         route.setEnabled(true);
 
-        Map<String, RouteRule.MatchPair> when = new HashMap<>();
-        RouteRule.MatchPair matchPair = new RouteRule.MatchPair(new HashSet<>(), new HashSet<>());
+        Map<String, RouteUtils.MatchPair> when = new HashMap<>();
+        RouteUtils.MatchPair matchPair = new RouteUtils.MatchPair(new HashSet<>(), new HashSet<>());
         when.put(Route.KEY_CONSUMER_HOST, matchPair);
 
         if (accessDTO.getWhitelist() != null) {
@@ -318,7 +340,7 @@
         }
 
         StringBuilder sb = new StringBuilder();
-        RouteRule.contidionToString(sb, when);
+        RouteUtils.contidionToString(sb, when);
         route.setMatchRule(sb.toString());
         return route;
     }
@@ -330,7 +352,7 @@
         } else {
             conditionRouteDTO.setApplication(routingRule.getKey());
         }
-        conditionRouteDTO.setConditions(routingRule.getConditions());
+        conditionRouteDTO.setConditions(RouteUtils.filterConditionRuleFromConditions(routingRule.getConditions()));
         conditionRouteDTO.setPriority(routingRule.getPriority());
         conditionRouteDTO.setEnabled(routingRule.isEnabled());
         conditionRouteDTO.setForce(routingRule.isForce());
@@ -338,7 +360,7 @@
         return conditionRouteDTO;
     }
 
-    public static Route convertBlackWhiteListtoRoute(BlackWhiteList blackWhiteList, String scope, String key) {
+    public static Route convertBlackWhiteListtoRoute(List<String> blackWhiteList, String scope, String key) {
         AccessDTO accessDTO = convertToAccessDTO(blackWhiteList, scope, key);
         return convertAccessDTOtoRoute(accessDTO);
     }
@@ -402,19 +424,19 @@
         return condition;
     }
 
-    public static RouteRule createFromNameAndValueListString(Map<String, String> whenParams, Map<String, String> notWhenParams,
-                                                             Map<String, String> thenParams, Map<String, String> notThenParams) {
+    public static RouteUtils createFromNameAndValueListString(Map<String, String> whenParams, Map<String, String> notWhenParams,
+                                                              Map<String, String> thenParams, Map<String, String> notThenParams) {
         Map<String, MatchPair> when = parseNameAndValueListString2Condition(whenParams, notWhenParams);
         Map<String, MatchPair> then = parseNameAndValueListString2Condition(thenParams, notThenParams);
 
-        return new RouteRule(when, then);
+        return new RouteUtils(when, then);
     }
 
-    public static RouteRule createFromCondition(Map<String, MatchPair> whenCondition, Map<String, MatchPair> thenCondition) {
-        return new RouteRule(whenCondition, thenCondition);
+    public static RouteUtils createFromCondition(Map<String, MatchPair> whenCondition, Map<String, MatchPair> thenCondition) {
+        return new RouteUtils(whenCondition, thenCondition);
     }
 
-    public static RouteRule copyWithRemove(RouteRule copy, Set<String> whenParams, Set<String> thenParams) {
+    public static RouteUtils copyWithRemove(RouteUtils copy, Set<String> whenParams, Set<String> thenParams) {
         Map<String, MatchPair> when = new HashMap<String, MatchPair>();
         for (Entry<String, MatchPair> entry : copy.getWhenCondition().entrySet()) {
             if (whenParams == null || !whenParams.contains(entry.getKey())) {
@@ -429,7 +451,7 @@
             }
         }
 
-        return new RouteRule(when, then);
+        return new RouteUtils(when, then);
     }
 
     /**
@@ -438,9 +460,9 @@
      * @param copy Replace Base
      * @param whenCondition WhenCondition to replace, if Base does not have an item, insert it directly.
      * @param thenCondition ThenCondition to replace, if Base has no items, then insert directly.
-     * @return RouteRule after replacement
+     * @return RouteUtils after replacement
      */
-    public static RouteRule copyWithReplace(RouteRule copy, Map<String, MatchPair> whenCondition, Map<String, MatchPair> thenCondition) {
+    public static RouteUtils copyWithReplace(RouteUtils copy, Map<String, MatchPair> whenCondition, Map<String, MatchPair> thenCondition) {
         if (null == copy) {
             throw new NullPointerException("Argument copy is null!");
         }
@@ -457,7 +479,7 @@
             then.putAll(thenCondition);
         }
 
-        return new RouteRule(when, then);
+        return new RouteUtils(when, then);
     }
 
     // TODO ToString out of the current list is out of order, should we sort?
@@ -573,6 +595,14 @@
         return sb.toString();
     }
 
+    private static boolean isBlackList(String address) {
+        return (address.startsWith("host = ") && address.endsWith(" =>"));
+    }
+
+    private static boolean isWhiteList(String address) {
+        return (address.startsWith("host != ") && address.endsWith(" =>"));
+    }
+
     @Override
     public String toString() {
         if (tostring != null)
@@ -603,7 +633,7 @@
             return false;
         if (getClass() != obj.getClass())
             return false;
-        RouteRule other = (RouteRule) obj;
+        RouteUtils other = (RouteUtils) obj;
         if (thenCondition == null) {
             if (other.thenCondition != null)
                 return false;
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
index 6d527ff..a3c6405 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
@@ -20,9 +20,9 @@
 import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.admin.common.exception.ConfigurationException;
 import org.apache.dubbo.admin.common.util.Constants;
-import org.apache.dubbo.admin.data.config.GovernanceConfiguration;
-import org.apache.dubbo.admin.data.metadata.MetaDataCollector;
-import org.apache.dubbo.admin.data.metadata.impl.NoOpMetadataCollector;
+import org.apache.dubbo.admin.registry.config.GovernanceConfiguration;
+import org.apache.dubbo.admin.registry.metadata.MetaDataCollector;
+import org.apache.dubbo.admin.registry.metadata.impl.NoOpMetadataCollector;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.common.logger.Logger;
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/model/store/RoutingRule.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/model/store/RoutingRule.java
index 46b012f..7707e94 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/model/store/RoutingRule.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/model/store/RoutingRule.java
@@ -28,7 +28,7 @@
     private boolean force;
     private boolean runtime;
     private List<String> conditions;
-    private BlackWhiteList blackWhiteList;
+//    private BlackWhiteList blackWhiteList;
 
 
     public String getKey() {
@@ -87,11 +87,11 @@
         this.conditions = conditions;
     }
 
-    public BlackWhiteList getBlackWhiteList() {
-        return blackWhiteList;
-    }
-
-    public void setBlackWhiteList(BlackWhiteList blackWhiteList) {
-        this.blackWhiteList = blackWhiteList;
-    }
+//    public BlackWhiteList getBlackWhiteList() {
+//        return blackWhiteList;
+//    }
+//
+//    public void setBlackWhiteList(BlackWhiteList blackWhiteList) {
+//        this.blackWhiteList = blackWhiteList;
+//    }
 }
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/config/GovernanceConfiguration.java
similarity index 96%
rename from dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java
rename to dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/config/GovernanceConfiguration.java
index 8fb75ab..c6ed397 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/GovernanceConfiguration.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/config/GovernanceConfiguration.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.admin.data.config;
+package org.apache.dubbo.admin.registry.config;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.SPI;
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ApolloConfiguration.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/config/impl/ApolloConfiguration.java
similarity index 95%
rename from dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ApolloConfiguration.java
rename to dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/config/impl/ApolloConfiguration.java
index 2bc0f90..13d4b2e 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ApolloConfiguration.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/config/impl/ApolloConfiguration.java
@@ -15,11 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.admin.data.config.impl;
+package org.apache.dubbo.admin.registry.config.impl;
 
 import com.ctrip.framework.apollo.openapi.client.ApolloOpenApiClient;
 import com.ctrip.framework.apollo.openapi.dto.OpenItemDTO;
-import org.apache.dubbo.admin.data.config.GovernanceConfiguration;
+import org.apache.dubbo.admin.registry.config.GovernanceConfiguration;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.SPI;
 import org.springframework.beans.factory.annotation.Value;
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/NoOpConfiguration.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/config/impl/NoOpConfiguration.java
similarity index 92%
rename from dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/NoOpConfiguration.java
rename to dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/config/impl/NoOpConfiguration.java
index 08cb489..85dca2f 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/NoOpConfiguration.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/config/impl/NoOpConfiguration.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.admin.data.config.impl;
+package org.apache.dubbo.admin.registry.config.impl;
 
-import org.apache.dubbo.admin.data.config.GovernanceConfiguration;
+import org.apache.dubbo.admin.registry.config.GovernanceConfiguration;
 import org.apache.dubbo.common.URL;
 
 public class NoOpConfiguration implements GovernanceConfiguration {
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/config/impl/ZookeeperConfiguration.java
similarity index 97%
rename from dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java
rename to dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/config/impl/ZookeeperConfiguration.java
index ffe4b49..0ba847a 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/config/impl/ZookeeperConfiguration.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/config/impl/ZookeeperConfiguration.java
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.admin.data.config.impl;
+package org.apache.dubbo.admin.registry.config.impl;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.ExponentialBackoffRetry;
 import org.apache.dubbo.admin.common.util.Constants;
-import org.apache.dubbo.admin.data.config.GovernanceConfiguration;
+import org.apache.dubbo.admin.registry.config.GovernanceConfiguration;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.URL;
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/metadata/MetaDataCollector.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/MetaDataCollector.java
similarity index 95%
rename from dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/metadata/MetaDataCollector.java
rename to dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/MetaDataCollector.java
index 5b5e802..b5974a7 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/metadata/MetaDataCollector.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/MetaDataCollector.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.admin.data.metadata;
+package org.apache.dubbo.admin.registry.metadata;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.SPI;
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/metadata/impl/NoOpMetadataCollector.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/NoOpMetadataCollector.java
similarity index 91%
rename from dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/metadata/impl/NoOpMetadataCollector.java
rename to dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/NoOpMetadataCollector.java
index 8e561a6..3638570 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/metadata/impl/NoOpMetadataCollector.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/NoOpMetadataCollector.java
@@ -15,9 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.admin.data.metadata.impl;
+package org.apache.dubbo.admin.registry.metadata.impl;
 
-import org.apache.dubbo.admin.data.metadata.MetaDataCollector;
+import org.apache.dubbo.admin.registry.metadata.MetaDataCollector;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.metadata.identifier.MetadataIdentifier;
 
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/metadata/impl/RedisMetaDataCollector.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/RedisMetaDataCollector.java
similarity index 94%
rename from dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/metadata/impl/RedisMetaDataCollector.java
rename to dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/RedisMetaDataCollector.java
index b00238a..2431b8e 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/metadata/impl/RedisMetaDataCollector.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/RedisMetaDataCollector.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.admin.data.metadata.impl;
+package org.apache.dubbo.admin.registry.metadata.impl;
 
 
-import org.apache.dubbo.admin.data.metadata.MetaDataCollector;
+import org.apache.dubbo.admin.registry.metadata.MetaDataCollector;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.metadata.identifier.MetadataIdentifier;
 import redis.clients.jedis.Jedis;
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/metadata/impl/ZookeeperMetaDataCollector.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/ZookeeperMetaDataCollector.java
similarity index 96%
rename from dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/metadata/impl/ZookeeperMetaDataCollector.java
rename to dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/ZookeeperMetaDataCollector.java
index fcab3b0..48c3cf3 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/data/metadata/impl/ZookeeperMetaDataCollector.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/ZookeeperMetaDataCollector.java
@@ -15,13 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.admin.data.metadata.impl;
+package org.apache.dubbo.admin.registry.metadata.impl;
 
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.ExponentialBackoffRetry;
 import org.apache.dubbo.admin.common.util.Constants;
-import org.apache.dubbo.admin.data.metadata.MetaDataCollector;
+import org.apache.dubbo.admin.registry.metadata.MetaDataCollector;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/AbstractService.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/AbstractService.java
index 914943d..d9e63d5 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/AbstractService.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/AbstractService.java
@@ -16,8 +16,8 @@
  */
 package org.apache.dubbo.admin.service.impl;
 
-import org.apache.dubbo.admin.data.config.GovernanceConfiguration;
-import org.apache.dubbo.admin.data.metadata.MetaDataCollector;
+import org.apache.dubbo.admin.registry.config.GovernanceConfiguration;
+import org.apache.dubbo.admin.registry.metadata.MetaDataCollector;
 import org.apache.dubbo.admin.service.RegistryServerSync;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/RouteServiceImpl.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/RouteServiceImpl.java
index b7e7def..bd1272e 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/RouteServiceImpl.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/RouteServiceImpl.java
@@ -19,13 +19,12 @@
 import org.apache.dubbo.admin.common.exception.ResourceNotFoundException;
 import org.apache.dubbo.admin.common.util.Constants;
 import org.apache.dubbo.admin.common.util.ConvertUtil;
-import org.apache.dubbo.admin.common.util.RouteRule;
+import org.apache.dubbo.admin.common.util.RouteUtils;
 import org.apache.dubbo.admin.common.util.YamlParser;
 import org.apache.dubbo.admin.model.domain.Route;
 import org.apache.dubbo.admin.model.dto.AccessDTO;
 import org.apache.dubbo.admin.model.dto.ConditionRouteDTO;
 import org.apache.dubbo.admin.model.dto.TagRouteDTO;
-import org.apache.dubbo.admin.model.store.BlackWhiteList;
 import org.apache.dubbo.admin.model.store.RoutingRule;
 import org.apache.dubbo.admin.model.store.TagRoute;
 import org.apache.dubbo.admin.service.RouteService;
@@ -53,7 +52,7 @@
         if (existConfig != null) {
             existRule = YamlParser.loadObject(existConfig, RoutingRule.class);
         }
-        existRule = RouteRule.insertConditionRule(existRule, conditionRoute);
+        existRule = RouteUtils.insertConditionRule(existRule, conditionRoute);
         //register2.7
         dynamicConfiguration.setConfig(path, YamlParser.dumpObject(existRule));
 
@@ -74,8 +73,8 @@
             throw new ResourceNotFoundException("no existing condition route for path: " + path);
         }
         RoutingRule routingRule = YamlParser.loadObject(existConfig, RoutingRule.class);
-        ConditionRouteDTO oldConditionRoute = RouteRule.createConditionRouteFromRule(routingRule);
-        routingRule = RouteRule.insertConditionRule(routingRule, newConditionRoute);
+        ConditionRouteDTO oldConditionRoute = RouteUtils.createConditionRouteFromRule(routingRule);
+        routingRule = RouteUtils.insertConditionRule(routingRule, newConditionRoute);
         dynamicConfiguration.setConfig(path, YamlParser.dumpObject(routingRule));
 
         //for 2.6
@@ -98,8 +97,9 @@
             //throw exception
         }
         RoutingRule route = YamlParser.loadObject(config, RoutingRule.class);
-        if (route.getBlackWhiteList() != null) {
-           route.setConditions(null);
+        List<String> blackWhiteList = RouteUtils.filterBlackWhiteListFromConditions(route.getConditions());
+        if (blackWhiteList.size() != 0) {
+           route.setConditions(blackWhiteList);
             dynamicConfiguration.setConfig(path, YamlParser.dumpObject(route));
         } else {
             dynamicConfiguration.deleteConfig(path);
@@ -108,7 +108,7 @@
         //for 2.6
         if (route.getScope().equals(Constants.SERVICE)) {
             RoutingRule originRule = YamlParser.loadObject(config, RoutingRule.class);
-            ConditionRouteDTO conditionRouteDTO = RouteRule.createConditionRouteFromRule(originRule);
+            ConditionRouteDTO conditionRouteDTO = RouteUtils.createConditionRouteFromRule(originRule);
             Route old = convertRouteToOldRoute(conditionRouteDTO);
             registry.unregister(old.toUrl().addParameter(Constants.COMPATIBLE_CONFIG, true));
         }
@@ -120,16 +120,17 @@
         String config = dynamicConfiguration.getConfig(path);
         if (config != null) {
             RoutingRule ruleDTO = YamlParser.loadObject(config, RoutingRule.class);
-            BlackWhiteList old = ruleDTO.getBlackWhiteList();
-            if (ruleDTO.getConditions() == null) {
+            List<String> blackWhiteList = RouteUtils.filterBlackWhiteListFromConditions(ruleDTO.getConditions());
+            List<String> conditions = RouteUtils.filterConditionRuleFromConditions(ruleDTO.getConditions());
+            if (conditions.size() == 0) {
                 dynamicConfiguration.deleteConfig(path);
             } else {
-                ruleDTO.setBlackWhiteList(null);
+                ruleDTO.setConditions(conditions);
                 dynamicConfiguration.setConfig(path, YamlParser.dumpObject(ruleDTO));
             }
             //2.6
-            if (ruleDTO.getScope().equals(Constants.SERVICE) && old != null) {
-                Route route = RouteRule.convertBlackWhiteListtoRoute(old, Constants.SERVICE, id);
+            if (ruleDTO.getScope().equals(Constants.SERVICE) && blackWhiteList.size() > 0) {
+                Route route = RouteUtils.convertBlackWhiteListtoRoute(blackWhiteList, Constants.SERVICE, id);
                 registry.unregister(route.toUrl());
             }
         }
@@ -140,7 +141,7 @@
         String id = ConvertUtil.getIdFromDTO(accessDTO);
         String path = getPath(id, Constants.CONDITION_ROUTE);
         String config = dynamicConfiguration.getConfig(path);
-        BlackWhiteList blackWhiteList = RouteRule.convertToBlackWhiteList(accessDTO);
+        List<String> blackWhiteList = RouteUtils.convertToBlackWhiteList(accessDTO);
         RoutingRule ruleDTO;
         if (config == null) {
             ruleDTO = new RoutingRule();
@@ -151,19 +152,20 @@
                 ruleDTO.setScope(Constants.SERVICE);
             }
             ruleDTO.setKey(id);
-            ruleDTO.setBlackWhiteList(blackWhiteList);
+            ruleDTO.setConditions(blackWhiteList);
         } else {
             ruleDTO = YamlParser.loadObject(config, RoutingRule.class);
-            if (ruleDTO.getBlackWhiteList() != null) {
-                //todo throw exception
+            if (ruleDTO.getConditions() == null) {
+                ruleDTO.setConditions(blackWhiteList);
+            } else {
+                ruleDTO.getConditions().addAll(blackWhiteList);
             }
-            ruleDTO.setBlackWhiteList(blackWhiteList);
         }
         dynamicConfiguration.setConfig(path, YamlParser.dumpObject(ruleDTO));
 
         //for 2.6
         if (ruleDTO.getScope().equals("service")) {
-            Route route = RouteRule.convertAccessDTOtoRoute(accessDTO);
+            Route route = RouteUtils.convertAccessDTOtoRoute(accessDTO);
             registry.register(route.toUrl());
         }
 
@@ -175,8 +177,8 @@
         String config = dynamicConfiguration.getConfig(path);
         if (config != null) {
             RoutingRule ruleDTO = YamlParser.loadObject(config, RoutingRule.class);
-            BlackWhiteList blackWhiteList = ruleDTO.getBlackWhiteList();
-            return RouteRule.convertToAccessDTO(blackWhiteList, ruleDTO.getScope(), ruleDTO.getKey());
+            List<String> blackWhiteList = RouteUtils.filterBlackWhiteListFromConditions(ruleDTO.getConditions());
+            return RouteUtils.convertToAccessDTO(blackWhiteList, ruleDTO.getScope(), ruleDTO.getKey());
         }
         return null;
     }
@@ -185,20 +187,22 @@
     public void updateAccess(AccessDTO accessDTO) {
         String key = ConvertUtil.getIdFromDTO(accessDTO);
         String path = getPath(key, Constants.CONDITION_ROUTE);
-        BlackWhiteList blackWhiteList = RouteRule.convertToBlackWhiteList(accessDTO);
-        BlackWhiteList old = null;
+        List<String> blackWhiteList = RouteUtils.convertToBlackWhiteList(accessDTO);
         String config = dynamicConfiguration.getConfig(path);
+        List<String> oldList = null;
         if (config != null) {
             RoutingRule ruleDTO = YamlParser.loadObject(config, RoutingRule.class);
-            old = ruleDTO.getBlackWhiteList();
-            ruleDTO.setBlackWhiteList(blackWhiteList);
+            oldList = RouteUtils.filterBlackWhiteListFromConditions(ruleDTO.getConditions());
+            List<String> conditions = RouteUtils.filterConditionRuleFromConditions(ruleDTO.getConditions());
+            conditions.addAll(blackWhiteList);
+            ruleDTO.setConditions(conditions);
             dynamicConfiguration.setConfig(path, YamlParser.dumpObject(ruleDTO));
         }
 
         //2.6
         if (StringUtils.isNotEmpty(accessDTO.getService())) {
-            Route oldRoute = RouteRule.convertBlackWhiteListtoRoute(old, Constants.SERVICE, key);
-            Route newRoute = RouteRule.convertAccessDTOtoRoute(accessDTO);
+            Route oldRoute = RouteUtils.convertBlackWhiteListtoRoute(oldList, Constants.SERVICE, key);
+            Route newRoute = RouteUtils.convertAccessDTOtoRoute(accessDTO);
             registry.unregister(oldRoute.toUrl());
             registry.register(newRoute.toUrl());
         }
@@ -213,7 +217,7 @@
 
             if (ruleDTO.getScope().equals(Constants.SERVICE)) {
                 //for2.6
-                URL oldURL = convertRouteToOldRoute(RouteRule.createConditionRouteFromRule(ruleDTO)).toUrl().addParameter(Constants.COMPATIBLE_CONFIG, true);
+                URL oldURL = convertRouteToOldRoute(RouteUtils.createConditionRouteFromRule(ruleDTO)).toUrl().addParameter(Constants.COMPATIBLE_CONFIG, true);
                 registry.unregister(oldURL);
                 oldURL = oldURL.addParameter("enabled", true);
                 registry.register(oldURL);
@@ -235,7 +239,7 @@
 
             if (routeRule.getScope().equals(Constants.SERVICE)) {
                 //for 2.6
-                URL oldURL = convertRouteToOldRoute(RouteRule.createConditionRouteFromRule(routeRule)).toUrl().addParameter(Constants.COMPATIBLE_CONFIG,true);
+                URL oldURL = convertRouteToOldRoute(RouteUtils.createConditionRouteFromRule(routeRule)).toUrl().addParameter(Constants.COMPATIBLE_CONFIG,true);
                 registry.unregister(oldURL);
                 oldURL = oldURL.addParameter("enabled", false);
                 registry.register(oldURL);
@@ -254,7 +258,7 @@
         String config = dynamicConfiguration.getConfig(path);
         if (config != null) {
             RoutingRule routingRule = YamlParser.loadObject(config, RoutingRule.class);
-            ConditionRouteDTO conditionRouteDTO = RouteRule.createConditionRouteFromRule(routingRule);
+            ConditionRouteDTO conditionRouteDTO = RouteUtils.createConditionRouteFromRule(routingRule);
             return conditionRouteDTO;
         }
         return null;
@@ -264,7 +268,7 @@
     public void createTagRoute(TagRouteDTO tagRoute) {
         String id = ConvertUtil.getIdFromDTO(tagRoute);
         String path = getPath(id,Constants.TAG_ROUTE);
-        TagRoute store = RouteRule.convertTagroutetoStore(tagRoute);
+        TagRoute store = RouteUtils.convertTagroutetoStore(tagRoute);
         dynamicConfiguration.setConfig(path, YamlParser.dumpObject(store));
     }
 
@@ -276,7 +280,7 @@
             throw new ResourceNotFoundException("can not find tagroute: " + id);
             //throw exception
         }
-        TagRoute store = RouteRule.convertTagroutetoStore(tagRoute);
+        TagRoute store = RouteUtils.convertTagroutetoStore(tagRoute);
         dynamicConfiguration.setConfig(path, YamlParser.dumpObject(store));
 
     }
@@ -317,16 +321,16 @@
         String config = dynamicConfiguration.getConfig(path);
         if (config != null) {
             TagRoute tagRoute = YamlParser.loadObject(config, TagRoute.class);
-            return RouteRule.convertTagroutetoDisplay(tagRoute);
+            return RouteUtils.convertTagroutetoDisplay(tagRoute);
         }
         return null;
     }
 
     private String getPath(String key, String type) {
         if (type.equals(Constants.CONDITION_ROUTE)) {
-            return prefix + Constants.PATH_SEPARATOR + key + Constants.PATH_SEPARATOR + "routers";
+            return prefix + Constants.PATH_SEPARATOR + key + Constants.PATH_SEPARATOR + "condition-route";
         } else {
-            return prefix + Constants.PATH_SEPARATOR + key + Constants.PATH_SEPARATOR + "tagrouters";
+            return prefix + Constants.PATH_SEPARATOR + key + Constants.PATH_SEPARATOR + "tag-route";
         }
     }
 
diff --git a/dubbo-admin-frontend/src/components/ServiceSearch.vue b/dubbo-admin-frontend/src/components/ServiceSearch.vue
index 69ebfda..34af1f6 100644
--- a/dubbo-admin-frontend/src/components/ServiceSearch.vue
+++ b/dubbo-admin-frontend/src/components/ServiceSearch.vue
@@ -242,7 +242,7 @@
         if (version != null) {
           query = query + '&version=' + version
         }
-        return '/#/serviceDetail?' + query
+        return '#/serviceDetail?' + query
       },
       governanceHref: function (type, service, group, version) {
         let base = '/#/governance/' + type
diff --git a/dubbo-admin-frontend/src/components/governance/AccessControl.vue b/dubbo-admin-frontend/src/components/governance/AccessControl.vue
index bd6513e..f67fb62 100644
--- a/dubbo-admin-frontend/src/components/governance/AccessControl.vue
+++ b/dubbo-admin-frontend/src/components/governance/AccessControl.vue
@@ -87,8 +87,16 @@
                           class="mr-2"
                           color="blue"
                           slot="activator"
-                          @click="toEdit(props.item)">edit</v-icon>
-                  <span>Edit</span>
+                          @click="toEdit(props.item, true)">view</v-icon>
+                  <span>{{$t('view')}}</span>
+                </v-tooltip>
+                <v-tooltip bottom>
+                  <v-icon small
+                          class="mr-2"
+                          color="blue"
+                          slot="activator"
+                          @click="toEdit(props.item, false)">edit</v-icon>
+                  <span>{{$t('edit')}}</span>
                 </v-tooltip>
                 <v-tooltip bottom>
                   <v-icon small
@@ -96,7 +104,7 @@
                           slot="activator"
                           color="red"
                           @click="toDelete(props.item)">delete</v-icon>
-                  <span>Delete</span>
+                  <span>{{$t('delete')}}</span>
                 </v-tooltip>
               </td>
             </template>
@@ -144,18 +152,37 @@
         </v-card-title>
         <v-card-text>
           <v-form ref="modalForm">
-            <v-text-field label="Service Unique ID"
-                          :hint="$t('dataIdHint')"
-                          :readonly="modal.id != null"
-                          v-model="modal.service" />
+            <v-text-field
+              label="Service Unique ID"
+              :hint="$t('dataIdHint')"
+              :readonly="modal.readonly"
+              v-model="modal.service"
+            ></v-text-field>
             <v-text-field
               :label="$t('appName')"
               :hint="$t('appNameHint')"
-              :readonly="modal.id != null"
+              :readonly="modal.readonly"
               v-model="modal.application"
             ></v-text-field>
-            <v-subheader class="pa-0 mt-3">BLACK/WHITE LIST CONTENT</v-subheader>
-            <ace-editor v-model="modal.content" />
+            <v-layout row justify-space-between>
+              <v-flex >
+                <v-text-field
+                  :readonly="modal.readonly"
+                  :label="$t('whiteList')"
+                  v-modal="modal.whiteList"
+                  :hint="$t('whiteListHint')">
+                </v-text-field>
+              </v-flex>
+              <v-spacer></v-spacer>
+              <v-flex>
+                <v-text-field
+                  :label="$t('blackList')"
+                  :hint="$t('blackListHint')"
+                  v-modal="modal.blackList"
+                  :readonly="modal.id != null">
+                </v-text-field>
+              </v-flex>
+            </v-layout>
           </v-form>
         </v-card-text>
         <v-card-actions>
@@ -191,7 +218,6 @@
 </template>
 
 <script>
-import yaml from 'js-yaml'
 import AceEditor from '@/components/public/AceEditor'
 import Search from '@/components/public/Search'
 
@@ -210,6 +236,7 @@
     accesses: [],
     modal: {
       enable: false,
+      readonly: false,
       title: 'Create New',
       saveBtn: 'Create',
       click: () => {},
@@ -217,6 +244,8 @@
       service: null,
       application: null,
       content: '',
+      blackList: '',
+      whiteList: '',
       template:
         'blacklist:\n' +
         '  - 1.1.1.1\n' +
@@ -311,18 +340,20 @@
       })
     },
     createItem () {
-      let doc = yaml.load(this.modal.content)
+      // let doc = yaml.load(this.modal.content)
       this.filter = ''
       if (!this.modal.service && !this.modal.application) {
         this.$notify.error('Either service or application is needed')
         return
       }
       let vm = this
+      let blackList = this.modal.blackList.split(',')
+      let whiteList = this.modal.whiteList.split(',')
       this.$axios.post('/rules/access', {
         service: this.modal.service,
         application: this.modal.application,
-        whitelist: doc.whitelist,
-        blacklist: doc.blacklist
+        whitelist: whiteList,
+        blacklist: blackList
       }).then(response => {
         if (response.status === 201) {
           if (vm.modal.service) {
@@ -338,7 +369,7 @@
         this.showSnackbar('success', 'Create success')
       }).catch(error => this.showSnackbar('error', error.response.data.message))
     },
-    toEdit (item) {
+    toEdit (item, readonly) {
       let itemId = null
       if (this.selected === 0) {
         itemId = item.service
@@ -350,21 +381,26 @@
       }
       Object.assign(this.modal, {
         enable: true,
+        readonly: readonly,
         title: 'Edit',
         saveBtn: 'Update',
         click: this.editItem,
         id: itemId,
         service: item.service,
         application: item.application,
-        content: yaml.safeDump({blacklist: item.blacklist, whitelist: item.whitelist})
+        whiteList: item.whitelist,
+        blackList: item.blacklist
+        // content: yaml.safeDump({blacklist: item.blacklist, whitelist: item.whitelist})
       })
     },
     editItem () {
-      let doc = yaml.load(this.modal.content)
+      // let doc = yaml.load(this.modal.content)
+      let blackList = this.modal.blackList.split(',')
+      let whiteList = this.modal.whiteList.split(',')
       let vm = this
       this.$axios.put('/rules/access/' + this.modal.id, {
-        whitelist: doc.whitelist,
-        blacklist: doc.blacklist,
+        whitelist: whiteList,
+        blacklist: blackList,
         application: this.modal.application,
         service: this.modal.service
 
diff --git a/dubbo-admin-frontend/src/components/governance/LoadBalance.vue b/dubbo-admin-frontend/src/components/governance/LoadBalance.vue
index 0424a88..6a1eb56 100644
--- a/dubbo-admin-frontend/src/components/governance/LoadBalance.vue
+++ b/dubbo-admin-frontend/src/components/governance/LoadBalance.vue
@@ -119,20 +119,39 @@
             label="Service Unique ID"
             :hint="$t('dataIdHint')"
             v-model="service"
+            :readonly="readonly"
           ></v-text-field>
           <v-text-field
             :label="$t('appName')"
             :hint="$t('appNameHint')"
             v-model="application"
+            :readonly="readonly"
           ></v-text-field>
-          <v-subheader class="pa-0 mt-3">RULE CONTENT</v-subheader>
-          <ace-editor v-model="ruleText" :readonly="readonly"/>
+          <v-layout row justify-space-between>
+            <v-flex >
+              <v-text-field
+                :label="$t('method')"
+                :hint="$t('methodHint')"
+                v-model="rule.method"
+                :readonly="readonly"
+              ></v-text-field>
+            </v-flex>
+            <v-spacer></v-spacer>
+            <v-flex>
+              <v-select
+                :items="rule.strategyKey"
+                :label="$t('strategy')"
+                v-model="rule.strategy"
+                :readonly="readonly"
+              ></v-select>
+            </v-flex>
+          </v-layout>
 
         </v-card-text>
         <v-card-actions>
           <v-spacer></v-spacer>
-          <v-btn color="darken-1" flat @click.native="closeDialog">Close</v-btn>
-          <v-btn color="primary darken-1" depressed @click.native="saveItem">Save</v-btn>
+          <v-btn color="darken-1" flat @click.native="closeDialog">{{$t('close')}}</v-btn>
+          <v-btn color="primary darken-1" depressed @click.native="saveItem">{{$t('save')}}</v-btn>
         </v-card-actions>
       </v-card>
     </v-dialog>
@@ -143,8 +162,8 @@
         <v-card-text >{{this.warnText}}</v-card-text>
         <v-card-actions>
           <v-spacer></v-spacer>
-          <v-btn color="darken-1" flat @click.native="closeWarn">CANCLE</v-btn>
-          <v-btn color="primary darken-1" depressed @click.native="deleteItem(warnStatus.id)">CONFIRM</v-btn>
+          <v-btn color="darken-1" flat @click.native="closeWarn">{{$t('cancel')}}</v-btn>
+          <v-btn color="primary darken-1" depressed @click.native="deleteItem(warnStatus.id)">{{$t('confirm')}}</v-btn>
         </v-card-actions>
       </v-card>
     </v-dialog>
@@ -153,7 +172,6 @@
 
 </template>
 <script>
-  import yaml from 'js-yaml'
   import AceEditor from '@/components/public/AceEditor'
   import Search from '@/components/public/Search'
   export default {
@@ -189,6 +207,25 @@
       template:
         'methodName: *  # * for all methods\n' +
         'strategy:  # leastactive, random, roundrobin',
+      rule: {
+        method: '',
+        strategy: '',
+        strategyKey: [
+          {
+            text: 'Least Active',
+            value: 'leastactive'
+          },
+          {
+            text: 'Random',
+            value: 'random'
+          },
+          {
+            text: 'Round Robin',
+            value: 'roundrobin'
+          }
+
+        ]
+      },
       ruleText: '',
       readonly: false,
       serviceHeaders: [],
@@ -230,7 +267,7 @@
 
           },
           {
-            text: this.$('operation'),
+            text: this.$t('operation'),
             value: 'operation',
             sortable: false,
             width: '115px'
@@ -278,7 +315,8 @@
       },
       saveItem: function () {
         this.ruleText = this.verifyRuleText(this.ruleText)
-        let balancing = yaml.safeLoad(this.ruleText)
+        // let balancing = yaml.safeLoad(this.ruleText)
+        let balancing = {}
         if (!this.service && !this.application) {
           this.$notify.error('Either service or application is needed')
           return
@@ -286,6 +324,8 @@
         let vm = this
         balancing.service = this.service
         balancing.application = this.application
+        balancing.methodName = this.rule.method
+        balancing.strategy = this.rule.strategy
         if (this.updateId) {
           if (this.updateId === 'close') {
             this.closeDialog()
@@ -363,10 +403,12 @@
       handleBalance: function (balancing, readonly) {
         this.service = balancing.service
         this.application = balancing.application
-        delete balancing.service
-        delete balancing.application
-        delete balancing.id
-        this.ruleText = yaml.safeDump(balancing)
+        // delete balancing.service
+        // delete balancing.application
+        // delete balancing.id
+        // this.ruleText = yaml.safeDump(balancing)
+        this.rule.method = balancing.methodName
+        this.rule.strategy = balancing.strategy
         this.readonly = readonly
         this.dialog = true
       },
diff --git a/dubbo-admin-frontend/src/components/governance/WeightAdjust.vue b/dubbo-admin-frontend/src/components/governance/WeightAdjust.vue
index b5332cc..60515cd 100644
--- a/dubbo-admin-frontend/src/components/governance/WeightAdjust.vue
+++ b/dubbo-admin-frontend/src/components/governance/WeightAdjust.vue
@@ -118,16 +118,33 @@
             label="Service Unique ID"
             :hint="$t('serviceIdHint')"
             v-model="service"
+            :readonly="readonly"
           ></v-text-field>
           <v-text-field
             :label="$t('appName')"
             :hint="$t('appNameHint')"
             v-model="application"
+            :readonly="readonly"
           ></v-text-field>
-          <v-subheader class="pa-0 mt-3">{{$t('ruleContent')}}</v-subheader>
-
-          <ace-editor v-model="ruleText" :readonly="readonly"></ace-editor>
-
+          <v-layout row justify-space-between>
+            <v-flex >
+              <v-text-field
+                :label="$t('weight')"
+                :hint="$t('weightHint')"
+                v-model="rule.weight"
+                :readonly="readonly"
+              ></v-text-field>
+            </v-flex>
+            <v-spacer></v-spacer>
+            <v-flex>
+              <v-text-field
+                :label="$t('address')"
+                :hint="$t('weightAddressHint')"
+                v-model="rule.address"
+                :readonly="readonly"
+              ></v-text-field>
+            </v-flex>
+          </v-layout>
         </v-card-text>
         <v-card-actions>
           <v-spacer></v-spacer>
@@ -154,7 +171,6 @@
 
 <script>
   import AceEditor from '@/components/public/AceEditor'
-  import yaml from 'js-yaml'
   import Search from '@/components/public/Search'
   export default {
     components: {
@@ -181,9 +197,9 @@
       warnStatus: {},
       height: 0,
       operations: [
-        {id: 0, icon: 'visibility', tooltip: 'View'},
-        {id: 1, icon: 'edit', tooltip: 'Edit'},
-        {id: 3, icon: 'delete', tooltip: 'Delete'}
+        {id: 0, icon: 'visibility', tooltip: 'view'},
+        {id: 1, icon: 'edit', tooltip: 'edit'},
+        {id: 3, icon: 'delete', tooltip: 'delete'}
       ],
       weights: [
       ],
@@ -193,6 +209,10 @@
         '  - 192.168.0.1\n' +
         '  - 192.168.0.2',
       ruleText: '',
+      rule: {
+        weight: 100,
+        address: ''
+      },
       readonly: false,
       serviceHeaders: [],
       appHeaders: []
@@ -261,6 +281,8 @@
       },
       closeDialog: function () {
         this.ruleText = this.template
+        this.rule.address = ''
+        this.rule.weight = 100
         this.service = ''
         this.dialog = false
         this.readonly = false
@@ -280,13 +302,16 @@
         this.warn = false
       },
       saveItem: function () {
-        let weight = yaml.safeLoad(this.ruleText)
+        let weight = {}
+        // let weight = yaml.safeLoad(this.ruleText)
         if (!this.service && !this.application) {
           this.$notify.error('Either service or application is needed')
           return
         }
         weight.service = this.service
         weight.application = this.application
+        weight.weight = this.rule.weight
+        weight.addresses = this.rule.address.split(',')
         let vm = this
         if (this.updateId) {
           if (this.updateId === 'close') {
@@ -365,9 +390,11 @@
       handleWeight: function (weight, readonly) {
         this.service = weight.service
         this.application = weight.application
-        delete weight.service
-        delete weight.application
-        this.ruleText = yaml.safeDump(weight)
+        // delete weight.service
+        // delete weight.application
+        // this.ruleText = yaml.safeDump(weight)
+        this.rule.weight = weight.weight
+        this.rule.address = weight.addresses.join(',')
         this.readonly = readonly
         this.dialog = true
       },
diff --git a/dubbo-admin-frontend/src/lang/en.js b/dubbo-admin-frontend/src/lang/en.js
index 028a760..520e144 100644
--- a/dubbo-admin-frontend/src/lang/en.js
+++ b/dubbo-admin-frontend/src/lang/en.js
@@ -47,9 +47,9 @@
   method: 'Method',
   weight: 'Weight',
   create: 'CREATE',
-  save: 'Save',
+  save: 'SAVE',
   cancel: 'CANCEL',
-  close: 'Close',
+  close: 'CLOSE',
   confirm: 'CONFIRM',
   ruleContent: 'RULE CONTENT',
   createNewRoutingRule: 'Create New Routing Rule',
@@ -79,5 +79,15 @@
   parameterList: 'parameterList',
   returnType: 'returnType',
   here: 'here',
-  configAddress: 'https://github.com/apache/incubator-dubbo-ops/wiki/Dubbo-Admin-configuration'
+  configAddress: 'https://github.com/apache/incubator-dubbo-ops/wiki/Dubbo-Admin-configuration',
+  whiteList: 'White List',
+  whiteListHint: 'White list IP address, divided by comma: 1.1.1.1,2.2.2.2',
+  blackList: 'Black List',
+  blackListHint: 'Black list IP address, divided by comma: 3.3.3.3,4.4.4.4',
+  address: 'Address',
+  weightAddressHint: 'IP addresses to set this weight, divided by comma: 1.1.1.1,2.2.2.2',
+  weightHint: 'weight value, default is 100',
+  methodHint: 'choose method of load balancing, * for all methods',
+  strategy: 'Strategy',
+  balanceStrategyHint: 'load balancing strategy'
 }
diff --git a/dubbo-admin-frontend/src/lang/zh.js b/dubbo-admin-frontend/src/lang/zh.js
index b4acdeb..490afac 100644
--- a/dubbo-admin-frontend/src/lang/zh.js
+++ b/dubbo-admin-frontend/src/lang/zh.js
@@ -79,5 +79,15 @@
   returnType: '返回值',
   noMetadataHint: '无元数据信息,请升级至Dubbo2.7及以上版本,或者查看application.properties中关于config center的配置,详见',
   here: '这里',
-  configAddress: 'https://github.com/apache/incubator-dubbo-ops/wiki/Dubbo-Admin%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E'
+  configAddress: 'https://github.com/apache/incubator-dubbo-ops/wiki/Dubbo-Admin%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E',
+  whiteList: '白名单',
+  whiteListHint: '白名单IP列表, 多个地址用逗号分隔: 1.1.1.1,2.2.2.2',
+  blackList: '黑名单',
+  blackListHint: '黑名单IP列表, 多个地址用逗号分隔: 3.3.3.3,4.4.4.4',
+  address: '地址列表',
+  weightAddressHint: '此权重设置的IP地址,用逗号分隔: 1.1.1.1,2.2.2.2',
+  weightHint: '权重值,默认100',
+  methodHint: '负载均衡生效的方法,*代表所有方法',
+  strategy: '策略',
+  balanceStrategyHint: '负载均衡策略'
 }