| <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apache Dubbo – Admin 控制台操作手册</title><link>https://dubbo.apache.org/zh-cn/overview/reference/admin/</link><description>Recent content in Admin 控制台操作手册 on Apache Dubbo</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><atom:link href="https://dubbo.apache.org/zh-cn/overview/reference/admin/index.xml" rel="self" type="application/rss+xml"/><item><title>Overview: Admin 整体架构与安装步骤</title><link>https://dubbo.apache.org/zh-cn/overview/reference/admin/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/reference/admin/architecture/</guid><description> |
| <p>回顾 <a href="../../../what/overview/">Dubbo 服务治理体系的总体架构</a>,Admin 是服务治理控制面中的一个核心组件,负责微服务集群的服务治理、可视化展示等。</p> |
| <h2 id="admin-部署架构">Admin 部署架构</h2> |
| <p><img src="https://dubbo.apache.org/imgs/v3/reference/admin/admin-core-components.png" alt="admin-core-components.png"></p> |
| <p>总体上来说,Admin 部署架构分为以下几个部分:</p> |
| <ul> |
| <li>Admin 主进程,包括服务发现元数据管理、可视化控制台、安全认证策略管控、其他定制化服务治理能力等组件。</li> |
| <li>强依赖组件,包括 Mysql 数据库、注册/配置/元数据中心(可以是 Kubernetes、Nacos、Zookeeper 等)</li> |
| <li>可选依赖组件,包括 Prometheus、Grafana、Zipkin 等</li> |
| </ul> |
| <h2 id="安装-admin">安装 Admin</h2> |
| <h3 id="dubboctl-安装">Dubboctl 安装</h3> |
| <h4 id="download">Download</h4> |
| <p>当前Dubboctl未正式发行,可按以下方式进行尝试。 |
| 拉取Dubbo Admin并编译Dubboctl</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>git clone https://github.com/apache/dubbo-admin.git |
| </span></span><span style="display:flex;"><span><span style="color:#b58900">cd</span> dubbo-admin/cmd/dubboctl |
| </span></span><span style="display:flex;"><span>go build -o dubboctl . |
| </span></span></code></pre></div><p>将 dubboctl 放入可执行路径</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>ln -s dubbo-admin/cmd/dubboctl/dubboctl /usr/local/bin/dubboctl |
| </span></span></code></pre></div><h4 id="install">Install</h4> |
| <p>安装过程会依次:</p> |
| <ol> |
| <li>将用户自定义的配置profile以及set参数覆盖于默认profile,得到最终的profile</li> |
| </ol> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#586e75"># default profile</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">apiVersion</span>: dubbo.apache.org/v1alpha1 |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">kind</span>: DubboOperator |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">namespace</span>: dubbo-system |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">spec</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">profile</span>: default |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">namespace</span>: dubbo-system |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">componentsMeta</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">admin</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enabled</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">grafana</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enabled</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">repoURL</span>: https://grafana.github.io/helm-charts |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">version</span>: <span style="color:#2aa198">6.52.4</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">nacos</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enabled</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">zookeeper</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enabled</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">repoURL</span>: https://charts.bitnami.com/bitnami |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">version</span>: <span style="color:#2aa198">11.1.6</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">prometheus</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enabled</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">repoURL</span>: https://prometheus-community.github.io/helm-charts |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">version</span>: <span style="color:#2aa198">20.0.2</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">skywalking</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enabled</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">repoURL</span>: https://apache.jfrog.io/artifactory/skywalking-helm |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">version</span>: <span style="color:#2aa198">4.3.0</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">zipkin</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enabled</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">repoURL</span>: https://openzipkin.github.io/zipkin |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">version</span>: <span style="color:#2aa198">0.3.0</span> |
| </span></span></code></pre></div><p>建议使用自定义profile进行配置,在componentsMeta中开启或关闭组件,在components下配置各组件。其中components下各组件的配置值都是helm chart的values,各组件的具体配置请参考: |
| Grafana: <a href="https://github.com/grafana/helm-charts/blob/main/charts/grafana/README.md">https://github.com/grafana/helm-charts/blob/main/charts/grafana/README.md</a> |
| Zookeeper: <a href="https://github.com/bitnami/charts/tree/main/bitnami/zookeeper/#installing-the-chart">https://github.com/bitnami/charts/tree/main/bitnami/zookeeper/#installing-the-chart</a> |
| Prometheus: <a href="https://github.com/prometheus-community/helm-charts/tree/main/charts">https://github.com/prometheus-community/helm-charts/tree/main/charts</a> |
| Skywalking: <a href="https://github.com/apache/skywalking-kubernetes/blob/master/chart/skywalking/README.md">https://github.com/apache/skywalking-kubernetes/blob/master/chart/skywalking/README.md</a> |
| Zipkin: <a href="https://github.com/Financial-Times/zipkin-helm">https://github.com/Financial-Times/zipkin-helm</a></p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#586e75"># customization profile</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">apiVersion</span>: dubbo.apache.org/v1alpha1 |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">kind</span>: DubboOperator |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">metadata</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">namespace</span>: dubbo-system |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">spec</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">profile</span>: default |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">namespace</span>: dubbo-system |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">componentsMeta</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">admin</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enabled</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">grafana</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enabled</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">version</span>: <span style="color:#2aa198">6.31.0</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">prometheus</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enabled</span>: <span style="color:#cb4b16">false</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">components</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">admin</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">replicas</span>: <span style="color:#2aa198">3</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">grafana</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">testFramework</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enabled</span>: <span style="color:#cb4b16">false</span> |
| </span></span></code></pre></div><ol start="2"> |
| <li>根据profile拉取所需组件并生成manifest,目前Admin,Nacos已在本地,无需拉取;Grafana,Zookeeper,Prometheus,Skywalking,Zipkin将从官方chart库拉取,具体地址和版本可见上方default profile</li> |
| <li>将manifest应用于k8s集群</li> |
| </ol> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>dubboctl manifest install <span style="color:#586e75"># 使用默认 manifests 安装</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># or</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>dubboctl manifest generate | kubectl apply -f - |
| </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>dubboctl install --set spec.components.admin.replicas<span style="color:#719e07">=</span><span style="color:#2aa198">2</span> <span style="color:#586e75"># 设置组件的配置</span> |
| </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>dubboctl install --set spec.componentsMeta.admin.enabled<span style="color:#719e07">=</span>true, spec.componentsMeta.grafana.enabled<span style="color:#719e07">=</span><span style="color:#b58900">false</span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 开启或关闭组件</span> |
| </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>dubboctl install --set spec.componentsMeta.grafana.repoURL<span style="color:#719e07">=</span>https://grafana.github.io/helm-charts, spec.componentsMeta.grafana.version<span style="color:#719e07">=</span>6.31.0 |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 设置需远程拉取组件的仓库地址与版本</span> |
| </span></span></code></pre></div><p>检查安装效果</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl get pod -n dubbo-system |
| </span></span></code></pre></div><h4 id="打开-admin-控制台">打开 Admin 控制台</h4> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>kubectl port-forward svc/dubbo-admin -n dubbo-system 38080:38080 |
| </span></span></code></pre></div><p>打开浏览器,访问: <code>http://127.0.0.1:38080/</code></p> |
| <h3 id="helm-安装">Helm 安装</h3> |
| <p>获取图表</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>helm repo add https://charts.bitnami.com/bitnami |
| </span></span><span style="display:flex;"><span>helm repo add https://prometheus-community.github.io/helm-charts |
| </span></span><span style="display:flex;"><span>helm repo add https://grafana.github.io/helm-charts |
| </span></span><span style="display:flex;"><span>helm repo add https://apache.jfrog.io/artifactory/skywalking-helm |
| </span></span><span style="display:flex;"><span>helm repo add https://openzipkin.github.io/zipkin |
| </span></span></code></pre></div><p>安装 zookeeper</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm install zookeeper bitnami/zookeeper -n dubbo-system |
| </span></span></code></pre></div><p>安装 prometheus</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm install prometheus prometheus-community/prometheus -n dubbo-system |
| </span></span></code></pre></div><p>安装 grafana</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm install grafana grafana/grafana -n dubbo-system |
| </span></span></code></pre></div><p>安装 skywalking</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>helm install skywalking skywalking/skywalking -n dubbo-system |
| </span></span></code></pre></div><p>安装 zipkin</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>helm install zipkin openzipkin/zipkin -n dubbo-system |
| </span></span></code></pre></div><p>检查安装状态</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>helm ls -n dubbo-system ;kubectl get pods -n dubbo-system --output wide |
| </span></span></code></pre></div><h3 id="vm-安装">VM 安装</h3> |
| <h4 id="download-1">Download</h4> |
| <p>下载 Dubbo Admin 发行版本</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>curl -L https://dubbo.apache.org/installer.sh | <span style="color:#268bd2">VERSION</span><span style="color:#719e07">=</span>0.1.0 sh - |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># Admin 要组织好发行版本</span> |
| </span></span></code></pre></div><p>将 dubboctl 放入可执行路径</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>ln -s dubbo-admin-0.1.0/bin/dubbo-admin /usr/local/bin/dubbo-admin |
| </span></span></code></pre></div><h4 id="run">Run</h4> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>dubbo-admin run -f override-configuration.yml |
| </span></span></code></pre></div><h2 id="配置手册-configuration">配置手册 (Configuration)</h2> |
| <p>配置用于控制 dubbo-admin 的行为</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#586e75"># Environment type. Available values are: &#34;kubernetes&#34; or &#34;universal&#34;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">environment: universal # ENV</span>: DUBBO_ENVIRONMENT |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># Mode in which Dubbo CP is running. Available values are: &#34;standalone&#34;, &#34;global&#34;, &#34;zone&#34;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">mode: standalone # ENV</span>: DUBBO_MODE |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># Resource Store configuration</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">store</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Type of Store used in the Control Plane. Available values are: &#34;kubernetes&#34;, &#34;postgres&#34; or &#34;memory&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">type: memory # ENV</span>: DUBBO_STORE_TYPE |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Kubernetes Store configuration (used when store.type=kubernetes)</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">kubernetes</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Namespace where Control Plane is installed to.</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">systemNamespace: dubbo-system # ENV</span>: DUBBO_STORE_KUBERNETES_SYSTEM_NAMESPACE |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Postgres Store configuration (used when store.type=postgres)</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">mysql</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Host of the Postgres DB</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">host: 127.0.0.1 # ENV</span>: DUBBO_STORE_POSTGRES_HOST |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Port of the Postgres DB</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port: 15432 # ENV</span>: DUBBO_STORE_POSTGRES_PORT |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># User of the Postgres DB</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">user: dubbo # ENV</span>: DUBBO_STORE_POSTGRES_USER |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Password of the Postgres DB</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">password: dubbo # ENV</span>: DUBBO_STORE_POSTGRES_PASSWORD |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Database name of the Postgres DB</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">dbName: dubbo # ENV</span>: DUBBO_STORE_POSTGRES_DB_NAME |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Connection Timeout to the DB in seconds</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">connectionTimeout: 5 # ENV</span>: DUBBO_STORE_POSTGRES_CONNECTION_TIMEOUT |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Maximum number of open connections to the database</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># `0` value means number of open connections is unlimited</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">maxOpenConnections: 50 # ENV</span>: DUBBO_STORE_POSTGRES_MAX_OPEN_CONNECTIONS |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Maximum number of connections in the idle connection pool</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># &lt;0 value means no idle connections and 0 means default max idle connections</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">maxIdleConnections: 50 # ENV</span>: DUBBO_STORE_POSTGRES_MAX_IDLE_CONNECTIONS |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># TLS settings</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">tls</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Mode of TLS connection. Available values are: &#34;disable&#34;, &#34;verifyNone&#34;, &#34;verifyCa&#34;, &#34;verifyFull&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">mode: disable # ENV</span>: DUBBO_STORE_POSTGRES_TLS_MODE |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Path to TLS Certificate of the client. Used in verifyCa and verifyFull modes</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">certPath: # ENV</span>: DUBBO_STORE_POSTGRES_TLS_CERT_PATH |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Path to TLS Key of the client. Used in verifyCa and verifyFull modes</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">keyPath: # ENV</span>: DUBBO_STORE_POSTGRES_TLS_KEY_PATH |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Path to the root certificate. Used in verifyCa and verifyFull modes.</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">caPath: # ENV</span>: DUBBO_STORE_POSTGRES_TLS_ROOT_CERT_PATH |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># MinReconnectInterval controls the duration to wait before trying to</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># re-establish the database connection after connection loss. After each</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># consecutive failure this interval is doubled, until MaxReconnectInterval</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># is reached. Successfully completing the connection establishment procedure</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># resets the interval back to MinReconnectInterval.</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">minReconnectInterval</span>: <span style="color:#2aa198">&#34;10s&#34;</span> <span style="color:#586e75"># ENV: DUBBO_STORE_POSTGRES_MIN_RECONNECT_INTERVAL</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># MaxReconnectInterval controls the maximum possible duration to wait before trying</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># to re-establish the database connection after connection loss.</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">maxReconnectInterval</span>: <span style="color:#2aa198">&#34;60s&#34;</span> <span style="color:#586e75"># ENV: DUBBO_STORE_POSTGRES_MAX_RECONNECT_INTERVAL</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">server</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">port</span>: <span style="color:#2aa198">38080</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">registry</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">address</span>: xxx |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">metadata-center</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">address</span>: xxx |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">config-center</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">address</span>: xxx |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">external-services</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">prometheus</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Prometheus service name is &#34;metrics&#34; and is in the &#34;telemetry&#34; namespace</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># http://prometheus.&lt;dubbo_namespace_name&gt;:9090</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">url</span>: <span style="color:#2aa198">&#34;http://metrics.telemetry:9090/&#34;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">tracing</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Enabled by default. Kiali will anyway fallback to disabled if</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Jaeger is unreachable.</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enabled</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Jaeger service name is &#34;tracing&#34; and is in the &#34;telemetry&#34; namespace.</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Make sure the URL you provide corresponds to the non-GRPC enabled endpoint</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># if you set &#34;use_grpc&#34; to false.</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">in_cluster_url</span>: <span style="color:#2aa198">&#39;http://tracing.telemetry:16685/jaeger&#39;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">use_grpc</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Public facing URL of Jaeger</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">url</span>: <span style="color:#2aa198">&#39;http://my-jaeger-host/jaeger&#39;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">grafana</span>: |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">enabled</span>: <span style="color:#cb4b16">true</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Grafana service name is &#34;grafana&#34; and is in the &#34;telemetry&#34; namespace.</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">in_cluster_url</span>: <span style="color:#2aa198">&#39;http://grafana.telemetry:3000/&#39;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#586e75"># Public facing URL of Grafana</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">url</span>: <span style="color:#2aa198">&#39;http://my-ingress-host/grafana&#39;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># 更多配置</span> |
| </span></span></code></pre></div><h4 id="打开-admin-控制台-1">打开 Admin 控制台</h4> |
| <p>打开浏览器,访问: <code>http://127.0.0.1:38080/</code></p></description></item><item><title>Overview: Admin 服务查询</title><link>https://dubbo.apache.org/zh-cn/overview/reference/admin/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/reference/admin/search/</guid><description> |
| <p>Admin 支持可视化的展示 Dubbo 微服务集群的状态,方便用户从全局掌握集群的应用、服务和实例分布,Admin 还可以通过查询的方式了解某一个服务更详细的信息:</p> |
| <ul> |
| <li>首页集群大盘,展示集群应用、服务、示例的总体分布,集群总体流量情况等</li> |
| <li>支持根据应用名、服务名(可包含版本&amp;分组)、实例 IP 查询详细信息</li> |
| <li>支持服务名/应用名的自动补全</li> |
| <li>支持查看单条服务实例的详情</li> |
| </ul> |
| <h2 id="首页大盘">首页大盘</h2> |
| <p><img src="https://dubbo.apache.org/imgs/v3/reference/admin/console/dashboard.png" alt="admin-dashboard"></p> |
| <h2 id="根据-dubbo-服务名查询">根据 Dubbo 服务名查询</h2> |
| <p>精确输入<code>接口名:版本</code> 查询服务</p> |
| <p><img src="https://dubbo.apache.org/imgs/v3/reference/admin/console/admin-search-service.png" alt="admin-search-service"></p> |
| <p>通过 <code>*</code> 通配符模糊查询服务</p> |
| <p><img src="https://dubbo.apache.org/imgs/v3/reference/admin/console/admin-search-service.png" alt="admin-search-service2"></p> |
| <h2 id="根据应用名查询">根据应用名查询</h2> |
| <p>输入应用名查询某应用关联的所有服务(包含提供和消费的服务)</p> |
| <p><img src="https://dubbo.apache.org/imgs/v3/reference/admin/console/admin-search-application.png" alt="admin-search-application"></p> |
| <h2 id="根据实例-ip-名查询">根据实例 IP 名查询</h2> |
| <p>输入实例 IP 查询某实例关联的所有服务(包含提供和消费的服务)</p> |
| <p><img src="https://dubbo.apache.org/imgs/v3/reference/admin/console/admin-search-ip.png" alt="admin-search-ip"></p> |
| <blockquote> |
| <p>支持基于端口过滤服务</p> |
| </blockquote> |
| <h2 id="查看服务实例详情">查看服务实例详情</h2> |
| <p>在服务列表点击 <code>详情</code> 查看服务详细情况</p> |
| <p><img src="https://dubbo.apache.org/imgs/v3/reference/admin/console/admin-search-service-detail.png" alt="admin-search-service-detail"></p></description></item><item><title>Overview: Admin 服务测试功能简介</title><link>https://dubbo.apache.org/zh-cn/overview/reference/admin/test/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/reference/admin/test/</guid><description> |
| <p>服务测试功能通常提供给 Dubbo 服务的开发者使用,用来对自己发布的服务进行自测。通过在 Admin 控制台上模拟真实的消费端进程,对服务提供者发起调用,并验证调用结果是否符合预期。</p> |
| <h2 id="使用方式">使用方式</h2> |
| <h3 id="准备用例">准备用例</h3> |
| <ol> |
| <li> |
| <p>启动用例</p> |
| <p>可以参考 <a href="../../../quickstart/java/">快速开始</a> 启动一个简单的 Dubbo 服务,对于服务测试来说,只需要启动 provider 即可。</p> |
| </li> |
| <li> |
| <p>查询服务</p> |
| <p>完成服务端部署后,可以到 Admin 的 <code>服务测试</code> 页面查询对应的服务:</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/admin/testSearch.jpg" alt="testSearch"></p> |
| <p>这里的信息和元数据类似,包含方法名,参数类型和返回值信息,点击右边的标签就可以进入服务测试页面</p> |
| </li> |
| </ol> |
| <h3 id="执行服务测试">执行服务测试</h3> |
| <p>服务测试页面包含了两个 json 编辑器,参数类型的信息都是以 json 格式保存。</p> |
| <p>如以下示例所示,在左侧编辑器中填入对应的参数值(本例中数类型是 <code>String</code> ),填写完成后点击 <code>执行</code> 即可对服务端发起调用,调用结果展示在右边的编辑器中。</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/admin/testSuccess.jpg" alt="testSuccess"></p> |
| <p>如果调用失败,会显示详细的失败原因,下面来看一下调用失败的例子:</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/admin/testFail.jpg" alt="testFail"></p> |
| <p>本例中,先关掉 Dubbo 服务提供者的进程,再执行服务测试,可以看到返回的结果是<code>找不到服务提供者</code>的异常。和普通调用一样,业务和框架的异常都会返回在结果中,方便业务排查。</p> |
| <h3 id="复合类型参数的填写">复合类型参数的填写</h3> |
| <p>考虑 <code>UserService</code> 中的以下方法和类型:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#586e75">//org.apache.dubbo.demo.api.UserService |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>Result <span style="color:#268bd2">getUser</span><span style="color:#719e07">(</span>String name<span style="color:#719e07">,</span> UserInfoDO userInfoDO<span style="color:#719e07">);</span> |
| </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">UserInfoDO</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> <span style="color:#dc322f">int</span> id<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> LocationDO locationDO<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> DepartmentDO departmentDO<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> String <span style="color:#268bd2">toString</span><span style="color:#719e07">()</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> <span style="color:#2aa198">&#34;UserInfoDO{&#34;</span> <span style="color:#719e07">+</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;id=&#34;</span> <span style="color:#719e07">+</span> id <span style="color:#719e07">+</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;, locationDO=&#34;</span> <span style="color:#719e07">+</span> locationDO<span style="color:#719e07">.</span>toString<span style="color:#719e07">()</span> <span style="color:#719e07">+</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;, departmentDO=&#34;</span> <span style="color:#719e07">+</span> departmentDO<span style="color:#719e07">.</span>toString<span style="color:#719e07">()</span> <span style="color:#719e07">+</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#39;}&#39;</span><span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">DepartmentDO</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> String departName<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> LocationDO departLocation<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> String <span style="color:#268bd2">toString</span><span style="color:#719e07">()</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> <span style="color:#2aa198">&#34;DepartmentDO{&#34;</span> <span style="color:#719e07">+</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;departName=&#39;&#34;</span> <span style="color:#719e07">+</span> departName <span style="color:#719e07">+</span> <span style="color:#2aa198">&#39;\&#39;&#39;</span> <span style="color:#719e07">+</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;, departLocation=&#34;</span> <span style="color:#719e07">+</span> departLocation<span style="color:#719e07">.</span>toString<span style="color:#719e07">()</span> <span style="color:#719e07">+</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#39;}&#39;</span><span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">LocationDO</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> String address<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> <span style="color:#dc322f">int</span> postNum<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">@Override</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> String <span style="color:#268bd2">toString</span><span style="color:#719e07">()</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> <span style="color:#2aa198">&#34;LocationDO{&#34;</span> <span style="color:#719e07">+</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;address=&#39;&#34;</span> <span style="color:#719e07">+</span> address <span style="color:#719e07">+</span> <span style="color:#2aa198">&#39;\&#39;&#39;</span> <span style="color:#719e07">+</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;, postNum=&#34;</span> <span style="color:#719e07">+</span> postNum <span style="color:#719e07">+</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#39;}&#39;</span><span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div><p>参数是比较复杂的符合类型参数,服务测试的时候,会逐层展开填写每一个field的值,如下图所示: |
| <img src="https://dubbo.apache.org/imgs/blog/admin/complex.jpg" alt="complex"> |
| 同样可以调用成功并且返回结果</p> |
| <h2 id="原理">原理</h2> |
| <h3 id="数据来源">数据来源</h3> |
| <p>服务测试中,最重要的就是完整的方法签名信息,和参数的类型信息,有了这些信息才能够一步步填入每个参数的值,拼装出完整的服务消费者。因此,使用服务测试的前提是在 Dubbo 中开启元数据中心(默认开启,Zookeeper、Nacos、Redis 等默认以注册中心做为元数据中心),Dubbo Admin 的方法签名和参数类型信息就是元数据中心来的:</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/admin/metadata.png" alt="medatada"></p> |
| <p>如图所示,服务端在运行的时候会将服务的元数据信息注册到元数据中心,格式如下:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{ |
| </span></span><span style="display:flex;"><span> ... |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;methods&#34;</span>: [ |
| </span></span><span style="display:flex;"><span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;name&#34;</span>: <span style="color:#2aa198">&#34;sayHello&#34;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;parameterTypes&#34;</span>: [ |
| </span></span><span style="display:flex;"><span> <span style="color:#2aa198">&#34;org.apache.dubbo.demo.model.User&#34;</span> |
| </span></span><span style="display:flex;"><span> ], |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;returnType&#34;</span>: <span style="color:#2aa198">&#34;org.apache.dubbo.demo.model.Result&#34;</span> |
| </span></span><span style="display:flex;"><span> }, |
| </span></span><span style="display:flex;"><span> ... |
| </span></span><span style="display:flex;"><span> ], |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;types&#34;</span>: [ |
| </span></span><span style="display:flex;"><span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;char&#34;</span> |
| </span></span><span style="display:flex;"><span> }, |
| </span></span><span style="display:flex;"><span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;long&#34;</span> |
| </span></span><span style="display:flex;"><span> }, |
| </span></span><span style="display:flex;"><span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;org.apache.dubbo.demo.model.Result&#34;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;properties&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;msg&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;java.lang.String&#34;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;properties&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;value&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;char[]&#34;</span> |
| </span></span><span style="display:flex;"><span> }, |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;hash&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;int&#34;</span> |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> }, |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;userName&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;java.lang.String&#34;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;properties&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;value&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;char[]&#34;</span> |
| </span></span><span style="display:flex;"><span> }, |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;hash&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;int&#34;</span> |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> }, |
| </span></span><span style="display:flex;"><span> { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;org.apache.dubbo.demo.model.User&#34;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;properties&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;id&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;java.lang.Long&#34;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;properties&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;value&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;long&#34;</span> |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> }, |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;username&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;java.lang.Sring&#34;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;properties&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;value&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;char[]&#34;</span> |
| </span></span><span style="display:flex;"><span> }, |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;hash&#34;</span>: { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&#34;type&#34;</span>: <span style="color:#2aa198">&#34;int&#34;</span> |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> }, |
| </span></span><span style="display:flex;"><span> ... |
| </span></span><span style="display:flex;"><span> ] |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><p>与服务测试相关的就是<code>methods</code>和<code>types</code>所包含的方法和类型信息,Dubbo Admin根据这些信息,将参数渲染到服务测试页面的Json Editor中,由用户来输入每个参数,每个成员变量的值。</p> |
| <h3 id="泛化调用">泛化调用</h3> |
| <p>有了参数类型,下一个问题就是怎么能够调用到服务端,在传统的Dubbo RPC调用中,客户端需要依赖服务端的API jar包 (参考 <a href="https://github.com/apache/dubbo-samples/tree/master/1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-consumer">Quick Start</a> 中的消费端示例,这对于 Dubbo Admin 来说不太可能,因为服务的上下线是动态的,Dubbo Admin 无法动态增加 jar 包依赖,因此需要用到 Dubbo 中的<a href="../../../mannual/java-sdk/advanced-features-and-usage/service/generic-reference/"><strong>泛化调用</strong></a>,指的是在没有服务端API接口的情况下,客户端直接通过 <code>GenericService</code> 接口来发起服务调用,返回值中的数据对象都用Map来表示。泛化调用在服务端不需要做特殊处理,只需要客户端发起即可。</p></description></item><item><title>Overview: Admin 服务 Mock 功能简介</title><link>https://dubbo.apache.org/zh-cn/overview/reference/admin/mock/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/reference/admin/mock/</guid><description> |
| <p>Mock 功能是设计用来提升微服务研发与测试效率的,它可以短路 Consumer 侧发起的远程调用,提前返回预先设定好的 Mock 值,这样即使在没有 Provider 可用的情况下,消费端也能正常的推进开发、测试进程。除此之外,mock 也可用于快速模拟负责返回值的测试数据、模拟服务端异常等场景</p> |
| <p>需要注意的是,Mock 能力仅限用于测试环境,应避免将其用于生产环境。</p> |
| <h1 id="设计背景">设计背景</h1> |
| <p>在跨团队或是多应用开发时,在前期开发中往往会出现依赖的服务还未开发完成的情况,这样就会导致流程的阻塞,影响研发效率。基于这种情况,Dubbo Admin 提供了 mock 能力来解耦 Consumer 与 Provider 之间的依赖,以确保在 Provider 未就绪的情况下 Consumer 仍能正常开展测试,提高研发效率。</p> |
| <p>Dubbo 框架本身设计有服务降级(有时也称为 mock)能力,通过配置 <code>org.apache.dubbo.config.ReferenceConfig</code> 的 mock 字段(可设置为true或是对应接口的Mock实现)或动态配置规则,此时就可以启动服务降级能力。这种服务降级能力是为生产环境的限流降级准备的,虽然也可以用于本地开发测试场景,但灵活度并不高,基于提升开发效率的根本诉求,我们设计了基于 Admin 的服务降级能力。</p> |
| <p>Dubbo Admin 服务 mock 是一种更为轻量和便捷实现方式,主要用于开发测试阶段的,目标是提升微服务场景下的整体研发效率。需求详见:<a href="https://github.com/apache/dubbo-admin/issues/757">Dubbo Admin Mock需求</a>。</p> |
| <h2 id="架构设计">架构设计</h2> |
| <p><img src="https://dubbo.apache.org/imgs/v3/reference/admin/console/mock-architecture.png" alt="admin-mock-architecture.png"></p> |
| <p><strong>实现 Mock 能力,Dubbo 框架与 Admin 侧要支持的能力</strong></p> |
| <ul> |
| <li>Dubbo Admin |
| <ul> |
| <li>规则管理 |
| <ul> |
| <li>规则新增</li> |
| <li>规则查询</li> |
| <li>规则修改</li> |
| <li>规则删除</li> |
| </ul> |
| </li> |
| <li>请求历史记录</li> |
| <li>Mock 请求数据查询</li> |
| <li>MockService Provider |
| <ul> |
| <li>根据规则生成 Mock 数据</li> |
| <li>响应 Consumer Mock 请求</li> |
| <li>保存请求和返回数据</li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| <li>Dubbo |
| <ul> |
| <li>根据 mock 开关配置,转发请求到 Admin 注册的 MockService</li> |
| <li>处理 mock 返回值并转换为匹配方法签名的强类型数据</li> |
| </ul> |
| </li> |
| </ul> |
| <p><strong>Mock 请求原理时序图</strong></p> |
| <p><img src="https://dubbo.apache.org/imgs/v3/reference/admin/console/mock-workflow.png" alt="admin-mock-workflow.png"></p> |
| <h2 id="使用方式">使用方式</h2> |
| <ol> |
| <li> |
| <p>在 Consumer 应用中添加依赖</p> |
| <p>开启 Mock 前,请确保在消费端应用中引入以下依赖:</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#268bd2">&lt;dependency&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;groupId&gt;</span>org.apache.dubbo.extensions<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>dubbo-mock-admin<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;version&gt;</span>${version}<span style="color:#268bd2">&lt;/version&gt;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">&lt;/dependency&gt;</span> |
| </span></span></code></pre></div><blockquote> |
| <p>查看 <a href="https://dubbo.apache.org/zh-cn/download/spi-extensions/">dubbo-mock-admin 的可用版本</a></p> |
| </blockquote> |
| </li> |
| <li> |
| <p>配置 <code>-Denable.dubbo.admin.mock=true</code> 参数开启 Mock 并重启进程</p> |
| </li> |
| <li> |
| <p>打开 Admin 配置 Mock 规则</p> |
| <p>用户可以通过在控制台上指定需要被 mock 的消费端IP、服务名和方法和具体的 mock 行为,实现对调用结果的 mock。</p> |
| <p><img src="https://dubbo.apache.org/imgs/v3/reference/admin/console/mock-rule-screenshot.png" alt="admin-mock"></p> |
| <p>一些支持的规则类型与示例</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>数字类型:123 |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>字符串:&#34;hello, world!&#34; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>数组、列表:[1, 2, 3] |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>枚举:&#34;ENUM_TYPE&#34; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>Map、对象: |
| </span></span><span style="display:flex;"><span> { |
| </span></span><span style="display:flex;"><span> &#34;prop1&#34;: &#34;value1&#34;, |
| </span></span><span style="display:flex;"><span> &#34;prop2&#34;: [&#34;a&#34;, &#34;b&#34;, &#34;c&#34;] |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>null: null |
| </span></span></code></pre></div></li> |
| <li> |
| <p>此时,消费端再次发起远程调用,就会得到预期 Mock 返回值。</p> |
| <blockquote> |
| <p>注意事项</p> |
| <ol> |
| <li>Mock 仅限用于测试开发环境,因此为了确保核心依赖的稳定性,社区没有将 mock 组件打包在核心框架包中,用户可以自行决策是否将其作为应用的默认依赖在公司内推广</li> |
| <li>即使添加了 mock 二进制依赖,mock 功能也不会默认开启,需要设置 <code>-Denable.dubbo.admin.mock=true</code> 后才能开启。</li> |
| </ol> |
| </blockquote> |
| </li> |
| </ol> |
| <h2 id="实现原理">实现原理</h2> |
| <p>Consumer 调用发起的调用会被本地的 MockServiceFilter 拦截,如果 mock 开关开启,则 MockServiceFilter 将请求转发到 MockService (由 Dubbo Admin 发布的服务),MockService 根据请求的服务、方法等查询用户预先配置的 mock 规则,如果查询到则返回规则中的 mock 值,Consumer 收到 mock 值后调用成功返回。</p> |
| <h3 id="mock-返回值如何定义">Mock 返回值如何定义?</h3> |
| <p>当前 Admin 支持录入 JSON 或者基本类型数据,如:</p> |
| <ul> |
| <li>返回数字值 (当方法签名返回值是数字类型)</li> |
| </ul> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>123 |
| </span></span></code></pre></div><ul> |
| <li>返回字符串 (当方法签名返回值是字符串类型)</li> |
| </ul> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&#34;hello, world!&#34; |
| </span></span></code></pre></div><ul> |
| <li>返回 JSON (当方法签名返回值是 Map 或对象类型)</li> |
| </ul> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>{ |
| </span></span><span style="display:flex;"><span> &#34;prop1&#34;: &#34;value1&#34;, |
| </span></span><span style="display:flex;"><span> &#34;prop2&#34;: [&#34;a&#34;, &#34;b&#34;, &#34;c&#34;] |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><ul> |
| <li>返回数组 (当方法签名返回值是数组或列表)</li> |
| </ul> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>[1, 2, 3] |
| </span></span></code></pre></div><h3 id="消费端如何发起-mockservice-调用">消费端如何发起 MockService 调用?</h3> |
| <p><code>dubbo-mock-admin</code> 将为消费端引入 MockServiceFilter 请求拦截器,如果用户打开 mock 开关,那么 Filter 会将请求转发到 Admin MockService 服务。</p> |
| <h3 id="mock-值如何转换为原始类型值">Mock 值如何转换为原始类型值?</h3> |
| <p>MockService 支持返回标准 JSON 格式或者基本类型数据,消费端会基于 Dubbo 内置类型转换器将 JSON 等值转为原始对象类型。</p> |
| <h3 id="未来优化点">未来优化点</h3> |
| <ul> |
| <li>保存 Mock 开关到配置中心,用户可以通过 Admin 动态控制开关。</li> |
| <li>开启 Mysql 数据库链接池</li> |
| </ul> |
| <h3 id="表结构设计">表结构设计</h3> |
| <p>Admin 依赖 Mysql 数据库存储用户配置的 mock 规则,具体的表结构设计如下。</p> |
| <h4 id="mock-rule">Mock Rule</h4> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#719e07">CREATE</span> <span style="color:#719e07">TABLE</span> <span style="color:#719e07">`</span>mock_rule<span style="color:#719e07">`</span> ( |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">`</span>id<span style="color:#719e07">`</span> <span style="color:#b58900">int</span>(<span style="color:#2aa198">11</span>) <span style="color:#719e07">NOT</span> <span style="color:#719e07">NULL</span> AUTO_INCREMENT <span style="color:#719e07">COMMENT</span> <span style="color:#2aa198">&#39;主键&#39;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">`</span>service_name<span style="color:#719e07">`</span> <span style="color:#b58900">varchar</span>(<span style="color:#2aa198">255</span>) <span style="color:#719e07">DEFAULT</span> <span style="color:#719e07">NULL</span> <span style="color:#719e07">COMMENT</span> <span style="color:#2aa198">&#39;服务名&#39;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">`</span>method_name<span style="color:#719e07">`</span> <span style="color:#b58900">varchar</span>(<span style="color:#2aa198">255</span>) <span style="color:#719e07">DEFAULT</span> <span style="color:#719e07">NULL</span> <span style="color:#719e07">COMMENT</span> <span style="color:#2aa198">&#39;方法名&#39;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">`</span><span style="color:#719e07">rule</span><span style="color:#719e07">`</span> <span style="color:#b58900">text</span> <span style="color:#719e07">NULL</span> <span style="color:#719e07">DEFAULT</span> <span style="color:#719e07">COMMENT</span> <span style="color:#2aa198">&#39;规则&#39;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">`</span>created_at<span style="color:#719e07">`</span> datetime <span style="color:#719e07">NOT</span> <span style="color:#719e07">NULL</span> <span style="color:#719e07">DEFAULT</span> <span style="color:#719e07">CURRENT_TIMESTAMP</span> <span style="color:#719e07">COMMENT</span> <span style="color:#2aa198">&#39;创建时间&#39;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">`</span>updated_at<span style="color:#719e07">`</span> datetime <span style="color:#719e07">NOT</span> <span style="color:#719e07">NULL</span> <span style="color:#719e07">DEFAULT</span> <span style="color:#719e07">CURRENT_TIMESTAMP</span> <span style="color:#719e07">ON</span> <span style="color:#719e07">UPDATE</span> <span style="color:#719e07">CURRENT_TIMESTAMP</span> <span style="color:#719e07">COMMENT</span> <span style="color:#2aa198">&#39;更新时间&#39;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">PRIMARY</span> <span style="color:#719e07">KEY</span> (<span style="color:#719e07">`</span>id<span style="color:#719e07">`</span>) |
| </span></span><span style="display:flex;"><span>) ENGINE<span style="color:#719e07">=</span>InnoDB <span style="color:#719e07">DEFAULT</span> CHARSET<span style="color:#719e07">=</span>utf8 <span style="color:#719e07">COMMENT</span><span style="color:#719e07">=</span><span style="color:#2aa198">&#39;服务mock方法表&#39;</span>; |
| </span></span></code></pre></div><h4 id="mock-log">Mock Log</h4> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#719e07">CREATE</span> <span style="color:#719e07">TABLE</span> <span style="color:#719e07">`</span>mock_log<span style="color:#719e07">`</span> ( |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">`</span>id<span style="color:#719e07">`</span> <span style="color:#b58900">int</span>(<span style="color:#2aa198">10</span>) unsigned <span style="color:#719e07">NOT</span> <span style="color:#719e07">NULL</span> AUTO_INCREMENT <span style="color:#719e07">COMMENT</span> <span style="color:#2aa198">&#39;主键id&#39;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">`</span>method_id<span style="color:#719e07">`</span> <span style="color:#b58900">int</span>(<span style="color:#2aa198">11</span>) <span style="color:#719e07">DEFAULT</span> <span style="color:#719e07">NULL</span> <span style="color:#719e07">COMMENT</span> <span style="color:#2aa198">&#39;规则id&#39;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">`</span>request<span style="color:#719e07">`</span> <span style="color:#b58900">text</span> <span style="color:#719e07">COMMENT</span> <span style="color:#2aa198">&#39;请求数据&#39;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">`</span>response<span style="color:#719e07">`</span> <span style="color:#b58900">text</span> <span style="color:#719e07">COMMENT</span> <span style="color:#2aa198">&#39;返回值&#39;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">`</span>created_at<span style="color:#719e07">`</span> datetime <span style="color:#719e07">DEFAULT</span> <span style="color:#719e07">CURRENT_TIMESTAMP</span> <span style="color:#719e07">COMMENT</span> <span style="color:#2aa198">&#39;创建时间&#39;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">`</span>updated_at<span style="color:#719e07">`</span> datetime <span style="color:#719e07">DEFAULT</span> <span style="color:#719e07">CURRENT_TIMESTAMP</span> <span style="color:#719e07">ON</span> <span style="color:#719e07">UPDATE</span> <span style="color:#719e07">CURRENT_TIMESTAMP</span> <span style="color:#719e07">COMMENT</span> <span style="color:#2aa198">&#39;更新时间&#39;</span>, |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">PRIMARY</span> <span style="color:#719e07">KEY</span> (<span style="color:#719e07">`</span>id<span style="color:#719e07">`</span>) |
| </span></span><span style="display:flex;"><span>) ENGINE<span style="color:#719e07">=</span>InnoDB <span style="color:#719e07">DEFAULT</span> CHARSET<span style="color:#719e07">=</span>utf8 <span style="color:#719e07">COMMENT</span><span style="color:#719e07">=</span><span style="color:#2aa198">&#39;mock请求记录表&#39;</span>; |
| </span></span></code></pre></div></description></item><item><title>Overview: Admin 文档管理功能介绍</title><link>https://dubbo.apache.org/zh-cn/overview/reference/admin/documentation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/overview/reference/admin/documentation/</guid><description> |
| <p>// TBD</p></description></item></channel></rss> |