Make Admin easier to deploy  (#940)

diff --git a/README.md b/README.md
index 20b1122..8f83010 100644
--- a/README.md
+++ b/README.md
@@ -7,48 +7,183 @@
 [![Percentage of issues still open](http://isitmaintained.com/badge/open/apache/dubbo-admin.svg)](http://isitmaintained.com/project/apache/dubbo-admin "Percentage of issues still open")
 
 [中文说明](README_ZH.md)
-### Quick start
 
-* prebuilt docker image https://hub.docker.com/r/apache/dubbo-admin
-* quick start a live demo with [play-with-docker](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/apache/dubbo-admin/develop/docker/stack.yml#) (version:0.3.0)
-
-### Screenshot
+Dubbo Admin is a console for better visualization of Dubbo services, it provides fully support for Dubbo3 and is compatible with 2.7.x, 2.6.x and 2.5.x.
 
 ![index](https://raw.githubusercontent.com/apache/dubbo-admin/develop/doc/images/index.png)
 
-### Service Governance  
-service governance follows the version of Dubbo 2.7, and compatible for Dubbo 2.6, please refer to [here](https://github.com/apache/dubbo-admin/wiki/The-compatibility-of-service-governance)
-### admin UI
+# 1 Quick start
+There are 4 methods to run Dubbo Admin in production:
+
+1. [Run With Helm (Recommended)](#11-Run-With-Helm)
+2. [Run With Kubernetes](#12-Run-With-Kubernetes)
+3. [Run With Docker](#13-Run-With-Docker)
+4. [Run From Source Code](#14-Compile-From-Source)
+
+You can choose any of the above methods to run Admin based on your environment. Helm is recommended if your plan to run Admin in a Kubernetes cluster because it will have all the dependencies managed with only one command.
+
+## 1.1 Run With Helm
+
+There are two ways to deploy Dubbo Admin with helm depending on how you get the helm chart resources, both of them have the same effect.
+
+### 1.1.1 Run from helm chart sources
+**1. Get helm chart sources**
+
+Clone the Dubbo Admin repo:
+
+```sh
+$ git clone https://github.com/apache/dubbo-admin.git
+```
+
+From the repo's root directory, change your working directory to `deploy/helm/dubbo-admin`
+```sh
+$ cd /dubbo-admin/deploy/helm/dubbo-admin
+```
+**2. Install helm chart**
+
+```sh
+$ helm install dubbo-admin .
+```
+
+Or, if you need to customize the configuration Admin uses to let it connecting to the real registries or configuration centers, specify a customized configuration file using the `-f` helm option, for example, the following `value file` specifies registry, config-center and metadata addresses:
+
+Content of `properties.xml`:
+
+```xml
+properties: |
+  admin.registry.address=zookeeper://30.221.144.85:2181
+  admin.config-center=zookeeper://30.221.144.85:2181
+  admin.metadata-report.address=zookeeper://30.221.144.85:2181
+```
+
+`zookeeper://30.221.144.85:2181` should be a real address that is accessible from inside the kubernetes cluster.
+
+```sh
+$ helm install dubbo-admin -f properties.yaml .
+```
+
+The values specified in `properties` will override those in [application.properties](./dubbo-admin-server/src/main/resources/application.properties) of the Admin image. Despite `properties`, you can also set other values defined by Dubbo Admin helm.
+
+**3. Visit Dubbo Admin**
+
+Dubbo Admin should now has been successfully installed, run the following command:
+
+```sh
+$ kubectl --namespace default port-forward service/dubbo-admin 8080:8080
+```
+
+Or, you can choose to follow the command instructions from the helm installation process, it should be similar to the following:
+```sh
+export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=dubbo-admin,app.kubernetes.io/instance=dubbo-admin" -o jsonpath="{.items[0].metadata.name}")
+export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
+echo "Visit http://127.0.0.1:8080 to use your application"
+kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
+```
+
+Open browser and visit http://127.0.0.1:8080, default username and password are `root`
+
+### 1.1.2 Run from helm chart repository
+**1. Add helm chart repository (Currently not available)**
+
+```sh
+$ helm repo add dubbo-charts https://dubbo.apache.org/dubbo-charts
+$ helm repo update
+```
+
+**2. Install helm chart**
+```sh
+$ helm install dubbo-admin dubbo-charts/dubbo-admin
+```
+
+Check the corresponding chapter in [1.1.1 Run from helm chart sources](111-Run-from-helm-chart-sources) to see how to customize helm value.
+
+```sh
+$ helm install dubbo-admin -f properties.yaml dubbo-charts/dubbo-admin
+```
+
+**3. Visit Dubbo Admin**
+
+Dubbo Admin should now has been successfully installed, run the following command:
+
+```sh
+$ kubectl --namespace default port-forward service/dubbo-admin 8080:8080
+```
+
+Open browser and visit http://127.0.0.1:8080, default username and password are `root`
+
+## 1.2 Run With Kubernetes
+
+**1. Get Kubernetes manifests**
+```sh
+$ git clone https://github.com/apache/dubbo-admin.git
+```
+
+All we need from this step is the Admin kubernetes manifests in `deploy/k8s`
+
+But before you can apply the manifests, override the default value defined in [application.properties](./dubbo-admin-server/src/main/resources/application.properties) by adding items in `configmap.yaml`.
+
+```sh
+$ cd /dubbo-admin/deploy/k8s
+```
+
+**2. Deploy Dubbo Admin**
+```sh
+# Change configuration in ./deploy/application.yml before apply if necessary
+$ kubectl apply -f ./
+```
+
+**3. Visit Admin**
+```sh
+$ kubectl port-forward service dubbo-admin 8080:8080
+```
+
+Open web browser and visit `http://localhost:8080`, default username and password are `root`
+
+## 1.3 Run With Docker
+The prebuilt docker image is hosted at: https://hub.docker.com/repository/docker/apache/dubbo-admin
+
+You can run the image directly by mounting a volume from the host that contains an `application.properties` file with the accessible registry and config-center addresses specified.
+
+```sh
+$ docker run -it --rm -v /the/host/path/containing/properties:/config -p 8080:8080 apache/dubbo-admin
+```
+
+Replace `/the/host/path/containing/properties` with the actual host path (must be an absolute path) that points to a directory containing `application.properties`.
+
+Open web browser and visit `http://localhost:8080`, default username and password are `root`
+
+## 1.4 Compile From Source
+1. Clone source code on `develop` branch `git clone https://github.com/apache/dubbo-admin.git`
+2. Specify registry address in `dubbo-admin-server/src/main/resources/application.properties`
+3. Build
+    - `mvn clean package -Dmaven.test.skip=true`
+4. Start
+    * `mvn --projects dubbo-admin-server spring-boot:run`
+    OR
+    * `cd dubbo-admin-distribution/target`;   `java -jar dubbo-admin-0.1.jar`
+5. Visit `http://localhost:8080`, default username and password are `root`
+
+# 2. Want To Contribute
+
+Below contains the description of the project structure for developers who want to contribute to make Dubbo Admin better.
+
+## 2.1 Admin UI
 
 - [Vue.js](https://vuejs.org) and [Vue Cli](https://cli.vuejs.org/)
 - [dubbo-admin-ui/README.md](dubbo-admin-ui/README.md) for more detail
 - Set npm **proxy mirror**:
 
-  if you have network issue, you can set npm proxy mirror to speedup npm install:
+  If you have network issue, you can set npm proxy mirror to speedup npm install:
 
   add `registry=https://registry.npmmirror.com` to ~/.npmrc
 
-### admin Server
+## 2.2 Admin Server
 
 * Standard spring boot project
 * [configurations in application.properties](https://github.com/apache/dubbo-admin/wiki/Dubbo-Admin-configuration)
 
 
-### Production Setup
-
-1. Clone source code on develop branch `git clone https://github.com/apache/dubbo-admin.git`
-2. Specify registry address in `dubbo-admin-server/src/main/resources/application.properties`
-3. Build
-    - `mvn clean package -Dmaven.test.skip=true`
-4. Start 
-    * `mvn --projects dubbo-admin-server spring-boot:run`
-    OR
-    * `cd dubbo-admin-distribution/target`;   `java -jar dubbo-admin-0.1.jar`
-5. Visit `http://localhost:8080`
-6. Default username and password is `root`
----
-
-### Development Setup
+## 2.3 Setting up a local developing environment
 * Run admin server project
 
   backend is a standard spring boot project, you can run it in any java IDE
@@ -59,14 +194,9 @@
 
 * visit web page
 
-  visit `http://localhost:8081`, frontend supports hot reload.
-  
-### Swagger support
+  visit `http://localhost:8080`, frontend supports hot reload.
 
-Once deployed, you can check http://localhost:8080/swagger-ui.html to check all restful api and models
-
-
-### License
+# 3 License
 
 Apache Dubbo admin is under the Apache 2.0 license, Version 2.0.
 See [LICENSE](https://github.com/apache/dubbo-admin/blob/develop/LICENSE) for full license text.
diff --git a/README_ZH.md b/README_ZH.md
index 4d35128..d702df4 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -1,22 +1,175 @@
-# Dubbo控制台
+# Dubbo Admin
 
 [![Build Status](https://travis-ci.org/apache/dubbo-admin.svg?branch=develop)](https://travis-ci.org/apache/dubbo-admin)
 [![codecov](https://codecov.io/gh/apache/dubbo-admin/branch/develop/graph/badge.svg)](https://codecov.io/gh/apache/dubbo-admin/branches/develop)
 ![license](https://img.shields.io/github/license/apache/dubbo-admin.svg)
 
 [English version](README.md).
-### 快速开始
 
-* 预构建的Docker镜像 https://hub.docker.com/r/apache/dubbo-admin
-* 快速启动一个演示环境 [play-with-docker](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/apache/dubbo-admin/develop/docker/stack.yml#) (版本:0.3.0)
-
-### 页面截图
+Dubbo Admin 是一个控制台,为 Dubbo 集群提供更好可视化服务。Admin 支持 Dubbo3 并很好的兼容 2.7.x、2.6.x 和 2.5.x。
 
 ![index](https://raw.githubusercontent.com/apache/dubbo-admin/develop/doc/images/index.png)
 
-### 服务治理  
-服务治理的部分,按照Dubbo 2.7的格式进行配置,同时兼容Dubbo 2.6,详见[这里](https://github.com/apache/dubbo-admin/wiki/%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86%E5%85%BC%E5%AE%B9%E6%80%A7%E8%AF%B4%E6%98%8E)
-### 前端部分
+# 快速开始
+
+有四种将 Dubbo Admin 部署到生产环境的方式:
+
+1. [基于 Helm 运行 Admin (推荐)](#11-使用-Helm-文件)
+2. [基于 Kubernetes 运行 Admin](#12-使用-Kubernetes-文件)
+3. [基于 Docker 运行 Admin](#13-使用-Docker-文件)
+4. [基于源码打包运行 Admin](#14-通过源码打包运行)
+
+你可以基于自己的环境选择任一方式,其中,Helm 是推荐的安装方式,因为 Helm 可以做到一键安装,自动帮助管理所有 Admin 必须的生产环境依赖。
+
+## 1.1 使用 Helm 运行
+通过 Helm 运行 Admin 有两种方式,它们起到相同的效果,因此可以选择以下任意一种。
+
+### 1.1.1 基于 Chart 源文件运行 Admin
+**1. 下载 chart 源文件**
+
+克隆 Dubbo Admin 仓库源码:
+
+```sh
+$ git clone https://github.com/apache/dubbo-admin.git
+```
+
+从仓库根目录切换到以下目录 `deploy/helm/dubbo-admin`
+
+```sh
+$ cd dubbo-admin/deploy/helm/dubbo-admin
+```
+**2. 安装 helm chart**
+
+```sh
+$ helm install dubbo-admin .
+```
+
+或者,如果你想定制 Admin 的启动参数,以便让 Admin 连接到真实的生产环境注册中心或配置中心,可以通过以下 `-f` helm 参数指定自定义配置文件:
+
+properties.xml
+
+```xml
+properties: |
+  admin.registry.address=zookeeper://30.221.144.85:2181
+  admin.config-center=zookeeper://30.221.144.85:2181
+  admin.metadata-report.address=zookeeper://30.221.144.85:2181
+```
+
+`zookeeper://30.221.144.85:2181` 是可以在 Kubernetes 集群内被访问到的真实地址。
+
+```sh
+$ helm install dubbo-admin -f properties.yaml .
+```
+
+`properties` 字段指定的内容将会覆盖 Admin 镜像中 [application.properties](./dubbo-admin-server/src/main/resources/application.properties) 指定的默认配置,除了 `properties` 之外,还可以定制 Admin helm chart 定义的其他属性,这里是可供使用的[完整参数](./deploy/helm/dubbo-admin/values.yaml)。
+
+**3. 访问 Admin**
+
+Dubbo Admin 现在应该已经成功安装,运行以下命令获得访问地址:
+
+```sh
+$ kubectl --namespace default port-forward service/dubbo-admin 8080:8080
+```
+
+或者,你可以参考执行 helm 安装后给出的提示命令,类似如下:
+```sh
+export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=dubbo-admin,app.kubernetes.io/instance=dubbo-admin" -o jsonpath="{.items[0].metadata.name}")
+export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
+echo "Visit http://127.0.0.1:8080 to use your application"
+kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
+```
+
+打开浏览器并访问 http://127.0.0.1:8080,默认的 username 和 password 是 `root`
+
+### 1.1.2 基于 Chart 仓库运行 Admin
+
+**1. 添加 helm chart 仓库 (暂时不可用)**
+
+```sh
+$ helm repo add dubbo-charts https://dubbo.apache.org/dubbo-charts
+$ helm repo update
+```
+
+**2. 安装 helm chart**
+```sh
+$ helm install dubbo-admin dubbo-charts/dubbo-admin
+```
+
+参考 [1.1.1 基于 Chart 源文件运行 Admin](1.1.1-Run-from-helm-chart-sources) 中相应环节了解如何定制安装参数
+
+```sh
+$ helm install dubbo-admin -f properties.yaml dubbo-charts/dubbo-admin
+```
+
+**3. 访问 Dubbo Admin**
+
+Dubbo Admin 现在应该已经成功安装,运行以下命令获得访问地址:
+
+```sh
+$ kubectl --namespace default port-forward service/dubbo-admin 8080:8080
+```
+
+打开浏览器并访问 http://127.0.0.1:8080,默认的 username 和 password 是 `root`
+
+## 1.2 使用 Kubernetes 运行
+
+**1. 下载 Kubernetes manifests**
+```sh
+$ git clone https://github.com/apache/dubbo-admin.git
+```
+
+切换到 `deploy/k8s` 目录可以看到 Admin kubernetes 资源文件
+```sh
+$ cd /dubbo-admin/deploy/k8s
+```
+
+**2. 部署 Dubbo Admin**
+
+首先,请参照[application.properties](./dubbo-admin-server/src/main/resources/application.properties) 修改 `configmap.yml` 中的参数配置,只定义要覆盖参数即可。
+
+执行以下命令:
+
+```sh
+$ kubectl apply -f ./
+```
+
+**3. 访问 Admin**
+```sh
+$ kubectl port-forward service dubbo-admin 8080:8080
+```
+
+打开浏览器并访问 `http://localhost:8080`, 默认 username 和 password 是 `root`
+
+## 1.3 使用 Docker 运行
+预先定义的 Admin 镜像托管在: https://hub.docker.com/repository/docker/apache/dubbo-admin
+
+可以直接运行镜像来部署 Admin,并通过绑定宿主机上的 `application.properties` 文件定制镜像默认参数,如注册中心、配置中心地址等。
+
+```sh
+$ docker run -it --rm -v /the/host/path/containing/properties:/config -p 8080:8080 apache/dubbo-admin
+```
+
+将 `/the/host/path/containing/properties` 替换为宿主机上包含 `application.properties` 文件的实际路径(必须是一个有效目录的绝对路径)。
+
+打开浏览器并访问 `http://localhost:8080`, 默认 username 和 password 是 `root`
+
+## 1.4 通过源码打包运行
+
+1. 下载代码: `git clone https://github.com/apache/dubbo-admin.git`
+2. 在 `dubbo-admin-server/src/main/resources/application.properties`中指定注册中心地址
+3. 构建
+    - `mvn clean package -Dmaven.test.skip=true`
+4. 启动
+    * `mvn --projects dubbo-admin-server spring-boot:run`
+    或者
+    * `cd dubbo-admin-distribution/target; java -jar dubbo-admin-${project.version}.jar`
+5. 访问 `http://localhost:8080`
+
+# 2 参与项目贡献
+
+以下是项目架构介绍,适合想贡献源码的开发者阅读。
+
+## 2.1 前端部分
 
 - 使用[Vue.js](https://vuejs.org)作为javascript框架
 - [dubbo-admin-ui/README.md](dubbo-admin-ui/README.md)中有更详细的介绍
@@ -26,26 +179,12 @@
 
     在~/.npmrc中增加 `registry=https://registry.npmmirror.com`
 
-### 后端部分
+## 2.2 后端部分
 
 * 标准spring boot工程
-* [application.properties配置说明](https://github.com/apache/dubbo-admin/wiki/Dubbo-Admin%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E)  
+* [application.properties配置说明](https://github.com/apache/dubbo-admin/wiki/Dubbo-Admin%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E)
 
-
-### 生产环境配置
-
-1. 下载代码: `git clone https://github.com/apache/dubbo-admin.git`
-2. 在 `dubbo-admin-server/src/main/resources/application.properties`中指定注册中心地址
-3. 构建
-    - `mvn clean package -Dmaven.test.skip=true`
-4. 启动 
-    * `mvn --projects dubbo-admin-server spring-boot:run`
-    或者
-    * `cd dubbo-admin-distribution/target; java -jar dubbo-admin-0.1.jar`
-5. 访问 `http://localhost:8080`
----
-
-### 开发环境配置
+### 2.2.1 开发环境配置
 * 运行`dubbo admin server`
 
   `dubbo admin server`是一个标准的spring boot项目, 可以在任何java IDE中运行它
@@ -56,8 +195,8 @@
 
 * 页面访问
 
-  访问 `http://localhost:8081`, 由于前后端分开部署,前端支持热加载,任何页面的修改都可以实时反馈,不需要重启应用。
+  访问 `http://localhost:8080`, 由于前后端分开部署,前端支持热加载,任何页面的修改都可以实时反馈,不需要重启应用。
 
-### Swagger 支持
+### 2.2.2 Swagger 支持
 
 部署完成后,可以访问 http://localhost:8080/swagger-ui.html 来查看所有的restful api
diff --git a/deploy/helm/dubbo-admin/.helmignore b/deploy/helm/dubbo-admin/.helmignore
new file mode 100644
index 0000000..0e8a0eb
--- /dev/null
+++ b/deploy/helm/dubbo-admin/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/deploy/helm/dubbo-admin/Chart.yaml b/deploy/helm/dubbo-admin/Chart.yaml
new file mode 100644
index 0000000..3d14511
--- /dev/null
+++ b/deploy/helm/dubbo-admin/Chart.yaml
@@ -0,0 +1,24 @@
+apiVersion: v2
+name: dubbo-admin
+description: A Helm chart for Kubernetes
+
+# A chart can be either an 'application' or a 'library' chart.
+#
+# Application charts are a collection of templates that can be packaged into versioned archives
+# to be deployed.
+#
+# Library charts provide useful utilities or functions for the chart developer. They're included as
+# a dependency of application charts to inject those utilities and functions into the rendering
+# pipeline. Library charts do not define any templates and therefore cannot be deployed.
+type: application
+
+# This is the chart version. This version number should be incremented each time you make changes
+# to the chart and its templates, including the app version.
+# Versions are expected to follow Semantic Versioning (https://semver.org/)
+version: 0.1.0
+
+# This is the version number of the application being deployed. This version number should be
+# incremented each time you make changes to the application. Versions are not expected to
+# follow Semantic Versioning. They should reflect the version the application is using.
+# It is recommended to use it with quotes.
+appVersion: "1.16.0"
diff --git a/deploy/helm/dubbo-admin/templates/NOTES.txt b/deploy/helm/dubbo-admin/templates/NOTES.txt
new file mode 100644
index 0000000..ca484a3
--- /dev/null
+++ b/deploy/helm/dubbo-admin/templates/NOTES.txt
@@ -0,0 +1,22 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range $host := .Values.ingress.hosts }}
+  {{- range .paths }}
+  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
+  {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "dubbo-admin.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "dubbo-admin.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "dubbo-admin.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
+  echo http://$SERVICE_IP:{{ .Values.service.port }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "dubbo-admin.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
+{{- end }}
diff --git a/deploy/helm/dubbo-admin/templates/_helpers.tpl b/deploy/helm/dubbo-admin/templates/_helpers.tpl
new file mode 100644
index 0000000..004d964
--- /dev/null
+++ b/deploy/helm/dubbo-admin/templates/_helpers.tpl
@@ -0,0 +1,62 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "dubbo-admin.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "dubbo-admin.fullname" -}}
+{{- if .Values.fullnameOverride }}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "dubbo-admin.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "dubbo-admin.labels" -}}
+helm.sh/chart: {{ include "dubbo-admin.chart" . }}
+{{ include "dubbo-admin.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "dubbo-admin.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "dubbo-admin.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "dubbo-admin.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create }}
+{{- default (include "dubbo-admin.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }}
diff --git a/deploy/helm/dubbo-admin/templates/configmap.yaml b/deploy/helm/dubbo-admin/templates/configmap.yaml
new file mode 100644
index 0000000..c853957
--- /dev/null
+++ b/deploy/helm/dubbo-admin/templates/configmap.yaml
@@ -0,0 +1,6 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ .Chart.Name }}
+data:
+  application.properties: {{ .Values.properties | toYaml | indent 1 }}
diff --git a/deploy/helm/dubbo-admin/templates/deployment.yaml b/deploy/helm/dubbo-admin/templates/deployment.yaml
new file mode 100644
index 0000000..d9eaa80
--- /dev/null
+++ b/deploy/helm/dubbo-admin/templates/deployment.yaml
@@ -0,0 +1,39 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  labels:
+    app: {{ .Chart.Name }}
+  name: {{ .Chart.Name }}
+spec:
+  replicas: {{ .Values.replicaCount }}
+  selector:
+    matchLabels:
+      app: {{ .Chart.Name }}
+  template:
+    metadata:
+      labels:
+        app: {{ .Chart.Name }}
+    spec:
+      containers:
+        - name: {{ .Chart.Name }}
+          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          ports:
+            - containerPort: 8080
+              protocol: TCP
+              name: http
+          volumeMounts:
+            - mountPath: /config
+              name: application-properties
+          livenessProbe:
+            httpGet:
+              path: /
+              port: http
+          readinessProbe:
+            httpGet:
+              path: /
+              port: http
+      volumes:
+        - name: application-properties
+          configMap:
+            name: dubbo-admin
diff --git a/deploy/helm/dubbo-admin/templates/ingress.yaml b/deploy/helm/dubbo-admin/templates/ingress.yaml
new file mode 100644
index 0000000..3b15118
--- /dev/null
+++ b/deploy/helm/dubbo-admin/templates/ingress.yaml
@@ -0,0 +1,61 @@
+{{- if .Values.ingress.enabled -}}
+{{- $fullName := include "dubbo-admin.fullname" . -}}
+{{- $svcPort := .Values.service.port -}}
+{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
+  {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
+  {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
+  {{- end }}
+{{- end }}
+{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
+apiVersion: networking.k8s.io/v1
+{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+apiVersion: networking.k8s.io/v1beta1
+{{- else -}}
+apiVersion: extensions/v1beta1
+{{- end }}
+kind: Ingress
+metadata:
+  name: {{ $fullName }}
+  labels:
+    {{- include "dubbo-admin.labels" . | nindent 4 }}
+  {{- with .Values.ingress.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+spec:
+  {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
+  ingressClassName: {{ .Values.ingress.className }}
+  {{- end }}
+  {{- if .Values.ingress.tls }}
+  tls:
+    {{- range .Values.ingress.tls }}
+    - hosts:
+        {{- range .hosts }}
+        - {{ . | quote }}
+        {{- end }}
+      secretName: {{ .secretName }}
+    {{- end }}
+  {{- end }}
+  rules:
+    {{- range .Values.ingress.hosts }}
+    - host: {{ .host | quote }}
+      http:
+        paths:
+          {{- range .paths }}
+          - path: {{ .path }}
+            {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
+            pathType: {{ .pathType }}
+            {{- end }}
+            backend:
+              {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
+              service:
+                name: {{ $fullName }}
+                port:
+                  number: {{ $svcPort }}
+              {{- else }}
+              serviceName: {{ $fullName }}
+              servicePort: {{ $svcPort }}
+              {{- end }}
+          {{- end }}
+    {{- end }}
+{{- end }}
diff --git a/deploy/helm/dubbo-admin/templates/service.yaml b/deploy/helm/dubbo-admin/templates/service.yaml
new file mode 100644
index 0000000..cee869a
--- /dev/null
+++ b/deploy/helm/dubbo-admin/templates/service.yaml
@@ -0,0 +1,13 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "dubbo-admin.fullname" . }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    - port: {{ .Values.service.port }}
+      targetPort: http
+      protocol: TCP
+      name: http
+  selector:
+   app: {{ .Chart.Name }}
diff --git a/deploy/helm/dubbo-admin/templates/serviceaccount.yaml b/deploy/helm/dubbo-admin/templates/serviceaccount.yaml
new file mode 100644
index 0000000..9986487
--- /dev/null
+++ b/deploy/helm/dubbo-admin/templates/serviceaccount.yaml
@@ -0,0 +1,12 @@
+{{- if .Values.serviceAccount.create -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ include "dubbo-admin.serviceAccountName" . }}
+  labels:
+    {{- include "dubbo-admin.labels" . | nindent 4 }}
+  {{- with .Values.serviceAccount.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+{{- end }}
diff --git a/deploy/helm/dubbo-admin/templates/tests/test-connection.yaml b/deploy/helm/dubbo-admin/templates/tests/test-connection.yaml
new file mode 100644
index 0000000..ce40f40
--- /dev/null
+++ b/deploy/helm/dubbo-admin/templates/tests/test-connection.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Pod
+metadata:
+  name: "{{ include "dubbo-admin.fullname" . }}-test-connection"
+  labels:
+    {{- include "dubbo-admin.labels" . | nindent 4 }}
+  annotations:
+    "helm.sh/hook": test
+spec:
+  containers:
+    - name: wget
+      image: busybox
+      command: ['wget']
+      args: ['{{ include "dubbo-admin.fullname" . }}:{{ .Values.service.port }}']
+  restartPolicy: Never
diff --git a/deploy/helm/dubbo-admin/values.yaml b/deploy/helm/dubbo-admin/values.yaml
new file mode 100644
index 0000000..7a1d7df
--- /dev/null
+++ b/deploy/helm/dubbo-admin/values.yaml
@@ -0,0 +1,69 @@
+# Default values for dubbo-admin.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+replicaCount: 2
+
+image:
+  repository: apache/dubbo-admin
+  pullPolicy: IfNotPresent
+  # Overrides the image tag whose default is the chart appVersion.
+  tag: "0.5.0-SNAPSHOT"
+
+imagePullSecrets: []
+nameOverride: ""
+fullnameOverride: ""
+
+serviceAccount:
+  # Specifies whether a service account should be created
+  create: true
+  # Annotations to add to the service account
+  annotations: {}
+  # The name of the service account to use.
+  # If not set and create is true, a name is generated using the fullname template
+  name: ""
+
+
+podAnnotations: {}
+
+podSecurityContext: {}
+  # fsGroup: 2000
+
+securityContext: {}
+  # capabilities:
+  #   drop:
+  #   - ALL
+  # readOnlyRootFilesystem: true
+  # runAsNonRoot: true
+  # runAsUser: 1000
+
+service:
+  type: ClusterIP
+  port: 8080
+
+ingress:
+  enabled: false
+  className: ""
+  annotations: {}
+    # kubernetes.io/ingress.class: nginx
+  # kubernetes.io/tls-acme: "true"
+  hosts:
+    - host: dubbo.local
+      paths:
+        - path: /
+          pathType: ImplementationSpecific
+  tls: []
+  #  - secretName: chart-example-tls
+  #    hosts:
+  #      - chart-example.local
+
+autoscaling:
+  enabled: false
+  minReplicas: 1
+  maxReplicas: 100
+  targetCPUUtilizationPercentage: 80
+  # targetMemoryUtilizationPercentage: 80
+
+properties: |
+  dubbo.application.name=dubbo-admin
+
diff --git a/deploy/k8s/configmap.yaml b/deploy/k8s/configmap.yaml
new file mode 100644
index 0000000..dba952d
--- /dev/null
+++ b/deploy/k8s/configmap.yaml
@@ -0,0 +1,11 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: dubbo-admin
+data:
+  # Set the properties you want to override, properties not set here will be using the default values
+  # check application.properties inside dubbo-admin project for the keys supported
+  application.properties: |
+    admin.registry.address=zookeeper://127.0.0.1:2181
+    admin.config-center=zookeeper://127.0.0.1:2181
+    admin.metadata-report.address=zookeeper://127.0.0.1:2181
diff --git a/deploy/k8s/deployment.yaml b/deploy/k8s/deployment.yaml
new file mode 100644
index 0000000..0cddb9d
--- /dev/null
+++ b/deploy/k8s/deployment.yaml
@@ -0,0 +1,28 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  labels:
+    app: dubbo-admin
+  name: dubbo-admin
+spec:
+  replicas: 2
+  selector:
+    matchLabels:
+      app: dubbo-admin
+  template:
+    metadata:
+      labels:
+        app: dubbo-admin
+    spec:
+      containers:
+      - image: apache/dubbo-admin:latest
+        name: dubbo-admin
+        ports:
+          - containerPort: 8080
+        volumeMounts:
+        - mountPath: /config
+          name: application-properties
+      volumes:
+      - name: application-properties
+        configMap:
+          name: dubbo-admin
\ No newline at end of file
diff --git a/deploy/k8s/service.yaml b/deploy/k8s/service.yaml
new file mode 100644
index 0000000..a3e8252
--- /dev/null
+++ b/deploy/k8s/service.yaml
@@ -0,0 +1,11 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: dubbo-admin
+spec:
+  selector:
+    app: dubbo-admin
+  ports:
+    - protocol: TCP
+      port: 8080
+      targetPort: 8080
\ No newline at end of file
diff --git a/docker/latest/Dockerfile b/docker/latest/Dockerfile
index a4e4f75..d9f8696 100644
--- a/docker/latest/Dockerfile
+++ b/docker/latest/Dockerfile
@@ -22,7 +22,7 @@
 FROM openjdk:8-jre
 LABEL maintainer="dev@dubbo.apache.org"
 RUN apt-get update && apt-get install -y tini
-COPY --from=0 /source/dubbo-admin-snapshot/dubbo-admin-distribution/target/dubbo-admin-0.3.0-SNAPSHOT.jar /app.jar
+COPY --from=0 /source/dubbo-admin-snapshot/dubbo-admin-distribution/target/dubbo-admin-0.5.0-SNAPSHOT.jar /app.jar
 COPY --from=0 /source/dubbo-admin-snapshot/docker/entrypoint.sh /usr/local/bin/entrypoint.sh
 
 ENV JAVA_OPTS "-Dloader.path=/opt-libs"
diff --git a/dubbo-admin-distribution/src/bin/config/application.properties b/dubbo-admin-distribution/src/bin/config/application.properties
index 232b05e..618a2b0 100644
--- a/dubbo-admin-distribution/src/bin/config/application.properties
+++ b/dubbo-admin-distribution/src/bin/config/application.properties
@@ -78,4 +78,6 @@
 spring.datasource.password=
 
 # id generate type
-mybatis-plus.global-config.db-config.id-type=none
\ No newline at end of file
+mybatis-plus.global-config.db-config.id-type=none
+
+dubbo.application.logger=slf4j
\ No newline at end of file
diff --git a/dubbo-admin-server/pom.xml b/dubbo-admin-server/pom.xml
index f03e523..872c81c 100644
--- a/dubbo-admin-server/pom.xml
+++ b/dubbo-admin-server/pom.xml
@@ -41,6 +41,12 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.logging.log4j</groupId>
+                    <artifactId>log4j-to-slf4j</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>
@@ -189,6 +195,16 @@
         <dependency>
             <groupId>org.apache.zookeeper</groupId>
             <artifactId>zookeeper</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>log4j</groupId>
+                    <artifactId>log4j</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <!--JWT-->
@@ -233,6 +249,22 @@
             <groupId>javax.xml.bind</groupId>
             <artifactId>jaxb-api</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.25</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>1.2.3</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>1.2.3</version>
+        </dependency>
     </dependencies>
 
     <build>
@@ -326,12 +358,12 @@
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-jar-plugin</artifactId>
-                        <configuration>
-                            <excludes>
-                                <exclude>**/application.properties</exclude>
-                                <exclude>**/application-test.properties</exclude>
-                            </excludes>
-                        </configuration>
+<!--                        <configuration>-->
+<!--                            <excludes>-->
+<!--                                <exclude>**/application.properties</exclude>-->
+<!--                                <exclude>**/application-test.properties</exclude>-->
+<!--                            </excludes>-->
+<!--                        </configuration>-->
                     </plugin>
                 </plugins>
             </build>
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
index f354d6d..6be548a 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/ConfigCenter.java
@@ -105,6 +105,7 @@
 
         if (StringUtils.isNotEmpty(configCenter)) {
             configCenterUrl = formUrl(configCenter, configCenterGroup, configCenterGroupNameSpace, username, password);
+            logger.info("Admin using config center: " + configCenterUrl);
             dynamicConfiguration = ExtensionLoader.getExtensionLoader(GovernanceConfiguration.class).getDefaultExtension();
             dynamicConfiguration.setUrl(configCenterUrl);
             dynamicConfiguration.init();
@@ -118,6 +119,8 @@
                     } else if (s.startsWith(Constants.METADATA_ADDRESS)) {
                         metadataUrl = formUrl(removerConfigKey(s), metadataGroup, metadataGroupNameSpace, username, password);
                     }
+                    logger.info("Registry address found from config center: " + registryUrl);
+                    logger.info("Metadata address found from config center: " + registryUrl);
                 });
             }
         }
@@ -127,9 +130,9 @@
                 dynamicConfiguration = ExtensionLoader.getExtensionLoader(GovernanceConfiguration.class).getDefaultExtension();
                 dynamicConfiguration.setUrl(registryUrl);
                 dynamicConfiguration.init();
-                logger.warn("you are using dubbo.registry.address, which is not recommend, please refer to: https://github.com/apache/incubator-dubbo-admin/wiki/Dubbo-Admin-configuration");
+                logger.warn("you are using dubbo.registry.address, which is not recommend, please refer to: https://github.com/apache/dubbo-admin/wiki/Dubbo-Admin-configuration");
             } else {
-                throw new ConfigurationException("Either config center or registry address is needed, please refer to https://github.com/apache/incubator-dubbo-admin/wiki/Dubbo-Admin-configuration");
+                throw new ConfigurationException("Either config center or registry address is needed, please refer to https://github.com/apache/dubbo-admin/wiki/Dubbo-Admin-configuration");
                 //throw exception
             }
         }
@@ -145,10 +148,13 @@
         Registry registry = null;
         if (registryUrl == null) {
             if (StringUtils.isBlank(registryAddress)) {
-                throw new ConfigurationException("Either config center or registry address is needed, please refer to https://github.com/apache/incubator-dubbo-admin/wiki/Dubbo-Admin-configuration");
+                throw new ConfigurationException("Either config center or registry address is needed, please refer to https://github.com/apache/dubbo-admin/wiki/Dubbo-Admin-configuration");
             }
             registryUrl = formUrl(registryAddress, registryGroup, registryNameSpace, username, password);
         }
+
+        logger.info("Admin using registry address: " + registryUrl);
+
         RegistryFactory registryFactory = ApplicationModel.defaultModel().getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
         registry = registryFactory.getRegistry(registryUrl.addParameter(ENABLE_EMPTY_PROTECTION_KEY, String.valueOf(false)));
         return registry;
@@ -166,13 +172,14 @@
                 metadataUrl = formUrl(metadataAddress, metadataGroup, metadataGroupNameSpace, username, password);
                 metadataUrl = metadataUrl.addParameter(CLUSTER_KEY, cluster);
             }
+            logger.info("Admin using metadata address: " + metadataUrl);
         }
         if (metadataUrl != null) {
             metaDataCollector = ApplicationModel.defaultModel().getExtensionLoader(MetaDataCollector.class).getExtension(metadataUrl.getProtocol());
             metaDataCollector.setUrl(metadataUrl);
             metaDataCollector.init();
         } else {
-            logger.warn("you are using dubbo.registry.address, which is not recommend, please refer to: https://github.com/apache/incubator-dubbo-admin/wiki/Dubbo-Admin-configuration");
+            logger.warn("you are using dubbo.registry.address, which is not recommend, please refer to: https://github.com/apache/dubbo-admin/wiki/Dubbo-Admin-configuration");
         }
         return metaDataCollector;
     }
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/SwaggerConfiguration.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/SwaggerConfiguration.java
index ef44250..c198c72 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/SwaggerConfiguration.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/config/SwaggerConfiguration.java
@@ -45,7 +45,7 @@
     private ApiInfo apiInfo() {
         return new ApiInfoBuilder()
                 .title("dubbo admin swagger api")
-                .description("for more information please visit github page: https://github.com/apache/incubator-dubbo-admin")
+                .description("for more information please visit github page: https://github.com/apache/dubbo-admin")
                 .version("1.0")
                 .build();
     }
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/mapping/AdminServiceInstancesChangedListener.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/mapping/AdminServiceInstancesChangedListener.java
index 1afde55..6d69e14 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/mapping/AdminServiceInstancesChangedListener.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/registry/mapping/AdminServiceInstancesChangedListener.java
@@ -26,12 +26,13 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 public class AdminServiceInstancesChangedListener extends ServiceInstancesChangedListener {
 
     private AddressChangeListener addressChangeListener;
 
-    private Map<String, Object> oldServiceUrls;
+    private Map<String, List<ServiceInstancesChangedListener.ProtocolServiceKeyWithUrls>> oldServiceUrls;
 
     public AdminServiceInstancesChangedListener(Set<String> serviceNames, ServiceDiscovery serviceDiscovery, AddressChangeListener addressChangeListener) {
         super(serviceNames, serviceDiscovery);
@@ -43,8 +44,14 @@
         oldServiceUrls.keySet().stream()
                 .filter(protocolServiceKey -> !serviceUrls.containsKey(protocolServiceKey))
                 .forEach(protocolServiceKey -> addressChangeListener.notifyAddressChanged(protocolServiceKey, new ArrayList<>()));
-        serviceUrls.forEach((protocolServiceKey, urls) -> addressChangeListener.notifyAddressChanged(protocolServiceKey, (List<URL>) urls));
+        serviceUrls.forEach((protocolServiceKey, urls) -> addressChangeListener.notifyAddressChanged(protocolServiceKey, extractUrls(urls)));
 
         oldServiceUrls = serviceUrls;
     }
+
+    private List<URL> extractUrls(List<ServiceInstancesChangedListener.ProtocolServiceKeyWithUrls> keyUrls) {
+        return keyUrls.stream()
+                .flatMap((protocolServiceKeyWithUrls) -> protocolServiceKeyWithUrls.getUrls().stream())
+                .collect(Collectors.toList());
+    }
 }
diff --git a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/InstanceRegistryCache.java b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/InstanceRegistryCache.java
index 520f0db..eb23879 100644
--- a/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/InstanceRegistryCache.java
+++ b/dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/InstanceRegistryCache.java
@@ -97,7 +97,7 @@
         origin.keySet().forEach(providers::remove);
 
         for (List<InstanceAddressURL> instanceAddressURLs : providers.values()) {
-            MetadataService metadataService = MetadataUtils.referProxy(instanceAddressURLs.get(0).getInstance());
+            MetadataService metadataService = MetadataUtils.referProxy(instanceAddressURLs.get(0).getInstance()).getProxy();
             try {
                 Set<String> subscribedURLs = metadataService.getSubscribedURLs();
 
diff --git a/dubbo-admin-server/src/main/resources/application.properties b/dubbo-admin-server/src/main/resources/application.properties
index 232b05e..618a2b0 100644
--- a/dubbo-admin-server/src/main/resources/application.properties
+++ b/dubbo-admin-server/src/main/resources/application.properties
@@ -78,4 +78,6 @@
 spring.datasource.password=
 
 # id generate type
-mybatis-plus.global-config.db-config.id-type=none
\ No newline at end of file
+mybatis-plus.global-config.db-config.id-type=none
+
+dubbo.application.logger=slf4j
\ No newline at end of file
diff --git a/dubbo-admin-server/src/main/resources/logback-spring.xml b/dubbo-admin-server/src/main/resources/logback-spring.xml
index 0e01216..ee7fd1d 100644
--- a/dubbo-admin-server/src/main/resources/logback-spring.xml
+++ b/dubbo-admin-server/src/main/resources/logback-spring.xml
@@ -24,6 +24,7 @@
     <include resource="org/springframework/boot/logging/logback/file-appender.xml"/>
 
     <logger name="org.apache" level="WARN"/>
+    <logger name="org.apache.dubbo" level="INFO"/>
 
     <appender name="FILE-LOG-ASYNC" class="ch.qos.logback.classic.AsyncAppender">
         <discardingThreshold>0</discardingThreshold>
diff --git a/dubbo-admin-ui/README.md b/dubbo-admin-ui/README.md
index fe8a2c1..6b5848a 100644
--- a/dubbo-admin-ui/README.md
+++ b/dubbo-admin-ui/README.md
@@ -1,6 +1,6 @@
 # dubbo-admin-ui
 
-> dubbo admin ui based on vuetify  
+> dubbo admin ui based on vuetify
 > standard front end project
 
 ## Build Setup
@@ -9,7 +9,7 @@
 # install dependencies
 npm install
 
-# serve with hot reload at localhost:8081
+# serve with hot reload at localhost:8080
 npm run dev
 
 # build for production with minification
diff --git a/dubbo-admin-ui/public/dubbo-admin-info.json b/dubbo-admin-ui/public/dubbo-admin-info.json
index 156772d..616e67f 100644
--- a/dubbo-admin-ui/public/dubbo-admin-info.json
+++ b/dubbo-admin-ui/public/dubbo-admin-info.json
@@ -1,3 +1,3 @@
 {
-  "version": "0.5.0"
+  "version": "0.5.0-SNAPSHOT"
 }
diff --git a/pom.xml b/pom.xml
index fec0211..98b2281 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,10 +53,10 @@
 	</repositories>
 
 	<properties>
-		<revision>0.5.0</revision>
+		<revision>0.5.0-SNAPSHOT</revision>
 		<main.basedir>${project.basedir}</main.basedir>
 		<commons-lang3-version>3.7</commons-lang3-version>
-		<dubbo-version>3.0.8</dubbo-version>
+		<dubbo-version>3.1.2</dubbo-version>
 		<fastjson-version>1.2.83</fastjson-version>
 		<springfox-swagger-version>2.9.2</springfox-swagger-version>
 		<jacoco-version>0.8.2</jacoco-version>
@@ -239,6 +239,7 @@
 										<exclude>**/node/**</exclude>
 										<exclude>**/dubbo-admin-info.json</exclude>
 										<exclude>.asf.yaml</exclude>
+										<exclude>deploy/**</exclude>
 									</excludes>
 								</configuration>
 							</execution>