| <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apache Dubbo – Dubbo Admin 运维指南</title><link>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/</link><description>Recent content in Dubbo Admin 运维指南 on Apache Dubbo</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><atom:link href="https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/index.xml" rel="self" type="application/rss+xml"/><item><title>Docsv2.7: 管理控制台运维</title><link>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/functions/</guid><description> |
| <h2 id="搜索页面">搜索页面</h2> |
| <p>当你需要管理 Dubbo 的服务时,首先要搜索到这个服务,然后打开它的管理页面</p> |
| <p><img src="https://dubbo.apache.org/imgs/admin/dubbo-search.jpg" alt="/admin-guide/images/dubbo-search.png"></p> |
| <h2 id="服务提供者页面">服务提供者页面</h2> |
| <p><img src="https://dubbo.apache.org/imgs/admin/dubbo-providers.jpg" alt="/admin-guide/images/dubbo-providers.png"></p> |
| <h2 id="服务消费者页面">服务消费者页面</h2> |
| <p><img src="https://dubbo.apache.org/imgs/admin/dubbo-consumers.jpg" alt="/admin-guide/images/dubbo-consumers.png"></p> |
| <h2 id="添加路由规则页面">添加路由规则页面</h2> |
| <p><img src="https://dubbo.apache.org/imgs/admin/dubbo-add-route.jpg" alt="/admin-guide/images/dubbo-add-route.png"></p> |
| <h2 id="添加动态配置页面">添加动态配置页面</h2> |
| <p><img src="https://dubbo.apache.org/imgs/admin/dubbo-add-config.jpg" alt="/admin-guide/images/dubbo-add-config.png"></p></description></item><item><title>Docsv2.7: Dubbo 管理控制台介绍</title><link>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/introduction/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/introduction/</guid><description> |
| <p>目前的管理控制台已经发布 0.1 版本,结构上采取了前后端分离的方式,前端使用 Vue 和 Vuetify 分别作为 Javascript 框架和UI框架,后端采用 Spring Boot 框架。既可以按照标准的 Maven 方式进行打包,部署,也可以采用前后端分离的部署方式,方便开发,功能上,目前具备了服务查询,服务治理(包括 Dubbo 2.7 中新增的治理规则)以及服务测试三部分内容。</p> |
| <h3 id="maven方式部署">Maven方式部署</h3> |
| <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-sh" data-lang="sh"><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 |
| </span></span><span style="display:flex;"><span>mvn clean package |
| </span></span><span style="display:flex;"><span><span style="color:#b58900">cd</span> dubbo-admin-distribution/target |
| </span></span><span style="display:flex;"><span>java -jar dubbo-admin-0.1.jar |
| </span></span></code></pre></div><ul> |
| <li>访问</li> |
| </ul> |
| <p>http://localhost:8080</p> |
| <h3 id="前后端分离部署">前后端分离部署</h3> |
| <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-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#b58900">cd</span> dubbo-admin-ui |
| </span></span><span style="display:flex;"><span>npm install |
| </span></span><span style="display:flex;"><span>npm run dev |
| </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-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#b58900">cd</span> dubbo-admin-server |
| </span></span><span style="display:flex;"><span>mvn clean package |
| </span></span><span style="display:flex;"><span><span style="color:#b58900">cd</span> target |
| </span></span><span style="display:flex;"><span>java -jar dubbo-admin-server-0.1.jar |
| </span></span></code></pre></div><ul> |
| <li>访问</li> |
| </ul> |
| <p>http://localhost:8081</p> |
| <ul> |
| <li>前后端分离模式下,前端的修改可以实时生效</li> |
| </ul> |
| <h3 id="配置-1">配置: <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></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-sh" data-lang="sh"><span style="display:flex;"><span>dubbo-admin-server/src/main/resources/application.properties |
| </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-properties" data-lang="properties"><span style="display:flex;"><span>admin.config-center<span style="color:#719e07">=</span><span style="color:#2aa198">zookeeper://127.0.0.1:2181</span> |
| </span></span><span style="display:flex;"><span>admin.registry.address<span style="color:#719e07">=</span><span style="color:#2aa198">zookeeper://127.0.0.1:2181</span> |
| </span></span><span style="display:flex;"><span>admin.metadata-report.address<span style="color:#719e07">=</span><span style="color:#2aa198">zookeeper://127.0.0.1:2181</span> |
| </span></span></code></pre></div><p>三个配置项分别指定了配置中心,注册中心和元数据中心的地址,关于这三个中心的详细说明,可以参考<a href="../../../user/configuration/config-center">这里</a>。</p> |
| <p>也可以和 Dubbo 2.7 一样,在配置中心指定元数据和注册中心的地址,以 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-properties" data-lang="properties"><span style="display:flex;"><span><span style="color:#586e75"># /dubbo/config/dubbo/dubbo.properties</span> |
| </span></span><span style="display:flex;"><span>dubbo.registry.address<span style="color:#719e07">=</span><span style="color:#2aa198">zookeeper://127.0.0.1:2181</span> |
| </span></span><span style="display:flex;"><span>dubbo.metadata-report.address<span style="color:#719e07">=</span><span style="color:#2aa198">zookeeper://127.0.0.1:2181</span> |
| </span></span></code></pre></div><p>配置中心里的地址会覆盖掉本地 <code>application.properties</code> 的配置</p> |
| <p>其他配置请访问 github 中的文档:</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-sh" data-lang="sh"><span style="display:flex;"><span>https://github.com/apache/dubbo-admin |
| </span></span></code></pre></div><div class="footnotes" role="doc-endnotes"> |
| <hr> |
| <ol> |
| <li id="fn:1"> |
| <p>当前版本中未实现登录功能,会在后续版本加上&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p> |
| </li> |
| </ol> |
| </div></description></item><item><title>Docsv2.7: 服务测试</title><link>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/test/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/test/</guid><description> |
| <p>请参考这篇<a href="https://dubbo.apache.org/zh-cn/blog/2019/08/26/service-test/">博客</a></p></description></item><item><title>Docsv2.7: 服务查询和详情展示</title><link>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/search/</guid><description> |
| <p>服务查询是 Dubbo OPS 最基本的功能,目前支持服务,应用和 IP 三个维度的查询,并且服务和应用支持模糊查询和自动提示:</p> |
| <p><img src="https://dubbo.apache.org/imgs/admin/searchResult.png" alt="searchResult"></p> |
| <p>其中详情页展示了服务提供者,消费者等信息,元数据信息需要在 Dubbo 2.7 及之后的版本才会展示:</p> |
| <p><img src="https://dubbo.apache.org/imgs/admin/detail.jpg" alt="detail"></p></description></item><item><title>Docsv2.7: API文档&测试</title><link>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/apidocs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/apidocs/</guid><description> |
| <h2 id="dubbo-api-docs">dubbo api docs</h2> |
| <p>dubbo 接口文档、测试工具,根据注解生成文档,并提供测试功能.</p> |
| <p>增加一些注解就能生成类似swagger的文档, 不会把非web的dubbo项目变为web项目.</p> |
| <h2 id="相关仓库">相关仓库</h2> |
| <ul> |
| <li><a href="https://github.com/apache/dubbo-spi-extensions">dubbo-spi-extensions</a> |
| <a href="https://github.com/apache/dubbo-spi-extensions/tree/2.7.x/dubbo-api-docs">\分支: 2.7.x\dubbo-api-docs</a>: |
| Dubbo-Api-Docs 相关注解,解析注解</li> |
| <li><a href="https://github.com/KeRan213539/dubbo-admin">dubbo-admin</a>: Dubbo-Api-Docs 文档展示,测试功能</li> |
| </ul> |
| <h2 id="如何使用">如何使用?</h2> |
| <ol> |
| <li>dubbo项目的方法参数中加上 dubbo api docs 注解 |
| <ul> |
| <li>dubbo提供者项目引入 dubbo-api-docs-core</li> |
| <li>如果dubbo的接口和参数是一个单独的jar包项目,引入dubbo-api-docs-annotations</li> |
| <li>在提供者项目的项目启动类(标注了@SpringBootApplication的类)或者配制类(标注了@Configuration的类)中增加注解 |
| @EnableDubboApiDocs 以启用Dubbo Api Docs功能 |
| <ul> |
| <li>为避免增加生产环境中的资源占用, 建议单独创建一个配制类用于启用Dubbo Api Docs, 并配合 @Profile(&ldquo;dev&rdquo;) 注解使用</li> |
| <li>当然, Dubbo Api Docs 仅在项目启动时多消耗了点CPU资源, 并使用了一点点内存用于缓存, 将来会考虑将缓存中的内容放到元数据中心.</li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| </ol> |
| <h3 id="版本">版本</h3> |
| <p>当前版本: 同Dubbo版本号</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>&lt;dependency&gt; |
| </span></span><span style="display:flex;"><span> &lt;groupId&gt;org.apache.dubbo&lt;/groupId&gt; |
| </span></span><span style="display:flex;"><span> &lt;artifactId&gt;dubbo-api-docs-annotations&lt;/artifactId&gt; |
| </span></span><span style="display:flex;"><span> &lt;version&gt;${dubbo-version}&lt;/version&gt; |
| </span></span><span style="display:flex;"><span>&lt;/dependency&gt; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>&lt;dependency&gt; |
| </span></span><span style="display:flex;"><span> &lt;groupId&gt;org.apache.dubbo&lt;/groupId&gt; |
| </span></span><span style="display:flex;"><span> &lt;artifactId&gt;dubbo-api-docs-core&lt;/artifactId&gt; |
| </span></span><span style="display:flex;"><span> &lt;version&gt;${dubbo-version}&lt;/version&gt; |
| </span></span><span style="display:flex;"><span>&lt;/dependency&gt; |
| </span></span></code></pre></div><ol start="2"> |
| <li> |
| <p>下载 <a href="https://github.com/apache/dubbo-admin">dubbo-admin</a> <a href="https://github.com/apache/dubbo-admin/releases">下载地址</a></p> |
| </li> |
| <li> |
| <p>启动 dubbo-admin</p> |
| </li> |
| <li> |
| <p>访问: http:// localhost:8080</p> |
| </li> |
| <li> |
| <p>进入&quot;接口文档&quot;模块</p> |
| </li> |
| </ol> |
| <h3 id="注解使用">注解使用</h3> |
| <ul> |
| <li>@EnableDubboApiDocs: 配制注解, 启用 dubbo api docs 功能</li> |
| <li>@ApiModule: 类注解, dubbo接口模块信息,用于标注一个接口类模块的用途 |
| <ul> |
| <li>value: 模块名称</li> |
| <li>apiInterface: 提供者实现的接口</li> |
| <li>version: 模块版本</li> |
| </ul> |
| </li> |
| <li>@ApiDoc: 方法注解, dubbo 接口信息,用于标注一个接口的用途 |
| <ul> |
| <li>value: 接口名称</li> |
| <li>description: 接口描述(可使用html标签)</li> |
| <li>version: 接口版本</li> |
| <li>responseClassDescription: 响应的数据的描述</li> |
| </ul> |
| </li> |
| <li>@RequestParam: 类属性/方法参数注解,标注请求参数 |
| <ul> |
| <li>value: 参数名</li> |
| <li>required: 是否必传参数</li> |
| <li>description: 参数描述</li> |
| <li>example: 参数示例</li> |
| <li>defaultValue: 参数默认值</li> |
| <li>allowableValues: 允许的值,设置该属性后界面上将对参数生成下拉列表 |
| <ul> |
| <li>注:使用该属性后将生成下拉选择框</li> |
| <li>boolean 类型的参数不用设置该属性,将默认生成 true/false 的下拉列表</li> |
| <li>枚举类型的参数会自动生成下拉列表,如果不想开放全部的枚举值,可以单独设置此属性.</li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| <li>@ResponseProperty: 类属性注解, 标注响应参数 |
| <ul> |
| <li>value: 参数名</li> |
| <li>example: 示例</li> |
| </ul> |
| </li> |
| </ul> |
| <h3 id="使用注意">使用注意</h3> |
| <ul> |
| <li>获取接口列表直连:</li> |
| </ul> |
| <blockquote> |
| <p>由于可能不同功能的dubbo服务都会注册到同一个注册中心,但是dubbo doc |
| 使用的接口名是一样的,所以dubbo doc的接口采用直连方式以获取到不同功能服务的不同接口列表 |
| 测试可以直连或者走注册中心</p> |
| </blockquote> |
| <ul> |
| <li>响应bean(接口的返回类型)支持自定义泛型, 但只支持一个泛型占位符</li> |
| <li>关于Map的使用:Map的key只能用基本数据类型.如果Map的key不是基础数据类型,生成的 就不是标准json格式,会出异常</li> |
| <li>接口的同步/异步取自 org.apache.dubbo.config.annotation.Service.async</li> |
| </ul> |
| <h2 id="页面截图">页面截图</h2> |
| <p><img src="https://dubbo.apache.org/imgs/admin/dubbo_docs_zh.png" alt="页面截图"></p></description></item><item><title>Docsv2.7: 服务治理和配置管理</title><link>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/governance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/governance/</guid><description> |
| <h2 id="服务治理">服务治理</h2> |
| <p>服务治理主要作用是改变运行时服务的行为和选址逻辑,达到限流,权重配置等目的,主要有以下几个功能:</p> |
| <h3 id="应用级别的服务治理">应用级别的服务治理</h3> |
| <p>在 Dubbo 2.6 及更早版本中,所有的服务治理规则都只针对服务粒度,如果要把某条规则作用到应用粒度上,需要为应用下的所有服务配合相同的规则,变更,删除的时候也需要对应的操作,这样的操作很不友好,因此 Dubbo 2.7 版本中增加了应用粒度的服务治理操作,对于条件路由(包括黑白名单),动态配置(包括权重,负载均衡)都可以做应用级别的配置:</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/admin/conditionRoute.jpg" alt="condition"></p> |
| <p>上图是条件路由的配置,可以按照应用名,服务名两个维度来填写,也可以按照这两个维度来查询。</p> |
| <h3 id="标签路由">标签路由</h3> |
| <p>标签路由是 Dubbo 2.7 引入的新功能,配置以应用作为维度,给不同的服务器打上不同名字的标签,配置如下图所示:</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/admin/route.jpg" alt="tag"></p> |
| <p>调用的时候,客户端可以通过<code>setAttachment</code>的方式,来设置不同的标签名称,比如本例中,<code>setAttachment(tag1)</code>,客户端的选址范围就在如图所示的三台机器中,可以通过这种方式来实现流量隔离,灰度发布等功能。</p> |
| <h3 id="条件路由">条件路由</h3> |
| <p>条件路由是 Dubbo 一直以来就有的功能,目前可以配置服务和应用两个维度,条件路由为 <code>yaml</code> 格式,具体的规则体以及各种适用场景,请参考<a href="../../../user/examples/routing-rule">这里</a></p> |
| <h3 id="黑白名单">黑白名单</h3> |
| <p>黑白名单是条件路由的一部分,规则存储和条件路由放在一起,为了方便配置所以单独拿出来,同样可以通过服务和应用两个维度,指定黑名单和白名单:</p> |
| <p><img src="https://dubbo.apache.org/imgs/admin/blackList.jpg" alt="blackList"></p> |
| <h3 id="动态配置">动态配置</h3> |
| <p>动态配置是和路由规则平行的另一类服务治理治理功能,主要作用是在不重启服务的情况下,动态改变调用行为,从Dubbo2.7版本开始,支持服务和应用两个维度的配置,采用<code>yaml</code>格式,界面如下:</p> |
| <p><img src="https://dubbo.apache.org/imgs/admin/config.jpg" alt="config"></p> |
| <p>具体的规则体说明请参考<a href="../../../user/examples/config-rule">这里</a></p> |
| <h3 id="权重调节">权重调节</h3> |
| <p>权重调节是动态配置的子功能,主要作用是改变服务端的权重,更大的权重会有更大的几率被客户端选中作为服务提供者,从而达到流量分配的目的:</p> |
| <p><img src="https://dubbo.apache.org/imgs/admin/weight.jpg" alt="weight"></p> |
| <h3 id="负载均衡">负载均衡</h3> |
| <p>负载均衡也是动态配置的子功能,主要作用是调整客户端的选址逻辑,目前可选的负载均衡策略有随机,轮训和最小活跃,关于各个策略的解释请参考<a href="../../../user/examples/loadbalance">这里</a></p> |
| <h2 id="配置管理">配置管理</h2> |
| <p>配置管理也是配合Dubbo2.7新增的功能,在Dubbo2.7中,增加了全局和应用维度的配置,分别在全局和应用范围内生效,其中应用配置也可以指定该应用中的服务级别的配置,可以在控制台中查看,修改配置规则,默认展示全局维度的配置。</p> |
| <ul> |
| <li> |
| <p>全局配置:</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/admin/config.jpg" alt="config"></p> |
| <p>全局配置里可以指定注册中心,元数据中心的地址,服务端和客户端的超时时间等,这些配置在全局内生效。除了配置写入,也可以用来查看。如果使用zookeeper作为注册中心和元数据中心,还可以看到配置文件所在位置的目录结构。</p> |
| </li> |
| <li> |
| <p>应用, 服务配置</p> |
| <p><img src="https://dubbo.apache.org/imgs/blog/admin/appConfig.jpg" alt="appConfig"></p> |
| <p>应用级别的配置可以为应用或者应用内的服务指定配置,在服务维度上,需要区分提供者和消费者。<code>dubbo.reference.{serviceName}</code>表示作为该服务消费者的配置,<code>dubbo.provider.{servcieName}</code>表示作为该服务提供者的配置。其中注册中心和元数据中心的地址,只能在全局配置中指定,这也是Dubbo2.7中推荐的使用方式。</p> |
| </li> |
| <li> |
| <p>优先级: 服务配置 &gt; 应用配置 &gt; 全局配置</p> |
| </li> |
| </ul></description></item><item><title>Docsv2.7: 使用 Apache Skywalking 做分布式跟踪</title><link>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/skywalking/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/skywalking/</guid><description> |
| <h2 id="apache-skywalking-简介">Apache Skywalking 简介</h2> |
| <p><a href="https://github.com/apache/skywalking">Apache Skywalking</a> 专门为微服务架构和云原生架构系统而设计并且支持分布式链路追踪的APM系统。<a href="https://github.com/apache/skywalking">Apache Skywalking</a> 通过加载探针的方式收集应用调用链路信息,并对采集的调用链路信息进行分析,生成应用间关系和服务间关系以及服务指标。<a href="https://github.com/apache/skywalking">Apache Skywalking</a> 目前支持多种语言,其中包括 <a href="https://github.com/apache/skywalking">Java</a>,<a href="https://github.com/SkyAPM/SkyAPM-dotnet">.Net Core</a>,<a href="https://github.com/apache/skywalking-nodejs">Node.js</a> 和 <a href="https://github.com/SkyAPM/go2sky">Go</a> 语言。</p> |
| <p>目前 Skywalking 已经支持从 6 个可视化维度剖析分布式系统的运行情况。总览视图是应用和组件的全局视图,其中包括组件和应用数量,应用的告警波动,慢服务列表以及应用吞吐量;拓扑图从应用依赖关系出发,展现整个应用的拓扑关系;应用视图则是从单个应用的角度,展现应用的上下游关系,TopN 的服务和服务器,JVM 的相关信息以及对应的主机信息。服务视图关注单个服务入口的运行情况以及此服务的上下游依赖关系,依赖度,帮助用户针对单个服务的优化和监控;调用链展现了调用的单次请求经过的所有埋点以及每个埋点的执行时长;告警视图根据配置阈值针对应用、服务器、服务进行实时告警。</p> |
| <h2 id="dubbo-与-apache-skywalking">Dubbo 与 Apache Skywalking</h2> |
| <h3 id="编写-dubbo-示例程序">编写 Dubbo 示例程序</h3> |
| <p>Dubbo 实例程序已上传到 <a href="https://github.com/SkywalkingTest/dubbo-trace-example">Github 仓库</a>中。方便大家下载使用。</p> |
| <h4 id="api-工程">API 工程</h4> |
| <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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> org.apache.skywalking.demo.interfaces<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">interface</span> <span style="color:#268bd2">HelloService</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> String <span style="color:#268bd2">sayHello</span><span style="color:#719e07">(</span>String name<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div><h4 id="dubbo-服务提供工程">Dubbo 服务提供工程</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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> org.apache.skywalking.demo.provider<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">@Service</span><span style="color:#719e07">(</span>version <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;${demo.service.version}&#34;</span><span style="color:#719e07">,</span> |
| </span></span><span style="display:flex;"><span> application <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;${dubbo.application.id}&#34;</span><span style="color:#719e07">,</span> |
| </span></span><span style="display:flex;"><span> protocol <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;${dubbo.protocol.id}&#34;</span><span style="color:#719e07">,</span> |
| </span></span><span style="display:flex;"><span> registry <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;${dubbo.registry.id}&#34;</span><span style="color:#719e07">,</span> timeout <span style="color:#719e07">=</span> 60000<span style="color:#719e07">)</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">HelloServiceImpl</span> <span style="color:#268bd2">implements</span> HelloService <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> String <span style="color:#268bd2">sayHello</span><span style="color:#719e07">(</span>String name<span style="color:#719e07">)</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> LockSupport<span style="color:#719e07">.</span>parkNanos<span style="color:#719e07">(</span>TimeUnit<span style="color:#719e07">.</span>SECONDS<span style="color:#719e07">.</span>toNanos<span style="color:#719e07">(</span>1<span style="color:#719e07">));</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> <span style="color:#2aa198">&#34;Hello, &#34;</span> <span style="color:#719e07">+</span> name<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></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div><h4 id="consumer-工程">Consumer 工程</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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> org.apache.skywalking.demo.consumer<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">@RestController</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">ConsumerController</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> <span style="color:#268bd2">static</span> <span style="color:#dc322f">int</span> COUNT <span style="color:#719e07">=</span> 0<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">@Reference</span><span style="color:#719e07">(</span>version <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;${demo.service.version}&#34;</span><span style="color:#719e07">,</span> |
| </span></span><span style="display:flex;"><span> application <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;${dubbo.application.id}&#34;</span><span style="color:#719e07">,</span> |
| </span></span><span style="display:flex;"><span> url <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;dubbo://localhost:20880&#34;</span><span style="color:#719e07">,</span> timeout <span style="color:#719e07">=</span> 60000<span style="color:#719e07">)</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> HelloService helloService<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">@GetMapping</span><span style="color:#719e07">(</span><span style="color:#2aa198">&#34;/sayHello/{name}&#34;</span><span style="color:#719e07">)</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> String <span style="color:#268bd2">sayHello</span><span style="color:#719e07">(</span><span style="color:#268bd2">@PathVariable</span><span style="color:#719e07">(</span>name <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;name&#34;</span><span style="color:#719e07">)</span> String name<span style="color:#719e07">)</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">if</span> <span style="color:#719e07">((</span>COUNT<span style="color:#719e07">++)</span> <span style="color:#719e07">%</span> 3 <span style="color:#719e07">==</span> 0<span style="color:#719e07">){</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">throw</span> <span style="color:#719e07">new</span> RuntimeException<span style="color:#719e07">();</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">}</span> |
| </span></span><span style="display:flex;"><span> LockSupport<span style="color:#719e07">.</span>parkNanos<span style="color:#719e07">(</span>TimeUnit<span style="color:#719e07">.</span>SECONDS<span style="color:#719e07">.</span>toNanos<span style="color:#719e07">(</span>2<span style="color:#719e07">));</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> helloService<span style="color:#719e07">.</span>sayHello<span style="color:#719e07">(</span>name<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><h3 id="部署-apache-skywalking">部署 Apache Skywalking</h3> |
| <p>Apache Skywalking 共提供两种部署模式:单节点模式和集群模式,以下为单节点模式部署步骤,集群模式部署详情参考<a href="https://skywalking.apache.org/docs/main/next/en/setup/backend/backend-setup/">文档</a>。</p> |
| <h4 id="依赖第三方组件">依赖第三方组件</h4> |
| <ol> |
| <li>JDK8+</li> |
| <li>Elasticsearch 5.x</li> |
| </ol> |
| <h4 id="部署步骤">部署步骤</h4> |
| <ol> |
| <li>下载 <a href="http://skywalking.apache.org/downloads/">Apache Skywalking Collector</a></li> |
| <li>部署 ElasticSearch |
| <ul> |
| <li>修改 elasticsearch.yml文件,并设置 <code>cluster.name</code> 设置成 <code>CollectorDBCluster</code>。此名称需要和 collector 配置文件一致。</li> |
| <li>修改ES配置 <code>network.host</code> 值,将 <code>network.host</code> 的值修改成 <code>0.0.0.0</code>。</li> |
| <li>启动 Elasticsearch</li> |
| </ul> |
| </li> |
| <li>解压并启动 Skywalking Collector。运行 <code>bin/startup.sh</code> 命令即可启动 Skywalking Collector</li> |
| </ol> |
| <h4 id="启动示例程序">启动示例程序</h4> |
| <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>./mvnw clean package |
| </span></span></code></pre></div><h4 id="启动服务提供端">启动服务提供端</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>java -jar -javaagent:<span style="color:#268bd2">$AGENT_PATH</span>/skywalking-agent.jar -Dskywalking.agent.application_code<span style="color:#719e07">=</span>dubbo-provider -Dskywalking.collector.servers<span style="color:#719e07">=</span>localhost:10800 dubbo-provider/target/dubbo-provider.jar |
| </span></span></code></pre></div><h4 id="启动服务消费端">启动服务消费端</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>java -jar -javaagent:<span style="color:#268bd2">$AGENT_PATH</span>/skywalking-agent.jar -Dskywalking.agent.application_code<span style="color:#719e07">=</span>dubbo-consumer -Dskywalking.collector.servers<span style="color:#719e07">=</span>localhost:10800 dubbo-consumer/target/dubbo-consumer.jar |
| </span></span></code></pre></div><h4 id="访问消费端提供的服务">访问消费端提供的服务</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>curl http://localhost:8080/sayHello/test |
| </span></span></code></pre></div><h2 id="skywalking-监控截图">Skywalking 监控截图:</h2> |
| <h3 id="首页">首页</h3> |
| <p><img src="https://dubbo.apache.org/imgs/admin/skywalking-dashboard.png" alt="/admin-guide/images/skywalking-dashboard.png"></p> |
| <h3 id="拓扑图">拓扑图</h3> |
| <p><img src="https://dubbo.apache.org/imgs/admin/skywalking-topology.png" alt="/admin-guide/images/skywalking-topology.png"></p> |
| <h3 id="应用视图">应用视图</h3> |
| <p><img src="https://dubbo.apache.org/imgs/admin/skywalking-application.png" alt="/admin-guide/images/skywalking-application.png"></p> |
| <p>JVM 信息</p> |
| <p><img src="https://dubbo.apache.org/imgs/admin/skywalking-application_instance.png" alt="/admin-guide/images/skywalking-application_instance.png"></p> |
| <h3 id="服务视图">服务视图</h3> |
| <p>服务消费端:</p> |
| <p><img src="https://dubbo.apache.org/imgs/admin/skywalking-service-consumer.png" alt="/admin-guide/images/skywalking-service-consumer.png"></p> |
| <p>服务提供端:</p> |
| <p><img src="https://dubbo.apache.org/imgs/admin/skywalking-service-provider.png" alt="/admin-guide/images/skywalking-service-provider.png"></p> |
| <h3 id="trace视图">Trace视图</h3> |
| <p><img src="https://dubbo.apache.org/imgs/admin/skywalking-trace.png" alt="/admin-guide/images/skywalking-trace.png"></p> |
| <p>Span 信息:</p> |
| <p><img src="https://dubbo.apache.org/imgs/admin/skywalking-span-Info.png" alt="/admin-guide/images/skywalking-span-Info.png"></p> |
| <h3 id="告警视图">告警视图</h3> |
| <p><img src="https://dubbo.apache.org/imgs/admin/skywalking-alarm.png" alt="/admin-guide/images/skywalking-alarm.png"></p></description></item><item><title>Docsv2.7: 使用 Pinpoint 做分布式跟踪</title><link>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/pinpoint/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/docsv2.7/admin/ops/pinpoint/</guid><description> |
| <p>在使用 Dubbo 进行服务化或者整合应用后,假设某个服务后台日志显示有异常,这个服务又被多个应用调用的情况下,我们通常很难判断是哪个应用调用的,问题的起因是什么,因此我们需要一套分布式跟踪系统来快速定位问题,Pinpoint 可以帮助我们快速定位问题(当然,解决方案也不止这一种)。</p> |
| <h2 id="什么是-pinpoint">什么是 Pinpoint</h2> |
| <blockquote> |
| <p>摘自 <a href="https://skyao.gitbooks.io/learning-pinpoint/content/index.html">Pinpoint 学习笔记</a></p> |
| </blockquote> |
| <p><a href="https://github.com/naver/pinpoint">Pinpoint</a> 是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统。</p> |
| <p>仿照 Google Dapper,Pinpoint 通过跟踪分布式应用之间的调用来提供解决方案,以帮助分析系统的总体结构和内部模块之间如何相互联系。</p> |
| <blockquote> |
| <p>注:对于各个模块之间的通讯英文原文中用的是transaction一词,但是我觉得如果翻译为&quot;事务&quot;容易引起误解,所以替换为&quot;交互&quot;或者&quot;调用&quot;这种比较直白的字眼。</p> |
| </blockquote> |
| <p>在使用上力图简单高效:</p> |
| <ul> |
| <li>安装 agent,不需要修改哪怕一行代码</li> |
| <li>最小化性能损失</li> |
| </ul> |
| <h3 id="服务器地图servermap">服务器地图(ServerMap)</h3> |
| <p>通过可视化分布式系统的模块和他们之间的相互联系来理解系统拓扑。点击某个节点会展示这个模块的详情,比如它当前的状态和请求数量。</p> |
| <h3 id="实时活动线程图表realtime-active-thread-chart">实时活动线程图表(Realtime Active Thread Chart)</h3> |
| <p>实时监控应用内部的活动线程。</p> |
| <h3 id="请求应答分布图表requestresponse-scatter-chart">请求/应答分布图表(Request/Response Scatter Chart)</h3> |
| <p>长期可视化请求数量和应答模式来定位潜在问题。通过在图表上拉拽可以选择请求查看更多的详细信息。</p> |
| <h3 id="调用栈callstack">调用栈(CallStack)</h3> |
| <p>在分布式环境中为每个调用生成代码级别的可视图,在单个视图中定位瓶颈和失败点。</p> |
| <h3 id="巡查inspector">巡查(Inspector)</h3> |
| <p>查看应用上的其他详细信息,比如CPU使用率,内存/垃圾回收,TPS,和JVM参数。</p> |
| <h3 id="支持模块">支持模块</h3> |
| <ul> |
| <li>JDK 6+</li> |
| <li>Tomcat 6/7/8, Jetty 8/9, JBoss EAP 6, Resin 4, Websphere 6/7/8, Vertx 3.3/3.4/3.5</li> |
| <li>Spring, Spring Boot (Embedded Tomcat, Jetty)</li> |
| <li>Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient</li> |
| <li>Thrift Client, Thrift Service, DUBBO PROVIDER, DUBBO CONSUMER</li> |
| <li>ActiveMQ, RabbitMQ</li> |
| <li>MySQL, Oracle, MSSQL, CUBRID,POSTGRESQL, MARIA</li> |
| <li>Arcus, Memcached, Redis, CASSANDRA</li> |
| <li>iBATIS, MyBatis</li> |
| <li>DBCP, DBCP2, HIKARICP</li> |
| <li>gson, Jackson, Json Lib</li> |
| <li>log4j, Logback</li> |
| <li>自定义模块</li> |
| </ul> |
| <h2 id="pinpoint-与-dubbo-的结合">Pinpoint 与 Dubbo 的结合</h2> |
| <h3 id="启动-pinpoint">启动 Pinpoint</h3> |
| <p>参考 Pinpoint 的 <a href="https://pinpoint-apm.github.io/pinpoint/quickstart.html">Quick start</a> 搭建环境(不需要启动 TestApp)</p> |
| <h3 id="准备-dubbo-示例程序">准备 Dubbo 示例程序</h3> |
| <h4 id="创建-api-包">创建 API 包</h4> |
| <p>pom.xml</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:#719e07">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">&lt;project</span> xmlns=<span style="color:#2aa198">&#34;http://maven.apache.org/POM/4.0.0&#34;</span> |
| </span></span><span style="display:flex;"><span> xmlns:xsi=<span style="color:#2aa198">&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span> |
| </span></span><span style="display:flex;"><span> xsi:schemaLocation=<span style="color:#2aa198">&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;</span><span style="color:#268bd2">&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;modelVersion&gt;</span>4.0.0<span style="color:#268bd2">&lt;/modelVersion&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;groupId&gt;</span>com.example<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>demo-api<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;version&gt;</span>0.0.1-SNAPSHOT<span style="color:#268bd2">&lt;/version&gt;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">&lt;/project&gt;</span> |
| </span></span></code></pre></div><p>新建API接口:</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:#719e07">package</span> com.example.demoapi<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">interface</span> <span style="color:#268bd2">HelloService</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> String <span style="color:#268bd2">sayHello</span><span style="color:#719e07">(</span>String name<span style="color:#719e07">);</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">}</span> |
| </span></span></code></pre></div><h4 id="实现-dubbo-服务提供方">实现 Dubbo 服务提供方</h4> |
| <p>pom.xml</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:#719e07">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">&lt;project</span> xmlns=<span style="color:#2aa198">&#34;http://maven.apache.org/POM/4.0.0&#34;</span> xmlns:xsi=<span style="color:#2aa198">&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span> |
| </span></span><span style="display:flex;"><span> xsi:schemaLocation=<span style="color:#2aa198">&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;</span><span style="color:#268bd2">&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;modelVersion&gt;</span>4.0.0<span style="color:#268bd2">&lt;/modelVersion&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;groupId&gt;</span>com.example<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>demo-provider<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;version&gt;</span>0.0.1-SNAPSHOT<span style="color:#268bd2">&lt;/version&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;packaging&gt;</span>jar<span style="color:#268bd2">&lt;/packaging&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;name&gt;</span>demo-provider<span style="color:#268bd2">&lt;/name&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;parent&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;groupId&gt;</span>org.springframework.boot<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>spring-boot-starter-parent<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;version&gt;</span>2.0.3.RELEASE<span style="color:#268bd2">&lt;/version&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;relativePath/&gt;</span> <span style="color:#586e75">&lt;!-- lookup parent from repository --&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/parent&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;properties&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;project.build.sourceEncoding&gt;</span>UTF-8<span style="color:#268bd2">&lt;/project.build.sourceEncoding&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;project.reporting.outputEncoding&gt;</span>UTF-8<span style="color:#268bd2">&lt;/project.reporting.outputEncoding&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;java.version&gt;</span>1.8<span style="color:#268bd2">&lt;/java.version&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/properties&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;repositories&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;repository&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;id&gt;</span>sonatype-nexus-snapshots<span style="color:#268bd2">&lt;/id&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;url&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span style="color:#268bd2">&lt;/url&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;releases&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;enabled&gt;</span>false<span style="color:#268bd2">&lt;/enabled&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/releases&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;snapshots&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;enabled&gt;</span>true<span style="color:#268bd2">&lt;/enabled&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/snapshots&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/repository&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/repositories&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dependencies&gt;</span> |
| </span></span><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.springframework.boot<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>spring-boot-starter<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><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;dependency&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;groupId&gt;</span>com.alibaba.boot<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>dubbo-spring-boot-starter<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;version&gt;</span>0.2.0<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><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>com.example<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>demo-api<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;version&gt;</span>0.0.1-SNAPSHOT<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><span style="display:flex;"><span> |
| </span></span><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.springframework.boot<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>spring-boot-starter-test<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;scope&gt;</span>test<span style="color:#268bd2">&lt;/scope&gt;</span> |
| </span></span><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;/dependencies&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;build&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;plugins&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;plugin&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;groupId&gt;</span>org.springframework.boot<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>spring-boot-maven-plugin<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/plugin&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/plugins&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/build&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">&lt;/project&gt;</span> |
| </span></span></code></pre></div><ol> |
| <li>实现 <code>HelloService</code> 接口:</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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> com.example.demoprovider.provider<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.apache.dubbo.config.annotation.Service<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> com.example.demoapi.HelloService<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">@Service</span><span style="color:#719e07">(</span>version <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;${demo.service.version}&#34;</span><span style="color:#719e07">,</span> |
| </span></span><span style="display:flex;"><span> application <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;${dubbo.application.id}&#34;</span><span style="color:#719e07">,</span> |
| </span></span><span style="display:flex;"><span> protocol <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;${dubbo.protocol.id}&#34;</span><span style="color:#719e07">,</span> |
| </span></span><span style="display:flex;"><span> registry <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;${dubbo.registry.id}&#34;</span><span style="color:#719e07">)</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">HelloServiceImpl</span> <span style="color:#268bd2">implements</span> HelloService <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">static</span> <span style="color:#dc322f">int</span> i <span style="color:#719e07">=</span> 0<span style="color:#719e07">;</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">sayHello</span><span style="color:#719e07">(</span>String name<span style="color:#719e07">)</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> i<span style="color:#719e07">++;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">if</span> <span style="color:#719e07">(</span>i <span style="color:#719e07">%</span> 3 <span style="color:#719e07">==</span> 0<span style="color:#719e07">)</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">throw</span> <span style="color:#719e07">new</span> RuntimeException<span style="color:#719e07">(</span><span style="color:#2aa198">&#34;ex&#34;</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">return</span> <span style="color:#2aa198">&#34;Hello &#34;</span> <span style="color:#719e07">+</span> name <span style="color:#719e07">+</span> <span style="color:#2aa198">&#34;!&#34;</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><ol start="2"> |
| <li>编写 Spring Boot 引导程序:</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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> com.example.demoprovider<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.springframework.boot.SpringApplication<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.springframework.boot.autoconfigure.SpringBootApplication<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">@SpringBootApplication</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">DemoProviderApplication</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> <span style="color:#268bd2">static</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">main</span><span style="color:#719e07">(</span>String<span style="color:#719e07">[]</span> args<span style="color:#719e07">)</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> SpringApplication<span style="color:#719e07">.</span>run<span style="color:#719e07">(</span>DemoProviderApplication<span style="color:#719e07">.</span>class<span style="color:#719e07">,</span> args<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><ol start="3"> |
| <li>配置 <code>application.properties</code>:</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-properties" data-lang="properties"><span style="display:flex;"><span><span style="color:#586e75"># Spring boot application</span> |
| </span></span><span style="display:flex;"><span>spring.application.name <span style="color:#719e07">=</span> <span style="color:#2aa198">dubbo-provider-demo</span> |
| </span></span><span style="display:flex;"><span>server.port <span style="color:#719e07">=</span> <span style="color:#2aa198">9090</span> |
| </span></span><span style="display:flex;"><span>management.port <span style="color:#719e07">=</span> <span style="color:#2aa198">9091</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># Service version</span> |
| </span></span><span style="display:flex;"><span>demo.service.version <span style="color:#719e07">=</span> <span style="color:#2aa198">1.0.0</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># Base packages to scan Dubbo Components (e.g @Service , @Reference)</span> |
| </span></span><span style="display:flex;"><span>dubbo.scan.basePackages <span style="color:#719e07">=</span> <span style="color:#2aa198">com.example.demoprovider</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># Dubbo Config properties</span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">## ApplicationConfig Bean</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.id <span style="color:#719e07">=</span> <span style="color:#2aa198">dubbo-provider-demo</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.name <span style="color:#719e07">=</span> <span style="color:#2aa198">dubbo-provider-demo</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">## ProtocolConfig Bean</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.id <span style="color:#719e07">=</span> <span style="color:#2aa198">dubbo</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.name <span style="color:#719e07">=</span> <span style="color:#2aa198">dubbo</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.port <span style="color:#719e07">=</span> <span style="color:#2aa198">12345</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">## RegistryConfig Bean</span> |
| </span></span><span style="display:flex;"><span>dubbo.registry.id <span style="color:#719e07">=</span> <span style="color:#2aa198">my-registry</span> |
| </span></span><span style="display:flex;"><span>dubbo.registry.address <span style="color:#719e07">=</span> <span style="color:#2aa198">N/A</span> |
| </span></span></code></pre></div><h4 id="实现-dubbo-服务消费方">实现 Dubbo 服务消费方</h4> |
| <p>pom.xml</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:#719e07">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">&lt;project</span> xmlns=<span style="color:#2aa198">&#34;http://maven.apache.org/POM/4.0.0&#34;</span> xmlns:xsi=<span style="color:#2aa198">&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span> |
| </span></span><span style="display:flex;"><span> xsi:schemaLocation=<span style="color:#2aa198">&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;</span><span style="color:#268bd2">&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;modelVersion&gt;</span>4.0.0<span style="color:#268bd2">&lt;/modelVersion&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;groupId&gt;</span>com.example<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>demo-consumer<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;version&gt;</span>0.0.1-SNAPSHOT<span style="color:#268bd2">&lt;/version&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;packaging&gt;</span>jar<span style="color:#268bd2">&lt;/packaging&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;name&gt;</span>demo-consumer<span style="color:#268bd2">&lt;/name&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;parent&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;groupId&gt;</span>org.springframework.boot<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>spring-boot-starter-parent<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;version&gt;</span>2.0.3.RELEASE<span style="color:#268bd2">&lt;/version&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;relativePath/&gt;</span> <span style="color:#586e75">&lt;!-- lookup parent from repository --&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/parent&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;properties&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;project.build.sourceEncoding&gt;</span>UTF-8<span style="color:#268bd2">&lt;/project.build.sourceEncoding&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;project.reporting.outputEncoding&gt;</span>UTF-8<span style="color:#268bd2">&lt;/project.reporting.outputEncoding&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;java.version&gt;</span>1.8<span style="color:#268bd2">&lt;/java.version&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/properties&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;repositories&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;repository&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;id&gt;</span>sonatype-nexus-snapshots<span style="color:#268bd2">&lt;/id&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;url&gt;</span>https://oss.sonatype.org/content/repositories/snapshots<span style="color:#268bd2">&lt;/url&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;releases&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;enabled&gt;</span>false<span style="color:#268bd2">&lt;/enabled&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/releases&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;snapshots&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;enabled&gt;</span>true<span style="color:#268bd2">&lt;/enabled&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/snapshots&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/repository&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/repositories&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;dependencies&gt;</span> |
| </span></span><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.springframework.boot<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>spring-boot-starter-web<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><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;dependency&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;groupId&gt;</span>com.alibaba.boot<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>dubbo-spring-boot-starter<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;version&gt;</span>0.2.0<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><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>com.example<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>demo-api<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;version&gt;</span>0.0.1-SNAPSHOT<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><span style="display:flex;"><span> |
| </span></span><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.springframework.boot<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>spring-boot-starter-test<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;scope&gt;</span>test<span style="color:#268bd2">&lt;/scope&gt;</span> |
| </span></span><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;/dependencies&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;build&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;plugins&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;plugin&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;groupId&gt;</span>org.springframework.boot<span style="color:#268bd2">&lt;/groupId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;artifactId&gt;</span>spring-boot-maven-plugin<span style="color:#268bd2">&lt;/artifactId&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;configuration&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;classifier&gt;</span>exec<span style="color:#268bd2">&lt;/classifier&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/configuration&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/plugin&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/plugins&gt;</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">&lt;/build&gt;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">&lt;/project&gt;</span> |
| </span></span></code></pre></div><ol> |
| <li>通过 <code>@Reference</code> 注入 <code>HelloService</code></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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> com.example.democonsumer.controller<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.apache.dubbo.config.annotation.Reference<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> com.example.demoapi.HelloService<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.springframework.web.bind.annotation.RequestMapping<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.springframework.web.bind.annotation.RequestParam<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.springframework.web.bind.annotation.RestController<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">@RestController</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">DemoConsumerController</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">@Reference</span><span style="color:#719e07">(</span>version <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;${demo.service.version}&#34;</span><span style="color:#719e07">,</span> |
| </span></span><span style="display:flex;"><span> application <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;${dubbo.application.id}&#34;</span><span style="color:#719e07">,</span> |
| </span></span><span style="display:flex;"><span> url <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;dubbo://&lt;注意,这里填写具体IP&gt;:12345&#34;</span><span style="color:#719e07">)</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">private</span> HelloService helloService<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">@RequestMapping</span><span style="color:#719e07">(</span><span style="color:#2aa198">&#34;/sayHello&#34;</span><span style="color:#719e07">)</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> String <span style="color:#268bd2">sayHello</span><span style="color:#719e07">(</span><span style="color:#268bd2">@RequestParam</span> String name<span style="color:#719e07">)</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> <span style="color:#719e07">return</span> helloService<span style="color:#719e07">.</span>sayHello<span style="color:#719e07">(</span>name<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><blockquote> |
| <p>直连提供者调用需要填写具体IP地址,如果写localhost也可以,但是会被Pinpoint额外识别为一个未知服务</p> |
| </blockquote> |
| <ol start="2"> |
| <li>编写 Spring Boot 引导程序(Web 应用):</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-java" data-lang="java"><span style="display:flex;"><span><span style="color:#719e07">package</span> com.example.democonsumer<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.springframework.boot.SpringApplication<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">import</span> org.springframework.boot.autoconfigure.SpringBootApplication<span style="color:#719e07">;</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">@SpringBootApplication</span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">public</span> <span style="color:#268bd2">class</span> <span style="color:#268bd2">DemoConsumerApplication</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">public</span> <span style="color:#268bd2">static</span> <span style="color:#dc322f">void</span> <span style="color:#268bd2">main</span><span style="color:#719e07">(</span>String<span style="color:#719e07">[]</span> args<span style="color:#719e07">)</span> <span style="color:#719e07">{</span> |
| </span></span><span style="display:flex;"><span> SpringApplication<span style="color:#719e07">.</span>run<span style="color:#719e07">(</span>DemoConsumerApplication<span style="color:#719e07">.</span>class<span style="color:#719e07">,</span> args<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><ol start="3"> |
| <li>配置 <code>application.properties</code>:</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-properties" data-lang="properties"><span style="display:flex;"><span><span style="color:#586e75"># Spring boot application</span> |
| </span></span><span style="display:flex;"><span>spring.application.name<span style="color:#719e07">=</span><span style="color:#2aa198">dubbo-consumer-demo</span> |
| </span></span><span style="display:flex;"><span>server.port<span style="color:#719e07">=</span><span style="color:#2aa198">8080</span> |
| </span></span><span style="display:flex;"><span>management.port<span style="color:#719e07">=</span><span style="color:#2aa198">8081</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># Service Version</span> |
| </span></span><span style="display:flex;"><span>demo.service.version<span style="color:#719e07">=</span><span style="color:#2aa198">1.0.0</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75"># Dubbo Config properties</span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">## ApplicationConfig Bean</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.id<span style="color:#719e07">=</span><span style="color:#2aa198">dubbo-consumer-demo</span> |
| </span></span><span style="display:flex;"><span>dubbo.application.name<span style="color:#719e07">=</span><span style="color:#2aa198">dubbo-consumer-demo</span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">## ProtocolConfig Bean</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.id<span style="color:#719e07">=</span><span style="color:#2aa198">dubbo</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.name<span style="color:#719e07">=</span><span style="color:#2aa198">dubbo</span> |
| </span></span><span style="display:flex;"><span>dubbo.protocol.port<span style="color:#719e07">=</span><span style="color:#2aa198">12345</span> |
| </span></span></code></pre></div><h3 id="使用-pinpoint-agent-启动服务提供方和服务消费方">使用 Pinpoint-agent 启动服务提供方和服务消费方</h3> |
| <h4 id="启动服务提供方">启动服务提供方</h4> |
| <ol> |
| <li>编译打包</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>mvn clean package |
| </span></span></code></pre></div><ol start="2"> |
| <li>附加参数启动服务提供方</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>java -jar -javaagent:<span style="color:#268bd2">$AGENT_PATH</span>/pinpoint-bootstrap-<span style="color:#268bd2">$VERSION</span>.jar -Dpinpoint.agentId<span style="color:#719e07">=</span>demo-provider -Dpinpoint.applicationName<span style="color:#719e07">=</span>DP target/demo-provider-0.0.1-SNAPSHOT.jar |
| </span></span></code></pre></div><ol start="3"> |
| <li>附加参数启动服务消费方</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>java -jar -javaagent:<span style="color:#268bd2">$AGENT_PATH</span>/pinpoint-bootstrap-<span style="color:#268bd2">$VERSION</span>.jar -Dpinpoint.agentId<span style="color:#719e07">=</span>demo-consumer -Dpinpoint.applicationName<span style="color:#719e07">=</span>DC target/demo-comsumer-0.0.1-SNAPSHOT-exec.jar |
| </span></span></code></pre></div><ol start="4"> |
| <li>访问消费方地址模拟用户请求</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-fallback" data-lang="fallback"><span style="display:flex;"><span>http://localhost:8080/sayHello?name=ABC |
| </span></span></code></pre></div><h2 id="使用-pinpoint-快速定位问题">使用 Pinpoint 快速定位问题</h2> |
| <h3 id="首页">首页</h3> |
| <p><img src="https://dubbo.apache.org/imgs/admin/pinpoint-home.png" alt="/admin-guide/images/pinpoint-home.png"></p> |
| <blockquote> |
| <p>这里的用户请求是请求 DubboProvider 数量的双倍,原因是记录了 favicon.ico 图标请求导致的</p> |
| </blockquote> |
| <h3 id="调用树">调用树</h3> |
| <p><img src="https://dubbo.apache.org/imgs/admin/pinpoint-calltree.png" alt="/admin-guide/images/pinpoint-calltree.png"></p> |
| <h3 id="深入跟踪">深入跟踪</h3> |
| <p><img src="https://dubbo.apache.org/imgs/admin/pinpoint-mixedview.png" alt="/admin-guide/images/pinpoint-mixedview.png"></p> |
| <h3 id="其他">其他</h3> |
| <p>示例简单的模拟了 Dubbo 的提供和调用,并没有进行数据库等其他中间件的应用,详细使用请参照 Pinpoint 文档。</p></description></item></channel></rss> |