blob: 0051a3622c19e501cea69aca691dbba802cbff10 [file] [log] [blame]
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apache Dubbo – 新闻动态</title><link>https://dubbo.apache.org/zh-cn/tags/%E6%96%B0%E9%97%BB%E5%8A%A8%E6%80%81/</link><description>Recent content in 新闻动态 on Apache Dubbo</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 23 Oct 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://dubbo.apache.org/zh-cn/tags/%E6%96%B0%E9%97%BB%E5%8A%A8%E6%80%81/index.xml" rel="self" type="application/rss+xml"/><item><title>Blog: 聚焦稳定性,Dubbo Java 发版规划公布</title><link>https://dubbo.apache.org/zh-cn/blog/2022/10/22/%E8%81%9A%E7%84%A6%E7%A8%B3%E5%AE%9A%E6%80%A7dubbo-java-%E5%8F%91%E7%89%88%E8%A7%84%E5%88%92%E5%85%AC%E5%B8%83/</link><pubDate>Sat, 22 Oct 2022 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2022/10/22/%E8%81%9A%E7%84%A6%E7%A8%B3%E5%AE%9A%E6%80%A7dubbo-java-%E5%8F%91%E7%89%88%E8%A7%84%E5%88%92%E5%85%AC%E5%B8%83/</guid><description>
&lt;h2 id="dubbo-简介">Dubbo 简介&lt;/h2>
&lt;p>Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。&lt;/p>
&lt;h2 id="我应该如何选择版本">我应该如何选择版本?&lt;/h2>
&lt;p>对于这个问题,一直以来 Dubbo 都没有很好地去回答。究其原因保证所有版本的稳定性是一件非常有挑战的事情。比如在 Dubbo 2.7 的一些版本中,出现了一些前后不兼容的问题,给一些用户升级带来了困扰。为此,很多用户从保障稳定性的视角出发,选择了更保守的策略,即生产环境采用被采用最多的版本,此后就不再更新,避免升级过程中出现意外。&lt;/p>
&lt;p>但是这种方式无疑是有问题的,一方面这将导致永远无法用上社区新的功能,得到技术演进的红利;另一方面,对于安全漏洞和带来不稳定因素的 bug 等已知问题如果不升级永远会存在,久而久之将给应用带来巨大的风险,很有可能导致严重的安全生产事故。&lt;/p>
&lt;p>因此,为了更好地回答这个问题,Dubbo 制定了未来的版本迭代规划,明确版本的稳定性维护机制,提升开发者使用 Dubbo 的信心。&lt;/p>
&lt;h2 id="现状">现状&lt;/h2>
&lt;p>在此前,Dubbo 总共维护了 2.6.x、2.7.x 以及 3.x 三个大版本,其中 2.7.x 为捐献进入 Apache 基金会之后的版本。&lt;/p>
&lt;p>2.6.x 在去年已经宣布生命周期结束(EOL)了,而 2.7.x 累计维护了四年的时间了。这四年的时间里,2.7.x 版本经历了多次大的修改,如 2.7.3 版本中对 Nacos 的注册方式进行了修改、2.7.6 版本中添加了应用级服务发现、2.7.9 版本中对应用级服务发现进行大的重构等。&lt;/p>
&lt;p>这些修改都对 2.7.x 版本的稳定性带来了巨大的风险隐患,导致 2.7.x 中很多版本或多或少存在不同的问题,用户无法选择一个最稳定的版本进行使用。&lt;/p>
&lt;p>因此,我们希望在 3.x 版本中将这种不稳定的情况通过发版机制给收敛掉,提高 Dubbo 版本的稳定性。&lt;/p>
&lt;h2 id="未来总体规划">未来总体规划&lt;/h2>
&lt;p>在接下来,Dubbo 将以每 6 个月为一个周期,对每个版本包括了新功能合入、稳定性维护以及安全漏洞修复三个大方向的内容。&lt;/p>
&lt;p>新功能合入是指将 Dubbo 开发过程中所有新的特性、性能优化、破坏性修改都会被合入的行为。由于新功能是需要一段时间迭代稳定的,所以新功能的合入会给对应版本带来不稳定因素,因此只能在每个版本最开始的时候进行。&lt;/p>
&lt;p>稳定性维护是指修复&lt;strong>已有&lt;/strong>功能的非预期行为,进一步提升版本的稳定性。特别的,对于一些大的问题修复,如功能需要整体重构的,或者回带来破坏性影响的提交将被视为新功能提交,执行新功能合入的流程。避免因为修复一个问题而来带更多问题的严重后果。&lt;/p>
&lt;p>安全维护是指修复使用中的安全风险问题,这一块主要是解决来自白帽子提交的漏洞问题。&lt;/p>
&lt;p>新功能合入在每个版本中会持续 &lt;strong>6&lt;/strong> 个月,稳定性维护在每个版本中会持续 &lt;strong>12&lt;/strong> 个月,安全维护在每个版本中会持续 &lt;strong>18&lt;/strong> 个月。&lt;/p>
&lt;p>因此,从整体迭代规划来看,每 6 个月 Dubbo 会开始一个新的版本迭代,与之同时的,也会有一个版本宣布生命周期结束(EOL)。&lt;/p>
&lt;h2 id="逐版本维护规划">逐版本维护规划&lt;/h2>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/release/release-roadmap.png" alt="image.png">&lt;/p>
&lt;p>上图为具体到每个版本在每个时间点的维护状态图。&lt;/p>
&lt;p>对于 Dubbo 2.7 以及 3.0 版本,目前已经进入了安全维护阶段,将在 2023 年 3 月宣布版本维护周期结束。&lt;/p>
&lt;p>对于 Dubbo 3.1 版本,目前已经是稳定性维护阶段,如前一小节所述,目前只会继续合入和稳定性修改的修改。处于稳定性维护阶段的版本也是社区推荐生产使用的最新版本。稳定性维护工作将持续到 2023 年 3 月,在此之后会有持续 6 个月的安全维护阶段,最终在 2023 年 9 月结束其版本的生命周期。&lt;/p>
&lt;p>对于 Dubbo 3.2 版本,目前仍处在新功能合入的阶段,发布的是 beta 版本。此阶段适合一些尝鲜使用,版本稳定性相较于已经进入仅稳定性维护阶段的版本稍欠。在 2023 年 3 月,Dubbo 3.2 将结束新功能合入周期,进行充分的稳定性验证,并正式发布生产可用的 GA 版本。此后在 2023 年 9 月之前会进行稳定性的维护,在 2024 年 3 月结束版本的生命周期。&lt;/p>
&lt;p>对于 Dubbo 3.3 版本,将在 2023 年 3 月紧随着 3.2 版本结束新功能合入阶段后正式开始开发。因此,Dubbo 3.3 版本的第一个 beta release 也将会在 2023 年 3 月发布。同样的,经过 6 个月的新功能合入阶段之后,Dubbo 3.3 版本将会在 2023 年 9 月正式发布生产可用 GA 版本,同时进入稳定性维护阶段。之后在 2024 年 3 月进入安全维护阶段,在 2024 年 9 月结束版本的生命周期。&lt;/p>
&lt;h2 id="总结">总结&lt;/h2>
&lt;p>对于绝大多数的生产用户,我们建议使用&lt;strong>当前处于仅稳定性维护阶段的版本的最新小版本&lt;/strong>。如在 2022 年 9 月至 2023 年 3 月这段时间,Dubbo 3.1 是处于仅稳定性维护阶段的,因此首选 Dubbo 3.1 版本。而对于如 3.1.0、3.1.1、3.1.2 等的 Dubbo 3.1.x 的多个小版本,我们建议直接使用最新的小版本。由于各个小版本之间仅包含稳定性修复,所以越往后的版本是越稳定的。&lt;/p>
&lt;p>对于愿意尝鲜、体验新功能的用户,可以直接基于最新的开发版本进行测试。即使是开发版本,Dubbo 也有一整套的质量保障机制,如果使用过程中遇到问题,欢迎向社区提交反馈。&lt;/p>
&lt;p>目前,阿里巴巴集团已经基于 Dubbo 3.0 的稳定版本完美支撑了整个核心电商今年双十一的所有调用,现在也正在升级到 Dubbo 3.1 这个最新的稳定版本上来。我们欢迎更多的用户一起升级到 Dubbo 3.1 版本上,在升级过程中可以参考官网给出的升级指南,遇到任何问题也可以通过 issue、微信群、钉钉群及时反馈社区,我们将尽全力协助。&lt;/p>
&lt;h2 id="更多">更多&lt;/h2>
&lt;p>在版本规划的方向上,除了本次发布的迭代线路图,Dubbo 还将通过一系列的机制保障用户的使用体验是连续的、稳定的。在大版本升级方面,Dubbo 将建设&lt;strong>完善的版本升级指南&lt;/strong>,如 Dubbo 3.1 版本升级到 Dubbo 3.2 版本中的重大修改点,让用户在升级的时候能够清晰的了解其中的风险点,更好的规划升级节奏。&lt;/p>
&lt;p>此外,对于目前人在大范围使用的 Dubbo 2.7 版本,在近期 Dubbo 社区也将推出&lt;strong>针对 Dubbo 2.7 版本的升级的指南与工具&lt;/strong>,通过工程化的方式让所有的 Dubbo 2.7 用户都可以提前查出所有的版本差异点,平滑升级到 Dubbo 3 上来。&lt;/p></description></item><item><title>Blog: IntelliJ IDEA❤️Apache Dubbo,IDEA官方插件正式发布!</title><link>https://dubbo.apache.org/zh-cn/blog/2023/10/23/intellij-idea%EF%B8%8Fapache-dubboidea%E5%AE%98%E6%96%B9%E6%8F%92%E4%BB%B6%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/</link><pubDate>Mon, 23 Oct 2023 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2023/10/23/intellij-idea%EF%B8%8Fapache-dubboidea%E5%AE%98%E6%96%B9%E6%8F%92%E4%BB%B6%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/</guid><description>
&lt;p>最受欢迎的 Java 集成开发环境 IntelliJ IDEA 与开源微服务框架 Apache Dubbo 社区强强合作,给广大微服务开发者带来了福音。与 IntelliJ IDEA 2023.2 版本一起,&lt;strong>Jetbrains 官方发布了一款全新插件 - Apache Dubbo in Spring Framework&lt;/strong>。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/2023/10/plugin/img_6.png" alt="IntelliJ IDEA loves️ Apache Dubbo">&lt;/p>
&lt;p>这款插件可以帮助开发者解决 Dubbo 项目初始化问题,同时方便识别项目开发过程中的 Dubbo 服务及其依赖关系,基于 Apache Dubbo 的微服务开发将变得非常简单。&lt;/p>
&lt;h2 id="安装插件">安装插件&lt;/h2>
&lt;p>在安装 Apache Dubbo 插件之前,请确保您使用的 IntelliJ IDEA 为 2023.2 及以上版本。
&lt;img src="https://dubbo.apache.org/imgs/blog/2023/10/plugin/img.png" alt="image.png">&lt;/p>
&lt;p>有两种方式可以完成 Apache Dubbo 插件的安装&lt;/p>
&lt;h3 id="方式一">方式一&lt;/h3>
&lt;p>使用浏览器打开插件 &lt;a href="https://plugins.jetbrains.com/plugin/20938-apache-dubbo-in-spring-framework">Apache Dubbo in Spring Framework&lt;/a> 官方地址,在页面右上角,点击 “Install to IntelliJ IDEA 2023.2” 按钮即可完成插件安装。
&lt;img src="https://dubbo.apache.org/imgs/blog/2023/10/plugin/img_1.png" alt="image.png">&lt;/p>
&lt;h3 id="方式二">方式二&lt;/h3>
&lt;p>打开 Preferences -&amp;gt; Plugins,输入 &amp;lsquo;Apache Dubbo&amp;rsquo; 搜索插件,安装即可。
&lt;img src="https://dubbo.apache.org/imgs/blog/2023/10/plugin/img_2.png" alt="image.png">&lt;/p>
&lt;h2 id="使用插件新建应用">使用插件新建应用&lt;/h2>
&lt;p>插件安装完成,接下来,我们看一下如何使用插件创建和开发 Apache Dubbo 微服务应用。&lt;/p>
&lt;h3 id="打开弹窗">打开弹窗&lt;/h3>
&lt;p>通过 &amp;ldquo;File -&amp;gt; New -&amp;gt; Project&amp;rdquo; 打开新建项目对话框,在对话框中,可以看到 Apache Dubbo 插件已经出现在左侧模版列表中,点击选中即可。
&lt;img src="https://dubbo.apache.org/imgs/blog/2023/10/plugin/img_3.png" alt="image.png">&lt;/p>
&lt;p>根据应用需要,录入项目名称、保存路径、坐标、JDK版本等信息了,录入完毕之后,点击 &amp;ldquo;Next&amp;rdquo; 进入下一步。&lt;/p>
&lt;h3 id="选择组件">选择组件&lt;/h3>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/2023/10/plugin/img_4.png" alt="image.png">&lt;/p>
&lt;p>插件将使用 &lt;code>dubbo-spring-boot-starter&lt;/code> 创建 Spring Boot 项目,因此我们&lt;/p>
&lt;ul>
&lt;li>首先,需要选择 Dubbo 与 Spring Boot 的版本。&lt;/li>
&lt;li>其次,根据项目需要,选择相应的 Dubbo 与业务组件&lt;/li>
&lt;/ul>
&lt;p>最后,点击 “Create”,完成项目创建。
&lt;img src="https://dubbo.apache.org/imgs/blog/2023/10/plugin/img_5.png" alt="image.png">&lt;/p>
&lt;h2 id="总结">总结&lt;/h2>
&lt;p>IntelliJ IDEA 官方插件的发布,极大的简化了 Dubbo 项目初始化的成本,接下来,Apache Dubbo 社区会继续与 IntelliJ 官方合作,将更多的 Dubbo 特性抽象为插件组件,以简化 Dubbo 使用中的依赖、配置管理等难题。
除了插件形式外,您也可以直接打开 &lt;a href="https://start.dubbo.apache.org">start.dubbo.apache.org&lt;/a> 在线服务,通过浏览器快速创建 Dubbo 项目。&lt;/p></description></item><item><title>Blog: Dubbo 微服务专题论坛 - 8月19日北京ApacheCon大会不见不散</title><link>https://dubbo.apache.org/zh-cn/blog/2023/08/07/dubbo-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%B8%93%E9%A2%98%E8%AE%BA%E5%9D%9B-8%E6%9C%8819%E6%97%A5%E5%8C%97%E4%BA%ACapachecon%E5%A4%A7%E4%BC%9A%E4%B8%8D%E8%A7%81%E4%B8%8D%E6%95%A3/</link><pubDate>Mon, 07 Aug 2023 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2023/08/07/dubbo-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%B8%93%E9%A2%98%E8%AE%BA%E5%9D%9B-8%E6%9C%8819%E6%97%A5%E5%8C%97%E4%BA%ACapachecon%E5%A4%A7%E4%BC%9A%E4%B8%8D%E8%A7%81%E4%B8%8D%E6%95%A3/</guid><description>
&lt;p>Dubbo 微服务专题论坛将于8月19日下午在北京丽亭华苑酒店举行,作为本次 CommunityOverCode Asia 2023(原 ApacheCon Asia)大会上的重磅议题,我们将以 Apache Dubbo 为中心展开,给大家带来开源微服务技术方向发展、云原生微服务选型、企业实践分享等精彩内容!&lt;/p>
&lt;p>打开 &lt;a href="https://www.bagevent.com/event/cocasia-2023">官网购票链接&lt;/a>,输入 cocasia 优惠码可八折购票!&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/2023/8/apachecon/apachecon-rpc-schedule.png" alt="apachecon-rpc-schedule">&lt;/p>
&lt;p>作为 Apache 软件基金会(ASF)的官方全球系列大会,每年的 CommunityOverCode Asia 都吸引着来自全球各个层次的参与者、社区共同探索 &amp;ldquo;明天的技术&amp;rdquo;。8 月 18 日至 20 日,即将强势来袭的 CommunityOverCode Asia 2023 上,大家可以近距离感受来自 Apache 项目的最新发展和新兴创新。&lt;/p></description></item><item><title>Blog: GLCC x Apache Dubbo编程夏令营报名启动</title><link>https://dubbo.apache.org/zh-cn/blog/2023/07/05/glcc-x-apache-dubbo%E7%BC%96%E7%A8%8B%E5%A4%8F%E4%BB%A4%E8%90%A5%E6%8A%A5%E5%90%8D%E5%90%AF%E5%8A%A8/</link><pubDate>Wed, 05 Jul 2023 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2023/07/05/glcc-x-apache-dubbo%E7%BC%96%E7%A8%8B%E5%A4%8F%E4%BB%A4%E8%90%A5%E6%8A%A5%E5%90%8D%E5%90%AF%E5%8A%A8/</guid><description>
&lt;h2 id="背景介绍">背景介绍&lt;/h2>
&lt;p>GitLink编程夏令营(GLCC),是在CCF中国计算机学会指导下,由CCF开源发展委员会(CCF ODC)举办的面向全国高校学生的暑期编程活动。活动将覆盖近千所高校,并联合各大开源基金会、开源企业、开源社区、开源专家,旨在鼓励青年学生通过参加真实的开源软件开发,提升自身技术能力,为开源社区输送优秀人才。为青年学生提供开放友好的交流平台,希望进一步推动国内开源社区的繁荣发展。&lt;/p>
&lt;h2 id="报名方式">报名方式&lt;/h2>
&lt;p>此次报名仅限 GLCC “无奖金项目”。具体请在此查看 &lt;strong>&lt;a href="https://www.gitlink.org.cn/glcc/freeproject" target="_blank">项目详情与报名方式&lt;/a>&lt;/strong>。&lt;/p>
&lt;p>&lt;strong>Apache Dubbo 项目报名截止日期:2023-07-30&lt;/strong>&lt;/p>
&lt;p>如有更多问题,请扫描官方公众号咨询:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/contacts/wechat-account.jpg" alt="wechat-account">&lt;/p></description></item><item><title>Blog: Apache Dubbo 开源之夏 2023,贡献社区赢取 12000 奖金</title><link>https://dubbo.apache.org/zh-cn/blog/2023/05/15/apache-dubbo-%E5%BC%80%E6%BA%90%E4%B9%8B%E5%A4%8F-2023%E8%B4%A1%E7%8C%AE%E7%A4%BE%E5%8C%BA%E8%B5%A2%E5%8F%96-12000-%E5%A5%96%E9%87%91/</link><pubDate>Mon, 15 May 2023 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2023/05/15/apache-dubbo-%E5%BC%80%E6%BA%90%E4%B9%8B%E5%A4%8F-2023%E8%B4%A1%E7%8C%AE%E7%A4%BE%E5%8C%BA%E8%B5%A2%E5%8F%96-12000-%E5%A5%96%E9%87%91/</guid><description>
&lt;p>欢迎在校同学们参与Apache Dubbo开源之夏,社区导师手把手让&lt;strong>你的代码被社会广泛复用,来赚取最高12000奖金,可&lt;/strong>推荐入职/实习你心意公司,&lt;strong>又拿钱又成长又有价值&lt;/strong>,你还等什么呢?报名马上截止,快来参与Apache Dubbo开源之夏。&lt;/p>
&lt;h2 id="ospp-开源之夏是什么">OSPP 开源之夏是什么?&lt;/h2>
&lt;p>开源之夏是由“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动,旨在鼓励&lt;strong>在校学生&lt;/strong>积极参与开源软件的开发维护,促进优秀开源软件社区的蓬勃发展,培养和发掘更多优秀的开发者。
活动联合国内外各大开源社区,针对重要开源软件的开发与维护提供项目任务,并面向全球高校学生开放报名。
学生可在本活动中自主选择感兴趣的项目任务进行申请,并在中选后获得该开源项目资深维护者(社区导师)亲自指导的机会,完成项目并贡献给社区后,参与学生还将获得开源之夏&lt;strong>活动奖金&lt;/strong>和&lt;strong>结项证书&lt;/strong>。&lt;/p>
&lt;h1 id="apache-dubbo-项目简介">Apache Dubbo 项目简介&lt;/h1>
&lt;p>Apache Dubbo 是国内最具影响力的开源软件项目之一,由阿里巴巴贡献开源,是支撑阿里双十一百万集群、万亿次服务调用的核心框架,目前 Dubbo 已捐献给享誉世界的 Apache 软件基金会 (ASF)。&lt;/p>
&lt;h2 id="参与apache-dubbo开源之夏条件">参与Apache Dubbo开源之夏条件&lt;/h2>
&lt;ul>
&lt;li>本活动面向年满 18 周岁在校学生。&lt;/li>
&lt;li>暑期即将毕业的学生,只要在申请时学生证处在有效期内,就可以提交申请。&lt;/li>
&lt;li>海外学生可提供录取通知书、学生卡、在读证明等文件用于证明学生身份。&lt;/li>
&lt;/ul>
&lt;h2 id="参与apache-dubbo开源之夏你能获得什么">参与Apache Dubbo开源之夏,你能获得什么?&lt;/h2>
&lt;ol>
&lt;li>**【你的代码被社会广泛复用】**你的代码可能会运行在上万家企业核心业务逻辑中,帮助企业解决问题。&lt;/li>
&lt;li>**【赢得最高12000奖金】**奖金总额根据项目难度分为进阶 12000 元、基础 8000 元(注:奖金数额为税前人民币金额)&lt;/li>
&lt;li>**【社区核心人员辅导快速成长】**只要你报名被选中,每个题目的导师会精心手把手教你融入社区,帮助你完成题目的设计以及最终的落地。&lt;/li>
&lt;li>**【推荐入职/实习】**在本次编程之夏项目中表现优秀同学,可推荐入职/实习 你心意的公司工作。&lt;/li>
&lt;li>**【额外获得社区礼包】**所有参与本次编程之夏项目的同学,均可获得Apache Dubbo社区大礼包。&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>百分百有奖品拿哦&lt;/strong>,现在唯一的问题是时间不多了,赶紧上车报名,截止报名时间是6月4日,6个核心题目,快点来报名参与Apache Dubbo编程之夏吧。&lt;/p>
&lt;h2 id="课题报名方式">课题&amp;amp;报名方式&lt;/h2>
&lt;p>点开Apache Dubbo开源之夏的&lt;a href="https://summer-ospp.ac.cn/org/orgdetail/ab188e59-fab8-468f-bc89-bdc2bd8b5e64?lang=zh">链接&lt;/a> 选择你喜欢的题目:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://summer-ospp.ac.cn/org/prodetail/23a7f0282?list=org&amp;amp;navpage=org">IDL 管理平台&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://summer-ospp.ac.cn/org/prodetail/23a7f0286?list=org&amp;amp;navpage=org">API 管理平台&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://summer-ospp.ac.cn/org/prodetail/23a7f0284?list=org&amp;amp;navpage=org">基于 Kubernetes 的集成测试体系建设&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://summer-ospp.ac.cn/org/prodetail/23a7f0287?list=org&amp;amp;navpage=org">服务 JSON 序列化兼容性校验&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://summer-ospp.ac.cn/org/prodetail/23a7f0289?list=org&amp;amp;navpage=org">将 Dubbo 工程结构重构为 Gradle 项目&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://summer-ospp.ac.cn/org/prodetail/23a7f0292?list=org&amp;amp;navpage=org">自动化性能测试方案&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://summer-ospp.ac.cn/org/prodetail/23a7f0294?list=org&amp;amp;navpage=org">移除对 jprotoc 的依赖&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://summer-ospp.ac.cn/org/prodetail/23a7f0520?list=org&amp;amp;navpage=org">Node.js HTTP/2 协议实现&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://summer-ospp.ac.cn/org/prodetail/23a7f0553?list=org&amp;amp;navpage=org">实现 Dubbo Rust 的路由模块&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>具体流程请参考 &lt;a href="https://summer-ospp.ac.cn/help/student/">学生指南&lt;/a>。&lt;/p>
&lt;p>请注意找导师沟通截止流程时间,优先更导师沟通,能帮助你更好的了解题目。&lt;/p>
&lt;p>为了方便大家报名,我们有以下咨询通道开放,如果对报名、题目、如何撰写 Proposal 有任何疑问,都可以前往咨询:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>扫码关注回复 &amp;ldquo;Apache Dubbo&amp;rdquo; 官网微信公众号,回复 “编程之夏” 加入微信沟通群&lt;/p>
&lt;p>&lt;img src="https://intranetproxy.alipay.com/skylark/lark/0/2023/jpeg/54037/1684119089728-eae2eb7d-4098-430e-a69e-a3939265e22b.jpeg#clientId=ub09992a8-5524-4&amp;amp;from=paste&amp;amp;height=129&amp;amp;id=u938740a9&amp;amp;originHeight=258&amp;amp;originWidth=258&amp;amp;originalType=binary&amp;amp;ratio=2&amp;amp;rotation=0&amp;amp;showTitle=false&amp;amp;size=27895&amp;amp;status=done&amp;amp;style=none&amp;amp;taskId=ud0f6af1b-fed8-4a07-aa5a-4e3f3bce229&amp;amp;title=&amp;amp;width=129" alt="qrcode_for_gh_a84d4cf4c871_258 (1).jpg">&lt;/p>
&lt;/li>
&lt;li>
&lt;p>钉钉群:22895027434(Dubbo 2023 编程之夏群),搜索并加入咨询问题&lt;/p>
&lt;/li>
&lt;li>
&lt;p>发送邮件到 Apache Dubbo 邮件组:dev@dubbo.apache.org&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h1 id="参考资料">参考资料&lt;/h1>
&lt;ul>
&lt;li>Apache Dubbo Github 仓库:
&lt;ul>
&lt;li>&lt;a href="http://github.com/apache/dubbo">Java&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://github.com/apache/dubbo-go">Go&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://github.com/apache/dubbo-js">Node.js&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://github.com/apache/dubbo-rust">Rust&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://github.com/apache/dubbo-admin">Admin&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://github.com/dubbo/">更多生态&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://dubbo.apache.org/">Apache Dubbo 官网&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://summer-ospp.ac.cn/org/orgdetail/a7f6e2ad-4acc-47f8-9471-4e54b9a166a6?lang=zh">开源之夏官网&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>为了让同学们更好地了解Apache Dubbo,我们还在观望提供了电子书供大家阅读学习。&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://cn.dubbo.apache.org/zh-cn/contact/books/">Apache Dubbo 微服务开发从入门到精通&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://cn.dubbo.apache.org/zh-cn/contact/books/">Apache Dubbo3 源码深度解析&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>同时如果同学们对其他领域项目感兴趣,也可以尝试申请,例如:&lt;/p>
&lt;ul>
&lt;li>对于&lt;strong>微服务注册发现和配置管理&lt;/strong>有兴趣的同学,可以尝试填报 &lt;a href="https://summer-ospp.ac.cn/org/orgdetail/ab188e59-fab8-468f-bc89-bdc2bd8b5e64?lang=zh">Nacos 开源之夏&lt;/a>;&lt;/li>
&lt;li>对于&lt;strong>微服务分布式事务&lt;/strong>有兴趣的同学,可以尝试填报&lt;a href="https://summer-ospp.ac.cn/org/orgdetail/064c15df-705c-483a-8fc8-02831370db14?lang=zh">Seata&lt;/a>开源之夏;&lt;/li>
&lt;li>对于&lt;strong>微服务框架和RPC框架&lt;/strong>有兴趣的同学,可以尝试填报&lt;a href="https://summer-ospp.ac.cn/org/orgdetail/41d68399-ed48-4d6d-9d4d-3ff4128dc132?lang=zh">Spring Cloud Alibaba&lt;/a> 和 &lt;a href="https://summer-ospp.ac.cn/org/orgdetail/a7f6e2ad-4acc-47f8-9471-4e54b9a166a6?lang=zh">Dubbo&lt;/a> 开源之夏;&lt;/li>
&lt;li>对于&lt;strong>云原生网关&lt;/strong>有兴趣的同学,可以尝试填报&lt;a href="https://higress.io/zh-cn/blog/ospp-2023">Higress&lt;/a> 开源之夏;&lt;/li>
&lt;li>对于&lt;strong>分布式高可用防护&lt;/strong>有兴趣的同学,可以尝试填报&lt;a href="https://summer-ospp.ac.cn/org/orgdetail/5e879522-bd90-4a8b-bf8b-b11aea48626b?lang=zh">Sentinel&lt;/a> 开源之夏;&lt;/li>
&lt;li>对于&lt;strong>微服务治理&lt;/strong>有兴趣的同学,可以尝试填报&lt;a href="https://summer-ospp.ac.cn/org/orgdetail/aaff4eec-11b1-4375-997d-5eea8f51762b?lang=zh">OpenSergo&lt;/a> 开源之夏。&lt;/li>
&lt;/ul></description></item><item><title>Blog: 精进云原生 - Dubbo 3.2 正式发布</title><link>https://dubbo.apache.org/zh-cn/blog/2023/04/15/%E7%B2%BE%E8%BF%9B%E4%BA%91%E5%8E%9F%E7%94%9F-dubbo-3.2-%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/</link><pubDate>Sat, 15 Apr 2023 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2023/04/15/%E7%B2%BE%E8%BF%9B%E4%BA%91%E5%8E%9F%E7%94%9F-dubbo-3.2-%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/</guid><description>
&lt;h2 id="背景介绍">背景介绍&lt;/h2>
&lt;p>Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。&lt;/p>
&lt;h2 id="rest-协议支持">Rest 协议支持&lt;/h2>
&lt;h3 id="1-why-rest">1. Why Rest?&lt;/h3>
&lt;p>随着移动互联网的普及,越来越多的应用程序需要与不同的系统进行集成。而这些系统可能使用不同的通信协议,这就需要应用程序能够灵活地适应各种协议。Rest 协议正是一种非常灵活的协议,它使用 HTTP 进行通信,可以与几乎任何系统进行集成。&lt;/p>
&lt;p>在过去,RPC框架通常使用二进制协议进行通信,这种协议非常高效,但不够灵活。相比之下,Rest协议使用HTTP进行通信,更方便与其他系统集成,也更容易与现代化的Web和移动应用程序集成。&lt;/p>
&lt;p>除了灵活性,Rest协议还具有易读性和易用性。使用Rest协议,开发人员可以使用通用的HTTP工具(例如cURL或Postman)测试和调试服务,而不需要特定的工具。此外,由于Rest协议使用标准的HTTP方法(例如GET、POST、PUT和DELETE),因此开发人员可以更容易地理解和使用服务。&lt;/p>
&lt;h3 id="2-how-to">2. How To?&lt;/h3>
&lt;p>在之前的 Dubbo 版本中,也提供了 Rest 协议的支持,但存在以下问题:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>仅支持 JAX-RS 注解域,相较于采用度更高的 Spring Web 注解,复杂度更高&lt;/p>
&lt;/li>
&lt;li>
&lt;p>需要依赖众多外部组件,如 Resteasy、tomcat、jetty 等,才能正常工作,极大地增加了使用成本。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>因此,在 Dubbo 3.2 版本中,我们引入了 Spring Web 注解域的支持以及 Rest 协议的原生支持,无需依赖任何外部组件。&lt;/p>
&lt;p>最直观的区别是,如果你升级到了 Dubbo 3.2,通过 Spring Web 发布的服务也可以直接通过 Dubbo 来发布。这一切只需要将 @Controller 注解改成 @DubboService 注解即可。&lt;/p>
&lt;p>此外,对于原来使用 Spring Boot 或者 Spring Cloud 作为服务拆分的用户,也可以基于本功能平滑地迁移到 Dubbo 上来,以极低的成本获得 Dubbo 强大的能力。&lt;/p>
&lt;h3 id="3-whats-next">3. What&amp;rsquo;s next?&lt;/h3>
&lt;p>接下来 Dubbo 还将继续完善。除了现有的特性,我们还将加入以下新的特性,以更好地满足需求:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>HTTP/2、HTTP/3 协议的原生支持。这意味着,你可以更加方便地使用 Dubbo 与其他系统进行通信,无需担心协议的兼容性问题。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>参考 Spring Web 注解,Dubbo 原生提供 Web 注解的支持,使得用户无需依赖 Spring Web 也可以获得与使用 Spring Web 相同的体验。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>支持现有服务零改造以 Rest 协议发布。这个特性可以让你更加灵活地管理你的服务,而无需对现有的服务进行任何改动。你可以通过 Rest 协议来发布你的服务,这样你的服务就可以更加方便地被其他系统所使用了。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="可观测体系">可观测体系&lt;/h2>
&lt;p>在微服务架构下,业务系统由越来越多的服务组成,服务之间互相调用,随之而来的问题是如何快速地定位故障,并及时解决。为了解决这一问题,我们需要更多的工具和技术来确保整个系统的可靠性。其中一个解决方案是使用日志记录和分析,以便可以更好地跟踪应用程序的运行情况,找到潜在的问题并及时解决。另外,使用可视化的监控工具可以帮助我们更好地理解整个系统的状态,从而更好地预测和解决问题。最后,我们还可以使用自动化测试来确保每个服务的质量,以及整个系统的稳定性和可靠性,从而更好地满足客户的需求。&lt;/p>
&lt;p>一套完整的可观测体系应该包括以下功能:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Metrics 指标监控,用于收集和分析各种指标数据,包括系统的性能、资源消耗情况等等。通过指标监控,用户可以及时了解系统的运行情况,发现异常并做出相应的处理。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Tracing 分布式追踪,用于跟踪系统中各个服务之间的调用链路,帮助用户发现和定位潜在的性能问题、瓶颈等等。通过分布式追踪,用户可以深入了解系统的运作过程,识别出可能存在的问题并进行有效的优化和调整。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Logging 日志管理,用于记录系统中发生的各种事件和操作,包括错误日志、访问日志、事务日志等等。通过日志管理,用户可以了解系统的运行情况、故障信息等等,帮助用户快速定位问题并进行相应的处理。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>综上所述,以上三个功能不仅可以帮助用户快速定位故障,提高系统的可靠性和稳定性,还可以帮助用户深入了解系统的运行情况和性能状况,为用户提供全方位的监控和保障。&lt;/p>
&lt;p>在 Dubbo 3.2 版本中,我们主要就 Metrics 和 Tracing 两个方面进行了增强。&lt;/p>
&lt;h3 id="1-metrics">1. Metrics&lt;/h3>
&lt;p>在 Metrics 方面,我们使用 Micrometer 大幅增加了指标的埋点,包括但不限于 QPS、RT、调用总数、成功数、失败数、失败原因统计等核心服务指标。为了更好地监测服务运行状态,Dubbo 还提供了对核心组件状态的监控,例如线程池数量、服务健康状态等。此外,Dubbo 还支持标准 Prometheus 的 Pull 和 Push 模式,并提供了若干个官方原生的 Grafana 面板,实现面向生产的 Metrics 全天候观测。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/32-release/Untitled.png" alt="img">&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/32-release/Untitled%201.png" alt="Untitled">&lt;/p>
&lt;p>对于所有的用户,只需要升级到 Dubbo 3.2 版本,并添加 dubbo-spring-boot-observability-starter 依赖即可获得 Metrics 能力。在应用启动后,将在 Dubbo QoS 的 metrics 命令下暴露相关的指标,本地可以通过 &lt;code>http://127.0.0.1:22222/metrics&lt;/code> 获取。此外对于使用了 Spring Actuator 的用户,Dubbo 也将默认将这些数据暴露出来。&lt;/p>
&lt;h3 id="tracing">Tracing&lt;/h3>
&lt;p>在 Tracing 方面,我们还基于 Micrometer 实现了请求运行时的埋点跟踪。我们通过 Filter 拦截器原生方式来实现这一功能。我们支持将跟踪数据导出到一些主流实现,例如 Zipkin、Skywalking、Jaeger 等。这样就可以实现全链路跟踪数据的分析和可视化展示。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/32-release/Untitled%202.png" alt="Untitled">&lt;/p>
&lt;h3 id="logging">Logging&lt;/h3>
&lt;p>此外,对于 Logging 方面,Dubbo 从 3.1 版本开始引入了错误码机制,实现了 WARN、ERROR 级别日志的全覆盖。在异常场景下,支持快速索引官网解决文档。&lt;/p>
&lt;h2 id="native-image-原生支持">Native Image 原生支持&lt;/h2>
&lt;p>在Native Image方面,Dubbo从3.2开始将正式基于GraalVM完成对Native Image 的支持,从Dubbo3.0开始,Dubbo已经有一些Native Image支持的探索,但是易用性和支持程度都不太理想,从3.2版本开始,Dubbo将会简化用户接入Native Image的使用方式。主要可以分为三个面:&lt;/p>
&lt;ol>
&lt;li>编译插件配置升级:从最初的 native-image-maven-plugin 改为 dubbo-maven-plugin +native-maven-plugin,区分了Graalvm官方提供的native image配置与Dubbo所需的native image配置,简化了用户所需要关心的native image配置&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-xml" data-lang="xml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;plugin&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;groupId&amp;gt;&lt;/span>org.graalvm.nativeimage&lt;span style="color:#268bd2">&amp;lt;/groupId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;artifactId&amp;gt;&lt;/span>native-image-maven-plugin&lt;span style="color:#268bd2">&amp;lt;/artifactId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;version&amp;gt;&lt;/span>21.0.0.2&lt;span style="color:#268bd2">&amp;lt;/version&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;executions&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;execution&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;goals&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;goal&amp;gt;&lt;/span>native-image&lt;span style="color:#268bd2">&amp;lt;/goal&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/goals&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;phase&amp;gt;&lt;/span>package&lt;span style="color:#268bd2">&amp;lt;/phase&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/execution&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/executions&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;configuration&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;skip&amp;gt;&lt;/span>false&lt;span style="color:#268bd2">&amp;lt;/skip&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;imageName&amp;gt;&lt;/span>demo-native-provider&lt;span style="color:#268bd2">&amp;lt;/imageName&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;mainClass&amp;gt;&lt;/span>org.apache.dubbo.demo.graalvm.provider.Application&lt;span style="color:#268bd2">&amp;lt;/mainClass&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;buildArgs&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --no-fallback
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-build-time=org.slf4j.MDC
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-build-time=org.slf4j.LoggerFactory
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-build-time=org.slf4j.impl.StaticLoggerBinder
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-build-time=org.apache.log4j.helpers.Loader
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-build-time=org.apache.log4j.Logger
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-build-time=org.apache.log4j.helpers.LogLog
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-build-time=org.apache.log4j.LogManager
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-build-time=org.apache.log4j.spi.LoggingEvent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-build-time=org.slf4j.impl.Log4jLoggerFactory
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-build-time=org.slf4j.impl.Log4jLoggerAdapter
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-build-time=org.eclipse.collections.api.factory.Sets
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.channel.epoll.Epoll
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.channel.epoll.Native
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.channel.epoll.EpollEventLoop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.channel.epoll.EpollEventArray
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.channel.DefaultFileRegion
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.channel.kqueue.KQueueEventArray
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.channel.kqueue.KQueueEventLoop
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.channel.kqueue.Native
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.channel.unix.Errors
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.channel.unix.IovArray
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.channel.unix.Limits
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.util.internal.logging.Log4JLogger
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.channel.unix.Socket
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --initialize-at-run-time=io.netty.channel.ChannelHandlerMask
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --report-unsupported-elements-at-runtime
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --allow-incomplete-classpath
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> --enable-url-protocols=http
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> -H:+ReportExceptionStackTraces
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/buildArgs&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/configuration&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;/plugin&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>变为:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-xml" data-lang="xml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;plugin&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;groupId&amp;gt;&lt;/span>org.graalvm.buildtools&lt;span style="color:#268bd2">&amp;lt;/groupId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;artifactId&amp;gt;&lt;/span>native-maven-plugin&lt;span style="color:#268bd2">&amp;lt;/artifactId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;version&amp;gt;&lt;/span>0.9.20&lt;span style="color:#268bd2">&amp;lt;/version&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;configuration&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;classesDirectory&amp;gt;&lt;/span>${project.build.outputDirectory}&lt;span style="color:#268bd2">&amp;lt;/classesDirectory&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;metadataRepository&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;enabled&amp;gt;&lt;/span>true&lt;span style="color:#268bd2">&amp;lt;/enabled&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/metadataRepository&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;requiredVersion&amp;gt;&lt;/span>22.3&lt;span style="color:#268bd2">&amp;lt;/requiredVersion&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;mainClass&amp;gt;&lt;/span>org.apache.dubbo.demo.graalvm.provider.Application&lt;span style="color:#268bd2">&amp;lt;/mainClass&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/configuration&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;/plugin&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;plugin&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;groupId&amp;gt;&lt;/span>org.apache.dubbo&lt;span style="color:#268bd2">&amp;lt;/groupId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;artifactId&amp;gt;&lt;/span>dubbo-maven-plugin&lt;span style="color:#268bd2">&amp;lt;/artifactId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;version&amp;gt;&lt;/span>${project.version}&lt;span style="color:#268bd2">&amp;lt;/version&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;configuration&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;mainClass&amp;gt;&lt;/span>org.apache.dubbo.demo.graalvm.provider.Application&lt;span style="color:#268bd2">&amp;lt;/mainClass&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/configuration&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;executions&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;execution&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;phase&amp;gt;&lt;/span>process-sources&lt;span style="color:#268bd2">&amp;lt;/phase&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;goals&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;goal&amp;gt;&lt;/span>dubbo-process-aot&lt;span style="color:#268bd2">&amp;lt;/goal&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/goals&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/execution&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/executions&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;/plugin&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol>
&lt;li>旧版本中需要用户手动生成和补全Dubbo内独有的Adaptive代码,新版本用户将不需要关心这些细节。&lt;/li>
&lt;li>旧版本中Dubbo框架生成的META-INF.native-image下的配置文件会直接生成在用户的工程目录中,3.2新版本将会被编译到target下,不影响用户的工程结构。除此之外,Dubbo框架也将不再采用手动补全native image的方式,而且采用自动探测和生成所需的配置文件的方式,简化了Dubbo开发者的体验。这也能够降低最后编译后的二进制包的大小和提高编译速度。&lt;/li>
&lt;/ol>
&lt;p>除了易用性提升以外,Dubbo将在3.2版本将在native image场景下支持API、注解以及XML配置方式,并支持与SpringBoot3中的native兼容。&lt;/p>
&lt;h2 id="其他">其他&lt;/h2>
&lt;h3 id="jdk-17--spring-boot-3-原生支持">JDK 17 &amp;amp; Spring Boot 3 原生支持&lt;/h3>
&lt;p>JDK 17 是继 JDK 11 之后目前 Java 的最新 LTS 版本,包括许多新功能和改进,例如 Sealed 类、垃圾收集器的改进等等。&lt;/p>
&lt;p>自从 JDK 16 开始限制 Java 内部类反射以后,Dubbo 的序列化以及动态代理都受到了一定的影响。在 Dubbo 3.2 中,我们通过 Fastjson2 以及 Javassist 的优化从底层解决了兼容性问题。目前 Dubbo 已经可以完美运行在 JDK17 之上,所有单元测试以及大多数集成测试也都在 JDK 17 平台上测试通过。&lt;/p>
&lt;p>针对即将发布的 JDK 21 LTS,Dubbo 正在紧锣密鼓地进行适配。我们将在 3.3 版本中加入对 JDK 21 和 Dubbo 协程(Project Loom)的支持。&lt;/p>
&lt;h3 id="rpc-性能大幅提升">RPC 性能大幅提升&lt;/h3>
&lt;p>在3.2版本中,我们对RPC调用性能做了调优,其中优化内容如下。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>消除了同步锁竞争以及会出现阻塞的代码(&lt;code>triple&lt;/code>)&lt;/p>
&lt;ol>
&lt;li>在3.1版本中创建HTTP/2 Stream Channel时采用了同步阻塞用户线程的方式等待Stream Channel创建完成,创建完成后才开始发起远程调用。而在3.2中我们将创建HTTP/2 Stream Channel的行为&lt;code>异步化&lt;/code>并保证创建完毕后才发起请求,以此&lt;code>减少了用户线程不必要的等待&lt;/code>。&lt;/li>
&lt;li>在3.1版本中用户线程与Netty的I/O线程出现了同步锁竞争,IO线程每次写请求都会检查Socket可用性,而用户线程中也使用了Socket可用性检查的方法,但JDK中Socket可用性检查的实现使用了 &lt;code>synchronized&lt;/code> 来保证并发安全,为了减少这部分的耗时我们将用户线程的检查移除,消除了该部分的耗时。&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;p>减少了用同步阻塞调用方式的请求响应延迟(&lt;code>dubbo&lt;/code>、&lt;code>triple&lt;/code>)&lt;/p>
&lt;p>在3.1版本中SYNC模式下的RPC调用我们使用了阻塞队列的方式等待远程服务写回的响应,当响应写回后会添加到队列中并唤醒被阻塞的用户线程。而在3.2中我们将阻塞队列更换为并发队列,利用其CAS的机制大幅度减少线程进入阻塞的次数,提高CPU利用率并降低了响应处理延迟&lt;/p>
&lt;/li>
&lt;li>
&lt;p>减少了线程切换的次数(&lt;code>triple&lt;/code>)&lt;/p>
&lt;p>在3.1版本中SYNC模式下的RPC调用在接收响应时使用了一个消费者线程池进行处理,处理完毕后才唤醒用户线程接收响应。但通过分析SYNC模式下的消费者线程池是不必要的,多了一层消费者线程池处理不仅浪费服务器资源还降低了性能,因此我们在3.2版本中将SYNC模式下消费者线程池移除,交互模型由 &lt;code>NettyEventLoop → ConsumerThread → UserThread&lt;/code>变成了&lt;code>NettyEventLoop → UserThread&lt;/code>,以此减少服务器资源的浪费同时提高了性能&lt;/p>
&lt;/li>
&lt;li>
&lt;p>优化了I/O性能(&lt;code>dubbo&lt;/code>、&lt;code>triple&lt;/code>)&lt;/p>
&lt;p>在3.1版本中我们利用了Netty框架实现了网络通讯,但每次往对端写消息时都直接刷写到对端导致系统调用次数极高,降低了通讯性能。为此我们在3.2版本中对该进行了优化,每次发消息时是先将消息提交到一个写队列中,并在合适的时机将多个消息一次性写出,以此提高了I/O利用率,大幅度提高RPC通讯性能。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>支持在用户线程上序列化报文(&lt;code>dubbo&lt;/code>、&lt;code>triple&lt;/code>)&lt;/p>
&lt;p>在3.1版本中RPC通讯中的报文反序列化均是在单一I/O线程中串行执行的,导致无法利用多核CPU的优势。为此我们在3.2版本中支持了在用户线程上执行反序列化这类较为耗时的任务,将I/O线程的压力均分到多个CPU核心上,以此提高了&lt;code>较大报文&lt;/code>场景下的RPC性能。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>3.2对比3.1的性能提升如下:&lt;/p>
&lt;p>Triple协议:较小报文场景createUser、existUser、getUser下,提升率约在&lt;code>40-45%&lt;/code>,提升后的性能与gRPC同场景的性能基本持平。较大报文场景listUser下提升了约&lt;code>17%&lt;/code>,相较于同场景下的gRPC还低&lt;code>11%&lt;/code>。&lt;/p>
&lt;p>Dubbo协议:较小报文场景createUser、getUser下,提升率约&lt;code>180%&lt;/code>。极小报文existUser(仅一个boolean值)下提升率约&lt;code>24%&lt;/code>,而较大报文listUser提升率最高,达到了&lt;code>1000%&lt;/code>!&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/32-release/Untitled%203.png" alt="Untitled">&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/32-release/Untitled%204.png" alt="Untitled">&lt;/p>
&lt;h2 id="如何升级到-dubbo-32">如何升级到 Dubbo 3.2&lt;/h2>
&lt;h3 id="pom-升级">Pom 升级&lt;/h3>
&lt;p>最新的 Dubbo Maven 坐标为:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-xml" data-lang="xml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;dependency&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;groupId&amp;gt;&lt;/span>org.apache.dubbo&lt;span style="color:#268bd2">&amp;lt;/groupId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;artifactId&amp;gt;&lt;/span>dubbo&lt;span style="color:#268bd2">&amp;lt;/artifactId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;version&amp;gt;&lt;/span>3.2.0&lt;span style="color:#268bd2">&amp;lt;/version&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;/dependency&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="兼容性">兼容性&lt;/h3>
&lt;p>对于绝大多数的用户,升级到 Dubbo 3.2.0 是完全平滑的,仅需要修改依赖包版本即可。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>序列化校验逻辑的增强(&lt;strong>重要&lt;/strong>)&lt;/p>
&lt;p>如前文所述,在 Dubbo 3.2.0 版本中,Dubbo 将默认开启序列化白名单的强校验,以提升 Dubbo 的安全性,避免远程命令执行的问题。目前的机制通过包名递归机制自动信任了部分类,但对于一些使用了泛型等可能存在扫描不全的用户,我们建议您先升级到 Dubbo 3.1.9 版本或添加 &lt;code>-Ddubbo.application.serialize-check-status=WARN&lt;/code> 配置。观察一段时间后(通过日志、QoS 命令),如果没有触发安全告警,则可以配置强校验模式。&lt;/p>
&lt;p>关于自定义白名单的配置,可以参考官网的 &lt;code>文档 / SDK 手册 / Java SDK / 高级特性和用法 / 提升安全性 / 类检查机制&lt;/code> 一文进行配置。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>默认序列化的修改&lt;/p>
&lt;p>Dubbo 3.2.0 版本开始默认序列化方式从 &lt;code>hessian2&lt;/code> 切换为 &lt;code>fastjson2&lt;/code>,对于升级到 3.2.0 的应用,Dubbo 会自动尝试采用 &lt;code>fastjson2&lt;/code> 进行序列化。请注意,无论是客户端还是服务端,只要有一端还没有升级到 3.2.0,都将降级为 &lt;code>hessian2&lt;/code> 序列化,保证兼容性。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>默认关闭推空保护&lt;/p>
&lt;p>推空保护的目的是在注册中心出现故障并且主动推送空地址的时候,Dubbo 保留最后一批 provider 信息,以保证服务可用。但是,在大多数情况下,即使注册中心出现故障,也不会推送空地址,只有在一些特殊情况下才会出现。如果开启推空保护,则会对 Dubbo 的 Fallback 逻辑、心跳逻辑等造成较大的影响,给开发人员使用 Dubbo 带来困扰。&lt;/p>
&lt;p>如果在生产环境中需要开启推空保护以实现高可用性,可以将 &lt;code>dubbo.application.enable-empty-protection&lt;/code> 配置为 &lt;code>true&lt;/code>。但是请注意,已知开启推空保护会导致服务端应用从仅支持接口级服务发现的 &lt;code>2.6.x&lt;/code>、&lt;code>2.7.x&lt;/code> 版本升级到 &lt;code>3.x&lt;/code> 之后回滚到原来的版本时出现异常,极端情况下可能会导致服务调用失败。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h2 id="总结">总结&lt;/h2>
&lt;p>Dubbo 3.2 是一个非常重要的版本,它带来了众多新功能和改进,使得 Dubbo 更加强大和易用。我们非常感谢社区的支持和贡献,希望大家可以尽快体验 Dubbo 3.2,享受其中带来的便利和优势。&lt;/p></description></item><item><title>Blog: Go 版本入 Dubbo 生态一周年</title><link>https://dubbo.apache.org/zh-cn/blog/2021/01/14/go-%E7%89%88%E6%9C%AC%E5%85%A5-dubbo-%E7%94%9F%E6%80%81%E4%B8%80%E5%91%A8%E5%B9%B4/</link><pubDate>Thu, 14 Jan 2021 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2021/01/14/go-%E7%89%88%E6%9C%AC%E5%85%A5-dubbo-%E7%94%9F%E6%80%81%E4%B8%80%E5%91%A8%E5%B9%B4/</guid><description>
&lt;p>去年 5 月,阿里开源的高性能 RPC 框架 Dubbo 从 ASF 毕业并晋升顶级项目,同时,还宣布 Go 语言版本的 Dubbo-go 正式加入 Dubbo 官方生态。&lt;/p>
&lt;p>经过一年的发展, Dubbo-go 在技术和社区运营方面都已经有了不错的成绩。Dubbo-go 是 Dubbo 的完整 Go 语言实现,在功能实现和技术路径上与 Dubbo 有不同程度的对标,项目团队预计很快便可以追平 Java 版的功能。当然,也是因为基于 Go 语言开发,Dubbo-go 更易上手,未来或将反哺 Dubbo 的云原生化。&lt;/p>
&lt;p>Dubbo-go 近期还实现了 REST 协议以及 gRPC 的支持,打通了 Spring Cloud 和 gRPC 生态,再加上与 Java Dubbo 的互通,应用场景广泛。因此,它被其开发者叫做“all-in-one”的 RPC 框架。&lt;/p>
&lt;p>目前 Dubbo 官方已经投入人力参与 Dubbo-go 的开发,阿里集团今年完成 HSF 和 Dubbo 的融合后,会在集团内逐步推广使用 Dubbo-go。&lt;/p>
&lt;p>开源中国采访了当前正在开发中的 v1.5 版本的主要推进者邓明,回顾 Dubbo-go 的过往,尤其是最近一年的发展情况,并展望项目未来的发展。&lt;/p>
&lt;h2 id="dubbo-go-过去发展回顾">Dubbo-go 过去发展回顾&lt;/h2>
&lt;p>&lt;strong>OSCHINA:&lt;/strong> 作为项目主要推动者之一,可以简单回顾下 Dubbo-go 的发展历程吗?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>首先,个人代表社区,借助贵方平台,感谢 Dubbo-go 的使用者、曾经合作过的各个媒体平台以及 Dubbo 官方过去一年来对我们项目的关注,Dubbo-go 目前的发展离不开各方力量的帮助。&lt;/p>
&lt;p>实际上,在 Dubbo-go 加入 Dubbo 官方生态之前,已经发展了两年。它最早由其创始人于雨在 2016 年 5 月构建,同年 9 月发布并开源的。如下时间轴图清晰记录了 Dubbo-go 的前世今生。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/1year/dubbo-go-events.png" alt="img">&lt;/p>
&lt;p>&lt;strong>OSCHINA:&lt;/strong> 在去年项目刚加入 Dubbo 官方生态的时候,有开发团队成员说,Dubbo-go 当时还没能发挥出 Go 语言的优势,功能完整性还要完善。作为一个为解决 Go 项目与 Java &amp;amp; Dubbo 项目互通的项目,经过一年的发展,项目现在能发挥出 Go 语言的优势了吗,为什么?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>和去年比起来,在发挥 Go 语言自身优势上,有了很大的提高。&lt;/p>
&lt;p>Go 语言协程的个数上限比 Java 线程数目多。Go 语言的协程只运行在用户态,初始堆栈小且可伸缩,而 Java 线程启动因用户态系统态之间切换带来的额外成本被线程池抹平,所以只有在较大并发需求的场景下(核数限制的情况下,Java 线程池中最大线程数被限制),才会发挥优势。Dubbo 中类似的场景:异步处理网络和协议化的处理。我们在网络库 Getty 中加入了协程池,实现了网络收发和逻辑处理的解耦。&lt;/p>
&lt;p>另外,Go 语言上手速度确实比 Java 快好几个数量级,只要搭好具有良好扩展性的架子,社区 contributor 培养的成本比 Java 低很多。得益于此,Dubbo-go 的功能和性能将很快追平 Java。&lt;/p>
&lt;p>**&lt;strong>OSCHINA:&lt;/strong> **关于 Dubbo-go 在 Java 和 Go 运行时的兼容互通和功能一致目标,目前进展如何?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>目前,Dubbo-go 已经完全对齐 Dubbo v2.6.x,正在全力开发 v1.5.0 版本可以全面对齐 v2.7.x。&lt;/p>
&lt;p>Dubbo v2.7.5 之后开始支持应用维度的服务注册,这也是 v1.5.0 计划支持的核心特性。&lt;/p>
&lt;p>可以剧透一下,目前 v1.5.0 版本的 Dubbo-go 开发工作已经进入了尾声,正处于测试阶段。等 v1.5.0 发布之后,我们会陆续发布几个小版本,用于对齐 Dubbo v2.7.5 之后的版本。可以说,v1.5.x 主要是为了配合 dubbo 的云原生化。&lt;/p>
&lt;p>**&lt;strong>OSCHINA:&lt;/strong> **Dubbo-go 近期实现了 REST 协议支持,可以和 Spring Cloud 生态互联;年初实现了和 gRPC 的互联,这对 Dubbo-go 有什么意义?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>Dubbo-go 在支持了 REST 协议之后,已经可以做到跟绝大部分基于 HTTP 协议的微服务框架进行通信。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/1year/dubbo-go-rest.png" alt="img">&lt;/p>
&lt;p>另外一个突出优点是,支持了 gRPC 和 REST 之后,Dubbo-go 就可以考虑和一些公司内部自研的框架进行通信了。通常一些比较大的公司会自研框架,或者深度定制某些开源框架。而只要它们支持 gRPC 或者 HTTP 协议,Dubbo-go 就可以保证与这些框架的无缝衔接。&lt;/p>
&lt;p>还有一个优势,REST 协议对前端更友好,可以直接把 Dubbo-go 开发的服务给前端用,而不用加一层协议转换,也避免了前端直接发起 RPC 请求。因此,Dubbo-go 也就可以成为它们在 Go 微服务框架的一个比较优秀的选择。&lt;/p>
&lt;p>&lt;strong>OSCHINA:&lt;/strong> 1.4 版本中,Dubbo-go 在可观测性方面采用了 tracing 和 metric,metric 的实现参考了 Dubbo 的做法,也做了一些调整,具体是怎么样?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>可观测性是衡量一个微服务框架的重要方面。一般可观测性分成 tracing、metric 和 log 三个部分。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/1year/dubbo-go-observe.png" alt="img">&lt;/p>
&lt;p>在 v1.4 Dubbo-go 之前,tracing 和 metric 是 Dubbo-go 的薄弱环节。为了支持这两个,我们考察了比较多的开源框架的做法。我们发现,因为要考虑对接非常多诸如 zipkin/cat 等监控框架,所以它们往往会设计一整套监控和度量的 API。&lt;/p>
&lt;p>Dubbo 也是如此。Dubbo 的 metric 比较依赖阿里内部一个开源的 metric 的项目。这个项目也不是只能给 Dubbo 应用,而是 Java 项目都可以考虑。本质上来说,它定义了一套 API,而后提供了对不同开源框架的适配实现。把握住这一核心之后,我们就要考虑一个问题:要不要自己设计一套 API?我们的答案是 NO,并且选择了 opentracing API 作为我们监控使用的 API。&lt;/p>
&lt;p>首先,我们回顾那些自己设计了 API 的开源项目,它们的 API 和 opentracing API 还比较相像。我觉得我设计不出来一个明显比 opentracing API 更加优雅的 API 了。&lt;/p>
&lt;p>另外从实现效率上来说,如果我们使用 opentracing API 作为 Dubbo-go 接入 metric 和 tracing 的 API,那么,任何支持 opentracing API 的框架,都可以做到开箱即用。&lt;/p>
&lt;p>目前我们正在向社区用户征集监控意见,看社区希望我们在框架内什么地方进一步埋点。我们也得到了很多反馈,下一步就要考虑进一步优化采集的数据。&lt;/p>
&lt;p>&lt;strong>OSCHINA:&lt;/strong> Dubbo-go 的开发团队之前介绍,Dubbo-go 首要目的就是解决 Go 项目与 Java &amp;amp; Dubbo 项目的互通问题,同时也为 Go 项目提供了一种 RPC 与微服务开发框架的选择。但从之前的用户使用列表来看,直接把它作为 Go 的一个 RPC 框架来使用的好像并不是特别多,现在情况是这样吗?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>这个情况已经有了很大的改善了。最开始的时候,我们的用户大部分都是 Java Dubbo 那里过来的。但是到今年,据我们了解,已经有一些用户已经是直接把 Dubbo-go 作为 RPC 框架。在经过一年的发展以后,即便不考虑和 Dubbo 保持兼容这一特点,Dubbo-go 也可以说一个比较优秀的 Go 语言 RPC 框架。&lt;/p>
&lt;p>尤其是在异构系统通信和服务治理方面,我们提供了非常多样化的支持。这是很多别的 RPC 框架所不具备,或者不如我们的。&lt;/p>
&lt;p>&lt;strong>OSCHINA:&lt;/strong> 总结一下这一年里,Dubbo-go 技术方面值得了解的进展吧?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>Dubbo-go 这一年的进步很大,实现了非常多非常重要的特性。&lt;/p>
&lt;p>首先要提及的就是支持了很多协议,比如说基于 protobuf 的 gRPC 和 REST。这些协议保证了我们能够与市面上大多数的 RPC 框架进行通信,而且我们在 1.5.0 里面,还扩展支持支持基于 Json 的 gPRC 和 基于 protobuf 的 TCP 通信。&lt;/p>
&lt;p>第二则是支持了配置中心。这个功能可以提供给用户极大的配置上的灵活性。&lt;/p>
&lt;p>第三则是可观测性上改进,也就是前面提到的 metric 和 tracing。&lt;/p>
&lt;p>第四则是现在正在进行的应用注册模型,它能让我们更好地拥抱 k8s 和 servise mesh。为了支持应用注册模型,我们还实现了一个元数据中心,这个元数据中心非常有利于做网关。此外还实现了很多功能,如新的限流算法,负载均衡算法和路由策略等。具体内容,欢迎大家去看我们的 release log。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/1year/dubbo-go-arch.png" alt="img">&lt;/p>
&lt;p>&lt;strong>OSCHINA:&lt;/strong> 上个月,Go 官方公布的最新调查报告显示,Go 语言的主要用途包括编写 RPC 服务,其次库和框架方面增量巨大。“竞争对手”变多会影响到 Dubbo-go 原本的计划实施吗,Dubbo-go 和其他同类项目比有什么不同?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>我们对 Go 社区的进步感同身受。实际上,Dubbo-go 这一年很多功能的实现,都离不开合作社区的支持。比如说我们提供的基于 Nacos 的配置中心支持,以及现在正在测试基于 Nacos 的应用维度服务注册与发现,都十分依赖 Nacos 的 Go 语言 SDK 支持。&lt;/p>
&lt;p>而且我们也注意到,别的 Go 语言的微服务框架在这一年也取得了不错的进步,这是一种很好的鞭策。在 RPC 框架上,一直都是百家齐放百花争鸣局面,迫使我们朝着“人无我有,人有我精”的方向前进。到目前来说,我们感觉我们的竞争优势还是比较明显的:&lt;/p>
&lt;p>第一点就是保持了和 Dubbo 的兼容,那么原本的 Dubbo 用户在考虑 Go 语言框架的时候,我们就会是首选;&lt;/p>
&lt;p>第二个竞争优势则是支持多协议。这几年一个很明显的趋势就是,一个公司的技术栈难以保持单一,因为不同框架、不同语言会有不同优点。所以 Dubbo-go 也会是那些考虑连接异构系统用户的首选;&lt;/p>
&lt;p>第三则是软实力,也就是我们社区自身的优点。我们社区非常有活力,用户有什么问题都能够得到很快的响应;而我们的迭代速度,一直比较快。如果用户觉得自己能够很快获得帮助,那么他们也会倾向选择我们。&lt;/p>
&lt;p>&lt;strong>OSCHINA:&lt;/strong> 我们了解到,Dubbo-go/getty 是 Dubbo-go 中比较能体现 Go 语言优势的部分,目前已经被解耦出来,可以直接用。Dubbo-go 的其他组成部分会考虑同样解耦吗?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>这可以说是一个非常长远和理想化的计划了。我们现在正在做的一件事,是把项目里面用的公共方法、和框架无关的代码抽取出来,做成一个工具类库,也就是 dubbogo-gost 这个项目。&lt;/p>
&lt;p>我们注意到,不管是在 Dubbo-go,还是别的框架,这些代码都很类似,比如说对不同类型的数据排序。之前我们找过开源的 lib,但是都不尽如人意,所以我们打算把自己的拿出来,做成类似瑞士军刀一样小巧高效的工具。&lt;/p>
&lt;p>另外还要提到 dubbo-go-hessian2 开源仓库。我们可以自豪地说,这个库是 Go 里面对 hessian v2 协议支持最好的开源库。不仅仅是我们在用,阿里和蚂蚁金服也在用。我们也希望吸引更加多用户来使用,帮我们改进。&lt;/p>
&lt;p>&lt;strong>OSCHINA:&lt;/strong> Dubbo-go 今年 3 月 25 日的新版本 1.4.0 中“拿出了使用 k8s 作为注册中心的解决方案”,选择性放弃 Service 功能,将元数据直接写入到 Pod 对象的 Annotations 中。为什么做出这个决策,后续有什么落地计划?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>在使用 k8s 作为注册中心这个点上,讨论就花了很长的时间。&lt;/p>
&lt;p>其实最初考虑的是直接使用 k8s 服务发现模型,后来发现 k8s service 和 Dubbo-go Interface 之间存在一些难以调和的矛盾。比如说 Kubernetes 已经为其承载的服务提供了⼀套服务发现,服务注册,以及服务集群管理机制。⽽ Dubbo-go 也拥有⾃成体系的服务集群管理。&lt;/p>
&lt;p>这两个功能点形成了冲突,在无法调和两者的情况下,我们放弃了这个计划,并且提出了现在这个随 1.4.0 版本发布使用的模型。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/1year/dubbo-go-k8s.png" alt="img">&lt;/p>
&lt;p>后续,我们将主要考虑 k8s 本身提供的 CRD + Operator 的方案,毕竟越来越多的 k8s 周边的项目都在以 Operator 作为切入点。Dubbo-go 社区后续的方案将会以 CRD 的形式在 k8s 内注册和发现服务。这样做的原因有很多,首先是为了减少 Dubbo-go 对 kube-apiserver 的直接依赖。其次是为了标准化注册模型,当服务模型以 CRD 的形式存在在 k8s 集群中之后,其他围绕 k8s 的项目可以直接使用这些资源二次开发和拓展。而这种方式更加 CloudNative。&lt;/p>
&lt;p>&lt;strong>OSCHINA:&lt;/strong> Dubbo-go 现在在云原生应用上的布局是怎样的?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>社区的主要人力正与蚂蚁金服的 mosn 社区展开合作。目前有 5 个人力与 mosn 社区一起在 mosn 中实现 Dubbo 的服务发现、服务注册和基本的 RPC 通信等数据平面的能力,在 istio 层面支持通过 XDS 实现配置下发,以实现 mosn + Dubbo-go 【嵌入 mosn】 + istio 这种 sidecar 形式的云原生方案。已完成的工作已经在多点科技展开测试,近期 mosn 社区同学会在 A2M 大会上公布具体进展。&lt;/p>
&lt;p>除了 sidecar 这种 proxy 形式的云原生方案,社区还计划实现 Dubbo-go【应用 sdk】 + istio 这种 proxyless 方式的云原生方案。Java 应用或者 Go 应用通过 istio 的 xDS 协议完成服务注册和发现以及路由分发。或者说,我们力求微服务和云原生共存,可以称之为“双模微服务”。这种“双模微服务”允许标准的 Dubbo-go + sidecar 和 Dubbo-go【应用 sdk】 + istio 两种模式部署的应用共存。这将是 Dubbo-go v1.6 的核心工作。&lt;/p>
&lt;p>&lt;strong>OSCHINA:&lt;/strong> Dubbo-go 几乎是刚一诞生就转移到 Apache,并且很快发布了 Apache Dubbo Go v1.1.0,这对社区运营的帮助是什么,可以分享下 Dubbo-go 的运营情况和经验吗?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>可以说,Apache 基金会对我们的帮助是很大的。&lt;/p>
&lt;p>一方面,Apache 自身的光环十分有助于吸引开发关注和参与;另外一方面,Apache 的一些要求,也让社区运营更加规范。&lt;/p>
&lt;p>社区运营需要进一步规范化,透明化,以吸引更加多的人参与。我注意到很多优秀的社区运营做得很好,他们对 issue 的管理很细致,打上了各种标签,做到了对 issue 的轻重缓急的管理。这种标签能够很容易吸引一些打算尝试开源的新人,给社区带来新的血液。&lt;/p>
&lt;p>我们尝试使用 milestone 的方式来管理 Dubbo-go 的整体进度。现在也在尝试定期召开社区会议,讨论社区发展方向,重大特性的设计,以及解决争端会议会面向整个社区,想参与的人都可以参与。&lt;/p>
&lt;p>Dubbo-go 应用及规划 &lt;strong>OSCHINA:&lt;/strong> Dubbo-go 适合什么样的企业和场景?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>我们认为,如果用户需要一款 Go 语言方面 gRPC 框架,可以考虑 Dubbo-go;如果公司有和异构系统通信的需求,Dubbo-go 也是一个比较好的选择。特别是,公司内部还有 Java Dubbo 或者 Spring Clound 之类的应用,那么 Dubbo-go 优势就更加大了。&lt;/p>
&lt;p>Dubbo-go 可以说是 &amp;quot; all-in-one &amp;quot; 性质的 RPC 框架,自身包含服务治理等功能,非常省时省力,而且能够降低使用微服务的门槛。&lt;/p>
&lt;p>&lt;strong>OSCHINA:&lt;/strong> GitHub 的用户列表中已经有来自 14 家企业的使用记录,Dubbo-go 一般会提供哪些后续支持?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>我们一直都快速响应用户的问题,而且积极鼓励用户参与到 Dubbo-go 的开发中来。目前涂鸦智能、携程等几家用户已经成为了社区贡献的主要力量。&lt;/p>
&lt;p>有时候用户来做调研,进来社区咨询问题的时候,我们都会笑称他“如果选择了 Dubbo-go,就选择了一个强大的售后团队”。&lt;/p>
&lt;p>社区一位很活跃的 Contributor 潘总【github id: pantianying】对我们的热情服务应该深有体会。比如他会提 issue,然后我们也会很快解决像 router、优雅退出功能就是在潘总提出之后,我们很快实现的, 还有早期一次重构之后,也是潘总尝鲜试用。尝鲜版通常有很多 BUG,所以我们都是上班打工,下班给潘总修 BUG,也算是服务周到热情用心了。&lt;/p>
&lt;p>额外说下,目前 Dubbo 官方也已经投入人力参与 Dubbo-go 的开发,阿里集团今年完成 HSF 和 Dubbo 的融合后,会在集团内逐步推广使用 Dubbo-go。&lt;/p>
&lt;p>&lt;strong>OSCHINA:&lt;/strong> Dubbo-go 下一版本预计什么时候发布,有没有一些长远的发展计划?&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>当前正在测试的是 v1.5 版本,希望六月份能发出来。v1.6 版本正在设计和规划中,v1.6 是和 Dubbo 3 对齐的,所以也会是一个比较大的版本。&lt;/p>
&lt;p>今年我们社区主要集中在两件事上。第一件是云和云原生的支持,现在进行中的 v1.5 和 v1.6 都是围绕这一点的。今年几乎所有大的 feature 都是这方面的。&lt;/p>
&lt;p>第二件事,则是进一步提高 Dubbo-go 的文档、注释和代码质量。坦白来说,Dubbo-go 的文档并不是特别好,尤其是用户文档。我们也收到了很多用户的批评正在加强 CI 和自动化测试这块。总而言之,文档与质量这件事是今年的头等大事。&lt;/p>
&lt;p>&lt;strong>OSCHINA:&lt;/strong> 最后,请介绍一下自己吧。&lt;/p>
&lt;p>&lt;strong>Dubbo-go 邓明:&lt;/strong>&lt;/p>
&lt;p>说起来挺有意思的,就是我本身是业务开发,并不是传统意义上的中间件开发或者基础架构开发。我目前在 eBay 做支付业务的开发。eBay 是一个 WLB 的公司,也就是在 eBay 我才有了足够的业余时间,开始投入到了开源社区中。&lt;/p>
&lt;p>Dubbo-go 是我第一个深入参与的开源项目,也是我第一次尝试将个人对分布式系统和微服务治理的理解付诸实践的项目。它是我的第一个“孩子”。&lt;/p>
&lt;p>因为工作的关系,我算是 Dubbo-go 社区投入时间最多的人之一,为 Dubbo-go 开发了一些很有意思的特性,也因此成了 Apache committer。另外我还扮演了编辑的角色,帮社区小伙伴写的博客文章把把关,润润色。我也算是 Dubbo-go 的主要管理人员了,比如说 v1.5 这个版本就是主要由我推进的——这大概还是因为我时间比较多。&lt;/p></description></item><item><title>Blog: 都已经十岁的 Apache Dubbo,还能再乘风破浪吗?</title><link>https://dubbo.apache.org/zh-cn/blog/2021/01/14/%E9%83%BD%E5%B7%B2%E7%BB%8F%E5%8D%81%E5%B2%81%E7%9A%84-apache-dubbo%E8%BF%98%E8%83%BD%E5%86%8D%E4%B9%98%E9%A3%8E%E7%A0%B4%E6%B5%AA%E5%90%97/</link><pubDate>Thu, 14 Jan 2021 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2021/01/14/%E9%83%BD%E5%B7%B2%E7%BB%8F%E5%8D%81%E5%B2%81%E7%9A%84-apache-dubbo%E8%BF%98%E8%83%BD%E5%86%8D%E4%B9%98%E9%A3%8E%E7%A0%B4%E6%B5%AA%E5%90%97/</guid><description>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/10years/dubbo-home.png" alt="img">&lt;/p>
&lt;p>纵观中国开源历史,你真的没法找到第二个像 Dubbo 一样自带争议和讨论热度的开源项目。&lt;/p>
&lt;p>一方面,2011 年,它的开源填补了当时生产环境使用的 RPC 框架的空白,一发布就被广泛采用;另一方面,它经历了停止维护、重启维护后捐献给 Apache 基金会、接着又以顶级项目的身份毕业。&lt;/p>
&lt;p>面对多疑的开发者,在云原生时代,Apache Dubbo 将如何延续当前光芒?&lt;/p>
&lt;p>今年是 Dubbo 从 Apache 基金会毕业的一周年,同时也是推进 Dubbo 3.0,即全面拥抱云原生的重要一年。开源中国与 Apaceh Dubbo 共同策划**【Dubbo 云原生之路】**系列文章,和大家一起回顾 Apache Dubbo 社区的发展。系列文章主要涵盖 Dubbo 技术解读、社区、应用案例解析三大部分,之后每周都会和大家见面。&lt;/p>
&lt;p>&lt;strong>在【阿里巴巴云原生公众号】留言说出与 Apache Dubbo 的故事&lt;/strong>,点赞排名前十的同学可领取 Dubbo 送出的专属奖品杯子一只;另外由Apache Dubbo PMC @Chickenlj 随机抽取一名幸运读者,赠送价值 260 元护眼灯一台。下周三开奖。&lt;/p>
&lt;p>&lt;strong>作者简介&lt;/strong>&lt;/p>
&lt;p>&lt;strong>刘军&lt;/strong>,花名陆龟,GitHub 账号 Chickenlj,Apache Dubbo PMC,项目核心开发,见证了 Dubbo 重启开源,到从 Apache 基金会毕业的整个过程。现任职阿里云云原生应用平台团队,参与服务框架、微服务相关工作,目前主要在推动 Dubbo 3.0 - Dubbo 云原生。&lt;/p>
&lt;h1 id="系列开篇30-全面铺开asf-毕业一周年">系列开篇:3.0 全面铺开、ASF 毕业一周年&lt;/h1>
&lt;p>从 2019 年到现在,在 Dubbo 毕业的这一年时间里,Dubbo 社区和产品都取得长足进步,同时 Dubbo 云原生版本 - Dubbo 3.0 的开发工作也已经全面铺开。&lt;/p>
&lt;p>社区方面。需要重点提及的有两点:一个是落地与贡献的企业用户进一步增加,主动与社区取得联系的中、大规模公司达 200 多家,如携程、工商银行、瓜子二手车、网联清算、中通等;另一个是&lt;a href="http://mp.weixin.qq.com/s?__biz=MjM5NzM0MjcyMQ==&amp;amp;mid=2650091639&amp;amp;idx=1&amp;amp;sn=9733d57fd9babe53826bc93c2a466adf&amp;amp;chksm=bedaeb1989ad620f99abfee5902d69dc6c7544d1d70803d854f20ea7a1a44c1d0c4ba82f8d3a&amp;amp;scene=21#wechat_redirect">&lt;strong>以 Dubbo-go 为代表的子社区&lt;/strong>&lt;/a>蓬勃发展。&lt;/p>
&lt;p>产品技术演进方面。Dubbo Java 版发布 10 个版本,在多语言、协议、性能、服务治理模型等方面都有深度探索。Dubbo go 发布超过 8 个版本,在功能基本对齐 Java 版本的基础上,一些方向上也已经走在了 Java 版本前面。&lt;/p>
&lt;p>值得一提的是,阿里巴巴内部也正在积极推动 Dubbo 社区版本在内部的落地,从今年开始逐步实现&lt;strong>以 Dubbo 替换其内部的 HSF 框架&lt;/strong>。这一方面有利于阿里将其在 HSF 上的丰富服务治理经验回馈输出到社区,另一方面阿里官方的落地也将直接加速 Dubbo 云原生的发展。&lt;/p>
&lt;p>在云原生大潮下,&lt;strong>3.0 已被正式列为今年 Dubbo 产品建设的核心目标&lt;/strong>,涉及下一代 RPC 协议、服务治理模型、云原生基础设施适配等多方面的内容。其中,很多方面已经在当前的 2.7 版本中做了前置性探索,如近期发布的基于 HTTP/2 的协议支持、应用级服务发现等,后续工作将以此为基础展开。系列文章也会有对 Dubbo 3.0 Roadmap 及技术方案的详细解析。&lt;/p>
&lt;h2 id="dubbo-毕业一周年回顾">Dubbo 毕业一周年回顾&lt;/h2>
&lt;p>2017 年 7 月,Dubbo 开源项目被重新激活,2018 年捐献到 Apache 基金会,2019 年 5 月,Dubbo 正式从 Apache 基金会孵化毕业,成为 Apache 顶级项目。接下来,文章分别从社区、子社区、产品三方面介绍 Dubbo 过去一年的成绩。&lt;/p>
&lt;h3 id="社区一年发布-24-个版本贡献者已超-300">社区一年发布 24 个版本,贡献者已超 300&lt;/h3>
&lt;p>如果说最开始重新激活是以阿里巴巴为主导的项目维护投入,那自 Dubbo 加入 Apache 起,它就已经开始成为一个社区主导、社区贡献为主的完全开放的基金会项目。&lt;/p>
&lt;p>到今天,这一趋势正变得更明显。包括阿里巴巴、携程、工商银行、瓜子二手车、网联清算、中通等在内的互联网、传统企业公司,在 Dubbo 的使用与社区代码贡献上都有投入。Dubbo 社区正变得非常活跃和多样化。&lt;/p>
&lt;p>过去一年,Dubbo 社区项目总共发布 24 个版本,发展 Committer/PMC 27 人,其中有 20% 的贡献者是来自于阿里巴巴,80% 以上来自不同组织的开发者或爱好者。&lt;/p>
&lt;p>Dubbo 社区组织了超过 10 场线下 meetup 活动,基本覆盖了国内开发者聚集的城市。通过线下或线上直播活动,分享超过 100 个 topic 的演讲,深度讲解 Dubbo 社区最新动态、功能模块开发和近期规划等。主题演讲大多是社区采集方式,由 Dubbo 的深度企业分享实践经验,其中典型的代表包括携程、工商银行、考拉、信用算力等。&lt;/p>
&lt;p>从 GitHub 统计数据来看,Dubbo Star 数取得新的里程碑,已超过 3 万,相比重启开源时增长了近 5 倍;贡献者由最初的几十个增长到现在的 300 多个,而这其中有 60 多人已经被提名为 committer,不论是贡献者数量还是 committer 比例都得到很大的提升;Dubbo Java 发布的有 65 个。&lt;/p>
&lt;p>上述主要是对 Dubbo Java 项目社区发展的总结,下面将介绍 Dubbo Java 产品方面的进展。&lt;/p>
&lt;h3 id="dubbo-java-迭代目前主要维护-3-个大版本">Dubbo Java 迭代,目前主要维护 3 个大版本&lt;/h3>
&lt;p>当前社区维护的 Dubbo Java 大版本主要有 3 个,分别是 2.5.x、2.6.x 和 2.7.x。&lt;/p>
&lt;ul>
&lt;li>2.7.x 是社区的主要开发版本,在过去的一年共发布了 8 个版本(2.7.0 - 2.7.7),每个版本都有一些值得关注的特性或功能升级,涵盖从编程模型、服务治理、性能到协议的多个方面的增强;&lt;/li>
&lt;li>2.6.x 版本则定位为 bugfix 版本,过去一年共发布了 3 个版本,主要以修复问题和安全漏洞为主,并没有增加太多新的 feature;&lt;/li>
&lt;li>2.5.x 版本从 2019 年初开始已宣布 EOF,只做安全修复;而到了下半年已经完全停止了维护。&lt;/li>
&lt;/ul>
&lt;p>下面通过一个简要分层模块图,回顾过去一段时间 Dubbo 的技术架构演进,从编程模型、服务治理、传输协议、性能优化等角度切入:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/10years/dubbo-layer.png" alt="img">&lt;/p>
&lt;p>以上很多功能都已被各大厂商落地,用于解决具体的业务问题。我们也期待,接下来这些厂商带来更多关于 Dubbo 实践经验的深度总结。&lt;/p>
&lt;h3 id="dubbo-go-发展的第五年正与-dubbo-齐头并进">Dubbo-go 发展的第五年,正与 Dubbo 齐头并进&lt;/h3>
&lt;p>除 Dubbo Java 之外,Dubbo 周边也发展出了很多优秀的子项目(子社区),其中包括 Dubbo-spring-boot-project、Dubbo-go 等,这里先着重介绍 Dubbo-go 子社区。&lt;/p>
&lt;p>Dubbo-go 项目最早由于雨在 2016 年 5 月构建,同年 9 月发布并开源,如下时间轴图清晰记录了 Dubbo-go 的前世今生。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/10years/dubbo-go-events.png" alt="img">&lt;/p>
&lt;p>秉承 &amp;ldquo;bridge the gap between Java and Go&amp;rdquo; 天然使命的 Dubbo-go,已经进入第五个年头,也走出了自己独特的发展路径:&lt;/p>
&lt;ul>
&lt;li>当前的 v1.4.0 版本已对齐 2.6.x 版本,即将发布的版本将与 v2.7.x【对标 v2.7.5】对齐,而后将会发布对标 Dubbo 3.x 的 v1.6.0版本;&lt;/li>
&lt;li>独立维护从底层的 hessian2 协议库 Dubbo-go-hessian2、网络库 getty 到上层对标 Dubbo 的 Dubbo-go 的全套实现;&lt;/li>
&lt;li>独立的 TCP + Protobuf 和 gRPC + JSON 通信方案也已开发完成【将包含着在版本 v1.5.0 中】;&lt;/li>
&lt;li>已与 Dubbo/gRPC/&lt;a href="https://mp.weixin.qq.com/s?__biz=MzA4ODg0NDkzOA==&amp;amp;mid=2247487916&amp;amp;idx=1&amp;amp;sn=894316507590793285d0e15734db0bde&amp;amp;scene=21#wechat_redirect">Spring Boot&lt;/a> 实现互联互通;&lt;/li>
&lt;li>通过接入 &lt;a href="https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&amp;amp;mid=2247488596&amp;amp;idx=2&amp;amp;sn=4d554d32fdd167b6b74fc792c78fb341&amp;amp;scene=21#wechat_redirect">Opentracing&lt;/a> 和 Promethus,Dubbo-go 在可观测性等微服务方向的进行了自己独特的探索;&lt;/li>
&lt;li>已实现了基于 HTTPS 的&lt;a href="https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&amp;amp;mid=2247489539&amp;amp;idx=3&amp;amp;sn=379514cac71b91d57643e6f3d2701cdf&amp;amp;scene=21#wechat_redirect">可信 RPC 调用&lt;/a>;&lt;/li>
&lt;li>已经实现了自己独特的&lt;a href="https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&amp;amp;mid=2247489465&amp;amp;idx=3&amp;amp;sn=514144ef1a217a50b9f5a640ca122ac8&amp;amp;scene=21#wechat_redirect">把 Kubernetes 作为注册中心的微服务方案&lt;/a>;&lt;/li>
&lt;/ul>
&lt;p>Dubbo-go 从最开始 Dubbo 的 Go 语言实现,已发展成为目前 Dubbo 多语言版本中功能最强大者,它的发展离不开背后强大的 Dubbo-go 社区。除了上述 Dubbo-go 的自身特性外,通过跨社区合作,取得了如下成绩:&lt;/p>
&lt;ul>
&lt;li>通过与 MOSN 社区合作,已经实现 Dubbo/Dubbo-go 应用可以零成本接入基于 MOSN 实现 Dubbo Mesh,实现微服务和云原生共存的 &lt;strong>“双模微服务”&lt;/strong>;&lt;/li>
&lt;li>与 sentinel 社区合作,在 Dubbo/Dubbo-go 完整接入 sentinel 的降级和限流方案;&lt;/li>
&lt;li>与 Apollo 社区合作,在 Dubbo-go 中实现远程配置下发;&lt;/li>
&lt;li>与 Nacos 社区合作,实现基于 Nacos 的服务发现;&lt;/li>
&lt;/ul>
&lt;p>Dubbo-go 社区 2020 年 Q2 主要目标有:&lt;/p>
&lt;ul>
&lt;li>发布完全对齐 Dubbo 2.7.x 的 v1.5.0 版本;&lt;/li>
&lt;li>发布对标 Dubbo 3.0 的 v1.6.0版本;&lt;/li>
&lt;li>在云原生方面继续自己的探索;&lt;/li>
&lt;li>继续与兄弟社区保持合作共进态势,扩大自身使用范围;&lt;/li>
&lt;li>生产实践上推进在阿里集团,以及更多厂家的落地。&lt;/li>
&lt;/ul>
&lt;p>项目(包括子项目)目前已先后在携程、涂鸦智能和蚂蚁金服等公司生产落地。&lt;/p>
&lt;p>今年阿里集团完成 HSF 和 Dubbo 的融合后,项目也将在阿里集团双十一战场经受考验。&lt;/p>
&lt;h2 id="云原生-dubbo---dubbo-30">云原生 Dubbo - Dubbo 3.0&lt;/h2>
&lt;p>3.0 是下一代 Dubbo 架构的代号。一年前,最开始探索 Reactive Stream 之时,社区也曾有过对 Dubbo 3.0的广泛讨论。而这一次,在云原生大背景下,3.0 代表了更全面的 Dubbo 架构升级,涉及到下一代 RPC 协议、全新的服务治理模型和云原生基础设施适配等。&lt;/p>
&lt;p>阿里巴巴是参与 Dubbo 3.0 开发建设的主要力量之一,这款始于阿里的开源项目正重新回归阿里内部落地。&lt;/p>
&lt;p>去年开始,阿里巴巴就已经在逐步推动以 Dubbo 替换其内部的 HSF 框架的工作,通过将 Dubbo 与 HSF 两个框架融为一体,并在此基础上发展出适应云原生架构的 Dubbo 版本。Dubbo 重回阿里巴巴的落地是拥抱社区、拥抱云原生、拥抱标准化的一次很好的实践。&lt;/p>
&lt;p>阿里巴巴内部 Dubbo 3.0 的落地,对社区也是一个重大利好,这一方面有利于阿里巴巴将其在 HSF 上的丰富服务治理经验回馈输出到社区,另一方面也将直接推动 Dubbo 云原生架构的快速演进。除了阿里巴巴之外,包括斗鱼、工商银行、爱奇艺等厂商也都在参与下一代 Dubbo 3.0 的建设。&lt;/p>
&lt;p>下面列出了 Dubbo 3.0 中的三个重要方向,具体的 Roadmap 将在接下来文章中单独说明:&lt;/p>
&lt;ul>
&lt;li>下一代 RPC 协议。新协议将提供更丰富的如 Stream、Flow Control 等内置语义,同时将具有更好的扩展性、网关的友好性等;&lt;/li>
&lt;li>基于应用粒度的服务发现机制。在兼顾 Dubbo 面向接口的易用性与功能性的基础上,解决与 Kubernetes Native Service 适配问题,解决大规模集群下的地址推送性能瓶颈问题;&lt;/li>
&lt;li>适配云原生基础设施的解决方案。这涉及到 Dubbo 服务与基础设施生命周期对接、Kubernetes Native Service 适配、适应基础设施调度的服务治理规则、适配 Service Mesh 架构的解决方案等;&lt;/li>
&lt;/ul>
&lt;p>接下来沿着这三个方面简要展开。&lt;/p>
&lt;h3 id="下一代-rpc-协议">下一代 RPC 协议&lt;/h3>
&lt;p>专注在协议自身来说,下一代的协议主要聚焦在 HTTP/2、Reactive Stream、Flow Control 等方面:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Reactive Stream:&lt;/strong> Reactive Stream 引入 RPC,带来更丰富的通信语义和 API 编程模型支持,如 Request-Stream、Bi-Stream 等;&lt;/li>
&lt;li>&lt;strong>HTTP/2:&lt;/strong> 微服务云原生场景下,基于 HTTP/2 构建的通信协议具有更好的通用性和穿透性;&lt;/li>
&lt;li>&lt;strong>Flow Control:&lt;/strong> 协议内置流控机制,支持类似 Reqctive Stream 的 Request (n) 流控机制。&lt;/li>
&lt;/ul>
&lt;p>从解决的业务场景问题上来说,基于新的协议 Dubbo 在框架层面要支持智能决策的负载均衡算法、对 Mesh 和网关更友好、更容易提供多语言实现与互通等。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Mesh:&lt;/strong> 协议对穿透 Mesh 更友好,区分协议头 Metadata 与 RPC Payload,方便完成与 Mesh 的协作,包括流量控制机制、应用层配置协商等;&lt;/li>
&lt;li>&lt;strong>协议通用性:&lt;/strong> 兼顾通用性与性能,支持协议能在各种设备上运行;&lt;/li>
&lt;li>&lt;strong>多语言支持:&lt;/strong> 如通过支持 Protobuf 提供了更完善的 跨语言服务定义 与 序列化传输的支持。&lt;/li>
&lt;/ul>
&lt;h3 id="应用级服务治理">应用级服务治理&lt;/h3>
&lt;p>面向接口一直以来都是 Dubbo 框架的优势。一方面它的易用性,为开发者屏蔽了远程调用的存在;另一方面面向接口的地址发现、服务治理带来了更强大的能力,使得整个 Dubbo 治理体系非常强大与灵活。&lt;/p>
&lt;p>既然面向接口有如此多的好处,那为什么我们还要探索面向应用的服务治理模式呢?&lt;/p>
&lt;p>听起来似乎有些矛盾。其实到底是面向接口,还是面向应用,只是从不同的角度看 Dubbo。我们所聊的“面向接口 -&amp;gt; 面向应用”的改造,主要体现在服务注册、发现层面:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/10years/dubbo-triangle.png" alt="img">&lt;/p>
&lt;p>而我们说的面向应用的新模型,主要对第 2 点,即注册中心的数据组织转变为 “面向应用/实例” 粒度。这为我们解决两个问题:&lt;/p>
&lt;ul>
&lt;li>在服务发现层面与 Kubernetes Service 等微服务模型对齐;&lt;/li>
&lt;li>服务发现的数据量将有一个量级的下降,从 “接口数 * 实例数 ”下降到 “应用数 * 实例数”。&lt;/li>
&lt;/ul>
&lt;p>具体可以参见文章《&lt;a href="https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&amp;amp;mid=2247489653&amp;amp;idx=1&amp;amp;sn=445692c491f68aed3f649730d3d9ba96&amp;amp;scene=21#wechat_redirect">Dubbo 迈出云原生重要一步 - 应用级服务发现解析&lt;/a>》,本系列文章后续也会有对这部分机制和实现的更深度解析。&lt;/p>
&lt;h3 id="云原生基础设施">云原生基础设施&lt;/h3>
&lt;p>云原生带来了底层基础设施,应用开发、部署和运维等全方位的变化:&lt;/p>
&lt;p>&lt;strong>基础设施&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>基础设施调度机制变化,带来运维(生命周期)、服务治理等方面的变化;&lt;/li>
&lt;li>服务发现能力下沉, Kubernetes 抽象了 Native Service Discovery。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Service Mesh - 云原生微服务解决方案&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Mesh 为跨语言、sdk 升级等提供了解决方案,Dubbo sdk 要与 Mesh 协作,做到功能、协议、服务治理等多方便的适配;&lt;/li>
&lt;li>Mesh 尚未大规模铺开,且其更适合对流量管控更关注的应用,传统 SDK 的性能优势仍旧存在,两者混部迁移场景可能会长期存在。&lt;/li>
&lt;/ul>
&lt;p>从应用场景上,Dubbo 可能的部署环境包括:&lt;/p>
&lt;ol>
&lt;li>不使用 Kubernetes Native Service,Kubernetes 只作为容器编排调度设施,继续使用 Dubbo 自建的服务注册、发现机制;&lt;/li>
&lt;li>复用 Kubernetes Native Service,Dubbo 不再关心服务注册,Dubbo Client 负责服务发现与流量分配;&lt;/li>
&lt;li>Dubbo sdk 往 Mesh 迁移,一方面要做到适应 Mesh 架构,成为 Mesh 体系下的 RPC 编程和通信方案;另一方面要做到 Dubbo 与 Mesh 架构长期共存,互相打通服务发现和治理体系;&lt;/li>
&lt;li>Kubernetes 上与云下混合部署的平滑迁移支持,包括服务发现的统一与网络通信方案的打通。&lt;/li>
&lt;/ol>
&lt;p>从 Dubbo 功能划分上,将着重从以下方面提供对云原生基础设施的支持:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>生命周期&lt;/strong>:Dubbo 与 Kubernetes 调度机制绑定,保持服务生命周期与 Pod 容器等生命周期的自动对齐;&lt;/li>
&lt;li>&lt;strong>治理规则&lt;/strong>:服务治理规则在规则体、规则格式方面进行优化,如规则体以 YAML 描述、取消过滤规则对 IP 的直接依赖,定义规则特有的 CRD 资源等;&lt;/li>
&lt;li>&lt;strong>服务发现&lt;/strong>:支持 K8S Native Service 的服务发现,包括 DNS、API-Server,支持 xDS 的服务发现;&lt;/li>
&lt;li>&lt;strong>Mesh 架构协作&lt;/strong>:构建下一代的基于 HTTP/2的通信协议,支持 xDS 的标准化的数据下发。&lt;/li>
&lt;/ul>
&lt;p>新一代的 RPC 协议和应用级服务发现模型将会是这一部分的前置基础。&lt;/p>
&lt;h1 id="总结与展望">总结与展望&lt;/h1>
&lt;p>作为系列文章开篇,我们在这里对 Dubbo 过去一年的成绩做了简要的总结与回顾,包括 Dubbo 社区、产品迭代的发展。接下来我们会看到更多来自深度 Dubbo 用户的落地经验分享,Dubbo-go 子社区的发展故事等。更重要的,我们也对下一代云原生 Dubbo - Dubbo 3.0 做了展望,后续关于 Dubbo 3.0 Roadmap、方案设计与进展解析等也将在此系列中发布。&lt;/p></description></item><item><title>Blog: Dubbo Go 的前世今生</title><link>https://dubbo.apache.org/zh-cn/blog/2021/01/11/dubbo-go-%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F/</link><pubDate>Mon, 11 Jan 2021 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2021/01/11/dubbo-go-%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F/</guid><description>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/dubbo-go-history.png" alt="img">&lt;/p>
&lt;p>dubbo-go 是目前 Dubbo 多语言生态最火热的项目。dubbo-go 最早的版本应该要追溯到 2016 年,由社区于雨同学编写 dubbo-go 的初版。当时很多东西没有现成的轮子,如 Go 语言没有像 netty 一样的基于事件的网络处理引擎、 hessian2 协议没有 Go 语言版本实现,加上当时 Dubbo 也没有开始重新维护。所以从协议库到网络引擎,再到上层 dubbo-go ,其实都是从零开始写的。&lt;/p>
&lt;p>在 2018 年,携程开始做 Go 语言的一些中间件以搭建内部的 Go 语言生态,需要有一个 Go 的服务框架可以与携程的现有 dubbo soa 生态互通。所以由我负责重构了 dubbo-go 并开源出这个版本。当时调研了很多开源的 Go 语言服务框架,当时能够支持 hessian2 协议的并跟 Dubbo 可以打通的仅找到了当时于雨写的 dubbo-go 早期版本。由于携程对社区版本的 Dubbo 做了挺多的扩展,源于对扩展性的需求我们 Go 语言版本需要一个更易于扩展的版本,加上当时这个版本本身的功能也比较简单,所以我们找到了作者合作重构了一个更好的版本。经过了大半年时间,在上图第三阶段 19 年 6 月的时候,基本上已经把 dubbo-go 重构了一遍,总体的思路是参考的 Dubbo 整体的代码架构,用Go语言完全重写了一个完整的具备服务端跟消费端的 Golang rpc/ 微服务框架。&lt;/p>
&lt;p>后来我们将重构后的版本 dubbo-go 1.0 贡献给 Apache 基金会,到现在已经过去了两个多月的时间,近期社区发布了1.1版本。目前为止,已经有包括携程在内的公司已经在生产环境开始了试用和推广。&lt;/p>
&lt;h3 id="start-dubbo-go">Start dubbo-go&lt;/h3>
&lt;p>现在的 dubbo-go 已经能够跟 Java 版本做比较好的融合互通,同时 dubbo-go 自身也是一个完成的 Go 语言 rpc/ 微服务框架,它也可以脱离 java dubbo 来独立使用。&lt;/p>
&lt;p>这边简单介绍一下用法,写一个 hello world 的例子。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/java-provider.png" alt="img">&lt;/p>
&lt;p>上图是一个简单的 java service ,注册为一个 Dubbo 服务,是一个简单的获取用户信息的例子。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/go-consumer.png" alt="img">&lt;/p>
&lt;p>上图是 dubbo-go 的客户端,来订阅和调用这个 Java 的 Dubbo 服务。Go 语言客户端需要显式调用 SetConsumerService 来注册需要订阅的服务,然后通过调用 dubbo-go-hessian2 库的 registerPOJO 方法来注册 user 对象,做 Java 和 Go 语言之间的自定义 pojo 类型转换。具体的服务调用方法就是声明一个的 GetUser 闭包,便可直接调用。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/go-provider.png" alt="img">&lt;/p>
&lt;p>上图,同样的可以基于 dubbo-go 发布一个 GetUser 的服务端,使用方式类似,发布完后可以被 dubbo java 的客户端调用。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/java-go-interop.png" alt="img">&lt;/p>
&lt;p>如上图所示,现在已经做到了这样一个程度,同样一份 dubbo-go 客户端代码,可以去调用 dubbo-go 的服务端,也可以去调用 Dubbo Java 的服务端;同样一份 dubbo-go 的服务端代码,可以被 dubbo-go 客户端和 Java 客户端调用,所以基本上使用 Dubbo 作为 PPC 框架的 Go 语言应用跟 Java 应用是没有什么阻碍的,是完全的跨语言 RPC 调用。更重要的是 dubbo-go 继承了 Dubbo 的许多优点,如易于扩展、服务治理功能强大,大家在用 Go 语言开发应用的过程中,如果也遇到类似需要与 Dubbo Java 打通的需求,或者需要找一个服务治理功能完备的 Go 微服务框架,可以看下我们 dubbo-go 项目。&lt;/p>
&lt;h3 id="dubbo-go-的组成项目">dubbo-go 的组成项目&lt;/h3>
&lt;p>下面介绍一下 dubbo-go 的组成项目,为了方便可以被其他项目直接复用, dubbo-go 拆分成了多个项目,并全部以 Apache 协议开源。&lt;/p>
&lt;h5 id="apachedubbo-go">apache/dubbo-go&lt;/h5>
&lt;p>dubbo-go 主项目, Dubbo 服务端、客户端完整 Go 语言实现。&lt;/p>
&lt;h5 id="apachedubbo-go-hession2">apache/dubbo-go-hession2&lt;/h5>
&lt;p>目前应用最广泛,与 Java 版本兼容程度最高的 hessian2 协议 Go 语言实现,已经被多个 GolangRPC &amp;amp; Service Mesh 项目使用。&lt;/p>
&lt;h5 id="dubbo-gogetty">dubbo-go/getty&lt;/h5>
&lt;p>dubbo-go 异步网络 I/O 库,将网络处理层解耦。&lt;/p>
&lt;h5 id="dubbo-gogost">dubbo-go/gost&lt;/h5>
&lt;p>基本类库,定义了 timeWheel、hashSet、taskPool 等。&lt;/p>
&lt;h5 id="dubbo-godubbo-go-benchmark">dubbo-go/dubbo-go-benchmark&lt;/h5>
&lt;p>用于对 dubbo-go 进行简单的压力测试,性能测试。&lt;/p>
&lt;h5 id="apachedubbo-go-hessian2">apache/dubbo-go-hessian2&lt;/h5>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/dubbo-go-hessian2.png" alt="img">&lt;/p>
&lt;p>先简单介绍一下 dubbo-go-hessian2 项目。该项目就是 hessian2 协议的 Go 语言实现,最基本的可以将 Java 的基本数据类型和复杂数据类型(如一些包装类和list接口实现类)与 golang 这边对应。&lt;/p>
&lt;p>详情可以参考:&lt;/p>
&lt;p>&lt;em>&lt;a href="https://github.com/hessian-group/hessian-type-mapping">https://github.com/hessian-group/hessian-type-mapping&lt;/a>&lt;/em>&lt;/p>
&lt;p>另外 Dubbo Java 服务端可以不捕获异常,将异常类通过 hession2 协议序列化通过网络传输给消费端,消费端进行反序列化对该异常对象并进行捕获。我们经过一段时间的整理,目前已经支持在 Go 消费端定义对应 Java 的超过 40 种 exception 类,来实现对 Java 异常的捕获,即使用 dubbo-go 也可以做到直接捕获 Java 服务端抛出的异常。&lt;/p>
&lt;p>另外对于 Java 端 BigDecimal 高精度计算类的支持。涉及到一些金融相关的计算会有类似的需求,所以也对这个类进行了支持。&lt;/p>
&lt;p>其他的,还有映射 java 端的方法别名,主要的原因是 Go 这边语言的规约,需要被序列化的方法名必须是首字母大写。而 Java 这边没有这种规范,所以我们加了一个 hessian 标签的支持,可以允许用户手动映射 Java 端的方法名称。&lt;/p>
&lt;p>基本上现在的 dubbo-go 已经满足绝大多数与 Java 的类型互通需求,我们近期也在实现对 Java 泛型的支持。&lt;/p>
&lt;h5 id="dubbo-gogetty-1">dubbo-go/getty&lt;/h5>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/dubbo-go-getty.png" alt="img">&lt;/p>
&lt;p>Go 语言天生就是一个异步网络 I/O 模型,在 linux 上 Go 语言写的网络服务器也是采用的 epoll 作为最底层的数据收发驱动,这跟 java 在 linux 的 nio 实现是一样的。所以 Go 语言的网络处理天生就是异步的。我们需要封装的其实是基于 Go 的异步网络读写以及之后的处理中间层。getty 将网络数据处理分为三层,入向方向分别经过对网络 i/o 封装的 streaming 层、根据不同协议对数据进行序列化反序列化的 codec 层,以及最后数据上升到需要上层消费的 handler 层。出向方向基本与入向经过的相反。每个链接的 IO 协程是成对出现的,比如读协程负责读取、 codec 逻辑然后数据到 listener 层,然后最后的事件由业务协程池来处理。&lt;/p>
&lt;p>该项目目前是与 dubbo-go 解耦出来的,所以大家如果有类似需求可以直接拿来用,目前已经有对于 tcp/udp/websocket 的支持。&lt;/p>
&lt;h5 id="apachedubbo-go-1">apache/dubbo-go&lt;/h5>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/dubbo-go-arch.png" alt="img">&lt;/p>
&lt;p>dubbo-go 主项目,我们重构的这一版主要是基于 Dubbo 的分层代码设计,上图是 dubbo-go 的代码分层。基本上与 Java 版本 Dubbo 现有的分层一致,所以 dubbo-go 也继承了 Dubbo 的一些优良特性,比如整洁的代码架构、易于扩展、完善的服务治理功能。&lt;/p>
&lt;p>我们携程这边,使用的是自己的注册中心,可以在 dubbo-go 扩展机制的基础上灵活扩展而无需去改动 dubbo-go 的源代码。&lt;/p>
&lt;h3 id="dubbo-go-的功能介绍">dubbo-go 的功能介绍&lt;/h3>
&lt;h5 id="dubbo-go-已实现功能">dubbo-go 已实现功能&lt;/h5>
&lt;p>目前 dubbo-go 已经实现了 Dubbo 的常用功能(如负责均衡、集群策略、服务多版本多实现、服务多注册中心多协议发布、泛化调用、服务降级熔断等),其中服务注册发现已经支持 zookeeper/etcd/consul/nacos 主流注册中心。这里不展开详细介绍,目前 dubbo-go 支持的功能可以查看项目 readme 中的 feature list ,详情参考:&lt;em>&lt;a href="https://github.com/apache/dubbo-go#feature-list">https://github.com/apache/dubbo-go#feature-list&lt;/a>&lt;/em>&lt;/p>
&lt;p>目前社区正在开发中的功能,主要是早期用户使用过程中提出的一些需求,也是生产落地一些必需的需求,如监控、调用链跟踪以及服务路由、动态配置中心等更高级的服务治理需求。&lt;/p>
&lt;h5 id="dubbo-go-功能介绍之泛化调用">dubbo-go 功能介绍之泛化调用&lt;/h5>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/dubbo-go-generic-invoke.png" alt="img">&lt;/p>
&lt;p>这里详细做几个重点功能的介绍。首先是泛化调用,如上图,这个也是社区同学提的需求。该同学公司内部有很多 Dubbo 服务,他们用 Go 做了一个 api gateway 网关,想要把 Dubbo 服务暴露成外网 http 接口。因为内部的 Dubbo 服务比较多,不可能每一个 Dubbo 服务都去做一个消费端接口去做适配,这样的话一旦服务端改动,客户端也要改。所以他这边的思路是做基于 dubbo-go 做泛化调用, api-gateway 解析出外网请求的地址,解析出想要调用的 Dubbo 服务的目标。基于dubbo-go consumer 泛化调用指定 service、method ,以及调用参数。&lt;/p>
&lt;p>具体的原理是, dubbo-go 这边作为消费端,实际会通过本地 genericService.invoke 方法做代理,参数里面包含了 service name,method name ,还包含被调用目标 service 需要的参数类型、值等数据,这些数据后面会通过 dubbo-go-hession2 做转换,会将内容转化成 map 类型,经过网络发送到对应的 Java 服务端,然后 Java 那边是接收的 map 类型的参数,会自动反序列化成自己的 pojo 类型。这样就实现了 dubbo-go 作为客户端,泛化调用 Dubbo 服务端的目的。&lt;/p>
&lt;h5 id="dubbo-go-功能介绍之降级熔断">dubbo-go 功能介绍之降级熔断&lt;/h5>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/dubbo-go-curcuit-breaker.png" alt="img">&lt;/p>
&lt;p>降级熔断这边是基于的是大家比较熟悉的 hystrix 的 Go 语言版本,基于 hystrix ,用户可以定义熔断规则和降级触发的代码段。降级熔断支持是作为一个独立的 dubbo-go filter ,可以灵活选择是否启用,如果不启用就可以在打包的时候不将依赖引入。Filter 层是 dubbo-go 中对于请求链路的一个责任链模式抽象,目前有许多功能都是基于动态扩展 filter 链来实现的,包括 trace、leastactive load balacne、log 等。降级熔断设计成一个服务调用端独立的filter可以灵活满足调用端视角对于微服务架构中“防雪崩“的服务治理需求。&lt;/p>
&lt;h5 id="dubbo-go-功能介绍之动态配置">dubbo-go 功能介绍之动态配置&lt;/h5>
&lt;p>关于动态配置中心, Dubbo 的 2.6 到 2.7 版本做了一个比较大的变化,从之前的 url 配置形式过渡到了支持配置中心 yaml 格式配置的形式,治理粒度也从单服务级别的配置支持到了应用级别的配置,不过在2.7版本中还是兼容 2.6 版本 url 形式进行服务配置的。dubbo-go 这边考虑到跟 Dubbo2.6 和 2.7 的互通性,同样支持 url 和配置文件方式的服务配置,同时兼容应用级别和服务级别的配置,跟 dubbo 保持一致,目前已经实现了zookeeper和apollo作为配置中心的支持。&lt;/p>
&lt;h3 id="dubbo-go-roadmap-2019-2020">dubbo-go roadmap 2019-2020&lt;/h3>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/dubbo-go-roadmap-2019.png" alt="img">&lt;/p>
&lt;p>最后是大家比较关注的,社区关于 dubbo-go 2019 年下半年的计划,目前来看主要还是现有功能的补齐和一些问题的修复,我们的目标就是首先做到 Java 和 Go 在运行时的兼容互通和功能的一致,其次是查漏补缺 dubbo-go 作为一个完整 Go 语言微服务框架在功能上的可以改进之处。&lt;/p>
&lt;p>另外值得关注的一点是,预计今年年底, dubbo-go 会发布一个支持 kubernetes 作为注册中心的扩展,积极拥抱云原生生态。关于云原生的支持,社区前期做了积极的工作,包括讨论关于 dubbo-go 与 Service Mesh 的关系以及在其中的定位,可以肯定的是, dubbo-go 将会配合 Dubbo 社区在 Service Mesh 方向的规划并扮演重要角色,我们初步预计会在明年给出与 Service Mesh开源社区项目集成的方案,请大家期待。&lt;/p>
&lt;p>dubbo-go 社区目前属于快速健康成长状态,从捐赠给 Apache 后的不到3个月的时间里,吸引了大批量的活跃开发者和感兴趣的用户,欢迎各位同道在使用或者学习中遇到问题能够来社区讨论或者给予指正,也欢迎对 dubbo-go 有潜在需求或者对 dubbo-go 感兴趣的同道能加入到社区中。&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://player.bilibili.com/player.html?aid=413770787&amp;cid=210657864&amp;page=1&amp;as_wide=1&amp;high_quality=1&amp;danmaku=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="">&lt;/iframe>
&lt;/div>
&lt;h3 id="关于作者">关于作者&lt;/h3>
&lt;p>何鑫铭,目前就职于携程,基础中台研发部技术专家,dubbo-go 共同发起人、主要作者,Apache Dubbo committer,关注互联网中台以及中间件领域。&lt;/p></description></item><item><title>Blog: Dubbo Go 回顾与展望</title><link>https://dubbo.apache.org/zh-cn/blog/2021/01/11/dubbo-go-%E5%9B%9E%E9%A1%BE%E4%B8%8E%E5%B1%95%E6%9C%9B/</link><pubDate>Mon, 11 Jan 2021 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2021/01/11/dubbo-go-%E5%9B%9E%E9%A1%BE%E4%B8%8E%E5%B1%95%E6%9C%9B/</guid><description>
&lt;p>Dubbo 是阿里于 2011 年开源的一款高性能 RPC 框架,在 Java 生态中具有不小的影响力。2019年5月21日,Dubbo 从 Apache 软件基金会毕业,成为 Apache 顶级项目。目前,毕业后的 Dubbo 项目的生态中已经正式官宣引入了 Go 语言,发布了 Dubbogo 项目。本文即是对 Dubbogo 这一项目的完整回顾与真实展望。由蚂蚁金服中间件技术专家于雨和携程基础中台研发部工程师方银城合作完成。&lt;/p>
&lt;h2 id="一-dubbogo-整体框架">一 Dubbogo 整体框架&lt;/h2>
&lt;p>先介绍一下 dubbogo 的缘起,先看下面这幅图:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p1.jpeg" alt="img">&lt;/p>
&lt;p>最右边的 service0 和 service1 是 Dubbo 的服务端,左边的 gateway 是网关,HTTP 请求从网关进来,必须转化成 Dubbo 的协议才能到后面的服务,所以中间加了一层proxy 完成相关功能。基本上每个 service 都需要一个 proxy 去转化协议和请求,所以这个时候 dubbogo 的项目需求就出来了。最初的实现就是以 Dubbo 的 Go 版本作为目标,实现与 Java 版本 Dubbo 的互调。&lt;/p>
&lt;h3 id="dubbogo-目标">Dubbogo 目标&lt;/h3>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p2.jpeg" alt="img">&lt;/p>
&lt;p>然后这个图是 dubbogo 的现在达到的目标:用一份 Go 客户端的代码能够在没有任何代理和其他中间件的情况下直接调用其他语言端,主要是Java 服务端的服务和 Go 服务端的服务,而 Go 作为服务端的时候,Java 客户端也可以直接调用 Go 服务端的服务。&lt;/p>
&lt;h3 id="dubbogo-发展历程">Dubbogo 发展历程&lt;/h3>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p3.jpeg" alt="img">&lt;/p>
&lt;p>下面介绍 dubbogo 的整个发展历程,在2016年8月份的时候是于雨构建了 dubbogo 项目,那个时候的 dubbogo 只支持通过 jsonrpc 2.0 协议 进行 HTTP 通信,到 2018 年2 月份支持 hessian2 协议进行 TCP 通信,到 2018 年 5 月项目被 dubbo 官方关注后开始从零重构,于雨 2018 年 8 月份初步重构出一个 0.1 版本。由于我们携程这边的一些需求,2019 年初我和我的同事何鑫铭也开始参与了 dubbogo 项目的重构,同时和于雨一起开始组建社区,在 2019 年 6 月份的时候 dubbogo1.0 版本上线,这个版本的重构是参照了 Dubbo 的整体设计,主体功能都在这个版本里面有呈现,同期该项目进入了 Apache 组织。今年 8 月份由社区同学望哥负责的 Dubbo-go-hessian2 的项目也进了 Apache 组织。到目前为止我们社区有些工作已经和 dubbo 齐头并进,例如对 grpc 和 k8s 的支持,相关代码正在 review 中,年底发布的 v1.3 版本会包含 grpc 支持。预计到2020年,也是明年的目标,希望项目能以全新姿态融入云原生时代。&lt;/p>
&lt;h3 id="dubbogo-整体设计">Dubbogo 整体设计&lt;/h3>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p4.jpeg" alt="img">&lt;/p>
&lt;p>这个图大家是不是看着很熟悉,是 Dubbo 的整个分层设计图,但是少了 Dubbo 里面的很多东西,因为我们是借鉴了 Dubbo 的分层设计和易拓展性的思想,但是由于 Go 语言和 Java 语言的本质差别决定了我们项目设计不可能完全照搬它,有一些东西就给它简化了,特别是协议层这一块。比如说 Dubbo 里面 SPI 的拓展,在 Go 里面我们是借用了 Go 的非侵入式接口的方式去实现的,由于 Go 禁止 package 循环引用,所以 dubbogo 在代码的分包分层上面也是有严格的规定,这正好跟它的易拓展性的特性结合了起来。&lt;/p>
&lt;p>关于代理部分,因为 Java 有动态代理,Go 的反射就没有 Java 的反射那么强大,所以我们这边代理的实现方式也跟它是不一样的。&lt;/p>
&lt;h3 id="dubbogo-能力大图">Dubbogo 能力大图&lt;/h3>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p5.jpeg" alt="img">&lt;/p>
&lt;p>上面的图是我们当前 dubbogo 项目实现的能力大图,最上层是当前实现的一些注册中心有 zk、etcd、nacos、consul,现在与 k8s 关联的功能正在开发中。配置中心目前是支持 Apollo 和 zookeeper。左边是消费端,消费端这边实现的是有 cluster 的,策略上基本上实现了 dubbo 支持的所有策略。然后还有负载均衡策略,fillter 主要是有一个 tps 的限流还有泛化调用,这两个后面会讲到。编码层现在就是 jsonrpc 2.0 和 hessian2,protobuf v3 正在加紧 review 中。目前社区正在开发中的支持,包括 trace、grpc、k8s注册中心,以及对 restful 的支持。&lt;/p>
&lt;h3 id="关键项目">关键项目&lt;/h3>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p6.jpeg" alt="img">&lt;/p>
&lt;p>目前 dubbogo 项目整体由 4 个组成部分。第一个是 getty,一个异步网络 IO 库,是实现 tcp 通信协议最坚实的基础;第二个是 dubbo-go-hessian2,这个是与当前 java hessian2 高度兼容的项目;第三个是 gost,是 dubbogo 的 基础库;最后是 dubbogo 的示例库,目前已经迁移到 &lt;a href="https://github.com/apache/dubbo-samples">https://github.com/apache/dubbo-samples&lt;/a>,和 Java 示例合并了。这些都是当前 dubbogo 主要的组成项目。&lt;/p>
&lt;h2 id="二-协议实现">二 协议实现&lt;/h2>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p7.jpeg" alt="img">&lt;/p>
&lt;p>接下来讲一些具体的实现和部分的功能,上图是 dubbo-go-hessian2 实现,列出来是一些主要的功能列表,第一个是 Java 的 JDK Exceptions 的实现,里面实现了 40 多种的 Java JDK 主要的异常,可以与 Java 的 hessian2 版本互相解编码的支持,支持自动扩展自己实现 exceptions,或者是不常见的 Exceptions;第二个是支持字段名的联名,Go 可序列化的字段是大写字母开头,但是 Java 默认是小写开头的,所以有编码的字段名不一致的问题,这就有别名识别和支持自定义命名。&lt;/p>
&lt;p>go-hessian2 还支持 Java 的 bigdecimal、Date、Time、基本类型的包装类型、Generic Invocation、Dubbo Attachements,甚至支持 emoji 表情。&lt;/p>
&lt;p>go-hessian2 里面如果要解码和编码用户自定义类型,用户需要自己把它注册进去,前提是支持 go-hessian2 的 POJO interface,才能跟 JAVA 对应类互相解编码。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p8.jpeg" alt="img">&lt;/p>
&lt;p>上面是 go-hessian2 的类型对应表,需要特别点出的是 int,go 这边的 int 类型在不同字长系统下是有不同的大小,可能是 32 位也可能 64位的,而 Java 的 int 是 32 位的,所以我们以 go 语言的 int32 类型对应 Java int 类型。&lt;/p>
&lt;p>刚才提到了 Java 的 Class 和 go struct 的对应。上图有一个 go-hessian2 的 POJO 接口定义,每个 Java class 对应到 go struct,则 struct 需要给出 Java ClassName。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p9.jpeg" alt="img">&lt;/p>
&lt;p>你也可以加 hessian 标签,解析的时候会把这个字段名用别名写进去,实现自定义 fieldName。默认情况下,go-hessian2 中会自动把 struct field 首字母变成小写作为其 fieldName。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p10.jpeg" alt="img">&lt;/p>
&lt;p>泛化引用,是 dubbogo 里面比较重要的功能。社区一位同学需要基于 dubbogo 实现网关,收集外部的请求,然后通过泛化引用的形式调用其他 Dubbo 服务,最后自己动手把它实现了。使用时,首先需要在项目里内置一个 GenericService 服务,调用Load,然后就像正常的调用服务一样直接调用,跟 Java 是类似的,Go 客户端可以不知道 Java 的接口定义和类定义,把方法名、参数类型、参数数组以一个 map 的形式传输到 Java 服务端,Java 服务端收到请求后进行识别,把它转换成 POJO 类。&lt;/p>
&lt;p>以上是 go-hessian2 一些细节。上文讲到的泛化引用,是把网关作为整个内网 Dubbo 服务的公共消费端,使用的时候只需要知道请求的方法、参数类别,然后就能够调用 Dubbo 的服务。后面主要分享三部分内容:首先是网络引擎、底层网络库这块;其次是服务治理方面的内容,其中包含以 k8s 作为注册中心的一个初步的解决方案;第三部分是互联互通,主要是和 grpc 打通。最后给出一个展望,包含 dubbogo 社区明年的工作内容。&lt;/p>
&lt;h2 id="三-网络引擎">三 网络引擎&lt;/h2>
&lt;p>dubbogo 的网络引擎里面分为三层, 如下图所示:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p11.jpeg" alt="img">&lt;/p>
&lt;p>最底层 streaming 处理二进制流,第二层 codec层,进行协议的序列化和反序列化,第三层是 Eventlistener,提供应用使用接口。streaming 层能支持 websocket、TCP、UDP 三种网络通讯协议,这层具有一定的灵活性,今年年初上海有一个同学今年把 KCP 也加进去了,当时说要开源贡献出来,我还在期待中。codec 层可以适用不同协议,用户自定义即可。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p12.jpeg" alt="img">&lt;/p>
&lt;p>EventListener 对上层暴露了 4 个回调接口。第一个是 OnOpen,网络连接初建成功时被调用,应用层如果判定其为正常连接,则可以把连接 session 存储下来,如果用户判断当前连接过多则返回一个非空的 error,则这个连接会被 dubbogo 关闭。其次是 OnError 事件,当网络连接出错,就会回调到这个接口,在 dubbogo 关闭这个连接之前允许用户做相应处理,如把网络连接 session 从应用层的 session 池中删除。第三个是 OnCron,处理定时任务,如心跳,dubbogo 针对 websocket 协议在底层直接把心跳热任务处理了,针对 tcp 和 udp 协议需要用户在这个回调函数中自己实现。第四个接口是 OnMessage,用作处理一个完整的网络包。可以看到整个回调接口风格跟 websocket 的接口很像。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p13.jpeg" alt="img">&lt;/p>
&lt;h3 id="协程池">协程池&lt;/h3>
&lt;p>dubbogo 的 goroutine pool 里有 worker channel 【数量为 M】和逻辑处理 goroutine 【数量为 N】和网络任务【网络包】三种角色,网络解包后把把包按照某种规则放入某个 worker pool,然后逻辑处理 goroutine 从 channel 中读取数据包并执行逻辑处理,其目的是是为了把网络 I/O 与逻辑处理分开。不同的 goroutine pool 设计中,有的 N 大小会变化,有的不变,分别可称之为可伸缩 goroutine pool 和不可伸缩 goroutine pool,可伸缩 goroutine pool 可以对机器资源的使用不可预计。dubbogo 采用了不可伸缩 goroutine pool,其考量是限定其网络资源使用的上限。&lt;/p>
&lt;p>另外,dubbogo 的 goroutine pool 不考虑收包后的处理顺序。譬如,dubbogo 服务端收到了 A 和 B 两个网络包,dubbogo 有可能先处理网络包 B,后处理网络包 A。如果客户端的每次请求都是独立的,没有前后顺序关系,则带有不考虑网络包处理顺序是没有问题的。如果有强顺序要求,譬如上层用户关注 A 和 B 请求处理的前后顺序,则可以把 A 和 B 两个请求合并为一个请求,或者把 dubbogo 的 goroutine pool 特性关闭。&lt;/p>
&lt;p>一般情况下,不建议大家自己写 goroutine pool,因为 Go 语言对 goroutine 资源的管理已经非常先进,比如释放一个协程,Go 不会马上销毁掉相关的资源,一旦有创建 goroutine 的需要,马上就可复用这个成本是很低的。什么情况下使用 Goroutine Pool 呢?个人觉得像网络库逻辑处理这类场景下执行同样类型任务场景下确定 goroutine 会被迅速重复使用时可以尝试使用,但是怎么用好还是需要仔细考量,即需要仔细考量 M 与 N 的比例关系。&lt;/p>
&lt;p>假设处理某种网络任务请求,有的请求1秒就处理完了,有的可能10毫秒处理完了,设置 M 与 N 比例为 1:1,这样 1 对 1 造成的后果可能是饥饿,就是有一些队列处理的很快,有的处理很慢,整体负载不均衡,这种情况下就不推荐你用协成池了。&lt;/p>
&lt;p>还有一个比例模型是是1:N的,一写多读,比如说所有的请求都交给一个队列,所有逻辑处理 goroutine pool 都消费这个队列,造成的结果是什么呢?因为你只有一个生产者,那你就只有一个队列,多个消费者消费这一个队列,造成的结果是什么呢?因为 go channel 的低效率【整体使用一个 mutex lock】造成消费者 goroutine hang 在锁竞争上,当然其网络包处理顺序更无从保证。&lt;/p>
&lt;p>比较均衡的效果就是 M 和 N 都大于 1,dubbogo 的的 goroutine pool 模型中 M 和 N 的取值可以自行配置,其效果是每个 channel 被 N/M 个 goroutine 消费,这种模型类似于 kafka 的 consumer group,其优点是兼顾处理效率和锁压力平衡,可以做到总体层面的任务处理均衡。&lt;/p>
&lt;h3 id="优化改进">优化改进&lt;/h3>
&lt;p>优化改进主要从三个方面入手, 如下图所示:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p14.jpeg" alt="img">&lt;/p>
&lt;ol>
&lt;li>内存池。goroutine pool 是管理对 CPU 资源的分配,内存池就是管理内存资源的分配。我个人反对纯粹为了炫技没有目的地写内存池,其实 Go 的内存管理这块目前优化的很好了。Go 语言初始版本的内存管理使用了谷歌自家的 tcmalloc 库,这个库把应用释放的内存自己先缓存住,待失效期后才释放,那这样造成的结果是什么呢?就是早期的 Go 程序的内存成本很高。假设程序一个 sidecar 程序的资源限制是内存2G,CPU 核数是 2 核,用这样一个内存管理库,内存用完不释放给操作系统,那么没人敢用这个项目,当然最新的 Go 内存管理器是经过完全重构的,虽然也区分不同大小 span 的内存在 P 级别和全局级别进行缓存,但是基本上不用考虑这种内存膨胀不可控的问题了。那么什么情况下使用内存池呢?你确定你的业务有一些对象是频繁的复用则可以尝试使用。 目前大部分内存池技术底层依赖的底座都是 sync.Pool,自己写一个也不难。而且 Go 1.13 之后的 sync.Pool 已经可以做到跨 GC span 不释放缓存对象,非常之好。&lt;/li>
&lt;li>定时器。Go 语言早期定时器因为整体使用一把大锁的缘故效率极差,当然最新的就相当好了,通过每个 CPU 核下一个定时器的方法【类似于分片锁】分散了竞争压力,但是很多情况下还是有竞争压力,如果对时间精度要求不高个人建议在自己的应用中自己写一个简单的时间轮实现一个定时器,释放 CPU 压力。&lt;/li>
&lt;li>网络写 buffer 合并。写 buffer 合并一般采用 writev,但是 Go 语言的 writev 有内存泄露问题,我这边一个负责 MOSN 开发的同事元总发现的。他先给 Go 语言官方提交了 PR,然后在 MOSN 中把 writev 扔掉自己写了一个简单好用的写 buffer 合并发送实现:通过 for 循环 10 次从发送 channel 中把网络包读取出来然后合并发送,当然循环中间网络发送 channel 没有足够的网络包就通过 &lt;code>select-default&lt;/code> 分支立即退出循环。&lt;/li>
&lt;/ol>
&lt;h3 id="channel-使用">channel 使用&lt;/h3>
&lt;p>Go 语言是一个适合处理 IO 密集型任务的语言,不擅长处理 CPU 密集型任务,其内存通信的基础就是 channel。channel 整体的内存基础是一个 ring buffer 数组和一个 lock,外加其他一些读写通知队列等,也是因为一把大锁的缘故,则 buffer 型 channel 如果使用不当则效率不会很高,如每个 channel element 的内存使用过大。channel 还有一个 closed 字段,用于判定 channel 的写是否被关闭掉,Go 语言对其操作是以原子锁方式进行的,很多人以这个字段为基础进行信号通知,如果使用不当很可能造成 for 循环 CPU 100% 的问题,所以在 for-select 循环中特别要谨慎使用,dubbogo 在这方面踩过坑。&lt;/p>
&lt;h2 id="四-服务治理">四 服务治理&lt;/h2>
&lt;p>下面为大家讲一下服务治理,说到服务治理,其实最重要的还是服务发现和服务注册,这块逻辑跟 Dubbo 类似,这次不作展开。下面主要包含两方面的内容,分别是限流算法和优雅退出。&lt;/p>
&lt;h3 id="限流算法">限流算法&lt;/h3>
&lt;p>限流算法首先需要考虑限流的对象,dubbogo 需要考虑 interface 和 method。其次是限流方法,首先需要考虑的是单机限流还是集群限流,单机限流算法很多,譬如常用的固定窗口算法和滑动窗口算法,以及更进一步的自适应限流。限流时一个重要问题就是限流参数是很难配的,譬如线上服务到底需要使用多少机器资源合理,限流窗口的时间窗口时长应该多长合适,其 qps 值设置多少合适呢?这都是 dubbogo 需要解决的问题。先进如谷歌的 BBR 算法,可以在当前的网络环境恶化前不断尝试改进相关参数,直到尝试出一段时间内的最佳参数。还有一些业务形态下的限流,如针对会员和非会员分别设计不同的限流链路。&lt;/p>
&lt;p>Dubbo 的限流接口源码如下:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p15.png" alt="img">&lt;/p>
&lt;p>这个接口抽象是非常漂亮的,第一个是限流 url,第二个服务调用。下面是 Dubbo 的固定窗口限流源码:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p16.png" alt="img">&lt;/p>
&lt;p>上面的代码很明显,&amp;ldquo;private final&amp;rdquo; 决定了 Dubbo 使用者只能使用期给定的固定窗口限流限算法,无法扩展。&lt;/p>
&lt;p>以下是 dubbogo 的限流接口:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p17.jpeg" alt="img">&lt;/p>
&lt;p>TpsLimiter 是限流对象,TpsLimitStrategy 是限流算法,RejectedExecutionHandle 是限流动作。&lt;/p>
&lt;p>接下来是一个固定窗口算法实现:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p18.jpeg" alt="img">&lt;/p>
&lt;p>上图是 dubbogo 的固定窗口算法实现,其非线程安全,大家看一下代码就可以了,不推荐大家用。下图是 dubbogo 的滑动窗口算法实现:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p19.jpeg" alt="img">&lt;/p>
&lt;p>其基本原理是用一个队列存储一段时间内的请求,然后根据队列长度判定即可。&lt;/p>
&lt;p>不管是固定窗口还是滑动窗口,其判定算法简单,麻烦的是其参数设置,如下图:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p20.png" alt="img">&lt;/p>
&lt;p>固定窗口时长精度很难控制。比如说限流一秒 QPS 值 1000,前 100 毫秒来了一千个请求,然后判定算法把请求放过了,而其后 900 毫秒 任何请求都无法处理。一般的处理方法是把时间粒度更精细一些,dubbogo 的时间窗口最小单位是一毫秒,则用户可以把时间窗口设定为 100 毫秒,总体来说一段时间内是很平稳的。下面这个图是我们社区的 commiter 邓明写完博客发出来,行业大佬微信评论如下:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p21.png" alt="img">&lt;/p>
&lt;p>图中第一个问题是 qps 和 tps 每个请求成本不同,这个问题怎么处理呢?个人觉得这是一个分级限流问题,在同一个服务下针对不同的请求做不同的分级处理。第二个问题 ”配置了 qps 1000,但是请求过来是10万你还是死“,这个就需要更上层的运维能力进行应对,譬如判定为恶意流量攻击就应该在网关层拦截掉,如果是服务能力不行就扩容。&lt;/p>
&lt;p>针对分级限流,dubbogo 目前尚无法在同一个进程内完成,这需要 dubbogo 的配置中心更完善以后进行处理,用户可以通过搭建不同的服务链路处理之。譬如会员/非会员分级,同一个服务针对不同的会员等级搭建相应的链路,在网关层就判定一个 userID 是否是会员,然后发送不同的链路。&lt;/p>
&lt;p>dubbogo 的单机熔断是基于 hystrix-go 实现的,其判定参数有最大并发请求数、超时时间、错误率;其次是保护窗口,是熔断时长,熔断多久后进行服务恢复;第三个是保护性动作,就是在保护时间窗口之内执行什么样的动作,具体实现用户自定义。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p22.jpeg" alt="img">&lt;/p>
&lt;h3 id="优雅退出">优雅退出&lt;/h3>
&lt;p>优雅退出也是邓明同学的大作,可以在网络上搜到相关博客。实现优雅退出的步骤有:&lt;/p>
&lt;ol>
&lt;li>告知注册中心,服务即将关闭,此时等待并处理请求;&lt;/li>
&lt;li>注册中心通知别的客户端,别的客户端停止发送新请求,等待已发请求的响应;&lt;/li>
&lt;li>节点处理完所有接收到的请求并且返回响应后,释放作为服务端相关的组件和资源;&lt;/li>
&lt;li>节点释放作为客户端的组件和资源。&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p23.jpeg" alt="img">&lt;/p>
&lt;p>所以每一步基本上都要给程序一定的时间进行等待,所以等的时间窗口是多少呢?dubbogo 默认每个步骤大概花2秒,总体一个时间窗口是10秒。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p24.png" alt="img">&lt;/p>
&lt;p>基本上在别的 RPC 框架里面,可能不太常见到这种处理。&lt;/p>
&lt;h2 id="五-dubbogo-上云">五 Dubbogo 上云&lt;/h2>
&lt;p>dubbogo 作为微服务框架如何适配 k8s,如何部署?dubbogo 本身是一个 RPC 框架,但是其又有了服务治理能力,这部分能力与 k8s 的部分能力有些重合,不可能为了适配 k8s 就彻底抛弃。目前 Dubbo 官方也没有很好的解决方案供我们参考,所以这里我们 dubbogo 先给出一个简单的常识性的实践方案。下面先分析下 dubbogo 的 interface/service 和 k8s service 两者直接的差别。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p25.jpeg" alt="img">&lt;/p>
&lt;p>k8s service 是许多具有相同服务能力 pod 资源的聚合,它自己的负载均衡算法以及健康检查等功能。而 Dubbo 里面的 interface/service 仅仅是服务 provider 集合,服务治理能力依赖 dubbo 的 directory、router 和 loadbalace 等额外的功能模块。并且Dubbo 服务区分 group/version,还有 provider、consumer 角色等等。Dubbo interface/service 无法与 k8s service 对标,Dubbo interface/service 和其整体服务治理能力才能对标成 k8s service。二者差异这么大,如何将 dubbo 集成到 k8s 中呢?&lt;/p>
&lt;p>k8s 提供了 pod/endpoint/service 三层维度的资源。简单的做法,可以通过监听pod/endpoint/service 三层维度资源的事件,作出合理的处理以达到服务治理的目的。目前我们社区成员王翔提交了一个基于监听 pod 事件来实现服务治理的 pr,优点就是不需要引入额外组件,通过监听 k8s 中最细粒度资源 pod 的事件,通过 k8s apiserver 获取 pod 列表,只是通过 apiserver 使用 etcd 的服务注册和服务通知能力,其他继续使用 Dubbo 的服务治理能力。其优点是模型简单,不需要实现额外的模块,几乎不需要对 Dubbo 作出改动,缺点就是其实无法使用 k8s 自己的健康检查能力,需要自己监听很细粒度的 pod 事件来综合处理服务健康、服务上下线等情况,而且还存在没有使用 k8s service 的事件监听能力,每个 consumer 冗余监听一些不必要监听的事件,加大 apiserver 的网络压力。所以其实现目前来看可能还不是最优解,与 k8s 建议的operator 方式也有一定的背离。社区目前还在讨论新方案,寻求 k8s 最优解,大部分人倾向于采用 k8s 社区推荐的 operator 方案,但是其开发和线上维护成本就上升了。后面两种方式会共存,使用者见仁见智。&lt;/p>
&lt;h2 id="六-互融互通">六 互融互通&lt;/h2>
&lt;p>关于互融互通,Dubbo 明年有个三个重要目标,其中一个目标是与外面的微服务生态进行互联互通,比如说跟 grpc 互通。目前 dubbo 的 grpc 的解决方案已经开放出来,dubbogo 与 grpc 互通的开发工作也几近完成。&lt;/p>
&lt;p>下面左边 dubbogo 的代码生成器工具根据 grpc 的 pb 服务定义文件自动生成的适配 dubbogo 的代码,右边是对应的使用示例。不同于 k8s service 的复杂性,grpc 整体仅仅具有 rpc 能力,没有服务治理能力,所以原始的 grpc 就可以很好的嵌入到 dubbogo 里面,grpc server 的 methodhandler 对我们 dubbogo 来说就是 dubbo invoker,grpc 的一些相关的接口直接跟我们的接口嵌套起来,两个生态就对接起来了。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-go/gochina/p26.jpeg" alt="img">&lt;/p>
&lt;h2 id="七-展望未来">七 展望未来&lt;/h2>
&lt;p>最后就是展望未来,也就是明年的规划。&lt;/p>
&lt;p>明年我们将会很快实现 dubbo router。社区在 8月份已经实现了 router 功能需要的底层的算法模块,但是当时配置中心下发相关的参数的能力还不是很强,所以没有最终完成。最近服务治理配置刚刚支持了 zookeeper 和 apollo,预计很快就可以将 router 的参数通过配置中心下发的形式支持掉。另外,还有 tracing,我们将会引入社区主流的 tracing 方案,以 opentracing 为标准,去集成 opentracing 开源生态的相关能力。第三个是 kubernetes operator,这个就是刚才说的 K8s 的服务调用,我们会基于 operator 的方案做一版新的基于 k8s 的注册中心实现。最后就是云原生生态的融入,即与 istio 的集成,dubbogo 将会成为 dubbo 在 service mesh 生态中的重要角色。&lt;/p>
&lt;p>目前 dubbogo 项目,今年是能 run 起来,质量方面还有很多工作要做,功能基本上到明年可与 dubbo 2.7 补齐,目前已经基本够用。目前落地实践的是 3 个比较典型的公司,一个是携程,还有一个是涂鸦智能。&lt;/p>
&lt;p>dubbogo 本身是一个 go 语言项目,也期待与其他 go 社区的指正或者需求,一起成长。&lt;/p></description></item><item><title>Blog: 从 2019 到 2020,Apache Dubbo 年度回顾与总结</title><link>https://dubbo.apache.org/zh-cn/blog/2020/05/11/%E4%BB%8E-2019-%E5%88%B0-2020apache-dubbo-%E5%B9%B4%E5%BA%A6%E5%9B%9E%E9%A1%BE%E4%B8%8E%E6%80%BB%E7%BB%93/</link><pubDate>Mon, 11 May 2020 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2020/05/11/%E4%BB%8E-2019-%E5%88%B0-2020apache-dubbo-%E5%B9%B4%E5%BA%A6%E5%9B%9E%E9%A1%BE%E4%B8%8E%E6%80%BB%E7%BB%93/</guid><description>
&lt;p>非常感谢大家对 Dubbo 社区的关注,通过这篇文章我们将:总结过去一年 Dubbo 社区取得的成绩,包括社区和框架演进两个方面;展望未来 Dubbo 社区和框架的新的规划(roadmap)。社区建设是推动 Dubbo 健康持续发展的一个非常重要的环节,我们需要与社区保持良性的互动、有活跃的贡献者、有积极的富有建设性的讨论,而整个 Dubbo 社区过去一年在这方面都做的不错;在框架演进上,我们主要发布了 2.7.0 - 2.7.5 共 6 个特性版本,功能层面涵盖编程模型、协议、服务治理、性能优化等多个方面;除了已经发布的功能外,我们在 Dubbo 3.0 协议、服务自省和云原生等方向上也做了深入的探索,对这些方向的支持将是 Dubbo 接下来的重要工作方向,希望能通过这篇文章将其中更详细的思考和计划同步给大家。&lt;/p>
&lt;h2 id="社区回顾">社区回顾&lt;/h2>
&lt;p>回顾 Dubbo 社区过去一年的发展,其中一个重要的节点就是 2019 年 5 月从 Apache 孵化毕业。成为第二个由 Alibaba 捐献后从 Apache 毕业的项目,我有幸参与到了从重启开源、进入 Apache 孵化到毕业的整个过程,社区在此过程中做了大量的工作,包括邮件列表建设、代码规范检查、文档和代码国际化、issue/pr 处理等,这些一方面是 Apache 社区要求的工作,同时也为推动 Dubbo 的发展起到了正面的作用。&lt;/p>
&lt;p>在从 Apache 毕业之后,Dubbo 相关的项目也进行了迁移,都迁移到了 &lt;a href="https://github.com/apache?utf8=%E2%9C%93&amp;amp;q=dubbo&amp;amp;type=&amp;amp;language=">Apache&lt;/a> 组织之下:&lt;/p>
&lt;p>Dubbo 社区的项目总共有 24 个之多,维护如此多的项目,并不是单纯靠几个活跃的开发者就能做到的,而是靠整个社区努力的结果。我总结了过去一年提名的所有 Committer/PMC,总过有 27 人获得提名(23 名 committer、4 名 PMC),通过下方的饼状图可以看出,只有不到 20% 的贡献者是来自于 Alibaba,而 80% 以上是来自各个不同组织的开发者或爱好者。这样的 Committer 分布,是加入 Apache 带给 Dubbo 社区的一个最重要的变化之一:Dubbo 项目是属于整个社区的,反映的是不同组织不同开发者的共同诉求,它的发展不是由一个公司控制或决定的,而是由社区共同讨论后决定的。如果你对参与到 Dubbo 社区感兴趣,都可以参与到 Dubbo 发展的讨论、决策和 coding 中来,也非常期待各位能成为下一个 Committer。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/community-distribution.png" alt="community distribution">&lt;/p>
&lt;p>过去一年 Dubbo 社区组织了超过 10 场的线下 meetup 活动,覆盖了国内基本所有的开发者聚集的城市,与广大 Dubbo 开发者和使用者保持了密切交流。通过这些线下或线上的直播活动,分享了超过 100 个 topic 的演讲,深度讲解了 Dubbo 社区最新动态、功能模块开发和近期规划等。并且在所有的这些主题演讲中,绝大多数都是通过社区采集的方式,最终由 Dubbo 的深度企业分享的实践主题,其中典型的代表包括携程、工商银行、考拉、信用算力等。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/community-meetup.png" alt="community meetup">&lt;/p>
&lt;p>从 Github 上来看,Dubbo 在过去一年也受到了非常高的关注度,一个重要的里程碑是 Star 数突破 3w,相比重启开源时增长了近 5 倍;贡献者由最初的几十个增长到现在的 282 个,而这其中有六七十个已经被提名为 committer,不论是贡献者数量还是 committer 比例都得到很大的提升;另一个数据是发布的版本,总共发布了 64 个版本,大家如果要了解每个版本的具体信息,也可以从这里点进去查看。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/community-github.png" alt="community github">&lt;/p>
&lt;p>当前社区维护的大版本主要有 3 个,分别是 2.5.x 2.6.x 和 2.7.x。&lt;/p>
&lt;p>其中,2.7.x 是我们的主要开发版本,在过去的一年共发布了 6 个版本(2.7.0 - 2.7.5),每个版本都带来了一些值得关注的特性或功能升级,涵盖从编程模型、服务治理、性能到协议的多个方面的增强。&lt;/p>
&lt;p>2.6.x 版本则定位为 bugfix 版本,过去一年共发布了 3 个版本,主要以修复问题和安全漏洞为主,并没有增加什么新 feature,因此这一系列的版本在稳定性上是得到保证的。&lt;/p>
&lt;p>2.5.x 版本当前从去年初开始已宣布 EOF,只做安全修复;而到了下半年已经完全停止了维护。还在使用这个版本的用户建议尽快升级到 2.6 或 2.7 版本。&lt;/p>
&lt;p>关于 2.6 和 2.7 版本的用户分布情况,目前并没有官方的统计数据,但是根据我们从 issue 分布及一些深度用户的跟踪情况来看,这两个版本的使用分布大概是 40% - 60% 的状态。同时我们还观察到一个趋势,即很大一部分 2.6 的用户都已经开始调研升级到 2.7 版本或在升级的过程中,毕竟一个框架是否能很好的满足业务开发诉求,一个重要的因素是其是否不断的有功能的加入,是否能跟进新的技术趋势,2.6 版本已很难满足这些诉求。&lt;/p>
&lt;p>对于很多开发者来说,要升级到 2.7 版本,当前最大的顾虑即是其稳定性。因为 2.7 每个版本都会增加很多新内容且迭代速度较快,要保证每个发布版本的稳定性对社区来说也是一个充满挑战的事情。为了方便用户更好的完成升级评估,我们近期在 github 上列出了单独列了一个 issue 来统计现在包括未来版本的稳定性:&lt;a href="https://github.com/apache/dubbo/issues/5669">Dubbo 各版本总结与升级建议 #5669&lt;/a>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>&lt;strong>版本&lt;/strong>&lt;/th>
&lt;th>&lt;strong>重要功能&lt;/strong>&lt;/th>
&lt;th>&lt;strong>升级建议&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>2.7.5&lt;/td>
&lt;td>服务自省 HTTP/2(gRPC) Protobuf TLS 性能优化 &lt;a href="https://github.com/apache/dubbo/releases/tag/dubbo-2.7.5">https://github.com/apache/dubbo/releases/tag/dubbo-2.7.5&lt;/a>&lt;/td>
&lt;td>不建议大规模生产使用&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>2.7.4.1&lt;/td>
&lt;td>&lt;a href="https://github.com/apache/dubbo/releases/tag/dubbo-2.7.4.1">bugfixes and enhancements of 2.7.3&lt;/a>&lt;/td>
&lt;td>&lt;strong>推荐生产使用&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>2.7.3&lt;/td>
&lt;td>&lt;a href="https://github.com/apache/dubbo/releases/tag/dubbo-2.7.3">bigfixes of and enhancements of 2.7.2&lt;/a>&lt;/td>
&lt;td>&lt;strong>推荐生产使用&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>2.7.2&lt;/td>
&lt;td>&lt;a href="https://github.com/apache/dubbo/releases/tag/dubbo-2.7.2">bigfixes of and enhancements of 2.7.1&lt;/a>&lt;/td>
&lt;td>不建议大规模生产使用&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>2.7.1&lt;/td>
&lt;td>&lt;a href="https://github.com/apache/dubbo/releases/tag/dubbo-2.7.1">bigfixes of and enhancements of 2.7.0&lt;/a>&lt;/td>
&lt;td>不建议大规模生产使用&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6&lt;/td>
&lt;td>2.7.0&lt;/td>
&lt;td>异步编程模型 - 消费端/提供端异步 服务治理规则增强 简化的注册模型 配置中心、元数据中心 package 重构 &lt;a href="https://github.com/apache/dubbo/releases/tag/dubbo-2.7.0">https://github.com/apache/dubbo/releases/tag/dubbo-2.7.0&lt;/a>&lt;/td>
&lt;td>beta 版本,2.6.x 重构后首个版本&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>其中 2.7.5 版本预计将在接下来的 1-2 个版本之后逐步达到稳定状态。&lt;/p>
&lt;p>对于后续的版本是否通过标识性的后缀如 -beta、RC 等来区分不同阶段的发布版本,社区也有过类似的讨论,后续我们将视未来发展情况而定。&lt;/p>
&lt;h2 id="重点功能回顾">重点功能回顾&lt;/h2>
&lt;p>接下来针对 2.7 版本中发布的新功能,从编程模型、性能优化、服务治理、传输协议、生态发展等几个角度来做具体的讲解。&lt;/p>
&lt;h3 id="编程模型">编程模型&lt;/h3>
&lt;p>Dubbo 中涉及编程模型相关的改动主要是以下几点:&lt;/p>
&lt;ul>
&lt;li>CompletableFuture 异步方法签名的服务&lt;/li>
&lt;li>服务端异步支持 API&lt;/li>
&lt;li>IDL 跨语言服务定义&lt;/li>
&lt;li>Reactive-style 方法签名的服务&lt;/li>
&lt;/ul>
&lt;p>首先,我们先来看一下异步化相关的增强。
Dubbo Java 版本的典型服务定义如下:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">HelloService&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">// Synchronous style&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> String &lt;span style="color:#268bd2">sayHello&lt;/span>(String name);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果要实现消费端的异步服务调用,则需要单独配置异步标识,并通过 RpcContext API 配合使用&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>String result &lt;span style="color:#719e07">=&lt;/span> helloService.sayHello(&lt;span style="color:#2aa198">&amp;#34;world&amp;#34;&lt;/span>); &lt;span style="color:#586e75">// result is always null&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Future future &lt;span style="color:#719e07">=&lt;/span> RpcContext.getContext().getFuture();
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在 2.7 版本之后,我们可以直接定义如下方法接口,以更直观的实现消费端/提供端异步:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">public&lt;/span> &lt;span style="color:#268bd2">interface&lt;/span> &lt;span style="color:#268bd2">HelloService&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">// Asynchronous style&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> CompletableFuture&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">&amp;gt;&lt;/span> &lt;span style="color:#268bd2">sayHello&lt;/span>(String name);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>CompletableFuture&lt;span style="color:#719e07">&amp;lt;&lt;/span>String&lt;span style="color:#719e07">&amp;gt;&lt;/span> future &lt;span style="color:#719e07">=&lt;/span> helloService.sayHello(&lt;span style="color:#2aa198">&amp;#34;world&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以上示例都是基于 Java Interface 来描述 Dubbo 服务的,如果要和多语言异构的微服务实现互调,则服务又需要用相应语言的方式重新定义一遍,无法实现跨语言的服务复用;另外跨语言的序列化也是需要注意的一个问题。&lt;/p>
&lt;p>为此 2.7.5 版本引入了对 IDL + Protobuf 的支持,以解决跨语言的服务定义问题,具体可参见示例:&lt;/p>
&lt;p>&lt;a href="https://github.com/apache/dubbo-samples/tree/master/3-extensions/serialization/dubbo-samples-protobuf">dubbo-samples-protobuf&lt;/a>&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/service-idl.png" alt="service idl">&lt;/p>
&lt;p>对 Reactive-style API 的支持则和上面 CompletableFuture 有些类似,允许用户定义 RxJava、Reactor API 的服务接口&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/idl-dubbo-compiler.png" alt="idl dubbo compiler">&lt;/p>
&lt;p>但是需要注意的一定是,由于外围的 Reactive API 需要有底层传输协议的支持才有意义,因此,目前 Reactive API 只能在使用 gRPC 协议时才有意义,具体请参见示例以及下面关于 ”&lt;a href="https://github.com/apache/dubbo-samples/tree/master/99-integration/dubbo-samples-grpc/dubbo-samples-rxjava">Dubbo 对 gRPC 的支持&lt;/a>” 一节的讲解。&lt;/p>
&lt;h3 id="性能优化">性能优化&lt;/h3>
&lt;p>2.7 版本在性能优化方面也做了很多的工作,对 Dubbo 业务系统的吞吐量、调用链路响应速度、服务治理链路性能等都有明显提升。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>系统吞吐量&lt;/p>
&lt;p>和提升系统吞吐量相关的增强主要有框架的全异步化改造、消费端线程模型优化、引入 Stream 语义协议等。&lt;/p>
&lt;p>全异步化改造,很关键的一点是 Filter 链路的异步化,之前的 Filter 只有一个同步的 invoke 方法,现在为了支持异步回调,增加了 Listener 回调监听器,从而可以实现对异步调用结果的监听与拦截。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/filter.png" alt="filter">&lt;/p>
&lt;p>关于消费端线程模型的优化,对于网关类应用,需要消费大量服务的应用,都会在系统稳定性和性能表现上有很大提升,其优化后的总体工作原理图所下所示,具体解析可以参见之前发布的文章:&lt;a href="https://dubbo.apache.org/zh-cn/docsv2.7/user/examples/consumer-threadpool/">《消费端线程池模型》&lt;/a>&lt;/p>
&lt;p>老线程模型工作原理:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/consumer-threadpool0.png" alt="consumer threadpool">&lt;/p>
&lt;p>新线程模型工作原理:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/consumer-threadpool1.png" alt="consumer threadpool new">&lt;/p>
&lt;ol start="2">
&lt;li>
&lt;p>RPC 调用链路&lt;/p>
&lt;p>从 2.7.0 到 2.7.5,从我们的测试数据来看,通过一系列的优化调用链路性能提升在 30% 以上。总体来说,优化的目标是减少调用过程中的内存分配和 cpu 计算,主要有两个方面的改造:&lt;/p>
&lt;ul>
&lt;li>服务元数据静态化,在启动阶段尽可能多的计算并缓存,以减少调用过程中的计算成本,加快响应速度&lt;/li>
&lt;li>减少调用过程中的 URL 操作产生的内存分配&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>服务治理链路&lt;/p>
&lt;p>服务治理链路上主要有以下几点值得关注:地址推送、服务治理规则推送、服务治理规则计算、路由选址等,尤其是在大规模服务集群的场景下,以上每个点都可能成为性能或稳定性瓶颈。在 2.7 版本中,目前着重对 “地址推送” 相关计算路径做了优化,简单概括起来主要是以下几点:&lt;/p>
&lt;ul>
&lt;li>地址推送事件合并,避免短时间重复计算&lt;/li>
&lt;li>全量地址推送时,避免 URL 重新分配&lt;/li>
&lt;li>在 URL 合并链路上,引入 URL 可变状态,避免 URL 拷贝造成的开销&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="服务治理">服务治理&lt;/h3>
&lt;p>服务治理也是 2.7 版本中着重增强的一个模块。总体上可以分为三部分&lt;/p>
&lt;ul>
&lt;li>普通路由规则相关的优化和增强&lt;/li>
&lt;li>增强对跨区域、跨机房部署的路由支持&lt;/li>
&lt;li>元数据中心、配置中心&lt;/li>
&lt;/ul>
&lt;p>我们针对这三部分逐步展开讲解。以下是 2.7 版本路由规则的几个例子。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/route-app.png" alt="route app">&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/route-service.png" alt="route service">&lt;/p>
&lt;p>其中,最明显的一个变化是路由规则都以 YAML 进行了重写,并且后续所有的路由规则都计划以 YAML 为基本描述语言;相比于之前路由规则直接存储于注册中心,在 2.7 版本中增加了配置中心后,新版本的路由规则默认将存储在于独立的配置中心,配置格式推送机制都得到了优化;另外,2.7 版本中还增加了应用粒度的路由规则,方便从整个应用的角度去设置流量规则。&lt;/p>
&lt;p>新增加的跨注册中心的路由机制,可以实现调用流量在多个注册中心间的负载均衡,对于需要做异地容灾、同机房优先或者注册中心迁移的场景比较有用处。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/cluster-lb.png" alt="cluster load balance">&lt;/p>
&lt;p>当前支持的注册中心集群负载均衡策略有:&lt;/p>
&lt;ul>
&lt;li>同区域优先&lt;/li>
&lt;li>权重轮询&lt;/li>
&lt;li>指定优先级&lt;/li>
&lt;li>任意可用&lt;/li>
&lt;/ul>
&lt;p>元数据中心存储了 Dubbo 服务方法定义的描述,目前主要的用途是服务测试,将来也可用作服务 API 管理、网关参数映射等。&lt;/p>
&lt;p>新增的配置中心主要有两个用途:存储/推送配置规则、应用配置托管,接下来着重讲解应用配置托管相关功能,看其对 Dubbo 的开发与运维配置的影响。Dubbo 当前支持 JVM 动态参数、配置中心、API、本地配置文件等几种配置源,他们之间按照优先级从高到低的顺序实现配置覆盖,如下图所示:&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/config.png" alt="config">&lt;/p>
&lt;p>配置中心相当于是共享版本的 &lt;code>dubbo.properties&lt;/code> 的远程托管,其中,key 值有特定的命名规范:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-properties" data-lang="properties">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># 应⽤用级别&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dubbo.{config-type}[.{config-id}].{config-item} &lt;span style="color:#2aa198">{config-item-value}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># 服务级别&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dubbo.service.{interface-name}[.{method-name}].{config-item} &lt;span style="color:#2aa198">{config-item-value}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dubbo.reference.{interface-name}[.{method-name}].{config-item} &lt;span style="color:#2aa198">{config-item-value}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># 多配置项&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>dubbo.{config-type}s.{config-id}.{config-item} &lt;span style="color:#2aa198">{config-item-value}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="传输协议">传输协议&lt;/h3>
&lt;p>2.7 版本在 RPC 协议层和序列化层进行了扩展,RPC 协议层增加了对 gRPC 协议的支持,序列化层增加了对 Protobuf 协议的支持。&lt;/p>
&lt;p>支持 gRPC 其中一个重要原因是其基于 HTTP/2 协议构建,HTTP/2 协议作为 HTTP 标准协议,在各个层次的网络设备及网关代理上都得到了很好的支持,因此具有更好的穿透性和通用性。通过支持 gRPC 协议,对于期望使用 HTTP/2 的 Dubbo 用户提供了一种传输协议选择。&lt;/p>
&lt;p>gRPC 在 HTTP/2 上构建了 Stream 的 RPC 语义,支持 Request - Response、Stream - Response、Request - Stream、Bi-Stream 等多种语义,能满足不同的业务调用场景。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/service-idl2.png" alt="service idl2">&lt;/p>
&lt;p>在 Dubbo 的设计中,所有的 RPC 协议都处于一个平等的地位,无论是自有的 Dubbo 协议,还是扩展的其他三方协议如 Thrift、Hessian、gRPC 等,得益于这样的设计,我们可以扩展任何新协议支持。关于如何扩展 RPC 协议及其应用场景,请参见之前发布的&lt;a href="https://mp.weixin.qq.com/s/-fvDeGlCLjz0n60naZJnQg">《使用 Dubbo 连接异构微服务体系》&lt;/a>文章。&lt;/p>
&lt;p>Protobuf 序列化协议支持更多的是考虑其在跨语言、安全性和性能方面。&lt;/p>
&lt;h2 id="roadmap">Roadmap&lt;/h2>
&lt;p>未来社区将会持续推动 Dubbo 的发展,重点来说有以下几个方向:&lt;/p>
&lt;ul>
&lt;li>继续增强服务治理相关能力,以更好的满足微服务开发和运维的需求;&lt;/li>
&lt;li>协议层面,着手研发下一代的 RPC 协议,新协议将提供更丰富的如 Stream、Flow Control 等内置语义,同时将具有更好的扩展性、网关的友好性等;&lt;/li>
&lt;li>基于应用粒度的服务发现机制,&lt;/li>
&lt;li>云原生带来了底层基础设施的变化,同时在此基础上衍生出了如 ServiceMesh 的微服务解决方案,我们需要继续探索 Dubbo ;&lt;/li>
&lt;/ul>
&lt;h3 id="微服务功能">微服务功能&lt;/h3>
&lt;p>目前正在开发或规划中的微服务功能有服务鉴权、熔断、路由规则增强等,预计将在接下来的 2.7.6 等版本中陆续发布。后续也将会根据社区中的诉求,陆续增加其他的微服务功能支持。&lt;/p>
&lt;p>以当前正在开发的服务鉴权功能为例,这是社区中很多 Dubbo 使用者在实际使用中遇到的需求:虽然 Dubbo 服务主要是在内部运转,但有些服务仍期望只对部分场景或用户开放,比如某些涉及到敏感数据操作的服务,这就需要有鉴权能力的支持。&lt;/p>
&lt;p>&lt;a href="https://github.com/apache/dubbo/issues/5461">Dubbo调用鉴权认证方案 #5461&lt;/a> 中有关于 Dubbo 当前正在开发中的鉴权功能的详细讨论,总体来说 Dubbo 提供的鉴权功能约束了 Dubbo 侧鉴权的基本流程,这是一套通用鉴权的方案,在 token 计算、校验等环节都被设计为可扩展的,因此可以方便的对接到各种认证及权限管理系统。&lt;/p>
&lt;p>非常感谢社区的活跃开发者,现就职于爱奇艺的 &lt;a href="https://github.com/CodingSinger">CodingSinger&lt;/a>,其是鉴权模块的发起者和主要开发贡献者。&lt;/p>
&lt;h3 id="协议---30">协议 - 3.0&lt;/h3>
&lt;p>以下是 Dubbo 2.0 协议,我们之前已经在多个场合做过详细的讲解&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/grpc/dubbo-ptotocol.png" alt="Dubbo Protocol 2.0">&lt;/p>
&lt;p>Dubbo 2.0 协议在云原生、mesh 等场景下暴露出一些问题,如:&lt;/p>
&lt;ul>
&lt;li>协议缺少扩展性&lt;/li>
&lt;li>RPC 协议层和 payload 耦合在一起&lt;/li>
&lt;li>基于 TCP 构建的二进制私有协议&lt;/li>
&lt;li>缺少 Stream 语义的支持&lt;/li>
&lt;/ul>
&lt;p>所以,针对以上问题,新一代的 Dubbo 协议将突出以下特点:&lt;/p>
&lt;p>&lt;strong>Reactive Stream&lt;/strong>
Reactive Stream 引入 RPC,带来更丰富的通信语义和 API 编程模型支持,如 Request-Stream、Bi-Stream 等&lt;/p>
&lt;p>&lt;strong>协议升级&lt;/strong>
协议内置应⽤层协议协商机制,包括自建协议升级机制、ALPN 等,以方面将来协议升级或兼容老版本协议的迁移&lt;/p>
&lt;p>&lt;strong>HTTP/2&lt;/strong>
微服务云原⽣生场景下,基于 HTTP/2 构建的通信协议具有更更好的通⽤用性和穿透性&lt;/p>
&lt;p>&lt;strong>可扩展&lt;/strong>
协议可扩展,区分协议头 Metadata 与 RPC 方法的参数&lt;/p>
&lt;p>&lt;strong>多语⾔支持&lt;/strong>
如通过支持 Protobuf 提供了更完善的 跨语言服务定义 与 序列化传输 的支持&lt;/p>
&lt;p>&lt;strong>Mesh&lt;/strong>
协议对 Mesh 更友好,方便完成与 Mesh 的协作,包括流量控制机制、应用层配置协商等&lt;/p>
&lt;p>&lt;strong>流量控制&lt;/strong>
协议内置流控机制,支持类似 Reqctive Stream 的 Request (n) 流控机制&lt;/p>
&lt;p>&lt;strong>协议通用性&lt;/strong>
兼顾通用性与性能,支持协议能在各种设备上运行&lt;/p>
&lt;h3 id="服务自省---应用粒度的服务注册">服务自省 - 应用粒度的服务注册&lt;/h3>
&lt;p>Dubbo 最大的优势之一在于其易用性,其面向接口(RPC 方法)的编程模型。同时,面向接口的治理也带来了一些问题:&lt;/p>
&lt;ul>
&lt;li>地址数量成倍增长,给地址推送带来很大压力&lt;/li>
&lt;li>和主流微服务体系模型不匹配,如 SpringCloud、Kubernetes 等&lt;/li>
&lt;/ul>
&lt;p>为此,我们计划引入应用粒度的服务注册机制,主要有以下几个重点:&lt;/p>
&lt;ul>
&lt;li>注册中心按 “应用 - 实例IP” 组织,不再关心 RPC 接口同步&lt;/li>
&lt;li>引入独立的元数据服务完成 RPC 接口同步工作&lt;/li>
&lt;/ul>
&lt;p>以下是应用粒度服务注册(服务自省)的基本工作原理,请持续关注后续对这部分的具体解析和开发进展。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/servicediscovery-new.png" alt="service discovery new">&lt;/p>
&lt;h3 id="云原生">云原生&lt;/h3>
&lt;p>云原生带来了底层基础设施,应用开发、部署和运维等全方位的变化:&lt;/p>
&lt;p>&lt;strong>基础设施&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>基础设施调度机制变化,带来运维(生命周期)、服务治理等方面的变化。&lt;/li>
&lt;li>服务发现能力下沉, Kubernetes 抽象了 Native Service Discovery。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Service Mesh - 云原生微服务解决方案&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Mesh 为跨语言、sdk 升级等提供了解决方案,Dubbo sdk 要与 Mesh 协作,做到功能、协议、服务治理等多方便的适配。&lt;/li>
&lt;li>Mesh 尚未大规模铺开,且其更适合对流量管控更关注的应用,传统 SDK 的性能优势仍旧存在,两者混部迁移场景可能会长期存在。&lt;/li>
&lt;/ul>
&lt;p>从应用场景上,Dubbo 可能的部署环境包括:&lt;/p>
&lt;ol>
&lt;li>不使用 Kubernetes Native Service,Kubernetes 只作为容器编排调度设施,继续使用 Dubbo 自建的服务注册、发现机制。&lt;/li>
&lt;li>复用 Kubernetes Native Service,Dubbo 不再关心服务注册,Dubbo Client 负责服务发现与流量分配。&lt;/li>
&lt;li>Dubbo sdk 往 Mesh 迁移,一方面要做到适应 Mesh 架构,成为 Mesh 体系下的 RPC 编程和通信方案;另一方面要做到 Dubbo 与 Mesh 架构长期共存,互相打通服务发现和治理体系。&lt;/li>
&lt;li>Kubernetes 上与云下混合部署的平滑迁移支持,包括服务发现的统一与网络通信方案的打通。&lt;/li>
&lt;/ol>
&lt;p>从 Dubbo 功能划分上,将着重从以下方面提供对云原生基础设施的支持:&lt;/p>
&lt;p>&lt;strong>生命周期:&lt;/strong> Dubbo 与 Kubernetes 调度机制绑定,保持服务生命周期与 Pod 容器等生命周期的自动对齐
&lt;strong>治理规则:&lt;/strong> 服务治理规则在规则体、规则格式方面进行优化,如规则体以 YAML 描述、取消过滤规则对 IP 的直接依赖,定义规则特有的 CRD 资源等。
&lt;strong>服务发现:&lt;/strong> 支持 K8S Native Service 的服务发现,包括 DNS、API-Server,支持 xDS 的服务发现
&lt;strong>Mesh 架构协作:&lt;/strong> 构建下一代的基于 HTTP/2 的通信协议,支持 xDS 的标准化的数据下发&lt;/p></description></item><item><title>Blog: 遇见Dubbo</title><link>https://dubbo.apache.org/zh-cn/blog/2019/01/26/%E9%81%87%E8%A7%81dubbo/</link><pubDate>Sat, 26 Jan 2019 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2019/01/26/%E9%81%87%E8%A7%81dubbo/</guid><description>
&lt;p>我是一个有Dubbo情节的程序员。&lt;/p>
&lt;p>Dubbo以不同方式,陪伴了我时间不长的整个代码生涯。不久前,通过社区投票,我被选举为&lt;code>Committer&lt;/code>。当时我在朋友圈发了一句话,也是贯穿我从开始使用Dubbo、研究Dubbo、贡献Dubbo到最后成为&lt;code>Committer&lt;/code>的全过程,一直为我提供内心无与伦比愉悦的源泉:成长这种事,能看见脚印特别幸福。&lt;/p>
&lt;p>今天来个回忆杀,把我和Dubbo的那些事拿出来说说。&lt;/p>
&lt;h2 id="小白">小白&lt;/h2>
&lt;p>我知道Dubbo,是在我大三翘课出去实习的时候,那个时候是无知的,我眼里最牛的人就是能熟练使用各种配置,精通SSH框架的人。就是在那种情况下,我外出实习,遇到了一群影响我至今的人。当时也是机缘巧合,我们进行了两个非常小的模块的服务化改造。那时的团队除了我们老大,全是一群新兵蛋子,老大指哪我们打哪。老大说,就用Dubbo吧,从那时候开始,我才知道,哦!原来还有一种东西叫做RPC,还有个阿里巴巴的RPC框架叫Dubbo。&lt;/p>
&lt;p>苦于当时非常有限的水平和高强度的工作,我和Dubbo的缘分也就停留在一面之缘的程度——要说认识谈不上,说不认识也牵强。&lt;/p>
&lt;h2 id="contributor">Contributor&lt;/h2>
&lt;p>我在二维火任职的一年算是我Dubbo生涯里承上启下的一年。二维火当时自己维护了一个Dubbo的分支,有一群对Dubbo非常了解的人。那时候,工作结束搞Dubbo,周六加班研究Dubbo。看源码,看不懂就debug一下,debug也不明白就问,问人,问google,里外折腾了个遍。&lt;/p>
&lt;p>后来毕业加入网易云音乐。大概是今年五月份的时候,我发现了一个Dubbo的小bug,并且给Dubbo提交了pull request。在第一次被merge之后,非常受鼓舞,这才有了后续的故事。后来,回看这第一次提交,真的算是我和Dubbo的一个拐点,拐弯之后,我才逐渐走上一条成为&lt;code>Committer&lt;/code>的路。&lt;/p>
&lt;p>可能很多人看到这里要望而却步了,这也是做开源给很多人留下的固有的印象——是不是没发现BUG就不能提交pull request,不能做贡献?其实完全不是的,这里给大家敲黑板划重点:其实很多贡献者的第一次贡献,贡献的并非代码,而是文档修改或者单元测试。相比于BUG或者新的Feature,单测和文档上的修复门槛就比较低了。&lt;/p>
&lt;p>我自己的方法论就是:&lt;strong>先尝试增加单元测试,写单测的时候顺手debug+看代码。或者多看文档,了解框架的同时,发现错别字、语意不明或者文档上的链接干脆点不开的情况,直接提交PR到对应的仓库&lt;/strong>。&lt;/p>
&lt;p>万事开头难。第一次被merge代码,你就可以成为一个&lt;code>Contributor&lt;/code>了。&lt;code>Contributor&lt;/code>很多,但是&lt;code>Committer&lt;/code>很少,下面继续说怎么从一个&lt;code>Contributor&lt;/code>成长为独当一面的&lt;code>Committer&lt;/code>。&lt;/p>
&lt;h2 id="committer">Committer&lt;/h2>
&lt;p>做开源和写代码一样,都不是一朝一夕的事情,而是量变促成质变的过程。这是一个没捷径可走的过程,欲带皇冠必承其重。身后的Dubbo功底自不必多说,这个部分主要是想跟大家说一下除了钻研和热爱之外,其他需要注意的地方。&lt;/p>
&lt;p>首先是多提交高质量PR。任何一个PR都会被review,代码中的问题,思路上的偏差,都会被指正。提交PR是一个反复琢磨的过程。PR的质量不能简单的归结于新增了多少行代码,高质量的PR一定是经过缜密思考的,为什么删除代码,新增的代码有什么意义,修改之后有什么效果等等。希望大家更加重视质量而非数量,眼光放长远,相信你的收获一定会非常大!&lt;/p>
&lt;p>第二个就是,我们需要培养一种思维方式——Apache Way。一句话概括就是&lt;strong>社区重于代码&lt;/strong>。Apache是一个注重社区的的开源组织,其行为方式相比于目前我们的开发方式,还是有所不同,这里我举一个Apache Way的例子,用以说明传统方式相较于Apache Way的区别在哪里,这里假设我想为Dubbo开发一个功能A。&lt;/p>
&lt;p>&lt;strong>Old Way&lt;/strong>:&lt;/p>
&lt;ol>
&lt;li>功能设计:做一个设计文档(根据功能大小而定),大概划定需要修改或新增的类,大体设计接口等。&lt;/li>
&lt;li>开发代码。&lt;/li>
&lt;li>提交PR。&lt;/li>
&lt;li>Review &amp;amp; Merge&lt;/li>
&lt;/ol>
&lt;p>可以看到,我们整个过程中,真正与社区交互的只有最后一步。&lt;/p>
&lt;p>&lt;strong>Apache Way&lt;/strong>:&lt;/p>
&lt;ol>
&lt;li>功能设计:发送邮件至mailing list并且提交ISSUE,与社区成员共同探讨,产出一个设计文档(根据功能大小而定),大概划定需要修改或新增的类,大体设计接口等。然后再次发送邮件并且回复ISSUE,通知社区设计文档定稿或者方案确定。&lt;/li>
&lt;li>开发代码:发送邮件至社区,通知社区成员我即将投入开发功能A,如需帮助,可以同时说明需要协助。&lt;/li>
&lt;li>提交PR:发送邮件并且回复ISSUE,提醒社区开发结束,贴上PR地址以通知社区review代码。&lt;/li>
&lt;li>Review + Merge后,发送邮件并且关闭ISSUE,通知社区功能A的开发功能告一段落。&lt;/li>
&lt;/ol>
&lt;p>可以看到,Apache Way就是在整个开发过程中,不断地与社区交互,最大发挥社区的功能,汲取众人之力,这才是所谓&lt;strong>社区&lt;/strong>以及所谓&lt;strong>开源&lt;/strong>的含义。&lt;/p>
&lt;h2 id="结尾">结尾&lt;/h2>
&lt;p>Dubbo目前还在孵化阶段,整个Dubbo社区还不完善,我们也在跟着Dubbo一起成长,我们非常希望更多的Dubbo爱好者深度参与到Dubbo中,为你的代码生涯树一个里程碑。&lt;/p>
&lt;p>相信过程,收获结果;天道酬勤,功不唐捐!&lt;/p></description></item><item><title>Blog: 第五届Dubbo开发者沙龙在杭州成功举办</title><link>https://dubbo.apache.org/zh-cn/blog/2018/12/10/%E7%AC%AC%E4%BA%94%E5%B1%8Adubbo%E5%BC%80%E5%8F%91%E8%80%85%E6%B2%99%E9%BE%99%E5%9C%A8%E6%9D%AD%E5%B7%9E%E6%88%90%E5%8A%9F%E4%B8%BE%E5%8A%9E/</link><pubDate>Mon, 10 Dec 2018 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2018/12/10/%E7%AC%AC%E4%BA%94%E5%B1%8Adubbo%E5%BC%80%E5%8F%91%E8%80%85%E6%B2%99%E9%BE%99%E5%9C%A8%E6%9D%AD%E5%B7%9E%E6%88%90%E5%8A%9F%E4%B8%BE%E5%8A%9E/</guid><description>
&lt;p>第五届Dubbo开发者沙龙在杭州成功举办,&lt;/p>
&lt;p>分享嘉宾&lt;/p>
&lt;ul>
&lt;li>李鼎: 如何参与Dubbo开源社区 &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/how-to-involve-in-dubbo-community.pdf">slides&lt;/a>&lt;/li>
&lt;li>曹胜利: Dubbo 2.7新特性介绍及演示 &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/dubbo-2.7-introduction.pdf">slides&lt;/a>&lt;/li>
&lt;li>陶杨: Dubbo在考拉的应用实践 &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/dubbo-practice-in-netease-koala.pdf">slides&lt;/a>&lt;/li>
&lt;li>小马哥: Dubbo+Nacos服务治理重新实现 &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/nacos-support-in-dubbo.pdf">slides&lt;/a>&lt;/li>
&lt;li>赵奕豪: Sentinel:分布式服务的流量防卫兵 &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/sentinel-support-for-dubbo.pdf">slides&lt;/a>&lt;/li>
&lt;li>陈志轩: 当Dubbo遇上Arthas:排查问题的实践 &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201812%40hangzhou/troubleshooting-dubbo-with-arthas.pdf">slides&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Blog: 如何准备Apache Release</title><link>https://dubbo.apache.org/zh-cn/blog/2018/09/02/%E5%A6%82%E4%BD%95%E5%87%86%E5%A4%87apache-release/</link><pubDate>Sun, 02 Sep 2018 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2018/09/02/%E5%A6%82%E4%BD%95%E5%87%86%E5%A4%87apache-release/</guid><description>
&lt;h2 id="理解apache发布的内容和流程">理解Apache发布的内容和流程&lt;/h2>
&lt;p>总的来说,Source Release是Apache关注的重点,也是发布的必须内容;而Binary Release是可选项,Dubbo可以选择是否发布二进制包到Apache仓库或者发布到Maven中央仓库。&lt;/p>
&lt;p>请参考以下链接,找到更多关于ASF的发布指南:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.apache.org/dev/release-publishing">Apache Release Guide&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.apache.org/dev/release.html">Apache Release Policy&lt;/a>&lt;/li>
&lt;li>&lt;a href="http://www.apache.org/dev/publishing-maven-artifacts.html">Maven Release Info&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="本地构建环境准备">本地构建环境准备&lt;/h2>
&lt;p>主要包括签名工具、Maven仓库认证相关准备&lt;/p>
&lt;h3 id="安装gpg">安装GPG&lt;/h3>
&lt;p>详细文档请参见&lt;a href="https://www.gnupg.org/download/index.html">这里&lt;/a>, Mac OS下配置如下&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>$ brew install gpg
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ gpg --version &lt;span style="color:#586e75">#检查版本,应该为2.x&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="用gpg生成key">用gpg生成key&lt;/h3>
&lt;p>根据提示,生成key&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ gpg --full-gen-key
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpg &lt;span style="color:#719e07">(&lt;/span>GnuPG&lt;span style="color:#719e07">)&lt;/span> 2.0.12; Copyright &lt;span style="color:#719e07">(&lt;/span>C&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#2aa198">2009&lt;/span> Free Software Foundation, Inc.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>This is free software: you are free to change and redistribute it.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>There is NO WARRANTY, to the extent permitted by law.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Please &lt;span style="color:#719e07">select&lt;/span> what kind of key you want:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">(&lt;/span>1&lt;span style="color:#719e07">)&lt;/span> RSA and RSA &lt;span style="color:#719e07">(&lt;/span>default&lt;span style="color:#719e07">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">(&lt;/span>2&lt;span style="color:#719e07">)&lt;/span> DSA and Elgamal
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">(&lt;/span>3&lt;span style="color:#719e07">)&lt;/span> DSA &lt;span style="color:#719e07">(&lt;/span>sign only&lt;span style="color:#719e07">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#719e07">(&lt;/span>4&lt;span style="color:#719e07">)&lt;/span> RSA &lt;span style="color:#719e07">(&lt;/span>sign only&lt;span style="color:#719e07">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Your selection? &lt;span style="color:#2aa198">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>RSA keys may be between &lt;span style="color:#2aa198">1024&lt;/span> and &lt;span style="color:#2aa198">4096&lt;/span> bits long.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>What keysize &lt;span style="color:#719e07">do&lt;/span> you want? &lt;span style="color:#719e07">(&lt;/span>2048&lt;span style="color:#719e07">)&lt;/span> &lt;span style="color:#2aa198">4096&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Requested keysize is &lt;span style="color:#2aa198">4096&lt;/span> bits
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Please specify how long the key should be valid.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">0&lt;/span> &lt;span style="color:#719e07">=&lt;/span> key does not expire
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;n&amp;gt; &lt;span style="color:#719e07">=&lt;/span> key expires in n days
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;n&amp;gt;w &lt;span style="color:#719e07">=&lt;/span> key expires in n weeks
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;n&amp;gt;m &lt;span style="color:#719e07">=&lt;/span> key expires in n months
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;lt;n&amp;gt;y &lt;span style="color:#719e07">=&lt;/span> key expires in n years
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Key is valid &lt;span style="color:#719e07">for&lt;/span>? &lt;span style="color:#719e07">(&lt;/span>0&lt;span style="color:#719e07">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Key does not expire at all
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Is this correct? &lt;span style="color:#719e07">(&lt;/span>y/N&lt;span style="color:#719e07">)&lt;/span> y
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>GnuPG needs to construct a user ID to identify your key.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Real name: Robert Burrell Donkin
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Email address: rdonkin@apache.org
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Comment: CODE SIGNING KEY
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>You selected this USER-ID:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#2aa198">&amp;#34;Robert Burrell Donkin (CODE SIGNING KEY) &amp;lt;rdonkin@apache.org&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Change &lt;span style="color:#719e07">(&lt;/span>N&lt;span style="color:#719e07">)&lt;/span>ame, &lt;span style="color:#719e07">(&lt;/span>C&lt;span style="color:#719e07">)&lt;/span>omment, &lt;span style="color:#719e07">(&lt;/span>E&lt;span style="color:#719e07">)&lt;/span>mail or &lt;span style="color:#719e07">(&lt;/span>O&lt;span style="color:#719e07">)&lt;/span>kay/&lt;span style="color:#719e07">(&lt;/span>Q&lt;span style="color:#719e07">)&lt;/span>uit? O
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>You need a Passphrase to protect your secret key. &lt;span style="color:#586e75"># 填入密码,以后打包过程中会经常用到&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="查看key-id">查看key id&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>$ gpg --list-keys
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pub rsa4096/28681CB1 2018-04-26 &lt;span style="color:#586e75"># 28681CB1就是key id&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>uid &lt;span style="color:#719e07">[&lt;/span>ultimate&lt;span style="color:#719e07">]&lt;/span> liujun &lt;span style="color:#719e07">(&lt;/span>apache-dubbo&lt;span style="color:#719e07">)&lt;/span> &amp;lt;liujun@apache.org&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sub rsa4096/D3D6984B 2018-04-26
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># 通过key id发送public key到keyserver&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ gpg --keyserver pgpkeys.mit.edu --send-key 28681CB1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># 其中,pgpkeys.mit.edu为随意挑选的keyserver,keyserver列表为:https://sks-keyservers.net/status/,为相互之间是自动同步的,选任意一个都可以。&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果有多个public key,设置默认key。修改&lt;code>~/.gnupg/gpg.conf&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># If you have more than 1 secret key in your keyring, you may want to&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># uncomment the following option and set your preferred keyid.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>default-key 28681CB1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果有多个public key, 也可以删除无用的key:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75">### 先删除私钥,再删除公钥&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ gpg --yes --delete-secret-keys shenglicao2@gmail.com &lt;span style="color:#586e75">###老的私钥,指明邮箱即可&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ gpg --delete-keys 1808C6444C781C0AEA0AAD4C4D6A8007D20DB8A4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>PS: 最新版本经过实测,本地没有gpg.conf这个文件,因此如果在执行过程中遇到签名失败,可以参考这个文章:https://blog.csdn.net/wenbo20182/article/details/72850810 或 &lt;a href="https://d.sb/2016/11/gpg-inappropriate-ioctl-for-device-errors">https://d.sb/2016/11/gpg-inappropriate-ioctl-for-device-errors&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;h3 id="设置apache中央仓库">设置Apache中央仓库&lt;/h3>
&lt;p>Dubbo项目的父pom为Apache pom(2.7.0以上版本需要,2.6.x发布版本不需要此操作)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-xml" data-lang="xml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;parent&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;groupId&amp;gt;&lt;/span>org.apache&lt;span style="color:#268bd2">&amp;lt;/groupId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;artifactId&amp;gt;&lt;/span>apache&lt;span style="color:#268bd2">&amp;lt;/artifactId&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;version&amp;gt;&lt;/span>19&lt;span style="color:#268bd2">&amp;lt;/version&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;/parent&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>添加以下内容到.m2/settings.xml
所有密码请使用&lt;a href="http://maven.apache.org/guides/mini/guide-encryption.html">maven-encryption-plugin&lt;/a>加密后再填入&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-xml" data-lang="xml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;settings&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;servers&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">&amp;lt;!-- To publish a snapshot of some part of Maven --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;server&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;id&amp;gt;&lt;/span>apache.snapshots.https&lt;span style="color:#268bd2">&amp;lt;/id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;username&amp;gt;&lt;/span> &lt;span style="color:#586e75">&amp;lt;!-- YOUR APACHE LDAP USERNAME --&amp;gt;&lt;/span> &lt;span style="color:#268bd2">&amp;lt;/username&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;password&amp;gt;&lt;/span> &lt;span style="color:#586e75">&amp;lt;!-- YOUR APACHE LDAP PASSWORD (encrypted) --&amp;gt;&lt;/span> &lt;span style="color:#268bd2">&amp;lt;/password&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/server&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">&amp;lt;!-- To stage a release of some part of Maven --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;server&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;id&amp;gt;&lt;/span>apache.releases.https&lt;span style="color:#268bd2">&amp;lt;/id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;username&amp;gt;&lt;/span> &lt;span style="color:#586e75">&amp;lt;!-- YOUR APACHE LDAP USERNAME --&amp;gt;&lt;/span> &lt;span style="color:#268bd2">&amp;lt;/username&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;password&amp;gt;&lt;/span> &lt;span style="color:#586e75">&amp;lt;!-- YOUR APACHE LDAP PASSWORD (encrypted) --&amp;gt;&lt;/span> &lt;span style="color:#268bd2">&amp;lt;/password&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/server&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#586e75">&amp;lt;!-- gpg passphrase used when generate key --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;server&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;id&amp;gt;&lt;/span>gpg.passphrase&lt;span style="color:#268bd2">&amp;lt;/id&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;passphrase&amp;gt;&lt;/span>&lt;span style="color:#586e75">&amp;lt;!-- yourKeyPassword --&amp;gt;&lt;/span>&lt;span style="color:#268bd2">&amp;lt;/passphrase&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/server&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#268bd2">&amp;lt;/servers&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#268bd2">&amp;lt;/settings&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="打包上传">打包&amp;amp;上传&lt;/h2>
&lt;h3 id="准备分支">准备分支&lt;/h3>
&lt;p>从主干分支拉取新分支作为发布分支,如现在要发布$&lt;code>{release_version}&lt;/code>版本,则从2.6.x拉出新分支&lt;code>${release_version}-release&lt;/code>,此后&lt;code>${release_version}&lt;/code> Release Candidates涉及的修改及打标签等都在&lt;code>${release_version}-release&lt;/code>分支进行,最终发布完成后合入主干分支。&lt;/p>
&lt;h3 id="编译打包">编译打包&lt;/h3>
&lt;p>首先,在&lt;code>${release_version}-release&lt;/code>分支验证maven组件打包、source源码打包、签名等是否都正常工作。&lt;strong>2.6.x记得要使用1.6进行编译打包&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ mvn clean install -Prelease
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ mvn deploy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>上述命令将snapshot包推送到maven中央仓库&lt;/p>
&lt;h3 id="用maven-release-plugin发布">用maven-release-plugin发布&lt;/h3>
&lt;p>先用dryRun验证是否ok&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ mvn release:prepare -Prelease -Darguments&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;-DskipTests&amp;#34;&lt;/span> -DautoVersionSubmodules&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">true&lt;/span> -Dusername&lt;span style="color:#719e07">=&lt;/span>YOUR GITHUB ID-DdryRun&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>验证通过后,执行release:prepare&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ mvn release:clean
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ mvn release:prepare -Prelease -Darguments&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;-DskipTests&amp;#34;&lt;/span> -DautoVersionSubmodules&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">true&lt;/span> -Dusername&lt;span style="color:#719e07">=&lt;/span>YOUR GITHUB ID -DpushChanges&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">false&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>执行release插件时,如果指定了&lt;code>-DpushChanges=true&lt;/code>, 插件会自动提交到远端的GitHub仓库中,此时就需要输入GitHub的密码,注意不是输入web页面的登录密码,而是一个&lt;code>Personal access tokens&lt;/code>,获取方式详见&lt;a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token">这里&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>这里有一点要注意的是tag, 在执行过程中,需要选择发布的artifactId, 下一个版本artifactId以及发布版本的tag, tag默认的是dubbo-parent-xxxx,需要改成dubbo-xxxx&lt;/p>
&lt;/blockquote>
&lt;p>执行完上述步骤后,你会发现:&lt;/p>
&lt;ol>
&lt;li>&lt;code>source-release.zip&lt;/code> 和 &lt;code>bin-release.zip&lt;/code>包已经生成在&lt;code>dubbo-distribution&lt;/code>目录下,请解压并检查文件是否完整&lt;/li>
&lt;li>本地已经打出相应的tag,同时新增一个commit,名叫&lt;code>[maven-release-plugin] prepare release dubbo-x.x.x&lt;/code>&lt;/li>
&lt;li>分支版本自动升级为&lt;code>${release_version+1}-SNAPSHOT&lt;/code>,同时新增一个commit,名叫&lt;code>[[maven-release-plugin] prepare for next development iteration&lt;/code>&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>如果指定了&lt;code>-DpushChanges=true&lt;/code>, 则本地提交会自动推送到远端的GitHub仓库。根据经验,建议不要指定为true,请设置为false,待本地检查通过之后再手动提交&lt;/p>
&lt;/blockquote>
&lt;p>执行release:perform,做staging发布&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ mvn -Prelease release:perform -Darguments&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#2aa198">&amp;#34;-DskipTests&amp;#34;&lt;/span> -DautoVersionSubmodules&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">true&lt;/span> -Dusername&lt;span style="color:#719e07">=&lt;/span>YOUR GITHUB ID
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>此时插件会自动下载远端的tag对应的源码,编译后,将所有Artifacts发布到配置的远程&lt;a href="http://repository.apache.org">maven仓库&lt;/a>,处于staging状态。&lt;/p>
&lt;h4 id="注意点">注意点&lt;/h4>
&lt;ul>
&lt;li>在deploy执行过程中,有可能因为网络等原因被中断,如果是这样,可以重新开始执行。&lt;/li>
&lt;li>deploy执行到maven仓库的时候,请确认下包的总量是否正确。多次出现了包丢失的情况,特别是dubbo-parent包。&lt;/li>
&lt;/ul>
&lt;h2 id="准备apache发布">准备Apache发布&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>准备svn本机环境(Apache使用svn托管项目的发布内容)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>将dubbo checkout到本地目录&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ svn checkout https://dist.apache.org/repos/dist/dev/dubbo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># 假定本地目录为 ~/apache/incubator/dubbo&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>当前发布版本为${release_version},新建目录&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ &lt;span style="color:#b58900">cd&lt;/span> ~/apache/incubator/dubbo &lt;span style="color:#586e75"># dubbo svn根目录&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ mkdir &lt;span style="color:#2aa198">${&lt;/span>&lt;span style="color:#268bd2">release_version&lt;/span>&lt;span style="color:#2aa198">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>添加public key到&lt;a href="https://dist.apache.org/repos/dist/dev/dubbo/KEYS">KEYS&lt;/a>文件并提交到SVN仓库(第一次做发布的人需要做这个操作,具体操作参考KEYS文件里的说明)。KEYS主要是让参与投票的人在本地导入,用来校验sign的正确性&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>$ gpg -a --export your_key_id &amp;gt;&amp;gt; KEYS
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>拷贝&lt;code>distribution/target&lt;/code>下的source相关的包到svn本地仓库&lt;code>dubbo/${release_version}&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>生成sha512签名&lt;/p>
&lt;p>针对&lt;code>source-release.zip&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ shasum -a &lt;span style="color:#2aa198">512&lt;/span> apache-dubbo-&lt;span style="color:#2aa198">${&lt;/span>&lt;span style="color:#268bd2">release_version&lt;/span>&lt;span style="color:#2aa198">}&lt;/span>-source-release.zip &amp;gt;&amp;gt; apache-dubbo-&lt;span style="color:#2aa198">${&lt;/span>&lt;span style="color:#268bd2">release_version&lt;/span>&lt;span style="color:#2aa198">}&lt;/span>-source-release.zip.sha512
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>针对&lt;code>bin-release.zip&lt;/code>,需要增加&lt;code>-b&lt;/code>参数,表明是一个二进制文件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ shasum -b -a &lt;span style="color:#2aa198">512&lt;/span> apache-dubbo-&lt;span style="color:#2aa198">${&lt;/span>&lt;span style="color:#268bd2">release_version&lt;/span>&lt;span style="color:#2aa198">}&lt;/span>-bin-release.zip &amp;gt;&amp;gt; apache-dubbo-&lt;span style="color:#2aa198">${&lt;/span>&lt;span style="color:#268bd2">release_version&lt;/span>&lt;span style="color:#2aa198">}&lt;/span>-bin-release.zip.sha512
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>如果有binary release要同时发布&lt;/p>
&lt;p>在&lt;code>distribution/target&lt;/code>目录下,拷贝&lt;code>bin-release.zip&lt;/code>以及&lt;code>bin-release.zip.asc&lt;/code>到svn本地仓库&lt;code>dubbo/${release_version}&lt;/code>,参考第6步,生成sha512签名。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>提交到Apache svn&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>$ svn status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ svn commit -m &lt;span style="color:#2aa198">&amp;#39;prepare for ${release_version} RC1&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h2 id="验证release-candidates">验证Release Candidates&lt;/h2>
&lt;p>详细的检查列表请参考官方的&lt;a href="https://cwiki.apache.org/confluence/display/INCUBATOR/Incubator+Release+Checklist">check list&lt;/a>&lt;/p>
&lt;p>首先,从一下地址下载要发布的Release Candidate到本地环境:&lt;/p>
&lt;pre>
https://dist.apache.org/repos/dist/dev/dubbo/${release_version}/
&lt;/pre>
&lt;p>然后,开始验证环节,验证包含但不限于以下内容和形式&lt;/p>
&lt;h3 id="检查签名和hash等信息">检查签名和hash等信息&lt;/h3>
&lt;h4 id="检查sha512哈希">检查sha512哈希&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>$ shasum -c apache-dubbo-&lt;span style="color:#2aa198">${&lt;/span>&lt;span style="color:#268bd2">release_version&lt;/span>&lt;span style="color:#2aa198">}&lt;/span>-source-release.zip.sha512
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>$ shasum -c apache-dubbo-&lt;span style="color:#2aa198">${&lt;/span>&lt;span style="color:#268bd2">release_version&lt;/span>&lt;span style="color:#2aa198">}&lt;/span>-bin-release.zip.sha512
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="检查gpg签名">检查gpg签名&lt;/h4>
&lt;p>如果是第一次检查,需要首先导入公钥。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span> $ curl https://dist.apache.org/repos/dist/dev/dubbo/KEYS &amp;gt;&amp;gt; KEYS &lt;span style="color:#586e75"># download public keys to local directory&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> $ gpg --import KEYS &lt;span style="color:#586e75"># import keys&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> $ gpg —edit-key liujun
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;gt; trust &lt;span style="color:#586e75"># type trust command&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后使用如下命令检查签名&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>gpg --verify apache-dubbo-2.6.3-source-release.zip.asc apache-dubbo-2.6.3-source-release.zip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gpg --verify apache-dubbo-2.6.3-bin-release.zip.asc apache-dubbo-2.6.3-bin-release.zip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="检查源码包的文件内容">检查源码包的文件内容&lt;/h3>
&lt;p>解压缩&lt;code>apache-dubbo-${release_version}-source-release.zip&lt;/code>,进行如下检查:&lt;/p>
&lt;ul>
&lt;li>Directory with &amp;lsquo;incubating&amp;rsquo; in name
&lt;code>apache-dubbo-${release_version}-source-release&lt;/code>&lt;/li>
&lt;li>DISCLAIMER exists&lt;/li>
&lt;li>LICENSE and NOTICE exists and contents are good&lt;/li>
&lt;li>All files and no binary files exist&lt;/li>
&lt;li>All files has standard ASF License header&lt;/li>
&lt;li>Can compile from source&lt;/li>
&lt;li>All unit tests can pass
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>mvn clean &lt;span style="color:#b58900">test&lt;/span> &lt;span style="color:#586e75"># This will run all unit tests&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#586e75"># you can also open rat and style plugin to check if every file meets requirements.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mvn clean &lt;span style="color:#b58900">test&lt;/span> -Drat.skip&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">false&lt;/span> -Dcheckstyle.skip&lt;span style="color:#719e07">=&lt;/span>&lt;span style="color:#b58900">false&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>Release candidates match with corresponding tags, you can find tag link and hash in vote email.
&lt;ul>
&lt;li>check the version number in pom.xml are the same&lt;/li>
&lt;li>check there are no extra files or directories in the source package, for example, no empty directories or useless log files,这里需要注意换行符是否一致&lt;br>
&lt;code>diff -r a rc_dir tag_dir&lt;/code>&lt;/li>
&lt;li>check the top n tag commits, dive into the related files and check if the source package has the same changes&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="检查二进制包的文件内容c">检查二进制包的文件内容C&lt;/h3>
&lt;p>解压缩&lt;code>apache-dubbo-${release_version}-bin-release.zip&lt;/code>,进行如下检查:&lt;/p>
&lt;ul>
&lt;li>Check signatures are good&lt;/li>
&lt;li>&amp;lsquo;incubating&amp;rsquo; in name&lt;/li>
&lt;li>LICENSE and NOTICE exists and contents are good&lt;/li>
&lt;/ul>
&lt;p>注意,如果二进制包里面引入了第三方依赖,则需要更新LICENSE,加入第三方依赖的LICENSE,如果第三方依赖的LICENSE是Apache 2.0,并且对应的项目中包含了NOTICE,还需要更新NOTICE文件&lt;/p>
&lt;h2 id="进入投票">进入投票&lt;/h2>
&lt;p>投票分两个阶段:&lt;/p>
&lt;ol>
&lt;li>Dubbo社区投票,发起投票邮件到dev@dubbo.apache.org。在社区开发者Review,经过至少72小时并统计到3个同意发版的binding票后(只有PMC的票才是binding),即可进入下一阶段的投票。&lt;/li>
&lt;li>Apache社区投票,发起投票邮件到general@incubator.apache.org。经过至少72小时并统计到3个同意发版的binding票后(只有IPMC Member的票才是binding),即可进行正式发布。&lt;/li>
&lt;/ol>
&lt;p>Dubbo社区投票邮件模板:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Hello Dubbo Community,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>This is a call for vote to release Apache Dubbo (Incubating) version 2.6.2.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The release candidates:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>https://dist.apache.org/repos/dist/dev/dubbo/2.6.2/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Git tag for the release:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>https://github.com/apache/dubbo/tree/dubbo-2.6.2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Hash for the release tag:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>afab04c53edab38d52275d2a198ea1aff7a4f41e
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Release Notes:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>https://github.com/apache/dubbo/releases/tag/untagged-4775c0a22c60fca55118
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The artifacts have been signed with Key : 28681CB1, which can be found in the keys file:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>https://dist.apache.org/repos/dist/dev/dubbo/KEYS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The vote will be open for at least 72 hours or until necessary number of votes are reached.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Please vote accordingly:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] +1 approve
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] +0 no opinion
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] -1 disapprove with the reason
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Thanks,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The Apache Dubbo (Incubating) Team
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Apache社区投票邮件模板:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Hello all,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>This is a call for vote to release Apache Dubbo (Incubating) version 2.6.4.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The Apache Dubbo community has voted on and approved a proposal to release
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Apache Dubbo (Incubating) version 2.6.4.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>We now kindly request the Incubator PMC members review and vote on this
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>incubator release.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Apache Dubbo™ is a high-performance, java based, open source
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>RPC framework. Dubbo offers three key functionalities, which include
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>interface based remote call, fault tolerance &amp;amp; load balancing, and
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>automatic service registration &amp;amp; discovery.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Dubbo community vote and result thread:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>https://lists.apache.org/thread.html/8d5c39eece6288beed2e22ca976350728c571d2a9cef1c9a9e56a409@%3Cdev.dubbo.apache.org%3E
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>A minor issue also can be found in the above thread.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The release candidates (RC1):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>https://dist.apache.org/repos/dist/dev/dubbo/2.6.4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Git tag for the release (RC1):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>https://github.com/apache/dubbo/tree/dubbo-2.6.4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Hash for the release tag:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>88037747a3b69d3225c73f6fbcda36ebd8435887
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Release Notes:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>*https://github.com/apache/dubbo/blob/dubbo-2.6.4/CHANGES.md
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;https://github.com/apache/dubbo/blob/dubbo-2.6.4/CHANGES.md&amp;gt;*
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The artifacts have been signed with Key : 7955FB6D1DD21CF7, which can be
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>found in the keys file:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>https://dist.apache.org/repos/dist/dev/dubbo/KEYS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Look at here for how to verify this release candidate:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>https://github.com/apache/dubbo-website/blob/asf-site/blog/en-us/prepare-an-apache-release.md#prepare-apache-release
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The vote will be open for at least 72 hours or until necessary number of
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>votes are reached.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Please vote accordingly:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] +1 approve
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] +0 no opinion
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[ ] -1 disapprove with the reason
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Thanks,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The Apache Dubbo (Incubating) Team
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>宣布投票结果模板:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>We’ve received 3 +1 binding votes and one +1 non-binding vote:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+1 binding, Ian Luo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+1 binding, Huxing Zhang
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+1 binding, Jun Liu
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+1 non-binding, Jerrick
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>I will create a new vote thread in Apache community now.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Best regards,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The Apache Dubbo (Incubating) Team
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="正式发布">正式发布&lt;/h2>
&lt;ol>
&lt;li>将&lt;a href="https://dist.apache.org/repos/dist/dev/dubbo">dev&lt;/a>目录下的发布包添加到&lt;a href="https://dist.apache.org/repos/dist/release/dubbo">release&lt;/a>目录下,KEYS有更新的,也需要同步更新。&lt;/li>
&lt;li>删除&lt;a href="https://dist.apache.org/repos/dist/dev/dubbo">dev&lt;/a>目录下的发布包&lt;/li>
&lt;li>删除&lt;a href="https://dist.apache.org/repos/dist/release/dubbo">release&lt;/a>目录下上一个版本的发布包,这些包会被自动保存在&lt;a href="https://archive.apache.org/dist/incubator/dubbo">这里&lt;/a>&lt;/li>
&lt;li>发布GitHub上的&lt;a href="https://github.com/apache/dubbo/releases">release notes&lt;/a>&lt;/li>
&lt;li>修改GitHub的Readme文件,将版本号更新到最新发布的版本&lt;/li>
&lt;li>在官网下载&lt;a href="https://dubbo.apache.org/en/blog/2020/05/18/past-releases/">页面&lt;/a>上添加最新版本的下载链接。最新的下载链接应该类似&lt;code>https://www.apache.org/dyn/closer.cgi?path=incubator/dubbo/$VERSION/apache-dubbo-$VERSION-source-release.zip&lt;/code>. 同时更新以前版本的下载链接,改为类似&lt;code>https://archive.apache.org/dist/dubbo/$VERSION/apache-dubbo-$VERSION-bin-release.zip&lt;/code>. 具体可以参考过往的&lt;a href="https://dubbo.apache.org/en/blog/2020/05/18/past-releases/">下载链接&lt;/a>&lt;/li>
&lt;li>合并&lt;code>${release-version}-release&lt;/code>分支到对应的主干分支, 然后删除相应的release分支,例如: &lt;code>git push origin --delete 2.7.0-release&lt;/code>&lt;/li>
&lt;li>发邮件到 &lt;code>dev@dubbo.apache.org&lt;/code> 和 &lt;code>general@incubator.apache.org&lt;/code>
宣布release邮件模板:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>Hello Community,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>The Apache Dubbo team is pleased to announce that the
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2.6.6 has just been released.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Apache Dubbo™ is a high-performance, java based, open source
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>RPC framework. Dubbo offers three key functionalities, which include
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>interface based remote call, fault tolerance &amp;amp; load balancing, and
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>automatic service registration &amp;amp; discovery.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Both the source release[1] and the maven binary release[2] are available
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>now, you can also find the detailed release notes in here[3].
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>If you have any usage questions, or have problems when upgrading or find
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>any problems about enhancements included in this release, please don’t
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hesitate to let us know by sending feedback to this mailing list or filing
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>an issue on GitHub[4].
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>=====
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>*Disclaimer*
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Apache Dubbo is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[1] https://dubbo.apache.org/en/blog/2020/05/18/past-releases/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[2] http://central.maven.org/maven2/com/alibaba/dubbo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[3] https://github.com/apache/dubbo/releases
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[4] https://github.com/apache/dubbo/issues
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="完成maven-convenient-binary发布可选">完成Maven Convenient Binary发布(可选)&lt;/h2>
&lt;p>&lt;strong>repository.apache.org&lt;/strong> nexus仓库的权限已经申请,参见&lt;a href="https://issues.apache.org/jira/browse/INFRA-16451">jira&lt;/a>&lt;/p>
&lt;p>发布jar包到maven仓库,首先访问&lt;a href="https://repository.apache.org">repository.apache.org&lt;/a>, 选择&lt;code>staging repository&lt;/code>, 点击&lt;code>release&lt;/code>按钮。等待一段时间之后,在&lt;a href="https://repository.apache.org/content/repositories/releases/org/apache/dubbo/">这里&lt;/a>确认完整性和正确性. 发布到Maven中央仓库则还需要等待一段时间。可以在&lt;a href="https://repo.maven.apache.org/maven2/org/apache/dubbo">这里&lt;/a>进行确认。&lt;/p>
&lt;h2 id="faq">FAQ&lt;/h2>
&lt;h4 id="gpg-signing-failed-inappropriate-ioctl-for-device">gpg: signing failed: Inappropriate ioctl for device&lt;/h4>
&lt;p>If you&amp;rsquo;ve encoutered this error, try the following commands:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#719e07">export&lt;/span> GPG_TTY&lt;span style="color:#719e07">=$&lt;/span>(tty)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Blog: 第四届Dubbo开发者沙龙于8月26日在成都举行</title><link>https://dubbo.apache.org/zh-cn/blog/2018/08/26/%E7%AC%AC%E5%9B%9B%E5%B1%8Adubbo%E5%BC%80%E5%8F%91%E8%80%85%E6%B2%99%E9%BE%99%E4%BA%8E8%E6%9C%8826%E6%97%A5%E5%9C%A8%E6%88%90%E9%83%BD%E4%B8%BE%E8%A1%8C/</link><pubDate>Sun, 26 Aug 2018 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2018/08/26/%E7%AC%AC%E5%9B%9B%E5%B1%8Adubbo%E5%BC%80%E5%8F%91%E8%80%85%E6%B2%99%E9%BE%99%E4%BA%8E8%E6%9C%8826%E6%97%A5%E5%9C%A8%E6%88%90%E9%83%BD%E4%B8%BE%E8%A1%8C/</guid><description>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/meetup-chengdu/all-hands.webp" alt="img">&lt;/p>
&lt;h2 id="用户深度沟通交流">用户深度沟通交流&lt;/h2>
&lt;p>8.26上午10:00-12:00,邀请到货车帮,云图金控,前BBD,飞鱼星四家公司开源爱好者及重度用户参与面对面交流;据参与者反馈,解答了对Dubbo的诸多疑惑,特别是如何参与贡献社区,以及捐献代码所带来的价值点。希望后面可以更加深入参与Dubbo社区及活动中。&lt;/p>
&lt;h2 id="meetup活动信息">meetup活动信息&lt;/h2>
&lt;p>本次活动依旧爆满,总报名人数976,现场用户350+,直播PV 13207。&lt;/p>
&lt;h2 id="报名信息">报名信息&lt;/h2>
&lt;p>Aliware Open Source•成都站-Apache Dubbo开发者沙龙于8月26日(周日)在成都高新区天府五街200号菁蓉国际广场8号楼2楼会议厅举办,技术GG们的思想盛宴,干货与福利一个都不会少。&lt;/p>
&lt;p>报名链接:http://www.huodongxing.com/event/7453091088400&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dubbo-chengdu-meetup-img.jpg" alt="img">&lt;/p></description></item><item><title>Blog: 第三届Dubbo开发者沙龙在深圳成功举办</title><link>https://dubbo.apache.org/zh-cn/blog/2018/07/30/%E7%AC%AC%E4%B8%89%E5%B1%8Adubbo%E5%BC%80%E5%8F%91%E8%80%85%E6%B2%99%E9%BE%99%E5%9C%A8%E6%B7%B1%E5%9C%B3%E6%88%90%E5%8A%9F%E4%B8%BE%E5%8A%9E/</link><pubDate>Mon, 30 Jul 2018 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2018/07/30/%E7%AC%AC%E4%B8%89%E5%B1%8Adubbo%E5%BC%80%E5%8F%91%E8%80%85%E6%B2%99%E9%BE%99%E5%9C%A8%E6%B7%B1%E5%9C%B3%E6%88%90%E5%8A%9F%E4%B8%BE%E5%8A%9E/</guid><description>
&lt;p>第三届Dubbo开发者沙龙在深圳成功举办,超过2000位开发者报名,现场参与人数700+,通过阿里云天池、云栖社区、大咖说引导线上直播观看次数17000+&lt;/p>
&lt;p>分享嘉宾&lt;/p>
&lt;ul>
&lt;li>陈志轩: Dubbo开源现状和2.7规划&lt;/li>
&lt;li>康彬: 乐信集团的微服务化之路&lt;/li>
&lt;li>林佳梁: Sentinel——企业用户的全方位流量哨兵&lt;/li>
&lt;/ul></description></item><item><title>Blog: 第二届Dubbo开发者沙龙在上海成功举办</title><link>https://dubbo.apache.org/zh-cn/blog/2018/06/23/%E7%AC%AC%E4%BA%8C%E5%B1%8Adubbo%E5%BC%80%E5%8F%91%E8%80%85%E6%B2%99%E9%BE%99%E5%9C%A8%E4%B8%8A%E6%B5%B7%E6%88%90%E5%8A%9F%E4%B8%BE%E5%8A%9E/</link><pubDate>Sat, 23 Jun 2018 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2018/06/23/%E7%AC%AC%E4%BA%8C%E5%B1%8Adubbo%E5%BC%80%E5%8F%91%E8%80%85%E6%B2%99%E9%BE%99%E5%9C%A8%E4%B8%8A%E6%B5%B7%E6%88%90%E5%8A%9F%E4%B8%BE%E5%8A%9E/</guid><description>
&lt;p>第二届Dubbo开发者沙龙在上海成功举办,超过700位开发者报名,现场参与人数300+,通过阿里云天池、云栖社区、大咖说引导线上直播观看次数10000+&lt;/p>
&lt;p>分享嘉宾及PPT:&lt;/p>
&lt;ul>
&lt;li>朱勇: Dubbo开源现状与未来规划 (中文) &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201806%40Shanghai/dubbo-status-and-roadmap.pdf">slides&lt;/a>&lt;/li>
&lt;li>小马哥: Dubbo Cloud Native 之路的实践与思考 (中文) &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201806%40Shanghai/dubbo-cloud-native-practices-and-thoughts.pdf">slides&lt;/a>&lt;/li>
&lt;li>郭平: Nacos - 贡献Dubbo生态,阿里巴巴注册中心和配置中心开源计划 (中文) &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201806%40Shanghai/nacos-open-source-initiative.pdf">slides&lt;/a>&lt;/li>
&lt;li>潘志伟: Dubbo在互金行业的应用场景 (中文) &lt;a href="https://github.com/dubbo/awesome-dubbo/blob/master/slides/meetup/201806%40Shanghai/dubbo-practices-on-internet-finance-industries.pdf">slides&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Blog: 首届Dubbo开发者沙龙在北京成功举办</title><link>https://dubbo.apache.org/zh-cn/blog/2018/05/12/%E9%A6%96%E5%B1%8Adubbo%E5%BC%80%E5%8F%91%E8%80%85%E6%B2%99%E9%BE%99%E5%9C%A8%E5%8C%97%E4%BA%AC%E6%88%90%E5%8A%9F%E4%B8%BE%E5%8A%9E/</link><pubDate>Sat, 12 May 2018 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2018/05/12/%E9%A6%96%E5%B1%8Adubbo%E5%BC%80%E5%8F%91%E8%80%85%E6%B2%99%E9%BE%99%E5%9C%A8%E5%8C%97%E4%BA%AC%E6%88%90%E5%8A%9F%E4%B8%BE%E5%8A%9E/</guid><description>
&lt;p>首届Dubbo开发者沙龙在北京成功举办, 超过400位开发者参加。这是一个很好的开始!&lt;/p>
&lt;p>分享嘉宾及主体如下:&lt;/p>
&lt;ul>
&lt;li>罗毅: Dubbo 的现状现状与未来规划 &lt;a href="https://github.com/dubbo/awesome-dubbo/raw/master/slides/meetup/201805%40Beijing/dubbo-present-and-future.pdf">PDF&lt;/a>&lt;/li>
&lt;li>刘军: 第四届阿里中间件性能挑战赛 &lt;a href="https://github.com/dubbo/awesome-dubbo/raw/master/slides/meetup/201805%40Beijing/introduction-to-4th-aliware-performance-challenge.pdf">PDF&lt;/a>&lt;/li>
&lt;li>陈志轩: 通过 Dubbo 和 Spring-boot 快速构建微服务 &lt;a href="https://github.com/dubbo/awesome-dubbo/raw/master/slides/meetup/201805%40Beijing/quickly-building-microservice-with-dubbo-and-springboot.pdf">PDF&lt;/a>&lt;/li>
&lt;li>王欣: Dubbo 和微店的服务化实践历程分享 &lt;a href="https://github.com/dubbo/awesome-dubbo/raw/master/slides/meetup/201805%40Beijing/dubbo-and-weidian's-practice-on-microservice-architecture.pdf">PDF&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Blog: ApacheCon NA 大会议程公布</title><link>https://dubbo.apache.org/zh-cn/blog/2018/05/02/apachecon-na-%E5%A4%A7%E4%BC%9A%E8%AE%AE%E7%A8%8B%E5%85%AC%E5%B8%83/</link><pubDate>Wed, 02 May 2018 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2018/05/02/apachecon-na-%E5%A4%A7%E4%BC%9A%E8%AE%AE%E7%A8%8B%E5%85%AC%E5%B8%83/</guid><description>
&lt;p>罗毅/刘军将在蒙特利尔举办的 ApacheCon 大会上进行题为&amp;quot;Introducing Apache Dubbo(Incubating): What is Dubbo and How it Works&amp;quot;的演讲。请点击&lt;a href="https://apachecon.dukecon.org/acna/2018/#/scheduledEvent/b8db9dc580d85853f">此处&lt;/a>查看大会议程,并在&lt;a href="https://www.eventbrite.com/e/apachecon-north-america-2018-registration-43200327342">此处&lt;/a>中进行注册。&lt;/p></description></item><item><title>Blog: 谷歌编程之夏会议上2018个项目被宣布</title><link>https://dubbo.apache.org/zh-cn/blog/2018/04/25/%E8%B0%B7%E6%AD%8C%E7%BC%96%E7%A8%8B%E4%B9%8B%E5%A4%8F%E4%BC%9A%E8%AE%AE%E4%B8%8A2018%E4%B8%AA%E9%A1%B9%E7%9B%AE%E8%A2%AB%E5%AE%A3%E5%B8%83/</link><pubDate>Wed, 25 Apr 2018 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2018/04/25/%E8%B0%B7%E6%AD%8C%E7%BC%96%E7%A8%8B%E4%B9%8B%E5%A4%8F%E4%BC%9A%E8%AE%AE%E4%B8%8A2018%E4%B8%AA%E9%A1%B9%E7%9B%AE%E8%A2%AB%E5%AE%A3%E5%B8%83/</guid><description>
&lt;p>谷歌编程之夏会议上2018个项目被宣布, Raghu Reddy 的项目&amp;quot;Apache Dubbo 扩展串行协议支持&amp;quot; 被&lt;a href="https://summerofcode.withgoogle.com/projects/#4747840161579008">接受&lt;/a>! 祝贺他!&lt;/p></description></item><item><title>Blog: 在DockerHub发布Dubbo Admin镜像</title><link>https://dubbo.apache.org/zh-cn/blog/2018/04/23/%E5%9C%A8dockerhub%E5%8F%91%E5%B8%83dubbo-admin%E9%95%9C%E5%83%8F/</link><pubDate>Mon, 23 Apr 2018 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2018/04/23/%E5%9C%A8dockerhub%E5%8F%91%E5%B8%83dubbo-admin%E9%95%9C%E5%83%8F/</guid><description>
&lt;p>Dubbo Admin是Dubbo的服务治理中心,提供了大量日常运维所需的服务治理、配置管理等功能。&lt;/p>
&lt;p>Dubbo Admin同时包含了前端代码和后端代码,如果用户需要自己下载源码并编译打包,需要花费一定时间。
特别是对于一些希望快速调研和试用Dubbo Admin的用户,这种流程的体验并不是很好。&lt;/p>
&lt;p>Docker是一个开源的应用容器引擎,让开发者可以打包应用以及依赖包到一个可移植的镜像中,社区对于提供Dubbo Admin镜像的呼声较高。
Docker官方维护了一个公共仓库DockerHub,该仓库还有很多国内镜像,访问速度快,将Dubbo Admin镜像发布到DockerHub是一个较好的选择。&lt;/p>
&lt;h2 id="dockerhub账号申请">DockerHub账号申请&lt;/h2>
&lt;p>要在DockerHub上发布镜像,自然需要对应的账号。
而DockerHub有两种常见账号,一种是面向个人的,一种是面向组织的。Apache在DockerHub上有一个组织账号&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>。
自然我们首选是发布在组织账号下。&lt;/p>
&lt;p>DockerHub对于组织账号的管理是基于组的,也就是一个组织账号下有多个组,每个组有不同的成员,而一个组可以管理一个或者多个镜像。&lt;/p>
&lt;p>所以要做的第一步就是申请权限,这个需要提一个issue给Apache Infrastructure团队,申请DockerHub的镜像仓库和组权限。
目前镜像和组已经申请好了,只需要申请组的权限就行了,可以参考之前的申请&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>。&lt;/p>
&lt;p>申请完权限以后使用Apache账号登陆应该就可以看到对应的镜像和配置选项了。&lt;/p>
&lt;h2 id="添加新的构建规则">添加新的构建规则&lt;/h2>
&lt;p>发布镜像到DockerHub有两种办法,一种是本地构建好镜像以后远程push到DockerHub,另外一种是提供Dockerfile并借助DockerHub提供的构建功能直接在DockerHub构建。
后者明显操作性和便捷性要好很多,目前Dubbo Admin的镜像也是这样构建发布的。&lt;/p>
&lt;p>当Dubbo Admin有新版本发布以后,需要在项目的docker目录新增一个Dockerfile文件,可以参考目前0.1.0版本的Dockerfile&lt;sup id="fnref:3">&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref">3&lt;/a>&lt;/sup>,其中的配置根据具体的版本可能有细微差别,但是大致上是一致的。&lt;/p>
&lt;p>在添加了Dockerfile之后,进入DockerHub对应的管理界面新增Build Rules&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/dockerhub-build-rules.png" alt="dockerhub-build-rules.png">&lt;/p>
&lt;p>根据实际情况填写即可。这里需要注意两点:&lt;/p>
&lt;ul>
&lt;li>latest 版本要和最新的版本配置一致&lt;/li>
&lt;li>不要勾选Autobuild&lt;/li>
&lt;/ul>
&lt;p>勾选Autobuild会导致每次git提交都会触发自动构建,但是由于Dubbo Admin不提供snapshot的Docker镜像,所以只有发布新版本的时候才需要构建发布。&lt;/p>
&lt;p>修改以后点Save,然后手动触发构建即可。&lt;/p>
&lt;h2 id="总结">总结&lt;/h2>
&lt;p>总的来说DockerHub上发布镜像的步骤并不复杂,如果已经申请过权限的话,操作起来是很流畅的。&lt;/p>
&lt;p>另外DockerHub的构建是需要排队的,有时候会遇到长时间没有开始构建的情况,需要耐心等待。&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>&lt;a href="https://hub.docker.com/r/apache">https://hub.docker.com/r/apache&lt;/a>&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>&lt;a href="https://issues.apache.org/jira/browse/INFRA-18167">https://issues.apache.org/jira/browse/INFRA-18167&lt;/a>&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:3">
&lt;p>&lt;a href="https://github.com/apache/dubbo-admin/blob/develop/docker/0.1.0/Dockerfile">https://github.com/apache/dubbo-admin/blob/develop/docker/0.1.0/Dockerfile&lt;/a>&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>Blog: Dubbo路线图在QCon Beijing 2018上公布</title><link>https://dubbo.apache.org/zh-cn/blog/2018/04/22/dubbo%E8%B7%AF%E7%BA%BF%E5%9B%BE%E5%9C%A8qcon-beijing-2018%E4%B8%8A%E5%85%AC%E5%B8%83/</link><pubDate>Sun, 22 Apr 2018 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2018/04/22/dubbo%E8%B7%AF%E7%BA%BF%E5%9B%BE%E5%9C%A8qcon-beijing-2018%E4%B8%8A%E5%85%AC%E5%B8%83/</guid><description>
&lt;p>罗毅在Qcon Beijing 2018上进行了Dubbo开源现状及未来规划的主题演讲。详细内容请查看&lt;a href="https://github.com/dubbo/awesome-dubbo/raw/master/slides/qcon2018/dubbo-present-and-future.pdf">幻灯片&lt;/a>。&lt;/p></description></item><item><title>Blog: 如何参与贡献Dubbo社区</title><link>https://dubbo.apache.org/zh-cn/blog/2018/03/11/%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E%E8%B4%A1%E7%8C%AEdubbo%E7%A4%BE%E5%8C%BA/</link><pubDate>Sun, 11 Mar 2018 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2018/03/11/%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E%E8%B4%A1%E7%8C%AEdubbo%E7%A4%BE%E5%8C%BA/</guid><description>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/involve-dubbo/head.jpg" alt="img">&lt;/p>
&lt;h2 id="前言">前言&lt;/h2>
&lt;p>本文首次分享是在Apache Dubbo成都meetup上,这个话题是第一次在meetup上讲,不是我们没有更好的话题,相反,我们认为这个话题非常重要,甚至建议这个话题以后每次meetup都要讲。&lt;/p>
&lt;p>Dubbo的发展历史大家应该并不陌生了,这里我还是简单回顾一下。Dubbo于2011年在github开源,后面几年由于一些原因停止了维护,直接去年7月份阿里重启维护,并于2018年2月16日捐献给Apache。&lt;/p>
&lt;p>为什么会选择捐献给Apache,主要是为了打消社区对Dubbo未来发展的顾虑,给Dubbo用户足够的信心;Apache认为&lt;code>社区大于代码&lt;/code>,非常注重多样性,强调一个项目需要有多个公司和个人贡献者参与,现在Dubbo的发展完全是按&lt;code>The Apache Way&lt;/code>社区化的方式来运作的。&lt;/p>
&lt;h2 id="apache的诞生">Apache的诞生&lt;/h2>
&lt;p>说到Apache,大家都非常熟悉了,它是全球目前最大的软件基金;Apache的很多项目我们都用过,比如Maven、Log4j、Tomcat等,但有一个项目要特别强调的,那就是 Apache httpd server,这是Apache的第一个项目。&lt;/p>
&lt;p>Apache软件基金会正式创建于1999年,主要是为公众提供有用的免费软件,并为软件开发者社区提供支持和服务;它的创建者是一个自称为&lt;code>Apache组织&lt;/code>的群体;&lt;/p>
&lt;p>早在1995年,这个组织就存在了,他们聚集在一起,在美国伊利诺伊大学超级计算机应用程序国家中心开发的NCSA HTTPd服务器的基础上开发与维护了一个叫Apache的HTTP服务器。&lt;/p>
&lt;p>最早NCSA HTTPd服务器是一个叫Rob McCool的人开发的,但是后来慢慢失去了兴趣,导致这个功能强大又好用的服务器没人维护;于是一些爱好者和用户就自发开始维护起来,并不断改善功能、发布版本;为了更好进行沟通,一哥们就创建了一个邮件组,并把维护工作高效组织起来,且自称是&lt;code>Apache组织&lt;/code>,并把这个软件叫&lt;code>Apache 服务器&lt;/code>。&lt;/p>
&lt;p>这也是为什么Apache的所有的项目到今天为止依然以邮件列表作为沟通的主要方式。&lt;/p>
&lt;p>关于Apache的命名来源,从北美当地的一支叫&lt;code>Apache&lt;/code>的印第安部落名称而来,这支部落以高超的军事素养和超人的忍耐力著称,19世纪后半期对侵占他们领土的入侵者进行了反抗;为了对这支部落表示敬仰,就取了这个名字;但这里还流传着一个小故事,说是在NCSA HTTPd基础上,大家都通过打补丁不断在修改这个软件,被戏称为&lt;code>A Patchy Server&lt;/code>,和&lt;code>Apache Server&lt;/code>读音很像。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/involve-dubbo/apache-history.png" alt="img">&lt;/p>
&lt;p>随着后来商业需求扩大,围绕Apache HTTP服务器的项目越来越多,后来越来越多的项目启动,也有很多外部组织捐献项目;为了让这些外部项目能顺利进入到Apache基金会,2002年创建了Incubator(孵化)项目。可以看到,经过10多年的发展,到2010年,75个顶级项目,30个孵化项目,每天2697封讨论邮件;2018年这个数据进一步增长,194个顶级项目,54个孵化项目,3255个committers;其中中国人主导的项目,有RocketMQ,WeeX,ECharts,Skywalking等。&lt;/p>
&lt;p>Dubbo正在成为Apache顶级项目的路上——Apache孵化项目中。&lt;/p>
&lt;p>回顾一下Apache这些历史和数据,我们不难发现几个关键词:兴趣、参与、邮件;这些就是我们后面要重点介绍的&lt;code>The Apache Way&lt;/code>。&lt;/p>
&lt;h2 id="asf组织架构">ASF组织架构&lt;/h2>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/involve-dubbo/apache-org.png" alt="img">&lt;/p>
&lt;p>我们知道每个组织都有它自己的架构,ASF同样也不例外;那Apache的组织架构是什么样的呢?它有什么独特的地方吗?这里特别要强调的是Project Management Committees,即 PMC,每个项目从孵化阶段开始就会有PMC,主要负责保证开源项目的社区活动都能运转良好,这里运转的机制就是&lt;code>The Apache Way&lt;/code>。&lt;/p>
&lt;p>图中,Board就是负责整个基金会符合章程的运作。Board我们一般很少能接触到,接触更多的是PMC以及下面的这几层。&lt;/p>
&lt;p>参与Apache项目社区活动的人,一般分为以下几类:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>直接用户:在座的都是Dubbo的用户,可能部分现在还不是,但将来肯定会是&lt;/p>
&lt;/li>
&lt;li>
&lt;p>贡献者:部分用户在使用Dubbo过程中,遇到问题,自己通过分析调试找到解决方案,并提交给Dubbo官方,最终被接受,这些用户就是Dubbo的贡献者&lt;/p>
&lt;/li>
&lt;li>
&lt;p>提交者:贡献多了,经过PMC的提议和投票,就会成为Committer;Committer即意味着正式加入Apache,拥有个人Apache帐号以及相应项目的写权限&lt;/p>
&lt;/li>
&lt;li>
&lt;p>PMC:Committer再往上走就是PMC,这个必须由现有PMC成员提名&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>个人在社区的成长,就像我们在公司晋升一样,一步一步往上走。&lt;/p>
&lt;p>本文的目的就是告诉大家,从User到Contributor没有大家想像的那么难,从Contributor到Committer也不是不可能;只要大家拥有一颗开源的心,找到自己感兴趣的项目,并持续投入,付出肯定会有回报。&lt;/p>
&lt;h2 id="the-apache-way">The Apache Way&lt;/h2>
&lt;p>就像你加入一家公司需要了解这家公司的文化一样,参与Apache开源项目之前,同样我们需要需要了解ASF的文化,这个文化就称为&lt;code>The Apache Way&lt;/code>。&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/involve-dubbo/apache-way.png" alt="img">&lt;/p>
&lt;p>这里想特别强调以下几点:&lt;/p>
&lt;ul>
&lt;li>社区胜于代码:把项目构建出来这不是开源,去构建社区才是真正的开源;对社区而言,一切都是围绕代码而生,无代码则社区不复存在;在代码之上,则是如何做事、如何待人、如何决策的理念体现;一个健康的社区远比优秀的代码重要——如果代码奇烂无比,社区可以重写,但社区有了毛病,代码最终也会付之东流;&lt;/li>
&lt;li>公开透明与共识决策:&lt;code>If it doesn't happen on email, it doesn't happen.&lt;/code> 所有的决定,不管是技术feature、发展方向,还是版本发布等,都应该被公开讨论,而形式就是邮件列表,这些讨论过程和结论都会被永久存档;而讨论的过程,就是大家自由发表意见的过程,但最终大家要投票,比较民主的做法;&lt;/li>
&lt;li>任人唯贤:&lt;code>Those that have proven they can do, get to do more.&lt;/code> 特别强调一点,贡献绝不仅仅是代码,贡献可以是很多方面,接下来我们结合Dubbo来讲,大家如何参与并贡献;&lt;/li>
&lt;/ul>
&lt;h2 id="参与dubbo社区">参与Dubbo社区&lt;/h2>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/involve-dubbo/dubbo-community.png" alt="img">&lt;/p>
&lt;p>要参与Dubbo社区,就要先大概了解一下目前社区的工作方式。总结一句话就是4个角色、3个途径以及2个代码组;&lt;/p>
&lt;ol>
&lt;li>4个角色前面也提到过了,分别是User、Contributor、Committer、PMC;这里特别要强调用的是,角色之间不是孤立的,比如提功能建议的也可以是Committer或Contributor等;PMC有投票权,但其他人一样也可以投票,这本身就是一种参与、一种贡献;&lt;/li>
&lt;li>3个途径,分别是Dubbo官网、github、dev邮件列表;目前比较活跃的是github issue/PR;我们鼓励按&lt;code>The Apache Way&lt;/code>的方式,使用邮件列表交流,让导师看到我们的贡献;&lt;/li>
&lt;li>2个代码组,一个是 &lt;code>github.com/apache/dubbo*&lt;/code> ,这里是dubbo孵化的项目,目前主要包含dubbo-rpc、dubbo-spring-boot-start、dubbo-ops三个部分;另外一个就是 &lt;code>github.com/dubbo&lt;/code>,这个是dubbo作为微服务解决方案的所有相关的生态部分,包括dubbo-rpc的扩展、dubbo与其他产品集成、dubbo多语言客户端实现以及一些工具和套件等;&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/involve-dubbo/dubbo-project.png" alt="img">&lt;/p>
&lt;p>所以,对于想参与Dubbo社区、想为Dubbo这个微服务解决方案自己一份力量的人来说,以下就是你们现在就可以开始做的:&lt;/p>
&lt;ol>
&lt;li>开发邮件组可以订阅起来,可以参考这里:https://github.com/apache/dubbo/wiki/Mailing-list-subscription-guide&lt;/li>
&lt;li>github.com/apache/dubbo star起来,fork起来&lt;/li>
&lt;li>学习中英文文档,进行修正或优化,提PR;有疑问的地方,可以email到邮件组或提issue;官方开发者的回复总比google或stackoverflow里找到的答案要强的多吧?&lt;/li>
&lt;li>如果你正在使用dubbo,可以将经验总结出来,写篇blog,分享给社区;真实的案例总是最具有说服力;&lt;/li>
&lt;li>如果你有时间,可以参与issue和PR的解决,回条用户的问题、PR的review;&lt;code>Good first issue&lt;/code>以及&lt;code>Help wanted&lt;/code>的issue,总有一个是适合你的;&lt;/li>
&lt;li>如果你想深入学习dubbo-rpc框架,UT是一个非常好的开始,完善和补充现有的UT,一边学习一边贡献,何乐而不为?&lt;/li>
&lt;li>发现了bug,报issue;通过自己的努力最终解决了,提一个issue,&lt;code>first-contributor&lt;/code>并不是那么难;哦,对了,拼写错误也算哦;&lt;/li>
&lt;li>如果你发现一个可以帮助用户更方便地使用dubbo,开发、测试、调试、mock、工具等;都可以贡献到Dubbo生态中来;&lt;/li>
&lt;li>最后我们非常欢迎大家通过邮件提想法,也欢迎大家多讨论;你会发现,技术变牛的同时,英文也变的66的了;&lt;/li>
&lt;/ol>
&lt;h2 id="加入apache孵化">加入Apache孵化&lt;/h2>
&lt;p>如果大家有好的项目希望捐献给Apache,这个流程可以参考一下;&lt;/p>
&lt;p>&lt;img src="https://dubbo.apache.org/imgs/blog/involve-dubbo/get-into-apache.png" alt="img">&lt;/p>
&lt;p>进入 Apache 分为三个阶段,准备阶段、孵化阶段和毕业阶段。准备阶段需要做的事情要找到愿意帮助孵化的导师,向Apache 提交进入孵化的申请,经过导师们讨论并投票,如果通过的话就可以进入孵化。孵化阶段分为两大环节,第一个环节是公司和个人签署协议向Apache 移交代码和知识产权,之后就是在导师的指导下按照Apache的规范做版本迭代、社区运营、发展更多的Committer;如果最终通过了成熟度评估,就可以顺利毕业成为Apache的顶级项目。&lt;/p>
&lt;h2 id="结语">结语&lt;/h2>
&lt;p>希望越来越多的公司团队和个人能够贡献到国际化的开源社区里去,一起打造我们中国的开源品牌!也希望大家都能愉快去贡献,罗马非一日建成,但付出一定会有回报。&lt;/p>
&lt;p>这里透露一个小福利,所有Apache Committer可以免费使用IntelliJ的全套付费产品,包括全宇宙最好用的IDEA。&lt;/p></description></item></channel></rss>