blob: fa39f2f32928b5c076889102a1cf59a3ec92f310 [file] [log] [blame]
<!doctype html><html lang=zh-cn class=no-js><head><meta name=ROBOTS content="INDEX, FOLLOW"><link rel=canonical href=https://cn.dubbo.apache.org/zh-cn/blog/2022/08/16/16-%E6%A8%A1%E5%9D%97%E5%8F%91%E5%B8%83%E5%99%A8%E5%8F%91%E5%B8%83%E6%9C%8D%E5%8A%A1%E5%85%A8%E8%BF%87%E7%A8%8B/><script>var _hmt=_hmt||[];(function(){var e,t=document.createElement("script");t.src="https://hm.baidu.com/hm.js?3b78f49ba47181e4d998a66b689446e9",e=document.getElementsByTagName("script")[0],e.parentNode.insertBefore(t,e)})()</script><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta http-equiv=Content-Security-Policy content="frame-src *"><meta name=generator content="Hugo 0.122.0"><link rel="shortcut icon" type=image/png href=/imgs/favicon.png><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=manifest href=/manifest.webmanifest><title>16-模块发布器发布服务全过程 | Apache Dubbo</title><meta property="og:title" content="16-模块发布器发布服务全过程">
<meta property="og:description" content="[Dubbo 3.0.8源码解析] DefaultModuleDeployer模块器启动的流程,其中在start代码的模版方法中开始了导出服务的功能,。
"><meta property="og:type" content="article"><meta property="og:url" content="https://cn.dubbo.apache.org/zh-cn/blog/2022/08/16/16-%E6%A8%A1%E5%9D%97%E5%8F%91%E5%B8%83%E5%99%A8%E5%8F%91%E5%B8%83%E6%9C%8D%E5%8A%A1%E5%85%A8%E8%BF%87%E7%A8%8B/"><meta property="article:section" content="blog"><meta property="article:published_time" content="2022-08-16T00:00:00+00:00"><meta property="article:modified_time" content="2022-08-16T00:00:00+00:00"><meta itemprop=name content="16-模块发布器发布服务全过程"><meta itemprop=description content="[Dubbo 3.0.8源码解析] DefaultModuleDeployer模块器启动的流程,其中在start代码的模版方法中开始了导出服务的功能,。
"><meta itemprop=datePublished content="2022-08-16T00:00:00+00:00"><meta itemprop=dateModified content="2022-08-16T00:00:00+00:00"><meta itemprop=wordCount content="2280"><meta itemprop=keywords content="源码解析,Java,"><meta name=twitter:card content="summary"><meta name=twitter:title content="16-模块发布器发布服务全过程"><meta name=twitter:description content="[Dubbo 3.0.8源码解析] DefaultModuleDeployer模块器启动的流程,其中在start代码的模版方法中开始了导出服务的功能,。
"><script async src="https://www.googletagmanager.com/gtag/js?id=G-NM6FFMT51J"></script><script>var doNotTrack=!1;if(!doNotTrack){window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-NM6FFMT51J",{anonymize_ip:!1})}</script><link rel=preload href=/scss/main.min.f77e221bcdbe0cadb996060fe82063c747b60c229a1f8bbf0ee529adbadd84fa.css as=style><link href=/scss/main.min.f77e221bcdbe0cadb996060fe82063c747b60c229a1f8bbf0ee529adbadd84fa.css rel=stylesheet integrity><script src=/js/jquery-3.5.1.min.js integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin=anonymous></script><meta name=theme-color content="#326ce5"><link rel=stylesheet href=/css/feature-states.css><meta name=description content="[Dubbo 3.0.8源码解析] DefaultModuleDeployer模块器启动的流程,其中在start代码的模版方法中开始了导出服务的功能,。
"><meta property="og:description" content="[Dubbo 3.0.8源码解析] DefaultModuleDeployer模块器启动的流程,其中在start代码的模版方法中开始了导出服务的功能,。
"><meta name=twitter:description content="[Dubbo 3.0.8源码解析] DefaultModuleDeployer模块器启动的流程,其中在start代码的模版方法中开始了导出服务的功能,。
"><meta property="og:url" content="https://cn.dubbo.apache.org/zh-cn/blog/2022/08/16/16-%E6%A8%A1%E5%9D%97%E5%8F%91%E5%B8%83%E5%99%A8%E5%8F%91%E5%B8%83%E6%9C%8D%E5%8A%A1%E5%85%A8%E8%BF%87%E7%A8%8B/"><meta property="og:title" content="16-模块发布器发布服务全过程"><meta name=twitter:title content="16-模块发布器发布服务全过程"><meta name=twitter:image:alt content="Apache Dubbo"><meta property="og:image" content="/imgs/blog/source-blog/16-deploy.png"><meta property="og:type" content="article"><meta name=viewport content="width=device-width"><script async defer src=/js/github-buttons.js></script><link href=/css/community.css rel=stylesheet><link href=/css/contactus.css rel=stylesheet><link href=/css/language.css rel=stylesheet><script src=/js/script.js></script></head><body class="td-page td-documentation"><header><nav class="js-navbar-scroll navbar navbar-expand navbar-dark flex-column flex-md-row td-navbar" data-auto-burger=primary><a class=navbar-brand href=/zh-cn/><span class=navbar-logo></span><span class="text-uppercase font-weight-bold">Apache Dubbo</span></a><div class="td-navbar-nav-scroll ml-md-auto" id=main_navbar><ul class="navbar-nav mt-2 mt-lg-0"><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/zh-cn/overview/home/><span>文档</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class="nav-link active" href=/zh-cn/blog/><span class=active>博客</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/zh-cn/download/><span>版本发布</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/zh-cn/contact/><span>联系社区</span></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=https://start.dubbo.apache.org/bootstrap.html target=_blank><span>Initializer</span><i class='fas fa-external-link-alt'></i></a></li><li class="nav-item mr-4 mb-2 mb-lg-0"><a class=nav-link href=/zh-cn/github/><span>Github</span><i class='fa-brands fa-github'></i></a></li><li class="nav-item dropdown d-lg-block"><a class="nav-link dropdown-toggle" href=# id=navbarDropdownMenuLink role=button data-toggle=dropdown aria-haspopup=true aria-expanded=false>中文</a><div class="dropdown-menu dropdown-menu-right" aria-labelledby=navbarDropdownMenuLink><a class=dropdown-item href=/en/>English</a></div></li><li class="nav-item dropdown d-lg-block"><div class="nav-item d-none d-lg-block"></div></li></ul></div></nav><section class="header-hero text-white pb-0 light-text"></section></header><div class="container-fluid td-outer"><div class=td-main><div class="row flex-md-nowrap"><div class="col-12 col-md-3 col-xl-2 td-sidebar d-print-none"><script>$(function(){$("#td-section-nav a").removeClass("active"),$("#td-section-nav #m-zh-cnblog2022081616-e6a8a1e59d97e58f91e5b883e599a8e58f91e5b883e69c8de58aa1e585a8e8bf87e7a88b").addClass("active"),$("#td-section-nav #m-zh-cnblog2022081616-e6a8a1e59d97e58f91e5b883e599a8e58f91e5b883e69c8de58aa1e585a8e8bf87e7a88b-li span").addClass("td-sidebar-nav-active-item"),$("#td-section-nav #m-zh-cnblog2022081616-e6a8a1e59d97e58f91e5b883e599a8e58f91e5b883e69c8de58aa1e585a8e8bf87e7a88b").parents("li").addClass("active-path"),$("#td-section-nav li.active-path").addClass("show"),$("#td-section-nav li.active-path").children("input").prop("checked",!0),$("#td-section-nav #m-zh-cnblog2022081616-e6a8a1e59d97e58f91e5b883e599a8e58f91e5b883e69c8de58aa1e585a8e8bf87e7a88b-li").siblings("li").addClass("show"),$("#td-section-nav #m-zh-cnblog2022081616-e6a8a1e59d97e58f91e5b883e599a8e58f91e5b883e69c8de58aa1e585a8e8bf87e7a88b-li").children("ul").children("li").addClass("show"),$("#td-sidebar-menu").toggleClass("d-none")})</script><div id=td-sidebar-menu class="td-sidebar__inner d-none"><div id=content-mobile><form class="td-sidebar__search d-flex align-items-center"><button class="btn btn-link td-sidebar__toggle d-md-none p-0 ml-3 fas fa-bars" type=button data-toggle=collapse data-target=#td-section-nav aria-controls=td-docs-nav aria-expanded=false aria-label="Toggle section navigation"></button></form></div><div id=content-desktop></div><nav class="collapse td-sidebar-nav foldable-nav" id=td-section-nav><ul class="td-sidebar-nav__section pr-md-3 ul-0"><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-zh-cnblog-li><ul class=ul-1><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-zh-cnblognews-li><input type=checkbox id=m-zh-cnblognews-check>
<label for=m-zh-cnblognews-check><a href=/zh-cn/blog/news/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnblognews><span>社区动态</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20221201dubbo-java-314-e6ada3e5bc8fe58f91e5b883-li><input type=checkbox id=m-zh-cnblog20221201dubbo-java-314-e6ada3e5bc8fe58f91e5b883-check>
<label for=m-zh-cnblog20221201dubbo-java-314-e6ada3e5bc8fe58f91e5b883-check><a href=/zh-cn/blog/2022/12/01/dubbo-java-3.1.4-%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/ title="Dubbo Java 3.1.4 正式发布" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20221201dubbo-java-314-e6ada3e5bc8fe58f91e5b883><span>dubbo-java 3.1.4</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20221022e8819ae784a6e7a8b3e5ae9ae680a7dubbo-java-e58f91e78988e8a784e58892e585ace5b883-li><input type=checkbox id=m-zh-cnblog20221022e8819ae784a6e7a8b3e5ae9ae680a7dubbo-java-e58f91e78988e8a784e58892e585ace5b883-check>
<label for=m-zh-cnblog20221022e8819ae784a6e7a8b3e5ae9ae680a7dubbo-java-e58f91e78988e8a784e58892e585ace5b883-check><a href=/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/ title="聚焦稳定性,Dubbo Java 发版规划公布" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20221022e8819ae784a6e7a8b3e5ae9ae680a7dubbo-java-e58f91e78988e8a784e58892e585ace5b883><span>Dubbo Java 发版规划</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210718dubbo-java-302-e58f91e78988e585ace5918a-li><input type=checkbox id=m-zh-cnblog20210718dubbo-java-302-e58f91e78988e585ace5918a-check>
<label for=m-zh-cnblog20210718dubbo-java-302-e58f91e78988e585ace5918a-check><a href=/zh-cn/blog/2021/07/18/dubbo-java-3.0.2-%E5%8F%91%E7%89%88%E5%85%AC%E5%91%8A/ title="Dubbo Java 3.0.2 发版公告" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210718dubbo-java-302-e58f91e78988e585ace5918a><span>dubbo-java 3.0.2</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20220718dubbo-java-313-e6ada3e5bc8fe58f91e5b883-li><input type=checkbox id=m-zh-cnblog20220718dubbo-java-313-e6ada3e5bc8fe58f91e5b883-check>
<label for=m-zh-cnblog20220718dubbo-java-313-e6ada3e5bc8fe58f91e5b883-check><a href=/zh-cn/blog/2022/07/18/dubbo-java-3.1.3-%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/ title="Dubbo Java 3.1.3 正式发布" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20220718dubbo-java-313-e6ada3e5bc8fe58f91e5b883><span>dubbo-java 3.1.3</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20221218dubbo-java-320-beta3-e6ada3e5bc8fe58f91e5b883-li><input type=checkbox id=m-zh-cnblog20221218dubbo-java-320-beta3-e6ada3e5bc8fe58f91e5b883-check>
<label for=m-zh-cnblog20221218dubbo-java-320-beta3-e6ada3e5bc8fe58f91e5b883-check><a href=/zh-cn/blog/2022/12/18/dubbo-java-3.2.0-beta.3-%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/ title="Dubbo Java 3.2.0-beta.3 正式发布" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20221218dubbo-java-320-beta3-e6ada3e5bc8fe58f91e5b883><span>dubbo-java 3.2.0-beta.3</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20221118dubbo-320-beta2-e6ada3e5bc8fe58f91e5b883-li><input type=checkbox id=m-zh-cnblog20221118dubbo-320-beta2-e6ada3e5bc8fe58f91e5b883-check>
<label for=m-zh-cnblog20221118dubbo-320-beta2-e6ada3e5bc8fe58f91e5b883-check><a href=/zh-cn/blog/2022/11/18/dubbo-3.2.0-beta.2-%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/ title="Dubbo 3.2.0-beta.2 正式发布" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20221118dubbo-320-beta2-e6ada3e5bc8fe58f91e5b883><span>dubbo-java 3.2.0-beta.2</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20200518dubbo-java-2714-e58f91e78988e585ace5918a-li><input type=checkbox id=m-zh-cnblog20200518dubbo-java-2714-e58f91e78988e585ace5918a-check>
<label for=m-zh-cnblog20200518dubbo-java-2714-e58f91e78988e585ace5918a-check><a href=/zh-cn/blog/2020/05/18/dubbo-java-2.7.14-%E5%8F%91%E7%89%88%E5%85%AC%E5%91%8A/ title="Dubbo Java 2.7.14 发版公告" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20200518dubbo-java-2714-e58f91e78988e585ace5918a><span>dubbo-java 2.7.14</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog10101dubbo-go-151-li><input type=checkbox id=m-zh-cnblog10101dubbo-go-151-check>
<label for=m-zh-cnblog10101dubbo-go-151-check><a href=/zh-cn/blog/1/01/01/dubbo-go-1.5.1/ title="Dubbo Go 1.5.1" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog10101dubbo-go-151><span>dubbo-go 1.5.1</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog10101dubbo-go-hessian2-v170-li><input type=checkbox id=m-zh-cnblog10101dubbo-go-hessian2-v170-check>
<label for=m-zh-cnblog10101dubbo-go-hessian2-v170-check><a href=/zh-cn/blog/1/01/01/dubbo-go-hessian2-v1.7.0/ title="Dubbo Go Hessian2 v1.7.0" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog10101dubbo-go-hessian2-v170><span>dubbo-go-hessian2 v1.7.0</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20240118apache-dubbo-e4b88be4b880e4bba3e4ba91e58e9fe7949fe5beaee69c8de58aa1e68c91e68898e8b59be590afe58aa8e68aa5e5908de4ba94e5a4a7e8b59be9a29850e4b887e5a596e98791e6b1a0e7ad89e4bda0e69da5e68898-li><input type=checkbox id=m-zh-cnblog20240118apache-dubbo-e4b88be4b880e4bba3e4ba91e58e9fe7949fe5beaee69c8de58aa1e68c91e68898e8b59be590afe58aa8e68aa5e5908de4ba94e5a4a7e8b59be9a29850e4b887e5a596e98791e6b1a0e7ad89e4bda0e69da5e68898-check>
<label for=m-zh-cnblog20240118apache-dubbo-e4b88be4b880e4bba3e4ba91e58e9fe7949fe5beaee69c8de58aa1e68c91e68898e8b59be590afe58aa8e68aa5e5908de4ba94e5a4a7e8b59be9a29850e4b887e5a596e98791e6b1a0e7ad89e4bda0e69da5e68898-check><a href=/zh-cn/blog/2024/01/18/apache-dubbo-%E4%B8%8B%E4%B8%80%E4%BB%A3%E4%BA%91%E5%8E%9F%E7%94%9F%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%8C%91%E6%88%98%E8%B5%9B%E5%90%AF%E5%8A%A8%E6%8A%A5%E5%90%8D%E4%BA%94%E5%A4%A7%E8%B5%9B%E9%A2%9850%E4%B8%87%E5%A5%96%E9%87%91%E6%B1%A0%E7%AD%89%E4%BD%A0%E6%9D%A5%E6%88%98/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20240118apache-dubbo-e4b88be4b880e4bba3e4ba91e58e9fe7949fe5beaee69c8de58aa1e68c91e68898e8b59be590afe58aa8e68aa5e5908de4ba94e5a4a7e8b59be9a29850e4b887e5a596e98791e6b1a0e7ad89e4bda0e69da5e68898><span>Apache Dubbo 下一代云原生微服务挑战赛启动报名!五大赛题50万奖金池等你来战</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20231023intellij-ideaefb88fapache-dubboideae5ae98e696b9e68f92e4bbb6e6ada3e5bc8fe58f91e5b883-li><input type=checkbox id=m-zh-cnblog20231023intellij-ideaefb88fapache-dubboideae5ae98e696b9e68f92e4bbb6e6ada3e5bc8fe58f91e5b883-check>
<label for=m-zh-cnblog20231023intellij-ideaefb88fapache-dubboideae5ae98e696b9e68f92e4bbb6e6ada3e5bc8fe58f91e5b883-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20231023intellij-ideaefb88fapache-dubboideae5ae98e696b9e68f92e4bbb6e6ada3e5bc8fe58f91e5b883><span>IntelliJ IDEA❤️Apache Dubbo,IDEA官方插件正式发布!</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20231007apache-dubbo-e4ba91e58e9fe7949fe58fafe8a782e6b58be680a7e79a84e68ea2e7b4a2e4b88ee5ae9ee8b7b5-li><input type=checkbox id=m-zh-cnblog20231007apache-dubbo-e4ba91e58e9fe7949fe58fafe8a782e6b58be680a7e79a84e68ea2e7b4a2e4b88ee5ae9ee8b7b5-check>
<label for=m-zh-cnblog20231007apache-dubbo-e4ba91e58e9fe7949fe58fafe8a782e6b58be680a7e79a84e68ea2e7b4a2e4b88ee5ae9ee8b7b5-check><a href=/zh-cn/blog/2023/10/07/apache-dubbo-%E4%BA%91%E5%8E%9F%E7%94%9F%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7%E7%9A%84%E6%8E%A2%E7%B4%A2%E4%B8%8E%E5%AE%9E%E8%B7%B5/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20231007apache-dubbo-e4ba91e58e9fe7949fe58fafe8a782e6b58be680a7e79a84e68ea2e7b4a2e4b88ee5ae9ee8b7b5><span>Apache Dubbo 云原生可观测性的探索与实践</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20231007opensergo-dubbo-e5beaee69c8de58aa1e6b2bbe79086e69c80e4bdb3e5ae9ee8b7b5-li><input type=checkbox id=m-zh-cnblog20231007opensergo-dubbo-e5beaee69c8de58aa1e6b2bbe79086e69c80e4bdb3e5ae9ee8b7b5-check>
<label for=m-zh-cnblog20231007opensergo-dubbo-e5beaee69c8de58aa1e6b2bbe79086e69c80e4bdb3e5ae9ee8b7b5-check><a href=/zh-cn/blog/2023/10/07/opensergo-dubbo-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20231007opensergo-dubbo-e5beaee69c8de58aa1e6b2bbe79086e69c80e4bdb3e5ae9ee8b7b5><span>OpenSergo & Dubbo 微服务治理最佳实践</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20231007seata-e5beaee69c8de58aa1e69eb6e69e84e4b88be79a84e4b880e7ab99e5bc8fe58886e5b883e5bc8fe4ba8be58aa1e8a7a3e586b3e696b9e6a188-li><input type=checkbox id=m-zh-cnblog20231007seata-e5beaee69c8de58aa1e69eb6e69e84e4b88be79a84e4b880e7ab99e5bc8fe58886e5b883e5bc8fe4ba8be58aa1e8a7a3e586b3e696b9e6a188-check>
<label for=m-zh-cnblog20231007seata-e5beaee69c8de58aa1e69eb6e69e84e4b88be79a84e4b880e7ab99e5bc8fe58886e5b883e5bc8fe4ba8be58aa1e8a7a3e586b3e696b9e6a188-check><a href=/zh-cn/blog/2023/10/07/seata-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E4%B8%8B%E7%9A%84%E4%B8%80%E7%AB%99%E5%BC%8F%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20231007seata-e5beaee69c8de58aa1e69eb6e69e84e4b88be79a84e4b880e7ab99e5bc8fe58886e5b883e5bc8fe4ba8be58aa1e8a7a3e586b3e696b9e6a188><span>Seata 微服务架构下的一站式分布式事务解决方案</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20231007e59fbae4ba8e-triple-e5ae9ee78eb0-web-e7a7bbe58aa8e7abafe5908ee7abafe585a8e99da2e68993e9809a-li><input type=checkbox id=m-zh-cnblog20231007e59fbae4ba8e-triple-e5ae9ee78eb0-web-e7a7bbe58aa8e7abafe5908ee7abafe585a8e99da2e68993e9809a-check>
<label for=m-zh-cnblog20231007e59fbae4ba8e-triple-e5ae9ee78eb0-web-e7a7bbe58aa8e7abafe5908ee7abafe585a8e99da2e68993e9809a-check><a href=/zh-cn/blog/2023/10/07/%E5%9F%BA%E4%BA%8E-triple-%E5%AE%9E%E7%8E%B0-web-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E5%90%8E%E7%AB%AF%E5%85%A8%E9%9D%A2%E6%89%93%E9%80%9A/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20231007e59fbae4ba8e-triple-e5ae9ee78eb0-web-e7a7bbe58aa8e7abafe5908ee7abafe585a8e99da2e68993e9809a><span>基于 Triple 实现 Web 移动端后端全面打通</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20231007e590afe58aa8e9809fe5baa6e68f90e58d8710e5808dapache-dubbo-e99d99e68081e58c96-graalvm-native-image-e6b7b1e5baa6e8a7a3e69e90-li><input type=checkbox id=m-zh-cnblog20231007e590afe58aa8e9809fe5baa6e68f90e58d8710e5808dapache-dubbo-e99d99e68081e58c96-graalvm-native-image-e6b7b1e5baa6e8a7a3e69e90-check>
<label for=m-zh-cnblog20231007e590afe58aa8e9809fe5baa6e68f90e58d8710e5808dapache-dubbo-e99d99e68081e58c96-graalvm-native-image-e6b7b1e5baa6e8a7a3e69e90-check><a href=/zh-cn/blog/2023/10/07/%E5%90%AF%E5%8A%A8%E9%80%9F%E5%BA%A6%E6%8F%90%E5%8D%8710%E5%80%8Dapache-dubbo-%E9%9D%99%E6%80%81%E5%8C%96-graalvm-native-image-%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20231007e590afe58aa8e9809fe5baa6e68f90e58d8710e5808dapache-dubbo-e99d99e68081e58c96-graalvm-native-image-e6b7b1e5baa6e8a7a3e69e90><span>启动速度提升10倍:Apache Dubbo 静态化 GraalVM Native Image 深度解析</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20231007e6898be68a8ae6898be69599e4bda0e983a8e7bdb2dubboe5ba94e794a8e588b0kubernetes-apache-dubbo-kubernetes-e69c80e4bdb3e5ae9ee8b7b5-li><input type=checkbox id=m-zh-cnblog20231007e6898be68a8ae6898be69599e4bda0e983a8e7bdb2dubboe5ba94e794a8e588b0kubernetes-apache-dubbo-kubernetes-e69c80e4bdb3e5ae9ee8b7b5-check>
<label for=m-zh-cnblog20231007e6898be68a8ae6898be69599e4bda0e983a8e7bdb2dubboe5ba94e794a8e588b0kubernetes-apache-dubbo-kubernetes-e69c80e4bdb3e5ae9ee8b7b5-check><a href=/zh-cn/blog/2023/10/07/%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E9%83%A8%E7%BD%B2dubbo%E5%BA%94%E7%94%A8%E5%88%B0kubernetes-apache-dubbo-kubernetes-%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20231007e6898be68a8ae6898be69599e4bda0e983a8e7bdb2dubboe5ba94e794a8e588b0kubernetes-apache-dubbo-kubernetes-e69c80e4bdb3e5ae9ee8b7b5><span>手把手教你部署Dubbo应用到Kubernetes – Apache Dubbo Kubernetes 最佳实践</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20231007e694bfe98787e4ba91e59fbae4ba8edubboe79a84e6b7b7e59088e4ba91e695b0e68daee8b7a8e7bd91e5ae9ee8b7b5-li><input type=checkbox id=m-zh-cnblog20231007e694bfe98787e4ba91e59fbae4ba8edubboe79a84e6b7b7e59088e4ba91e695b0e68daee8b7a8e7bd91e5ae9ee8b7b5-check>
<label for=m-zh-cnblog20231007e694bfe98787e4ba91e59fbae4ba8edubboe79a84e6b7b7e59088e4ba91e695b0e68daee8b7a8e7bd91e5ae9ee8b7b5-check><a href=/zh-cn/blog/2023/10/07/%E6%94%BF%E9%87%87%E4%BA%91%E5%9F%BA%E4%BA%8Edubbo%E7%9A%84%E6%B7%B7%E5%90%88%E4%BA%91%E6%95%B0%E6%8D%AE%E8%B7%A8%E7%BD%91%E5%AE%9E%E8%B7%B5/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20231007e694bfe98787e4ba91e59fbae4ba8edubboe79a84e6b7b7e59088e4ba91e695b0e68daee8b7a8e7bd91e5ae9ee8b7b5><span>政采云基于Dubbo的混合云数据跨网实践</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230825coc-asia-2023-e5a4a7e4bc9ae7b2bee5bda9e59b9ee9a1be-li><input type=checkbox id=m-zh-cnblog20230825coc-asia-2023-e5a4a7e4bc9ae7b2bee5bda9e59b9ee9a1be-check>
<label for=m-zh-cnblog20230825coc-asia-2023-e5a4a7e4bc9ae7b2bee5bda9e59b9ee9a1be-check><a href=/zh-cn/blog/2023/08/25/coc-asia-2023-%E5%A4%A7%E4%BC%9A%E7%B2%BE%E5%BD%A9%E5%9B%9E%E9%A1%BE/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230825coc-asia-2023-e5a4a7e4bc9ae7b2bee5bda9e59b9ee9a1be><span>CoC Asia 2023 大会精彩回顾</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230807dubbo-e5beaee69c8de58aa1e4b893e9a298e8aebae59d9b-8e69c8819e697a5e58c97e4baacapachecone5a4a7e4bc9ae4b88de8a781e4b88de695a3-li><input type=checkbox id=m-zh-cnblog20230807dubbo-e5beaee69c8de58aa1e4b893e9a298e8aebae59d9b-8e69c8819e697a5e58c97e4baacapachecone5a4a7e4bc9ae4b88de8a781e4b88de695a3-check>
<label for=m-zh-cnblog20230807dubbo-e5beaee69c8de58aa1e4b893e9a298e8aebae59d9b-8e69c8819e697a5e58c97e4baacapachecone5a4a7e4bc9ae4b88de8a781e4b88de695a3-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230807dubbo-e5beaee69c8de58aa1e4b893e9a298e8aebae59d9b-8e69c8819e697a5e58c97e4baacapachecone5a4a7e4bc9ae4b88de8a781e4b88de695a3><span>Dubbo 微服务专题论坛 - 8月19日北京ApacheCon大会不见不散</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230705glcc-x-apache-dubboe7bc96e7a88be5a48fe4bba4e890a5e68aa5e5908de590afe58aa8-li><input type=checkbox id=m-zh-cnblog20230705glcc-x-apache-dubboe7bc96e7a88be5a48fe4bba4e890a5e68aa5e5908de590afe58aa8-check>
<label for=m-zh-cnblog20230705glcc-x-apache-dubboe7bc96e7a88be5a48fe4bba4e890a5e68aa5e5908de590afe58aa8-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230705glcc-x-apache-dubboe7bc96e7a88be5a48fe4bba4e890a5e68aa5e5908de590afe58aa8><span>GLCC x Apache Dubbo编程夏令营报名启动</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230515apache-dubbo-e5bc80e6ba90e4b98be5a48f-2023e8b4a1e78caee7a4bee58cbae8b5a2e58f96-12000-e5a596e98791-li><input type=checkbox id=m-zh-cnblog20230515apache-dubbo-e5bc80e6ba90e4b98be5a48f-2023e8b4a1e78caee7a4bee58cbae8b5a2e58f96-12000-e5a596e98791-check>
<label for=m-zh-cnblog20230515apache-dubbo-e5bc80e6ba90e4b98be5a48f-2023e8b4a1e78caee7a4bee58cbae8b5a2e58f96-12000-e5a596e98791-check><a href=/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/ title="Apache Dubbo 开源之夏 2023,贡献社区赢取 12000 奖金" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230515apache-dubbo-e5bc80e6ba90e4b98be5a48f-2023e8b4a1e78caee7a4bee58cbae8b5a2e58f96-12000-e5a596e98791><span>Apache Dubbo开源之夏2023,贡献社区赢取12000奖金</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230415e7b2bee8bf9be4ba91e58e9fe7949f-dubbo-32-e6ada3e5bc8fe58f91e5b883-li><input type=checkbox id=m-zh-cnblog20230415e7b2bee8bf9be4ba91e58e9fe7949f-dubbo-32-e6ada3e5bc8fe58f91e5b883-check>
<label for=m-zh-cnblog20230415e7b2bee8bf9be4ba91e58e9fe7949f-dubbo-32-e6ada3e5bc8fe58f91e5b883-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230415e7b2bee8bf9be4ba91e58e9fe7949f-dubbo-32-e6ada3e5bc8fe58f91e5b883><span>精进云原生 - Dubbo 3.2 正式发布</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog202302232022-e5b9b4e5baa6e680bbe7bb93e4b88e-2023-e696b0e5b9b4e8a784e58892-li><input type=checkbox id=m-zh-cnblog202302232022-e5b9b4e5baa6e680bbe7bb93e4b88e-2023-e696b0e5b9b4e8a784e58892-check>
<label for=m-zh-cnblog202302232022-e5b9b4e5baa6e680bbe7bb93e4b88e-2023-e696b0e5b9b4e8a784e58892-check><a href=/zh-cn/blog/2023/02/23/2022-%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93%E4%B8%8E-2023-%E6%96%B0%E5%B9%B4%E8%A7%84%E5%88%92/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog202302232022-e5b9b4e5baa6e680bbe7bb93e4b88e-2023-e696b0e5b9b4e8a784e58892><span>2022 年度总结与 2023 新年规划</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230223e4b880e69687e5b8aee4bda0e5bfabe9809fe4ba86e8a7a3-dubbo-e6a0b8e5bf83e883bde58a9b-li><input type=checkbox id=m-zh-cnblog20230223e4b880e69687e5b8aee4bda0e5bfabe9809fe4ba86e8a7a3-dubbo-e6a0b8e5bf83e883bde58a9b-check>
<label for=m-zh-cnblog20230223e4b880e69687e5b8aee4bda0e5bfabe9809fe4ba86e8a7a3-dubbo-e6a0b8e5bf83e883bde58a9b-check><a href=/zh-cn/blog/2023/02/23/%E4%B8%80%E6%96%87%E5%B8%AE%E4%BD%A0%E5%BF%AB%E9%80%9F%E4%BA%86%E8%A7%A3-dubbo-%E6%A0%B8%E5%BF%83%E8%83%BD%E5%8A%9B/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230223e4b880e69687e5b8aee4bda0e5bfabe9809fe4ba86e8a7a3-dubbo-e6a0b8e5bf83e883bde58a9b><span>一文帮你快速了解 Dubbo 核心能力</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230202dubbo-e59ca8-proxyless-mesh-e6a8a1e5bc8fe4b88be79a84e68ea2e7b4a2e4b88ee694b9e8bf9b-li><input type=checkbox id=m-zh-cnblog20230202dubbo-e59ca8-proxyless-mesh-e6a8a1e5bc8fe4b88be79a84e68ea2e7b4a2e4b88ee694b9e8bf9b-check>
<label for=m-zh-cnblog20230202dubbo-e59ca8-proxyless-mesh-e6a8a1e5bc8fe4b88be79a84e68ea2e7b4a2e4b88ee694b9e8bf9b-check><a href=/zh-cn/blog/2023/02/02/dubbo-%E5%9C%A8-proxyless-mesh-%E6%A8%A1%E5%BC%8F%E4%B8%8B%E7%9A%84%E6%8E%A2%E7%B4%A2%E4%B8%8E%E6%94%B9%E8%BF%9B/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230202dubbo-e59ca8-proxyless-mesh-e6a8a1e5bc8fe4b88be79a84e68ea2e7b4a2e4b88ee694b9e8bf9b><span>Dubbo 在 Proxyless Mesh 模式下的探索与改进</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230130dubbo-315320-beta4-e6ada3e5bc8fe58f91e5b883-li><input type=checkbox id=m-zh-cnblog20230130dubbo-315320-beta4-e6ada3e5bc8fe58f91e5b883-check>
<label for=m-zh-cnblog20230130dubbo-315320-beta4-e6ada3e5bc8fe58f91e5b883-check><a href=/zh-cn/blog/2023/01/30/dubbo-3.1.53.2.0-beta.4-%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230130dubbo-315320-beta4-e6ada3e5bc8fe58f91e5b883><span>Dubbo 3.1.5、3.2.0-beta.4 正式发布</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210823dubbo-java-3021-e58f91e78988e585ace5918a-li><input type=checkbox id=m-zh-cnblog20210823dubbo-java-3021-e58f91e78988e585ace5918a-check>
<label for=m-zh-cnblog20210823dubbo-java-3021-e58f91e78988e585ace5918a-check><a href=/zh-cn/blog/2021/08/23/dubbo-java-3.0.2.1-%E5%8F%91%E7%89%88%E5%85%AC%E5%91%8A/ title="Dubbo Java 3.0.2.1 发版公告" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210823dubbo-java-3021-e58f91e78988e585ace5918a><span>dubbo-java 3.0.2.1</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210702dubbo-java-301-e58f91e78988e585ace5918a-li><input type=checkbox id=m-zh-cnblog20210702dubbo-java-301-e58f91e78988e585ace5918a-check>
<label for=m-zh-cnblog20210702dubbo-java-301-e58f91e78988e585ace5918a-check><a href=/zh-cn/blog/2021/07/02/dubbo-java-3.0.1-%E5%8F%91%E7%89%88%E5%85%AC%E5%91%8A/ title="Dubbo Java 3.0.1 发版公告" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210702dubbo-java-301-e58f91e78988e585ace5918a><span>dubbo-ava 3.0.1</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210114dubbo-go-150-li><input type=checkbox id=m-zh-cnblog20210114dubbo-go-150-check>
<label for=m-zh-cnblog20210114dubbo-go-150-check><a href=/zh-cn/blog/2021/01/14/dubbo-go-1.5.0/ title="Dubbo Go 1.5.0" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210114dubbo-go-150><span>dubbo-go 1.5.0</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210114dubbo-go-hessian2-v160-li><input type=checkbox id=m-zh-cnblog20210114dubbo-go-hessian2-v160-check>
<label for=m-zh-cnblog20210114dubbo-go-hessian2-v160-check><a href=/zh-cn/blog/2021/01/14/dubbo-go-hessian2-v1.6.0/ title="Dubbo Go Hessian2 v1.6.0" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210114dubbo-go-hessian2-v160><span>dubbo-go-hessian2 v1.6.0</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210114e983bde5b7b2e7bb8fe58d81e5b281e79a84-apache-dubboe8bf98e883bde5868de4b998e9a38ee7a0b4e6b5aae59097-li><input type=checkbox id=m-zh-cnblog20210114e983bde5b7b2e7bb8fe58d81e5b281e79a84-apache-dubboe8bf98e883bde5868de4b998e9a38ee7a0b4e6b5aae59097-check>
<label for=m-zh-cnblog20210114e983bde5b7b2e7bb8fe58d81e5b281e79a84-apache-dubboe8bf98e883bde5868de4b998e9a38ee7a0b4e6b5aae59097-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210114e983bde5b7b2e7bb8fe58d81e5b281e79a84-apache-dubboe8bf98e883bde5868de4b998e9a38ee7a0b4e6b5aae59097><span>都已经十岁的 Apache Dubbo,还能再乘风破浪吗?</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210112dubbo-go-140-li><input type=checkbox id=m-zh-cnblog20210112dubbo-go-140-check>
<label for=m-zh-cnblog20210112dubbo-go-140-check><a href=/zh-cn/blog/2021/01/12/dubbo-go-1.4.0/ title="Dubbo Go 1.4.0" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210112dubbo-go-140><span>dubbo-go 1.4.0</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210111dubbo-go-e59b9ee9a1bee4b88ee5b195e69c9b-li><input type=checkbox id=m-zh-cnblog20210111dubbo-go-e59b9ee9a1bee4b88ee5b195e69c9b-check>
<label for=m-zh-cnblog20210111dubbo-go-e59b9ee9a1bee4b88ee5b195e69c9b-check><a href=/zh-cn/blog/2021/01/11/dubbo-go-%E5%9B%9E%E9%A1%BE%E4%B8%8E%E5%B1%95%E6%9C%9B/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210111dubbo-go-e59b9ee9a1bee4b88ee5b195e69c9b><span>Dubbo Go 回顾与展望</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20200518dubbo-java-275-e58a9fe883bde8a7a3e69e90-li><input type=checkbox id=m-zh-cnblog20200518dubbo-java-275-e58a9fe883bde8a7a3e69e90-check>
<label for=m-zh-cnblog20200518dubbo-java-275-e58a9fe883bde8a7a3e69e90-check><a href=/zh-cn/blog/2020/05/18/dubbo-java-2.7.5-%E5%8A%9F%E8%83%BD%E8%A7%A3%E6%9E%90/ title="Dubbo Java 2.7.5 功能解析" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20200518dubbo-java-275-e58a9fe883bde8a7a3e69e90><span>dubbo-java 2.7.5</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20200511e4bb8e-2019-e588b0-2020apache-dubbo-e5b9b4e5baa6e59b9ee9a1bee4b88ee680bbe7bb93-li><input type=checkbox id=m-zh-cnblog20200511e4bb8e-2019-e588b0-2020apache-dubbo-e5b9b4e5baa6e59b9ee9a1bee4b88ee680bbe7bb93-check>
<label for=m-zh-cnblog20200511e4bb8e-2019-e588b0-2020apache-dubbo-e5b9b4e5baa6e59b9ee9a1bee4b88ee680bbe7bb93-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20200511e4bb8e-2019-e588b0-2020apache-dubbo-e5b9b4e5baa6e59b9ee9a1bee4b88ee680bbe7bb93><span>从 2019 到 2020,Apache Dubbo 年度回顾与总结</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190126e98187e8a781dubbo-li><input type=checkbox id=m-zh-cnblog20190126e98187e8a781dubbo-check>
<label for=m-zh-cnblog20190126e98187e8a781dubbo-check><a href=/zh-cn/blog/2019/01/26/%E9%81%87%E8%A7%81dubbo/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190126e98187e8a781dubbo><span>遇见Dubbo</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20181210e7acace4ba94e5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e69dade5b79ee68890e58a9fe4b8bee58a9e-li><input type=checkbox id=m-zh-cnblog20181210e7acace4ba94e5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e69dade5b79ee68890e58a9fe4b8bee58a9e-check>
<label for=m-zh-cnblog20181210e7acace4ba94e5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e69dade5b79ee68890e58a9fe4b8bee58a9e-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20181210e7acace4ba94e5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e69dade5b79ee68890e58a9fe4b8bee58a9e><span>第五届Dubbo开发者沙龙在杭州成功举办</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180902e5a682e4bd95e58786e5a487apache-release-li><input type=checkbox id=m-zh-cnblog20180902e5a682e4bd95e58786e5a487apache-release-check>
<label for=m-zh-cnblog20180902e5a682e4bd95e58786e5a487apache-release-check><a href=/zh-cn/blog/2018/09/02/%E5%A6%82%E4%BD%95%E5%87%86%E5%A4%87apache-release/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180902e5a682e4bd95e58786e5a487apache-release><span>如何准备Apache Release</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180826e7acace59b9be5b18adubboe5bc80e58f91e88085e6b299e9be99e4ba8e8e69c8826e697a5e59ca8e68890e983bde4b8bee8a18c-li><input type=checkbox id=m-zh-cnblog20180826e7acace59b9be5b18adubboe5bc80e58f91e88085e6b299e9be99e4ba8e8e69c8826e697a5e59ca8e68890e983bde4b8bee8a18c-check>
<label for=m-zh-cnblog20180826e7acace59b9be5b18adubboe5bc80e58f91e88085e6b299e9be99e4ba8e8e69c8826e697a5e59ca8e68890e983bde4b8bee8a18c-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180826e7acace59b9be5b18adubboe5bc80e58f91e88085e6b299e9be99e4ba8e8e69c8826e697a5e59ca8e68890e983bde4b8bee8a18c><span>第四届Dubbo开发者沙龙于8月26日在成都举行</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180730e7acace4b889e5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e6b7b1e59cb3e68890e58a9fe4b8bee58a9e-li><input type=checkbox id=m-zh-cnblog20180730e7acace4b889e5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e6b7b1e59cb3e68890e58a9fe4b8bee58a9e-check>
<label for=m-zh-cnblog20180730e7acace4b889e5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e6b7b1e59cb3e68890e58a9fe4b8bee58a9e-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180730e7acace4b889e5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e6b7b1e59cb3e68890e58a9fe4b8bee58a9e><span>第三届Dubbo开发者沙龙在深圳成功举办</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180623e7acace4ba8ce5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e4b88ae6b5b7e68890e58a9fe4b8bee58a9e-li><input type=checkbox id=m-zh-cnblog20180623e7acace4ba8ce5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e4b88ae6b5b7e68890e58a9fe4b8bee58a9e-check>
<label for=m-zh-cnblog20180623e7acace4ba8ce5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e4b88ae6b5b7e68890e58a9fe4b8bee58a9e-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180623e7acace4ba8ce5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e4b88ae6b5b7e68890e58a9fe4b8bee58a9e><span>第二届Dubbo开发者沙龙在上海成功举办</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180512e9a696e5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e58c97e4baace68890e58a9fe4b8bee58a9e-li><input type=checkbox id=m-zh-cnblog20180512e9a696e5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e58c97e4baace68890e58a9fe4b8bee58a9e-check>
<label for=m-zh-cnblog20180512e9a696e5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e58c97e4baace68890e58a9fe4b8bee58a9e-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180512e9a696e5b18adubboe5bc80e58f91e88085e6b299e9be99e59ca8e58c97e4baace68890e58a9fe4b8bee58a9e><span>首届Dubbo开发者沙龙在北京成功举办</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180502apachecon-na-e5a4a7e4bc9ae8aeaee7a88be585ace5b883-li><input type=checkbox id=m-zh-cnblog20180502apachecon-na-e5a4a7e4bc9ae8aeaee7a88be585ace5b883-check>
<label for=m-zh-cnblog20180502apachecon-na-e5a4a7e4bc9ae8aeaee7a88be585ace5b883-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180502apachecon-na-e5a4a7e4bc9ae8aeaee7a88be585ace5b883><span>ApacheCon NA 大会议程公布</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180425e8b0b7e6ad8ce7bc96e7a88be4b98be5a48fe4bc9ae8aeaee4b88a2018e4b8aae9a1b9e79baee8a2abe5aea3e5b883-li><input type=checkbox id=m-zh-cnblog20180425e8b0b7e6ad8ce7bc96e7a88be4b98be5a48fe4bc9ae8aeaee4b88a2018e4b8aae9a1b9e79baee8a2abe5aea3e5b883-check>
<label for=m-zh-cnblog20180425e8b0b7e6ad8ce7bc96e7a88be4b98be5a48fe4bc9ae8aeaee4b88a2018e4b8aae9a1b9e79baee8a2abe5aea3e5b883-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180425e8b0b7e6ad8ce7bc96e7a88be4b98be5a48fe4bc9ae8aeaee4b88a2018e4b8aae9a1b9e79baee8a2abe5aea3e5b883><span>谷歌编程之夏会议上2018个项目被宣布</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180423e59ca8dockerhube58f91e5b883dubbo-admine9959ce5838f-li><input type=checkbox id=m-zh-cnblog20180423e59ca8dockerhube58f91e5b883dubbo-admine9959ce5838f-check>
<label for=m-zh-cnblog20180423e59ca8dockerhube58f91e5b883dubbo-admine9959ce5838f-check><a href=/zh-cn/blog/2018/04/23/%E5%9C%A8dockerhub%E5%8F%91%E5%B8%83dubbo-admin%E9%95%9C%E5%83%8F/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180423e59ca8dockerhube58f91e5b883dubbo-admine9959ce5838f><span>在DockerHub发布Dubbo Admin镜像</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180422dubboe8b7afe7babfe59bbee59ca8qcon-beijing-2018e4b88ae585ace5b883-li><input type=checkbox id=m-zh-cnblog20180422dubboe8b7afe7babfe59bbee59ca8qcon-beijing-2018e4b88ae585ace5b883-check>
<label for=m-zh-cnblog20180422dubboe8b7afe7babfe59bbee59ca8qcon-beijing-2018e4b88ae585ace5b883-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180422dubboe8b7afe7babfe59bbee59ca8qcon-beijing-2018e4b88ae585ace5b883><span>Dubbo路线图在QCon Beijing 2018上公布</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180311e5a682e4bd95e58f82e4b88ee8b4a1e78caedubboe7a4bee58cba-li><input type=checkbox id=m-zh-cnblog20180311e5a682e4bd95e58f82e4b88ee8b4a1e78caedubboe7a4bee58cba-check>
<label for=m-zh-cnblog20180311e5a682e4bd95e58f82e4b88ee8b4a1e78caedubboe7a4bee58cba-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180311e5a682e4bd95e58f82e4b88ee8b4a1e78caedubboe7a4bee58cba><span>如何参与贡献Dubbo社区</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-zh-cnblogusers-li><input type=checkbox id=m-zh-cnblogusers-check>
<label for=m-zh-cnblogusers-check><a href=/zh-cn/blog/users/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnblogusers><span>用户案例</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230116e998bfe9878ce5b7b4e5b7b4e58d87e7baa7-dubbo3-e585a8e99da2e58f96e4bba3-hsf2-li><input type=checkbox id=m-zh-cnblog20230116e998bfe9878ce5b7b4e5b7b4e58d87e7baa7-dubbo3-e585a8e99da2e58f96e4bba3-hsf2-check>
<label for=m-zh-cnblog20230116e998bfe9878ce5b7b4e5b7b4e58d87e7baa7-dubbo3-e585a8e99da2e58f96e4bba3-hsf2-check><a href=/zh-cn/blog/2023/01/16/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E5%8D%87%E7%BA%A7-dubbo3-%E5%85%A8%E9%9D%A2%E5%8F%96%E4%BB%A3-hsf2/ title="阿里巴巴升级 Dubbo3 全面取代 HSF2" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230116e998bfe9878ce5b7b4e5b7b4e58d87e7baa7-dubbo3-e585a8e99da2e58f96e4bba3-hsf2><span>阿里巴巴</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230115e5b7a5e59586e993b6e8a18c-dubbo3-e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0e5ae9ee8b7b5-li><input type=checkbox id=m-zh-cnblog20230115e5b7a5e59586e993b6e8a18c-dubbo3-e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0e5ae9ee8b7b5-check>
<label for=m-zh-cnblog20230115e5b7a5e59586e993b6e8a18c-dubbo3-e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0e5ae9ee8b7b5-check><a href=/zh-cn/blog/2023/01/15/%E5%B7%A5%E5%95%86%E9%93%B6%E8%A1%8C-dubbo3-%E5%BA%94%E7%94%A8%E7%BA%A7%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0%E5%AE%9E%E8%B7%B5/ title="工商银行 Dubbo3 应用级服务发现实践" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230115e5b7a5e59586e993b6e8a18c-dubbo3-e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0e5ae9ee8b7b5><span>工商银行</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230115e9a5bfe4ba86e4b988e585a8e7ab99e68890e58a9fe58d87e7baa7-dubbo3-li><input type=checkbox id=m-zh-cnblog20230115e9a5bfe4ba86e4b988e585a8e7ab99e68890e58a9fe58d87e7baa7-dubbo3-check>
<label for=m-zh-cnblog20230115e9a5bfe4ba86e4b988e585a8e7ab99e68890e58a9fe58d87e7baa7-dubbo3-check><a href=/zh-cn/blog/2023/01/15/%E9%A5%BF%E4%BA%86%E4%B9%88%E5%85%A8%E7%AB%99%E6%88%90%E5%8A%9F%E5%8D%87%E7%BA%A7-dubbo3/ title="饿了么全站成功升级 Dubbo3 " class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230115e9a5bfe4ba86e4b988e585a8e7ab99e68890e58a9fe58d87e7baa7-dubbo3><span>饿了么</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230115e5ba97e5b08fe89c9ce58d87e7baa7-triple-e58d8fe8aeae-li><input type=checkbox id=m-zh-cnblog20230115e5ba97e5b08fe89c9ce58d87e7baa7-triple-e58d8fe8aeae-check>
<label for=m-zh-cnblog20230115e5ba97e5b08fe89c9ce58d87e7baa7-triple-e58d8fe8aeae-check><a href=/zh-cn/blog/2023/01/15/%E5%BA%97%E5%B0%8F%E8%9C%9C%E5%8D%87%E7%BA%A7-triple-%E5%8D%8F%E8%AE%AE/ title="店小蜜升级 Triple 协议" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230115e5ba97e5b08fe89c9ce58d87e7baa7-triple-e58d8fe8aeae><span>达摩院云小蜜</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230115e7939ce5ad90e4ba8ce6898be8bda6-dubbo-e5ae9ee8b7b5-li><input type=checkbox id=m-zh-cnblog20230115e7939ce5ad90e4ba8ce6898be8bda6-dubbo-e5ae9ee8b7b5-check>
<label for=m-zh-cnblog20230115e7939ce5ad90e4ba8ce6898be8bda6-dubbo-e5ae9ee8b7b5-check><a href=/zh-cn/blog/2023/01/15/%E7%93%9C%E5%AD%90%E4%BA%8C%E6%89%8B%E8%BD%A6-dubbo-%E5%AE%9E%E8%B7%B5/ title="瓜子二手车 Dubbo 实践" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230115e7939ce5ad90e4ba8ce6898be8bda6-dubbo-e5ae9ee8b7b5><span>瓜子二手车</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230115e5b08fe7b1b3e4b88e-dubbo-e7a4bee58cbae79a84e59088e4bd9c-li><input type=checkbox id=m-zh-cnblog20230115e5b08fe7b1b3e4b88e-dubbo-e7a4bee58cbae79a84e59088e4bd9c-check>
<label for=m-zh-cnblog20230115e5b08fe7b1b3e4b88e-dubbo-e7a4bee58cbae79a84e59088e4bd9c-check><a href=/zh-cn/blog/2023/01/15/%E5%B0%8F%E7%B1%B3%E4%B8%8E-dubbo-%E7%A4%BE%E5%8C%BA%E7%9A%84%E5%90%88%E4%BD%9C/ title="小米与 Dubbo 社区的合作" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230115e5b08fe7b1b3e4b88e-dubbo-e7a4bee58cbae79a84e59088e4bd9c><span>小米</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230115e4b8ade4bca6e7bd91e7bb9c-dubbo3-e58d87e7baa7e5ae9ee8b7b5-li><input type=checkbox id=m-zh-cnblog20230115e4b8ade4bca6e7bd91e7bb9c-dubbo3-e58d87e7baa7e5ae9ee8b7b5-check>
<label for=m-zh-cnblog20230115e4b8ade4bca6e7bd91e7bb9c-dubbo3-e58d87e7baa7e5ae9ee8b7b5-check><a href=/zh-cn/blog/2023/01/15/%E4%B8%AD%E4%BC%A6%E7%BD%91%E7%BB%9C-dubbo3-%E5%8D%87%E7%BA%A7%E5%AE%9E%E8%B7%B5/ title="中伦网络 Dubbo3 升级实践" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230115e4b8ade4bca6e7bd91e7bb9c-dubbo3-e58d87e7baa7e5ae9ee8b7b5><span>中伦网络</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230115e5b9b3e5ae89e581a5e5bab7e79a84-dubbo3-e8bf81e7a7bbe58e86e7a88b-li><input type=checkbox id=m-zh-cnblog20230115e5b9b3e5ae89e581a5e5bab7e79a84-dubbo3-e8bf81e7a7bbe58e86e7a88b-check>
<label for=m-zh-cnblog20230115e5b9b3e5ae89e581a5e5bab7e79a84-dubbo3-e8bf81e7a7bbe58e86e7a88b-check><a href=/zh-cn/blog/2023/01/15/%E5%B9%B3%E5%AE%89%E5%81%A5%E5%BA%B7%E7%9A%84-dubbo3-%E8%BF%81%E7%A7%BB%E5%8E%86%E7%A8%8B/ title="平安健康的 Dubbo3 迁移历程" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230115e5b9b3e5ae89e581a5e5bab7e79a84-dubbo3-e8bf81e7a7bbe58e86e7a88b><span>平安健康</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230322e585a8e59bbde9a696e4b8aae694bfe4bc81e98787e8b4ade4ba91e5b9b3e58fb0e694bfe98787e4ba91e79a84e6b7b7e59088e4ba91e8b7a8e7bd91e696b9e6a188e5ae9ee8b7b5-li><input type=checkbox id=m-zh-cnblog20230322e585a8e59bbde9a696e4b8aae694bfe4bc81e98787e8b4ade4ba91e5b9b3e58fb0e694bfe98787e4ba91e79a84e6b7b7e59088e4ba91e8b7a8e7bd91e696b9e6a188e5ae9ee8b7b5-check>
<label for=m-zh-cnblog20230322e585a8e59bbde9a696e4b8aae694bfe4bc81e98787e8b4ade4ba91e5b9b3e58fb0e694bfe98787e4ba91e79a84e6b7b7e59088e4ba91e8b7a8e7bd91e696b9e6a188e5ae9ee8b7b5-check><a href=/zh-cn/blog/2023/03/22/%E5%85%A8%E5%9B%BD%E9%A6%96%E4%B8%AA%E6%94%BF%E4%BC%81%E9%87%87%E8%B4%AD%E4%BA%91%E5%B9%B3%E5%8F%B0%E6%94%BF%E9%87%87%E4%BA%91%E7%9A%84%E6%B7%B7%E5%90%88%E4%BA%91%E8%B7%A8%E7%BD%91%E6%96%B9%E6%A1%88%E5%AE%9E%E8%B7%B5/ title=全国首个政企采购云平台:政采云的混合云跨网方案实践 class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230322e585a8e59bbde9a696e4b8aae694bfe4bc81e98787e8b4ade4ba91e5b9b3e58fb0e694bfe98787e4ba91e79a84e6b7b7e59088e4ba91e8b7a8e7bd91e696b9e6a188e5ae9ee8b7b5><span>政采云</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-zh-cnblogintegration-li><input type=checkbox id=m-zh-cnblogintegration-check>
<label for=m-zh-cnblogintegration-check><a href=/zh-cn/blog/integration/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnblogintegration><span>生态集成</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20231007e5beaee69c8de58aa1e69c80e4bdb3e5ae9ee8b7b5e99bb6e694b9e980a0e5ae9ee78eb0-spring-cloud-apache-dubbo-e4ba92e9809a-li><input type=checkbox id=m-zh-cnblog20231007e5beaee69c8de58aa1e69c80e4bdb3e5ae9ee8b7b5e99bb6e694b9e980a0e5ae9ee78eb0-spring-cloud-apache-dubbo-e4ba92e9809a-check>
<label for=m-zh-cnblog20231007e5beaee69c8de58aa1e69c80e4bdb3e5ae9ee8b7b5e99bb6e694b9e980a0e5ae9ee78eb0-spring-cloud-apache-dubbo-e4ba92e9809a-check><a href=/zh-cn/blog/2023/10/07/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E9%9B%B6%E6%94%B9%E9%80%A0%E5%AE%9E%E7%8E%B0-spring-cloud-apache-dubbo-%E4%BA%92%E9%80%9A/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20231007e5beaee69c8de58aa1e69c80e4bdb3e5ae9ee8b7b5e99bb6e694b9e980a0e5ae9ee78eb0-spring-cloud-apache-dubbo-e4ba92e9809a><span>微服务最佳实践,零改造实现 Spring Cloud & Apache Dubbo 互通</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230628e8b5b0e59091-native-e58c96springdubbo-aot-e68a80e69cafe7a4bae4be8be4b88ee58e9fe79086e8aeb2e8a7a3-li><input type=checkbox id=m-zh-cnblog20230628e8b5b0e59091-native-e58c96springdubbo-aot-e68a80e69cafe7a4bae4be8be4b88ee58e9fe79086e8aeb2e8a7a3-check>
<label for=m-zh-cnblog20230628e8b5b0e59091-native-e58c96springdubbo-aot-e68a80e69cafe7a4bae4be8be4b88ee58e9fe79086e8aeb2e8a7a3-check><a href=/zh-cn/blog/2023/06/28/%E8%B5%B0%E5%90%91-native-%E5%8C%96springdubbo-aot-%E6%8A%80%E6%9C%AF%E7%A4%BA%E4%BE%8B%E4%B8%8E%E5%8E%9F%E7%90%86%E8%AE%B2%E8%A7%A3/ title="走向 Native 化:Spring&amp;Dubbo AOT 技术示例与原理讲解" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230628e8b5b0e59091-native-e58c96springdubbo-aot-e68a80e69cafe7a4bae4be8be4b88ee58e9fe79086e8aeb2e8a7a3><span>走向 Native 化:Dubbo AOT 正式发布</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230401e5a682e4bd95e9809ae8bf87-higress-e7bd91e585b3e4bba3e79086-dubbo-e69c8de58aa1-li><input type=checkbox id=m-zh-cnblog20230401e5a682e4bd95e9809ae8bf87-higress-e7bd91e585b3e4bba3e79086-dubbo-e69c8de58aa1-check>
<label for=m-zh-cnblog20230401e5a682e4bd95e9809ae8bf87-higress-e7bd91e585b3e4bba3e79086-dubbo-e69c8de58aa1-check><a href=/zh-cn/blog/2023/04/01/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87-higress-%E7%BD%91%E5%85%B3%E4%BB%A3%E7%90%86-dubbo-%E6%9C%8D%E5%8A%A1/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230401e5a682e4bd95e9809ae8bf87-higress-e7bd91e585b3e4bba3e79086-dubbo-e69c8de58aa1><span>如何通过 Higress 网关代理 Dubbo 服务</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20220504e5a682e4bd95e9809ae8bf87-apache-shenyu-e7bd91e585b3e4bba3e79086-dubbo-e69c8de58aa1-li><input type=checkbox id=m-zh-cnblog20220504e5a682e4bd95e9809ae8bf87-apache-shenyu-e7bd91e585b3e4bba3e79086-dubbo-e69c8de58aa1-check>
<label for=m-zh-cnblog20220504e5a682e4bd95e9809ae8bf87-apache-shenyu-e7bd91e585b3e4bba3e79086-dubbo-e69c8de58aa1-check><a href=/zh-cn/blog/2022/05/04/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87-apache-shenyu-%E7%BD%91%E5%85%B3%E4%BB%A3%E7%90%86-dubbo-%E6%9C%8D%E5%8A%A1/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20220504e5a682e4bd95e9809ae8bf87-apache-shenyu-e7bd91e585b3e4bba3e79086-dubbo-e69c8de58aa1><span>如何通过 Apache ShenYu 网关代理 Dubbo 服务</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20220118e4bb8ee58e9fe79086e588b0e6938de4bd9ce8aea9e4bda0e59ca8-apache-apisix-e4b8ade4bba3e79086-dubbo-e69c8de58aa1e69bb4e4bebfe68db7-li><input type=checkbox id=m-zh-cnblog20220118e4bb8ee58e9fe79086e588b0e6938de4bd9ce8aea9e4bda0e59ca8-apache-apisix-e4b8ade4bba3e79086-dubbo-e69c8de58aa1e69bb4e4bebfe68db7-check>
<label for=m-zh-cnblog20220118e4bb8ee58e9fe79086e588b0e6938de4bd9ce8aea9e4bda0e59ca8-apache-apisix-e4b8ade4bba3e79086-dubbo-e69c8de58aa1e69bb4e4bebfe68db7-check><a href=/zh-cn/blog/2022/01/18/%E4%BB%8E%E5%8E%9F%E7%90%86%E5%88%B0%E6%93%8D%E4%BD%9C%E8%AE%A9%E4%BD%A0%E5%9C%A8-apache-apisix-%E4%B8%AD%E4%BB%A3%E7%90%86-dubbo-%E6%9C%8D%E5%8A%A1%E6%9B%B4%E4%BE%BF%E6%8D%B7/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20220118e4bb8ee58e9fe79086e588b0e6938de4bd9ce8aea9e4bda0e59ca8-apache-apisix-e4b8ade4bba3e79086-dubbo-e69c8de58aa1e69bb4e4bebfe68db7><span>从原理到操作,让你在 Apache APISIX 中代理 Dubbo 服务更便捷</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190811e4bdbfe794a8apache-skywalking-incubator-e5819ae58886e5b883e5bc8fe8b79fe8b8aa-li><input type=checkbox id=m-zh-cnblog20190811e4bdbfe794a8apache-skywalking-incubator-e5819ae58886e5b883e5bc8fe8b79fe8b8aa-check>
<label for=m-zh-cnblog20190811e4bdbfe794a8apache-skywalking-incubator-e5819ae58886e5b883e5bc8fe8b79fe8b8aa-check><a href=/zh-cn/blog/2019/08/11/%E4%BD%BF%E7%94%A8apache-skywalking-incubator-%E5%81%9A%E5%88%86%E5%B8%83%E5%BC%8F%E8%B7%9F%E8%B8%AA/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190811e4bdbfe794a8apache-skywalking-incubator-e5819ae58886e5b883e5bc8fe8b79fe8b8aa><span>使用Apache Skywalking (Incubator) 做分布式跟踪</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190202e5bd93dubboe98187e4b88aarthase68e92e69fa5e997aee9a298e79a84e5ae9ee8b7b5-li><input type=checkbox id=m-zh-cnblog20190202e5bd93dubboe98187e4b88aarthase68e92e69fa5e997aee9a298e79a84e5ae9ee8b7b5-check>
<label for=m-zh-cnblog20190202e5bd93dubboe98187e4b88aarthase68e92e69fa5e997aee9a298e79a84e5ae9ee8b7b5-check><a href=/zh-cn/blog/2019/02/02/%E5%BD%93dubbo%E9%81%87%E4%B8%8Aarthas%E6%8E%92%E6%9F%A5%E9%97%AE%E9%A2%98%E7%9A%84%E5%AE%9E%E8%B7%B5/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190202e5bd93dubboe98187e4b88aarthase68e92e69fa5e997aee9a298e79a84e5ae9ee8b7b5><span>当Dubbo遇上Arthas:排查问题的实践</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190117e5a682e4bd95e4bdbfe794a8seatae4bf9de8af81dubboe5beaee69c8de58aa1e997b4e79a84e4b880e887b4e680a7-li><input type=checkbox id=m-zh-cnblog20190117e5a682e4bd95e4bdbfe794a8seatae4bf9de8af81dubboe5beaee69c8de58aa1e997b4e79a84e4b880e887b4e680a7-check>
<label for=m-zh-cnblog20190117e5a682e4bd95e4bdbfe794a8seatae4bf9de8af81dubboe5beaee69c8de58aa1e997b4e79a84e4b880e887b4e680a7-check><a href=/zh-cn/blog/2019/01/17/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8seata%E4%BF%9D%E8%AF%81dubbo%E5%BE%AE%E6%9C%8D%E5%8A%A1%E9%97%B4%E7%9A%84%E4%B8%80%E8%87%B4%E6%80%A7/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190117e5a682e4bd95e4bdbfe794a8seatae4bf9de8af81dubboe5beaee69c8de58aa1e997b4e79a84e4b880e887b4e680a7><span>如何使用Seata保证Dubbo微服务间的一致性</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190107e696b0e78988-dubbo-admin-e4bb8be7bb8d-li><input type=checkbox id=m-zh-cnblog20190107e696b0e78988-dubbo-admin-e4bb8be7bb8d-check>
<label for=m-zh-cnblog20190107e696b0e78988-dubbo-admin-e4bb8be7bb8d-check><a href=/zh-cn/blog/2019/01/07/%E6%96%B0%E7%89%88-dubbo-admin-%E4%BB%8B%E7%BB%8D/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190107e696b0e78988-dubbo-admin-e4bb8be7bb8d><span>新版 Dubbo Admin 介绍</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190105dubbo-e59ca8e7939ce5ad90e4ba8ce6898be8bda6e79a84e5ae9ee8b7b5-li><input type=checkbox id=m-zh-cnblog20190105dubbo-e59ca8e7939ce5ad90e4ba8ce6898be8bda6e79a84e5ae9ee8b7b5-check>
<label for=m-zh-cnblog20190105dubbo-e59ca8e7939ce5ad90e4ba8ce6898be8bda6e79a84e5ae9ee8b7b5-check><a href=/zh-cn/blog/2019/01/05/dubbo-%E5%9C%A8%E7%93%9C%E5%AD%90%E4%BA%8C%E6%89%8B%E8%BD%A6%E7%9A%84%E5%AE%9E%E8%B7%B5/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190105dubbo-e59ca8e7939ce5ad90e4ba8ce6898be8bda6e79a84e5ae9ee8b7b5><span>Dubbo 在瓜子二手车的实践</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20181107dubbo-e89e8de59088-nacos-e68890e4b8bae6b3a8e5868ce4b8ade5bf83-li><input type=checkbox id=m-zh-cnblog20181107dubbo-e89e8de59088-nacos-e68890e4b8bae6b3a8e5868ce4b8ade5bf83-check>
<label for=m-zh-cnblog20181107dubbo-e89e8de59088-nacos-e68890e4b8bae6b3a8e5868ce4b8ade5bf83-check><a href=/zh-cn/blog/2018/11/07/dubbo-%E8%9E%8D%E5%90%88-nacos-%E6%88%90%E4%B8%BA%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20181107dubbo-e89e8de59088-nacos-e68890e4b8bae6b3a8e5868ce4b8ade5bf83><span>Dubbo 融合 Nacos 成为注册中心</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180822springe5ba94e794a8e5bfabe9809fe99b86e68890dubbo--hystrix-li><input type=checkbox id=m-zh-cnblog20180822springe5ba94e794a8e5bfabe9809fe99b86e68890dubbo--hystrix-check>
<label for=m-zh-cnblog20180822springe5ba94e794a8e5bfabe9809fe99b86e68890dubbo--hystrix-check><a href=/zh-cn/blog/2018/08/22/spring%E5%BA%94%E7%94%A8%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90dubbo--hystrix/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180822springe5ba94e794a8e5bfabe9809fe99b86e68890dubbo--hystrix><span>Spring应用快速集成Dubbo + Hystrix</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180814e4bb8ee8b7a8e8afade8a880e8b083e794a8e588b0dubbo2js-li><input type=checkbox id=m-zh-cnblog20180814e4bb8ee8b7a8e8afade8a880e8b083e794a8e588b0dubbo2js-check>
<label for=m-zh-cnblog20180814e4bb8ee8b7a8e8afade8a880e8b083e794a8e588b0dubbo2js-check><a href=/zh-cn/blog/2018/08/14/%E4%BB%8E%E8%B7%A8%E8%AF%AD%E8%A8%80%E8%B0%83%E7%94%A8%E5%88%B0dubbo2.js/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180814e4bb8ee8b7a8e8afade8a880e8b083e794a8e588b0dubbo2js><span>从跨语言调用到dubbo2.js</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180807e59ca8-dubbo-e5ba94e794a8e4b8ade4bdbfe794a8-zookeeper-li><input type=checkbox id=m-zh-cnblog20180807e59ca8-dubbo-e5ba94e794a8e4b8ade4bdbfe794a8-zookeeper-check>
<label for=m-zh-cnblog20180807e59ca8-dubbo-e5ba94e794a8e4b8ade4bdbfe794a8-zookeeper-check><a href=/zh-cn/blog/2018/08/07/%E5%9C%A8-dubbo-%E5%BA%94%E7%94%A8%E4%B8%AD%E4%BD%BF%E7%94%A8-zookeeper/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180807e59ca8-dubbo-e5ba94e794a8e4b8ade4bdbfe794a8-zookeeper><span>在 Dubbo 应用中使用 Zookeeper</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180727sentinel-e4b8ba-dubbo-e69c8de58aa1e4bf9de9a9bee68aa4e888aa-li><input type=checkbox id=m-zh-cnblog20180727sentinel-e4b8ba-dubbo-e69c8de58aa1e4bf9de9a9bee68aa4e888aa-check>
<label for=m-zh-cnblog20180727sentinel-e4b8ba-dubbo-e69c8de58aa1e4bf9de9a9bee68aa4e888aa-check><a href=/zh-cn/blog/2018/07/27/sentinel-%E4%B8%BA-dubbo-%E6%9C%8D%E5%8A%A1%E4%BF%9D%E9%A9%BE%E6%8A%A4%E8%88%AA/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180727sentinel-e4b8ba-dubbo-e69c8de58aa1e4bf9de9a9bee68aa4e888aa><span>Sentinel 为 Dubbo 服务保驾护航</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180712e4bdbfe794a8pinpointe5819ae58886e5b883e5bc8fe8b79fe8b8aa-li><input type=checkbox id=m-zh-cnblog20180712e4bdbfe794a8pinpointe5819ae58886e5b883e5bc8fe8b79fe8b8aa-check>
<label for=m-zh-cnblog20180712e4bdbfe794a8pinpointe5819ae58886e5b883e5bc8fe8b79fe8b8aa-check><a href=/zh-cn/blog/2018/07/12/%E4%BD%BF%E7%94%A8pinpoint%E5%81%9A%E5%88%86%E5%B8%83%E5%BC%8F%E8%B7%9F%E8%B8%AA/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180712e4bdbfe794a8pinpointe5819ae58886e5b883e5bc8fe8b79fe8b8aa><span>使用Pinpoint做分布式跟踪</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180617e59ca8-dubbo-e4b8ade4bdbfe794a8-zipkin-li><input type=checkbox id=m-zh-cnblog20180617e59ca8-dubbo-e4b8ade4bdbfe794a8-zipkin-check>
<label for=m-zh-cnblog20180617e59ca8-dubbo-e4b8ade4bdbfe794a8-zipkin-check><a href=/zh-cn/blog/2018/06/17/%E5%9C%A8-dubbo-%E4%B8%AD%E4%BD%BF%E7%94%A8-zipkin/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180617e59ca8-dubbo-e4b8ade4bdbfe794a8-zipkin><span>在 Dubbo 中使用 Zipkin</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-zh-cnblogproposals-li><input type=checkbox id=m-zh-cnblogproposals-check>
<label for=m-zh-cnblogproposals-check><a href=/zh-cn/blog/proposals/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnblogproposals><span>技术方案</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230526google-paper-e99da2e59091e4ba91e697b6e4bba3e79a84e5ba94e794a8e5bc80e58f91e696b0e6a8a1e5bc8f-li><input type=checkbox id=m-zh-cnblog20230526google-paper-e99da2e59091e4ba91e697b6e4bba3e79a84e5ba94e794a8e5bc80e58f91e696b0e6a8a1e5bc8f-check>
<label for=m-zh-cnblog20230526google-paper-e99da2e59091e4ba91e697b6e4bba3e79a84e5ba94e794a8e5bc80e58f91e696b0e6a8a1e5bc8f-check><a href=/zh-cn/blog/2023/05/26/google-paper-%E9%9D%A2%E5%90%91%E4%BA%91%E6%97%B6%E4%BB%A3%E7%9A%84%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E6%96%B0%E6%A8%A1%E5%BC%8F/ title="[Google Paper] 面向云时代的应用开发新模式" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230526google-paper-e99da2e59091e4ba91e697b6e4bba3e79a84e5ba94e794a8e5bc80e58f91e696b0e6a8a1e5bc8f><span>面向云时代的应用开发新模式</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230220e68c87e6a087e59f8be782b9-li><input type=checkbox id=m-zh-cnblog20230220e68c87e6a087e59f8be782b9-check>
<label for=m-zh-cnblog20230220e68c87e6a087e59f8be782b9-check><a href=/zh-cn/blog/2023/02/20/%E6%8C%87%E6%A0%87%E5%9F%8B%E7%82%B9/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230220e68c87e6a087e59f8be782b9><span>指标埋点</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230130dubbo3-e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0e8aebee8aea1-li><input type=checkbox id=m-zh-cnblog20230130dubbo3-e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0e8aebee8aea1-check>
<label for=m-zh-cnblog20230130dubbo3-e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0e8aebee8aea1-check><a href=/zh-cn/blog/2023/01/30/dubbo3-%E5%BA%94%E7%94%A8%E7%BA%A7%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0%E8%AE%BE%E8%AE%A1/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230130dubbo3-e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0e8aebee8aea1><span>Dubbo3 应用级服务发现设计</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230130e590afe58f91e5bc8fe6b581e68ea7e588b6-li><input type=checkbox id=m-zh-cnblog20230130e590afe58f91e5bc8fe6b581e68ea7e588b6-check>
<label for=m-zh-cnblog20230130e590afe58f91e5bc8fe6b581e68ea7e588b6-check><a href=/zh-cn/blog/2023/01/30/%E5%90%AF%E5%8F%91%E5%BC%8F%E6%B5%81%E6%8E%A7%E5%88%B6/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230130e590afe58f91e5bc8fe6b581e68ea7e588b6><span>启发式流控制</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-zh-cnblogjava-li><input type=checkbox id=m-zh-cnblogjava-check>
<label for=m-zh-cnblogjava-check><a href=/zh-cn/blog/java/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnblogjava><span>Java</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-zh-cnblogjavademos-li><input type=checkbox id=m-zh-cnblogjavademos-check>
<label for=m-zh-cnblogjavademos-check><a href=/zh-cn/blog/java/demos/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnblogjavademos><span>功能演示</span></a></label><ul class="ul-3 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230105dubbo-e8bf9ee68ea5e5bc82e69e84e5beaee69c8de58aa1e4bd93e7b3bb-e5a49ae58d8fe8aeaee5a49ae6b3a8e5868ce4b8ade5bf83-li><input type=checkbox id=m-zh-cnblog20230105dubbo-e8bf9ee68ea5e5bc82e69e84e5beaee69c8de58aa1e4bd93e7b3bb-e5a49ae58d8fe8aeaee5a49ae6b3a8e5868ce4b8ade5bf83-check>
<label for=m-zh-cnblog20230105dubbo-e8bf9ee68ea5e5bc82e69e84e5beaee69c8de58aa1e4bd93e7b3bb-e5a49ae58d8fe8aeaee5a49ae6b3a8e5868ce4b8ade5bf83-check><a href=/zh-cn/blog/2023/01/05/dubbo-%E8%BF%9E%E6%8E%A5%E5%BC%82%E6%9E%84%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BD%93%E7%B3%BB-%E5%A4%9A%E5%8D%8F%E8%AE%AE%E5%A4%9A%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230105dubbo-e8bf9ee68ea5e5bc82e69e84e5beaee69c8de58aa1e4bd93e7b3bb-e5a49ae58d8fe8aeaee5a49ae6b3a8e5868ce4b8ade5bf83><span>Dubbo 连接异构微服务体系 - 多协议&多注册中心</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20220905proxyless-meshe59ca8dubboe4b8ade79a84e5ae9ee8b7b5-li><input type=checkbox id=m-zh-cnblog20220905proxyless-meshe59ca8dubboe4b8ade79a84e5ae9ee8b7b5-check>
<label for=m-zh-cnblog20220905proxyless-meshe59ca8dubboe4b8ade79a84e5ae9ee8b7b5-check><a href=/zh-cn/blog/2022/09/05/proxyless-mesh%E5%9C%A8dubbo%E4%B8%AD%E7%9A%84%E5%AE%9E%E8%B7%B5/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20220905proxyless-meshe59ca8dubboe4b8ade79a84e5ae9ee8b7b5><span>Proxyless Mesh在Dubbo中的实践</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20220726rest-e58d8fe8aeae-li><input type=checkbox id=m-zh-cnblog20220726rest-e58d8fe8aeae-check>
<label for=m-zh-cnblog20220726rest-e58d8fe8aeae-check><a href=/zh-cn/blog/2022/07/26/rest-%E5%8D%8F%E8%AE%AE/ title="Rest 协议" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20220726rest-e58d8fe8aeae><span>2.7 版本 Rest 协议实现重构设想</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20201222dubbo-api-docs--apache-dubboe69687e6a1a3e5b195e7a4bae6b58be8af95e5b7a5e585b7-li><input type=checkbox id=m-zh-cnblog20201222dubbo-api-docs--apache-dubboe69687e6a1a3e5b195e7a4bae6b58be8af95e5b7a5e585b7-check>
<label for=m-zh-cnblog20201222dubbo-api-docs--apache-dubboe69687e6a1a3e5b195e7a4bae6b58be8af95e5b7a5e585b7-check><a href=/zh-cn/blog/2020/12/22/dubbo-api-docs--apache-dubbo%E6%96%87%E6%A1%A3%E5%B1%95%E7%A4%BA%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20201222dubbo-api-docs--apache-dubboe69687e6a1a3e5b195e7a4bae6b58be8af95e5b7a5e585b7><span>Dubbo-Api-Docs -- Apache Dubbo文档展示&测试工具</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20191202dubboe6b58be8af95e9aa8ce8af81-li><input type=checkbox id=m-zh-cnblog20191202dubboe6b58be8af95e9aa8ce8af81-check>
<label for=m-zh-cnblog20191202dubboe6b58be8af95e9aa8ce8af81-check><a href=/zh-cn/blog/2019/12/02/dubbo%E6%B5%8B%E8%AF%95%E9%AA%8C%E8%AF%81/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20191202dubboe6b58be8af95e9aa8ce8af81><span>Dubbo测试验证</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20191130dubbo-e59ca8-service-mesh-e4b88be79a84e6809de88083e5928ce696b9e6a188-li><input type=checkbox id=m-zh-cnblog20191130dubbo-e59ca8-service-mesh-e4b88be79a84e6809de88083e5928ce696b9e6a188-check>
<label for=m-zh-cnblog20191130dubbo-e59ca8-service-mesh-e4b88be79a84e6809de88083e5928ce696b9e6a188-check><a href=/zh-cn/blog/2019/11/30/dubbo-%E5%9C%A8-service-mesh-%E4%B8%8B%E7%9A%84%E6%80%9D%E8%80%83%E5%92%8C%E6%96%B9%E6%A1%88/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20191130dubbo-e59ca8-service-mesh-e4b88be79a84e6809de88083e5928ce696b9e6a188><span>Dubbo 在 Service Mesh 下的思考和方案</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20191102dubboe69c8de58aa1e7abafe5bc82e6ada5e68ea5e58fa3e79a84e5ae9ee78eb0e8838ce699afe5928ce5ae9ee8b7b5-li><input type=checkbox id=m-zh-cnblog20191102dubboe69c8de58aa1e7abafe5bc82e6ada5e68ea5e58fa3e79a84e5ae9ee78eb0e8838ce699afe5928ce5ae9ee8b7b5-check>
<label for=m-zh-cnblog20191102dubboe69c8de58aa1e7abafe5bc82e6ada5e68ea5e58fa3e79a84e5ae9ee78eb0e8838ce699afe5928ce5ae9ee8b7b5-check><a href=/zh-cn/blog/2019/11/02/dubbo%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%BC%82%E6%AD%A5%E6%8E%A5%E5%8F%A3%E7%9A%84%E5%AE%9E%E7%8E%B0%E8%83%8C%E6%99%AF%E5%92%8C%E5%AE%9E%E8%B7%B5/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20191102dubboe69c8de58aa1e7abafe5bc82e6ada5e68ea5e58fa3e79a84e5ae9ee78eb0e8838ce699afe5928ce5ae9ee8b7b5><span>Dubbo服务端异步接口的实现背景和实践</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20191101dubboe5aea2e688b7e7abafe5bc82e6ada5e68ea5e58fa3e79a84e5ae9ee78eb0e8838ce699afe5928ce5ae9ee8b7b5-li><input type=checkbox id=m-zh-cnblog20191101dubboe5aea2e688b7e7abafe5bc82e6ada5e68ea5e58fa3e79a84e5ae9ee78eb0e8838ce699afe5928ce5ae9ee8b7b5-check>
<label for=m-zh-cnblog20191101dubboe5aea2e688b7e7abafe5bc82e6ada5e68ea5e58fa3e79a84e5ae9ee78eb0e8838ce699afe5928ce5ae9ee8b7b5-check><a href=/zh-cn/blog/2019/11/01/dubbo%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%BC%82%E6%AD%A5%E6%8E%A5%E5%8F%A3%E7%9A%84%E5%AE%9E%E7%8E%B0%E8%83%8C%E6%99%AF%E5%92%8C%E5%AE%9E%E8%B7%B5/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20191101dubboe5aea2e688b7e7abafe5bc82e6ada5e68ea5e58fa3e79a84e5ae9ee78eb0e8838ce699afe5928ce5ae9ee8b7b5><span>Dubbo客户端异步接口的实现背景和实践</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20191028dubbo-e59ca8e8b7a8e8afade8a880e5928ce58d8fe8aeaee7a9bfe9808fe680a7e696b9e59091e4b88ae79a84e68ea2e7b4a2e694afe68c81-http2-grpc-e5928c-protobuf-li><input type=checkbox id=m-zh-cnblog20191028dubbo-e59ca8e8b7a8e8afade8a880e5928ce58d8fe8aeaee7a9bfe9808fe680a7e696b9e59091e4b88ae79a84e68ea2e7b4a2e694afe68c81-http2-grpc-e5928c-protobuf-check>
<label for=m-zh-cnblog20191028dubbo-e59ca8e8b7a8e8afade8a880e5928ce58d8fe8aeaee7a9bfe9808fe680a7e696b9e59091e4b88ae79a84e68ea2e7b4a2e694afe68c81-http2-grpc-e5928c-protobuf-check><a href=/zh-cn/blog/2019/10/28/dubbo-%E5%9C%A8%E8%B7%A8%E8%AF%AD%E8%A8%80%E5%92%8C%E5%8D%8F%E8%AE%AE%E7%A9%BF%E9%80%8F%E6%80%A7%E6%96%B9%E5%90%91%E4%B8%8A%E7%9A%84%E6%8E%A2%E7%B4%A2%E6%94%AF%E6%8C%81-http/2-grpc-%E5%92%8C-protobuf/ title="Dubbo 在跨语言和协议穿透性方向上的探索:支持 HTTP/2 gRPC 和 Protobuf" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20191028dubbo-e59ca8e8b7a8e8afade8a880e5928ce58d8fe8aeaee7a9bfe9808fe680a7e696b9e59091e4b88ae79a84e68ea2e7b4a2e694afe68c81-http2-grpc-e5928c-protobuf><span>支持 HTTP/2 gRPC 和 Protobuf</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20191022e69cace59cb0e5ad98e6a0b9e5928ce69cace59cb0e4bcaae8a385-li><input type=checkbox id=m-zh-cnblog20191022e69cace59cb0e5ad98e6a0b9e5928ce69cace59cb0e4bcaae8a385-check>
<label for=m-zh-cnblog20191022e69cace59cb0e5ad98e6a0b9e5928ce69cace59cb0e4bcaae8a385-check><a href=/zh-cn/blog/2019/10/22/%E6%9C%AC%E5%9C%B0%E5%AD%98%E6%A0%B9%E5%92%8C%E6%9C%AC%E5%9C%B0%E4%BC%AA%E8%A3%85/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20191022e69cace59cb0e5ad98e6a0b9e5928ce69cace59cb0e4bcaae8a385><span>本地存根和本地伪装</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20191001e7a094e7a9b6-dubbo-e7bd91e58da1e59cb0e59d80e6b3a8e5868ce697b6e79a84e4b880e782b9e6809de88083-li><input type=checkbox id=m-zh-cnblog20191001e7a094e7a9b6-dubbo-e7bd91e58da1e59cb0e59d80e6b3a8e5868ce697b6e79a84e4b880e782b9e6809de88083-check>
<label for=m-zh-cnblog20191001e7a094e7a9b6-dubbo-e7bd91e58da1e59cb0e59d80e6b3a8e5868ce697b6e79a84e4b880e782b9e6809de88083-check><a href=/zh-cn/blog/2019/10/01/%E7%A0%94%E7%A9%B6-dubbo-%E7%BD%91%E5%8D%A1%E5%9C%B0%E5%9D%80%E6%B3%A8%E5%86%8C%E6%97%B6%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%9D%E8%80%83/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20191001e7a094e7a9b6-dubbo-e7bd91e58da1e59cb0e59d80e6b3a8e5868ce697b6e79a84e4b880e782b9e6809de88083><span>研究 Dubbo 网卡地址注册时的一点思考</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190826service-test-li><input type=checkbox id=m-zh-cnblog20190826service-test-check>
<label for=m-zh-cnblog20190826service-test-check><a href=/zh-cn/blog/2019/08/26/service-test/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190826service-test><span>Dubbo Admin服务测试功能</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190811e69cace59cb0e8b083e794a8-li><input type=checkbox id=m-zh-cnblog20190811e69cace59cb0e8b083e794a8-check>
<label for=m-zh-cnblog20190811e69cace59cb0e8b083e794a8-check><a href=/zh-cn/blog/2019/08/11/%E6%9C%AC%E5%9C%B0%E8%B0%83%E7%94%A8/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190811e69cace59cb0e8b083e794a8><span>本地调用</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190726e59ca8-dubbo-e4b8ade4bdbfe794a8-rest-li><input type=checkbox id=m-zh-cnblog20190726e59ca8-dubbo-e4b8ade4bdbfe794a8-rest-check>
<label for=m-zh-cnblog20190726e59ca8-dubbo-e4b8ade4bdbfe794a8-rest-check><a href=/zh-cn/blog/2019/07/26/%E5%9C%A8-dubbo-%E4%B8%AD%E4%BD%BF%E7%94%A8-rest/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190726e59ca8-dubbo-e4b8ade4bdbfe794a8-rest><span>在 Dubbo 中使用 REST</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190622e4bdbfe794a8-dubbo-e8bf9ee68ea5e5bc82e69e84e5beaee69c8de58aa1e4bd93e7b3bb-li><input type=checkbox id=m-zh-cnblog20190622e4bdbfe794a8-dubbo-e8bf9ee68ea5e5bc82e69e84e5beaee69c8de58aa1e4bd93e7b3bb-check>
<label for=m-zh-cnblog20190622e4bdbfe794a8-dubbo-e8bf9ee68ea5e5bc82e69e84e5beaee69c8de58aa1e4bd93e7b3bb-check><a href=/zh-cn/blog/2019/06/22/%E4%BD%BF%E7%94%A8-dubbo-%E8%BF%9E%E6%8E%A5%E5%BC%82%E6%9E%84%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BD%93%E7%B3%BB/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190622e4bdbfe794a8-dubbo-e8bf9ee68ea5e5bc82e69e84e5beaee69c8de58aa1e4bd93e7b3bb><span>使用 Dubbo 连接异构微服务体系</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190502dubboe58fafe689a9e5b195e69cbae588b6e6ba90e7a081e8a7a3e69e90-li><input type=checkbox id=m-zh-cnblog20190502dubboe58fafe689a9e5b195e69cbae588b6e6ba90e7a081e8a7a3e69e90-check>
<label for=m-zh-cnblog20190502dubboe58fafe689a9e5b195e69cbae588b6e6ba90e7a081e8a7a3e69e90-check><a href=/zh-cn/blog/2019/05/02/dubbo%E5%8F%AF%E6%89%A9%E5%B1%95%E6%9C%BA%E5%88%B6%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190502dubboe58fafe689a9e5b195e69cbae588b6e6ba90e7a081e8a7a3e69e90><span>Dubbo可扩展机制源码解析</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190501dubbo-e4b880e887b4e680a7hashe8b49fe8bdbde59d87e8a1a1e5ae9ee78eb0e58996e69e90-li><input type=checkbox id=m-zh-cnblog20190501dubbo-e4b880e887b4e680a7hashe8b49fe8bdbde59d87e8a1a1e5ae9ee78eb0e58996e69e90-check>
<label for=m-zh-cnblog20190501dubbo-e4b880e887b4e680a7hashe8b49fe8bdbde59d87e8a1a1e5ae9ee78eb0e58996e69e90-check><a href=/zh-cn/blog/2019/05/01/dubbo-%E4%B8%80%E8%87%B4%E6%80%A7hash%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%AE%9E%E7%8E%B0%E5%89%96%E6%9E%90/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190501dubbo-e4b880e887b4e680a7hashe8b49fe8bdbde59d87e8a1a1e5ae9ee78eb0e58996e69e90><span>Dubbo 一致性Hash负载均衡实现剖析</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190425dubboe58fafe689a9e5b195e69cbae588b6e5ae9ee68898-li><input type=checkbox id=m-zh-cnblog20190425dubboe58fafe689a9e5b195e69cbae588b6e5ae9ee68898-check>
<label for=m-zh-cnblog20190425dubboe58fafe689a9e5b195e69cbae588b6e5ae9ee68898-check><a href=/zh-cn/blog/2019/04/25/dubbo%E5%8F%AF%E6%89%A9%E5%B1%95%E6%9C%BA%E5%88%B6%E5%AE%9E%E6%88%98/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190425dubboe58fafe689a9e5b195e69cbae588b6e5ae9ee68898><span>Dubbo可扩展机制实战</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190203e68f90e5898dife588a4e696ade5b8aee58aa9cpue58886e694afe9a284e6b58b-li><input type=checkbox id=m-zh-cnblog20190203e68f90e5898dife588a4e696ade5b8aee58aa9cpue58886e694afe9a284e6b58b-check>
<label for=m-zh-cnblog20190203e68f90e5898dife588a4e696ade5b8aee58aa9cpue58886e694afe9a284e6b58b-check><a href=/zh-cn/blog/2019/02/03/%E6%8F%90%E5%89%8Dif%E5%88%A4%E6%96%AD%E5%B8%AE%E5%8A%A9cpu%E5%88%86%E6%94%AF%E9%A2%84%E6%B5%8B/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190203e68f90e5898dife588a4e696ade5b8aee58aa9cpue58886e694afe9a284e6b58b><span>提前if判断帮助CPU分支预测</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20190107e6b585e8b088-rpc-li><input type=checkbox id=m-zh-cnblog20190107e6b585e8b088-rpc-check>
<label for=m-zh-cnblog20190107e6b585e8b088-rpc-check><a href=/zh-cn/blog/2019/01/07/%E6%B5%85%E8%B0%88-rpc/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20190107e6b585e8b088-rpc><span>浅谈 RPC</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20181027dubboe69c8de58aa1e58886e7bb84e5928ce78988e69cace8819ae59088-li><input type=checkbox id=m-zh-cnblog20181027dubboe69c8de58aa1e58886e7bb84e5928ce78988e69cace8819ae59088-check>
<label for=m-zh-cnblog20181027dubboe69c8de58aa1e58886e7bb84e5928ce78988e69cace8819ae59088-check><a href=/zh-cn/blog/2018/10/27/dubbo%E6%9C%8D%E5%8A%A1%E5%88%86%E7%BB%84%E5%92%8C%E7%89%88%E6%9C%AC%E8%81%9A%E5%90%88/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20181027dubboe69c8de58aa1e58886e7bb84e5928ce78988e69cace8819ae59088><span>Dubbo服务分组和版本聚合</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20181005dubbo-e58d8fe8aeaee8afa6e8a7a3-li><input type=checkbox id=m-zh-cnblog20181005dubbo-e58d8fe8aeaee8afa6e8a7a3-check>
<label for=m-zh-cnblog20181005dubbo-e58d8fe8aeaee8afa6e8a7a3-check><a href=/zh-cn/blog/2018/10/05/dubbo-%E5%8D%8F%E8%AE%AE%E8%AF%A6%E8%A7%A3/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20181005dubbo-e58d8fe8aeaee8afa6e8a7a3><span>Dubbo 协议详解</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180930dubboe4b88ekubernetese99b86e68890-li><input type=checkbox id=m-zh-cnblog20180930dubboe4b88ekubernetese99b86e68890-check>
<label for=m-zh-cnblog20180930dubboe4b88ekubernetese99b86e68890-check><a href=/zh-cn/blog/2018/09/30/dubbo%E4%B8%8Ekubernetes%E9%9B%86%E6%88%90/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180930dubboe4b88ekubernetese99b86e68890><span>Dubbo与Kubernetes集成</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180920dubbo-mesh-service-meshe79a84e5ae9ee8b7b5e4b88ee68ea2e7b4a2-li><input type=checkbox id=m-zh-cnblog20180920dubbo-mesh-service-meshe79a84e5ae9ee8b7b5e4b88ee68ea2e7b4a2-check>
<label for=m-zh-cnblog20180920dubbo-mesh-service-meshe79a84e5ae9ee8b7b5e4b88ee68ea2e7b4a2-check><a href=/zh-cn/blog/2018/09/20/dubbo-mesh-service-mesh%E7%9A%84%E5%AE%9E%E8%B7%B5%E4%B8%8E%E6%8E%A2%E7%B4%A2/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180920dubbo-mesh-service-meshe79a84e5ae9ee8b7b5e4b88ee68ea2e7b4a2><span>Dubbo Mesh | Service Mesh的实践与探索</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180902e5a682e4bd95e59fbae4ba8edubboe5ae9ee78eb0e585a8e5bc82e6ada5e8b083e794a8e993be-li><input type=checkbox id=m-zh-cnblog20180902e5a682e4bd95e59fbae4ba8edubboe5ae9ee78eb0e585a8e5bc82e6ada5e8b083e794a8e993be-check>
<label for=m-zh-cnblog20180902e5a682e4bd95e59fbae4ba8edubboe5ae9ee78eb0e585a8e5bc82e6ada5e8b083e794a8e993be-check><a href=/zh-cn/blog/2018/09/02/%E5%A6%82%E4%BD%95%E5%9F%BA%E4%BA%8Edubbo%E5%AE%9E%E7%8E%B0%E5%85%A8%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8%E9%93%BE/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180902e5a682e4bd95e59fbae4ba8edubboe5ae9ee78eb0e585a8e5bc82e6ada5e8b083e794a8e993be><span>如何基于Dubbo实现全异步调用链</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180822dubbo-e99b86e7bea4e5aeb9e99499-li><input type=checkbox id=m-zh-cnblog20180822dubbo-e99b86e7bea4e5aeb9e99499-check>
<label for=m-zh-cnblog20180822dubbo-e99b86e7bea4e5aeb9e99499-check><a href=/zh-cn/blog/2018/08/22/dubbo-%E9%9B%86%E7%BE%A4%E5%AE%B9%E9%94%99/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180822dubbo-e99b86e7bea4e5aeb9e99499><span>Dubbo 集群容错</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180819dubbo-e78eb0e69c89e5bf83e8b7b3e696b9e6a188e680bbe7bb93e4bba5e58f8ae694b9e8bf9be5bbbae8aeae-li><input type=checkbox id=m-zh-cnblog20180819dubbo-e78eb0e69c89e5bf83e8b7b3e696b9e6a188e680bbe7bb93e4bba5e58f8ae694b9e8bf9be5bbbae8aeae-check>
<label for=m-zh-cnblog20180819dubbo-e78eb0e69c89e5bf83e8b7b3e696b9e6a188e680bbe7bb93e4bba5e58f8ae694b9e8bf9be5bbbae8aeae-check><a href=/zh-cn/blog/2018/08/19/dubbo-%E7%8E%B0%E6%9C%89%E5%BF%83%E8%B7%B3%E6%96%B9%E6%A1%88%E6%80%BB%E7%BB%93%E4%BB%A5%E5%8F%8A%E6%94%B9%E8%BF%9B%E5%BB%BA%E8%AE%AE/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180819dubbo-e78eb0e69c89e5bf83e8b7b3e696b9e6a188e680bbe7bb93e4bba5e58f8ae694b9e8bf9be5bbbae8aeae><span>Dubbo 现有心跳方案总结以及改进建议</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180815dubbo27-e4b889e5a4a7e696b0e789b9e680a7e8afa6e8a7a3-li><input type=checkbox id=m-zh-cnblog20180815dubbo27-e4b889e5a4a7e696b0e789b9e680a7e8afa6e8a7a3-check>
<label for=m-zh-cnblog20180815dubbo27-e4b889e5a4a7e696b0e789b9e680a7e8afa6e8a7a3-check><a href=/zh-cn/blog/2018/08/15/dubbo2.7-%E4%B8%89%E5%A4%A7%E6%96%B0%E7%89%B9%E6%80%A7%E8%AF%A6%E8%A7%A3/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180815dubbo27-e4b889e5a4a7e696b0e789b9e680a7e8afa6e8a7a3><span>Dubbo2.7 三大新特性详解</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180814dubbo-e585b3e4ba8ee5908ce6ada5e5bc82e6ada5e8b083e794a8e79a84e587a0e7a78de696b9e5bc8f-li><input type=checkbox id=m-zh-cnblog20180814dubbo-e585b3e4ba8ee5908ce6ada5e5bc82e6ada5e8b083e794a8e79a84e587a0e7a78de696b9e5bc8f-check>
<label for=m-zh-cnblog20180814dubbo-e585b3e4ba8ee5908ce6ada5e5bc82e6ada5e8b083e794a8e79a84e587a0e7a78de696b9e5bc8f-check><a href=/zh-cn/blog/2018/08/14/dubbo-%E5%85%B3%E4%BA%8E%E5%90%8C%E6%AD%A5/%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180814dubbo-e585b3e4ba8ee5908ce6ada5e5bc82e6ada5e8b083e794a8e79a84e587a0e7a78de696b9e5bc8f><span>Dubbo 关于同步/异步调用的几种方式</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180814dubbo-e59fbae69cace794a8e6b395-dubbo-consumer-e9858de7bdae-li><input type=checkbox id=m-zh-cnblog20180814dubbo-e59fbae69cace794a8e6b395-dubbo-consumer-e9858de7bdae-check>
<label for=m-zh-cnblog20180814dubbo-e59fbae69cace794a8e6b395-dubbo-consumer-e9858de7bdae-check><a href=/zh-cn/blog/2018/08/14/dubbo-%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95-dubbo-consumer-%E9%85%8D%E7%BD%AE/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180814dubbo-e59fbae69cace794a8e6b395-dubbo-consumer-e9858de7bdae><span>Dubbo 基本用法 - Dubbo Consumer 配置</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180814dubbo-e59fbae7a180e794a8e6b395-provider-e9858de7bdae-li><input type=checkbox id=m-zh-cnblog20180814dubbo-e59fbae7a180e794a8e6b395-provider-e9858de7bdae-check>
<label for=m-zh-cnblog20180814dubbo-e59fbae7a180e794a8e6b395-provider-e9858de7bdae-check><a href=/zh-cn/blog/2018/08/14/dubbo-%E5%9F%BA%E7%A1%80%E7%94%A8%E6%B3%95-provider-%E9%85%8D%E7%BD%AE/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180814dubbo-e59fbae7a180e794a8e6b395-provider-e9858de7bdae><span>Dubbo 基础用法 - Provider 配置</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180814dubbo-e4bc98e99b85e5819ce69cba-li><input type=checkbox id=m-zh-cnblog20180814dubbo-e4bc98e99b85e5819ce69cba-check>
<label for=m-zh-cnblog20180814dubbo-e4bc98e99b85e5819ce69cba-check><a href=/zh-cn/blog/2018/08/14/dubbo-%E4%BC%98%E9%9B%85%E5%81%9C%E6%9C%BA/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180814dubbo-e4bc98e99b85e5819ce69cba><span>Dubbo 优雅停机</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180814dubboe79a84e6b39be58c96e8b083e794a8-li><input type=checkbox id=m-zh-cnblog20180814dubboe79a84e6b39be58c96e8b083e794a8-check>
<label for=m-zh-cnblog20180814dubboe79a84e6b39be58c96e8b083e794a8-check><a href=/zh-cn/blog/2018/08/14/dubbo%E7%9A%84%E6%B3%9B%E5%8C%96%E8%B0%83%E7%94%A8/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180814dubboe79a84e6b39be58c96e8b083e794a8><span>Dubbo的泛化调用</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180814spring-boot-dubboe5ba94e794a8e590afe5819ce6ba90e7a081e58886e69e90-li><input type=checkbox id=m-zh-cnblog20180814spring-boot-dubboe5ba94e794a8e590afe5819ce6ba90e7a081e58886e69e90-check>
<label for=m-zh-cnblog20180814spring-boot-dubboe5ba94e794a8e590afe5819ce6ba90e7a081e58886e69e90-check><a href=/zh-cn/blog/2018/08/14/spring-boot-dubbo%E5%BA%94%E7%94%A8%E5%90%AF%E5%81%9C%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180814spring-boot-dubboe5ba94e794a8e590afe5819ce6ba90e7a081e58886e69e90><span>Spring Boot Dubbo应用启停源码分析</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180814e9809ae8bf87qose5afb9e69c8de58aa1e8bf9be8a18ce58aa8e68081e68ea7e588b6-li><input type=checkbox id=m-zh-cnblog20180814e9809ae8bf87qose5afb9e69c8de58aa1e8bf9be8a18ce58aa8e68081e68ea7e588b6-check>
<label for=m-zh-cnblog20180814e9809ae8bf87qose5afb9e69c8de58aa1e8bf9be8a18ce58aa8e68081e68ea7e588b6-check><a href=/zh-cn/blog/2018/08/14/%E9%80%9A%E8%BF%87qos%E5%AF%B9%E6%9C%8D%E5%8A%A1%E8%BF%9B%E8%A1%8C%E5%8A%A8%E6%80%81%E6%8E%A7%E5%88%B6/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180814e9809ae8bf87qose5afb9e69c8de58aa1e8bf9be8a18ce58aa8e68081e68ea7e588b6><span>通过QoS对服务进行动态控制</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180810dubboe79a84e8b49fe8bdbde59d87e8a1a1-li><input type=checkbox id=m-zh-cnblog20180810dubboe79a84e8b49fe8bdbde59d87e8a1a1-check>
<label for=m-zh-cnblog20180810dubboe79a84e8b49fe8bdbde59d87e8a1a1-check><a href=/zh-cn/blog/2018/08/10/dubbo%E7%9A%84%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180810dubboe79a84e8b49fe8bdbde59d87e8a1a1><span>Dubbo的负载均衡</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180807dubbo-e6b3a8e8a7a3e9a9b1e58aa8-li><input type=checkbox id=m-zh-cnblog20180807dubbo-e6b3a8e8a7a3e9a9b1e58aa8-check>
<label for=m-zh-cnblog20180807dubbo-e6b3a8e8a7a3e9a9b1e58aa8-check><a href=/zh-cn/blog/2018/08/07/dubbo-%E6%B3%A8%E8%A7%A3%E9%A9%B1%E5%8A%A8/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180807dubbo-e6b3a8e8a7a3e9a9b1e58aa8><span>Dubbo 注解驱动</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180807dubbo-101-li><input type=checkbox id=m-zh-cnblog20180807dubbo-101-check>
<label for=m-zh-cnblog20180807dubbo-101-check><a href=/zh-cn/blog/2018/08/07/dubbo-101/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180807dubbo-101><span>第一个 Dubbo 应用</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180807e4bdbfe794a8jdk17e7bc96e8af91e8bf90e8a18cdubbo-2714e9a1b9e79bae-li><input type=checkbox id=m-zh-cnblog20180807e4bdbfe794a8jdk17e7bc96e8af91e8bf90e8a18cdubbo-2714e9a1b9e79bae-check>
<label for=m-zh-cnblog20180807e4bdbfe794a8jdk17e7bc96e8af91e8bf90e8a18cdubbo-2714e9a1b9e79bae-check><a href=/zh-cn/blog/2018/08/07/%E4%BD%BF%E7%94%A8jdk17%E7%BC%96%E8%AF%91%E8%BF%90%E8%A1%8Cdubbo-2.7.14%E9%A1%B9%E7%9B%AE/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180807e4bdbfe794a8jdk17e7bc96e8af91e8bf90e8a18cdubbo-2714e9a1b9e79bae><span>使用jdk17编译运行dubbo 2.7.14项目</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180807e59ca8-dubbo-e4b8ade4bdbfe794a8e6b3a8e8a7a3-li><input type=checkbox id=m-zh-cnblog20180807e59ca8-dubbo-e4b8ade4bdbfe794a8e6b3a8e8a7a3-check>
<label for=m-zh-cnblog20180807e59ca8-dubbo-e4b8ade4bdbfe794a8e6b3a8e8a7a3-check><a href=/zh-cn/blog/2018/08/07/%E5%9C%A8-dubbo-%E4%B8%AD%E4%BD%BF%E7%94%A8%E6%B3%A8%E8%A7%A3/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180807e59ca8-dubbo-e4b8ade4bdbfe794a8e6b3a8e8a7a3><span>在 Dubbo 中使用注解</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180722dubbo-27x-repackage-e5908ee79a84e585bce5aeb9e5ae9ee78eb0e696b9e6a188-li><input type=checkbox id=m-zh-cnblog20180722dubbo-27x-repackage-e5908ee79a84e585bce5aeb9e5ae9ee78eb0e696b9e6a188-check>
<label for=m-zh-cnblog20180722dubbo-27x-repackage-e5908ee79a84e585bce5aeb9e5ae9ee78eb0e696b9e6a188-check><a href=/zh-cn/blog/2018/07/22/dubbo-2.7.x-repackage-%E5%90%8E%E7%9A%84%E5%85%BC%E5%AE%B9%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%A1%88/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180722dubbo-27x-repackage-e5908ee79a84e585bce5aeb9e5ae9ee78eb0e696b9e6a188><span>Dubbo 2.7.x repackage 后的兼容实现方案</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180712dubbo-e4b88ae4b88be69687e4bfa1e681af-li><input type=checkbox id=m-zh-cnblog20180712dubbo-e4b88ae4b88be69687e4bfa1e681af-check>
<label for=m-zh-cnblog20180712dubbo-e4b88ae4b88be69687e4bfa1e681af-check><a href=/zh-cn/blog/2018/07/12/dubbo-%E4%B8%8A%E4%B8%8B%E6%96%87%E4%BF%A1%E6%81%AF/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180712dubbo-e4b88ae4b88be69687e4bfa1e681af><span>Dubbo 上下文信息</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180701e7acace4b880e4b8aa-dubbo-filter-li><input type=checkbox id=m-zh-cnblog20180701e7acace4b880e4b8aa-dubbo-filter-check>
<label for=m-zh-cnblog20180701e7acace4b880e4b8aa-dubbo-filter-check><a href=/zh-cn/blog/2018/07/01/%E7%AC%AC%E4%B8%80%E4%B8%AA-dubbo-filter/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180701e7acace4b880e4b8aa-dubbo-filter><span>第一个 Dubbo Filter</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180626e59b9ee5a3b0e6b58be8af95-li><input type=checkbox id=m-zh-cnblog20180626e59b9ee5a3b0e6b58be8af95-check>
<label for=m-zh-cnblog20180626e59b9ee5a3b0e6b58be8af95-check><a href=/zh-cn/blog/2018/06/26/%E5%9B%9E%E5%A3%B0%E6%B5%8B%E8%AF%95/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180626e59b9ee5a3b0e6b58be8af95><span>回声测试</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180603e4bba5-dubbo-e4b8bae4be8be8818ae8818ae5a682e4bd95e59091e5bc80e6ba90e9a1b9e79baee5819ae8b4a1e78cae-li><input type=checkbox id=m-zh-cnblog20180603e4bba5-dubbo-e4b8bae4be8be8818ae8818ae5a682e4bd95e59091e5bc80e6ba90e9a1b9e79baee5819ae8b4a1e78cae-check>
<label for=m-zh-cnblog20180603e4bba5-dubbo-e4b8bae4be8be8818ae8818ae5a682e4bd95e59091e5bc80e6ba90e9a1b9e79baee5819ae8b4a1e78cae-check><a href=/zh-cn/blog/2018/06/03/%E4%BB%A5-dubbo-%E4%B8%BA%E4%BE%8B%E8%81%8A%E8%81%8A%E5%A6%82%E4%BD%95%E5%90%91%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%E5%81%9A%E8%B4%A1%E7%8C%AE/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180603e4bba5-dubbo-e4b8bae4be8be8818ae8818ae5a682e4bd95e59091e5bc80e6ba90e9a1b9e79baee5819ae8b4a1e78cae><span>以 Dubbo 为例,聊聊如何向开源项目做贡献</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180521dubbo-e5a496e983a8e58c96e9858de7bdae-li><input type=checkbox id=m-zh-cnblog20180521dubbo-e5a496e983a8e58c96e9858de7bdae-check>
<label for=m-zh-cnblog20180521dubbo-e5a496e983a8e58c96e9858de7bdae-check><a href=/zh-cn/blog/2018/05/21/dubbo-%E5%A4%96%E9%83%A8%E5%8C%96%E9%85%8D%E7%BD%AE/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180521dubbo-e5a496e983a8e58c96e9858de7bdae><span>Dubbo 外部化配置</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20180101dubbo-e58d9ae5aea2e69687e6a1a3e4b8ade69687e68e92e78988e68c87e58d97-li><input type=checkbox id=m-zh-cnblog20180101dubbo-e58d9ae5aea2e69687e6a1a3e4b8ade69687e68e92e78988e68c87e58d97-check>
<label for=m-zh-cnblog20180101dubbo-e58d9ae5aea2e69687e6a1a3e4b8ade69687e68e92e78988e68c87e58d97-check><a href=/zh-cn/blog/2018/01/01/dubbo-%E5%8D%9A%E5%AE%A2%E6%96%87%E6%A1%A3%E4%B8%AD%E6%96%87%E6%8E%92%E7%89%88%E6%8C%87%E5%8D%97/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20180101dubbo-e58d9ae5aea2e69687e6a1a3e4b8ade69687e68e92e78988e68c87e58d97><span>Dubbo 博客文档中文排版指南</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-zh-cnblogjavacodeanalysis-li><input type=checkbox id=m-zh-cnblogjavacodeanalysis-check>
<label for=m-zh-cnblogjavacodeanalysis-check><a href=/zh-cn/blog/java/codeanalysis/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnblogjavacodeanalysis><span>源码分析</span></a></label><ul class="ul-3 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-zh-cnblogjavacodeanalysismetrics-li><input type=checkbox id=m-zh-cnblogjavacodeanalysismetrics-check>
<label for=m-zh-cnblogjavacodeanalysismetrics-check><a href=/zh-cn/blog/java/codeanalysis/metrics/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnblogjavacodeanalysismetrics><span>dubbo-metrics 指标模块源码浅析</span></a></label><ul class="ul-4 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20230428e5bc95e8a880-li><input type=checkbox id=m-zh-cnblog20230428e5bc95e8a880-check>
<label for=m-zh-cnblog20230428e5bc95e8a880-check><a href=/zh-cn/blog/2023/04/28/%E5%BC%95%E8%A8%80/ title=引言 class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20230428e5bc95e8a880><span>0-引言</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog202304281-e68c87e6a087e6a0b7e69cace79a84e694b6e99b86e4b88ee5ad98e582a8-li><input type=checkbox id=m-zh-cnblog202304281-e68c87e6a087e6a0b7e69cace79a84e694b6e99b86e4b88ee5ad98e582a8-check>
<label for=m-zh-cnblog202304281-e68c87e6a087e6a0b7e69cace79a84e694b6e99b86e4b88ee5ad98e582a8-check><a href=/zh-cn/blog/2023/04/28/1-%E6%8C%87%E6%A0%87%E6%A0%B7%E6%9C%AC%E7%9A%84%E6%94%B6%E9%9B%86%E4%B8%8E%E5%AD%98%E5%82%A8/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog202304281-e68c87e6a087e6a0b7e69cace79a84e694b6e99b86e4b88ee5ad98e582a8><span>1-指标样本的收集与存储</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog202304282-e68c87e6a087e694b6e99b86e599a8e79a84e68c87e6a087e98787e99b86e6b581e7a88b-li><input type=checkbox id=m-zh-cnblog202304282-e68c87e6a087e694b6e99b86e599a8e79a84e68c87e6a087e98787e99b86e6b581e7a88b-check>
<label for=m-zh-cnblog202304282-e68c87e6a087e694b6e99b86e599a8e79a84e68c87e6a087e98787e99b86e6b581e7a88b-check><a href=/zh-cn/blog/2023/04/28/2-%E6%8C%87%E6%A0%87%E6%94%B6%E9%9B%86%E5%99%A8%E7%9A%84%E6%8C%87%E6%A0%87%E9%87%87%E9%9B%86%E6%B5%81%E7%A8%8B/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog202304282-e68c87e6a087e694b6e99b86e599a8e79a84e68c87e6a087e98787e99b86e6b581e7a88b><span>2-指标收集器的指标采集流程</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog202304283-e68c87e6a087e79b91e590ace6b3a8e5868ce6a2b3e79086-li><input type=checkbox id=m-zh-cnblog202304283-e68c87e6a087e79b91e590ace6b3a8e5868ce6a2b3e79086-check>
<label for=m-zh-cnblog202304283-e68c87e6a087e79b91e590ace6b3a8e5868ce6a2b3e79086-check><a href=/zh-cn/blog/2023/04/28/3-%E6%8C%87%E6%A0%87%E7%9B%91%E5%90%AC%E6%B3%A8%E5%86%8C%E6%A2%B3%E7%90%86/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog202304283-e68c87e6a087e79b91e590ace6b3a8e5868ce6a2b3e79086><span>3-指标监听注册梳理</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog202304284-e68c87e6a087e8bdace68da2e4b88ee5afbce587ba-li><input type=checkbox id=m-zh-cnblog202304284-e68c87e6a087e8bdace68da2e4b88ee5afbce587ba-check>
<label for=m-zh-cnblog202304284-e68c87e6a087e8bdace68da2e4b88ee5afbce587ba-check><a href=/zh-cn/blog/2023/04/28/4-%E6%8C%87%E6%A0%87%E8%BD%AC%E6%8D%A2%E4%B8%8E%E5%AF%BC%E5%87%BA/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog202304284-e68c87e6a087e8bdace68da2e4b88ee5afbce587ba><span>4-指标转换与导出</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-zh-cnblogjavacodeanalysis308-li><input type=checkbox id=m-zh-cnblogjavacodeanalysis308-check>
<label for=m-zh-cnblogjavacodeanalysis308-check><a href=/zh-cn/blog/java/codeanalysis/3.0.8/ title="Dubbo 3.0.8 源码解析" class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnblogjavacodeanalysis308><span>Dubbo3 [v3.0.8] 源码解析</span></a></label><ul class="ul-4 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022082222-dubbo3e6b688e8b4b9e88085e887aae58aa8e6849fe5ba94e586b3e7ad96e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0e58e9fe79086-li><input type=checkbox id=m-zh-cnblog2022082222-dubbo3e6b688e8b4b9e88085e887aae58aa8e6849fe5ba94e586b3e7ad96e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0e58e9fe79086-check>
<label for=m-zh-cnblog2022082222-dubbo3e6b688e8b4b9e88085e887aae58aa8e6849fe5ba94e586b3e7ad96e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0e58e9fe79086-check><a href=/zh-cn/blog/2022/08/22/22-dubbo3%E6%B6%88%E8%B4%B9%E8%80%85%E8%87%AA%E5%8A%A8%E6%84%9F%E5%BA%94%E5%86%B3%E7%AD%96%E5%BA%94%E7%94%A8%E7%BA%A7%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0%E5%8E%9F%E7%90%86/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022082222-dubbo3e6b688e8b4b9e88085e887aae58aa8e6849fe5ba94e586b3e7ad96e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0e58e9fe79086><span>22-Dubbo3消费者自动感应决策应用级服务发现原理</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022082121-dubbo3e6b688e8b4b9e88085e5bc95e794a8e69c8de58aa1e585a5e58fa3-li><input type=checkbox id=m-zh-cnblog2022082121-dubbo3e6b688e8b4b9e88085e5bc95e794a8e69c8de58aa1e585a5e58fa3-check>
<label for=m-zh-cnblog2022082121-dubbo3e6b688e8b4b9e88085e5bc95e794a8e69c8de58aa1e585a5e58fa3-check><a href=/zh-cn/blog/2022/08/21/21-dubbo3%E6%B6%88%E8%B4%B9%E8%80%85%E5%BC%95%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%85%A5%E5%8F%A3/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022082121-dubbo3e6b688e8b4b9e88085e5bc95e794a8e69c8de58aa1e585a5e58fa3><span>21-Dubbo3消费者引用服务入口</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022082020-dubbo3e69c8de58aa1e5bc95e794a8e9858de7bdaereferenceconfig-li><input type=checkbox id=m-zh-cnblog2022082020-dubbo3e69c8de58aa1e5bc95e794a8e9858de7bdaereferenceconfig-check>
<label for=m-zh-cnblog2022082020-dubbo3e69c8de58aa1e5bc95e794a8e9858de7bdaereferenceconfig-check><a href=/zh-cn/blog/2022/08/20/20-dubbo3%E6%9C%8D%E5%8A%A1%E5%BC%95%E7%94%A8%E9%85%8D%E7%BD%AEreferenceconfig/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022082020-dubbo3e69c8de58aa1e5bc95e794a8e9858de7bdaereferenceconfig><span>20-Dubbo3服务引用配置ReferenceConfig</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022081919-e9878de696b0e69da5e8bf87e4bb8ee4b880e4b8aae69c8de58aa1e6b688e8b4b9e88085e79a84demoe8afb4e8b5b7-li><input type=checkbox id=m-zh-cnblog2022081919-e9878de696b0e69da5e8bf87e4bb8ee4b880e4b8aae69c8de58aa1e6b688e8b4b9e88085e79a84demoe8afb4e8b5b7-check>
<label for=m-zh-cnblog2022081919-e9878de696b0e69da5e8bf87e4bb8ee4b880e4b8aae69c8de58aa1e6b688e8b4b9e88085e79a84demoe8afb4e8b5b7-check><a href=/zh-cn/blog/2022/08/19/19-%E9%87%8D%E6%96%B0%E6%9D%A5%E8%BF%87%E4%BB%8E%E4%B8%80%E4%B8%AA%E6%9C%8D%E5%8A%A1%E6%B6%88%E8%B4%B9%E8%80%85%E7%9A%84demo%E8%AF%B4%E8%B5%B7/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022081919-e9878de696b0e69da5e8bf87e4bb8ee4b880e4b8aae69c8de58aa1e6b688e8b4b9e88085e79a84demoe8afb4e8b5b7><span>19 重新来过从一个服务消费者的Demo说起</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022081818-dubbo3e58583e695b0e68daee69c8de58aa1metadataservicee79a84e5afbce587ba-li><input type=checkbox id=m-zh-cnblog2022081818-dubbo3e58583e695b0e68daee69c8de58aa1metadataservicee79a84e5afbce587ba-check>
<label for=m-zh-cnblog2022081818-dubbo3e58583e695b0e68daee69c8de58aa1metadataservicee79a84e5afbce587ba-check><a href=/zh-cn/blog/2022/08/18/18-dubbo3%E5%85%83%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1metadataservice%E7%9A%84%E5%AF%BC%E5%87%BA/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022081818-dubbo3e58583e695b0e68daee69c8de58aa1metadataservicee79a84e5afbce587ba><span>18-Dubbo3元数据服务MetadataService的导出</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022081717-dubboe69c8de58aa1e68f90e4be9be88085e79a84e58f8ce6b3a8e5868ce58e9fe79086-li><input type=checkbox id=m-zh-cnblog2022081717-dubboe69c8de58aa1e68f90e4be9be88085e79a84e58f8ce6b3a8e5868ce58e9fe79086-check>
<label for=m-zh-cnblog2022081717-dubboe69c8de58aa1e68f90e4be9be88085e79a84e58f8ce6b3a8e5868ce58e9fe79086-check><a href=/zh-cn/blog/2022/08/17/17-dubbo%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9A%84%E5%8F%8C%E6%B3%A8%E5%86%8C%E5%8E%9F%E7%90%86/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022081717-dubboe69c8de58aa1e68f90e4be9be88085e79a84e58f8ce6b3a8e5868ce58e9fe79086><span>17-Dubbo服务提供者的双注册原理</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022081616-e6a8a1e59d97e58f91e5b883e599a8e58f91e5b883e69c8de58aa1e585a8e8bf87e7a88b-li><input type=checkbox id=m-zh-cnblog2022081616-e6a8a1e59d97e58f91e5b883e599a8e58f91e5b883e69c8de58aa1e585a8e8bf87e7a88b-check>
<label for=m-zh-cnblog2022081616-e6a8a1e59d97e58f91e5b883e599a8e58f91e5b883e69c8de58aa1e585a8e8bf87e7a88b-check><a href=/zh-cn/blog/2022/08/16/16-%E6%A8%A1%E5%9D%97%E5%8F%91%E5%B8%83%E5%99%A8%E5%8F%91%E5%B8%83%E6%9C%8D%E5%8A%A1%E5%85%A8%E8%BF%87%E7%A8%8B/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022081616-e6a8a1e59d97e58f91e5b883e599a8e58f91e5b883e69c8de58aa1e585a8e8bf87e7a88b><span>16-模块发布器发布服务全过程</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022081515-dubboe79a84e4b889e5a4a7e4b8ade5bf83e4b98be58583e695b0e68daee4b8ade5bf83e6ba90e7a081e8a7a3e69e90-li><input type=checkbox id=m-zh-cnblog2022081515-dubboe79a84e4b889e5a4a7e4b8ade5bf83e4b98be58583e695b0e68daee4b8ade5bf83e6ba90e7a081e8a7a3e69e90-check>
<label for=m-zh-cnblog2022081515-dubboe79a84e4b889e5a4a7e4b8ade5bf83e4b98be58583e695b0e68daee4b8ade5bf83e6ba90e7a081e8a7a3e69e90-check><a href=/zh-cn/blog/2022/08/15/15-dubbo%E7%9A%84%E4%B8%89%E5%A4%A7%E4%B8%AD%E5%BF%83%E4%B9%8B%E5%85%83%E6%95%B0%E6%8D%AE%E4%B8%AD%E5%BF%83%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022081515-dubboe79a84e4b889e5a4a7e4b8ade5bf83e4b98be58583e695b0e68daee4b8ade5bf83e6ba90e7a081e8a7a3e69e90><span>15-Dubbo的三大中心之元数据中心源码解析</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022081414-dubboe9858de7bdaee58aa0e8bdbde585a8e8a7a3e69e90-li><input type=checkbox id=m-zh-cnblog2022081414-dubboe9858de7bdaee58aa0e8bdbde585a8e8a7a3e69e90-check>
<label for=m-zh-cnblog2022081414-dubboe9858de7bdaee58aa0e8bdbde585a8e8a7a3e69e90-check><a href=/zh-cn/blog/2022/08/14/14-dubbo%E9%85%8D%E7%BD%AE%E5%8A%A0%E8%BD%BD%E5%85%A8%E8%A7%A3%E6%9E%90/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022081414-dubboe9858de7bdaee58aa0e8bdbde585a8e8a7a3e69e90><span>14-Dubbo配置加载全解析</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022081313-dubboe79a84e4b889e5a4a7e4b8ade5bf83e4b98be9858de7bdaee4b8ade5bf83-li><input type=checkbox id=m-zh-cnblog2022081313-dubboe79a84e4b889e5a4a7e4b8ade5bf83e4b98be9858de7bdaee4b8ade5bf83-check>
<label for=m-zh-cnblog2022081313-dubboe79a84e4b889e5a4a7e4b8ade5bf83e4b98be9858de7bdaee4b8ade5bf83-check><a href=/zh-cn/blog/2022/08/13/13-dubbo%E7%9A%84%E4%B8%89%E5%A4%A7%E4%B8%AD%E5%BF%83%E4%B9%8B%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022081313-dubboe79a84e4b889e5a4a7e4b8ade5bf83e4b98be9858de7bdaee4b8ade5bf83><span>13-Dubbo的三大中心之配置中心</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022081212-e585a8e5b180e8a786e9878ee69da5e79c8bdubbo3e79a84e69c8de58aa1e590afe58aa8e7949fe591bde591a8e69c9f-li><input type=checkbox id=m-zh-cnblog2022081212-e585a8e5b180e8a786e9878ee69da5e79c8bdubbo3e79a84e69c8de58aa1e590afe58aa8e7949fe591bde591a8e69c9f-check>
<label for=m-zh-cnblog2022081212-e585a8e5b180e8a786e9878ee69da5e79c8bdubbo3e79a84e69c8de58aa1e590afe58aa8e7949fe591bde591a8e69c9f-check><a href=/zh-cn/blog/2022/08/12/12-%E5%85%A8%E5%B1%80%E8%A7%86%E9%87%8E%E6%9D%A5%E7%9C%8Bdubbo3%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%90%AF%E5%8A%A8%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022081212-e585a8e5b180e8a786e9878ee69da5e79c8bdubbo3e79a84e69c8de58aa1e590afe58aa8e7949fe591bde591a8e69c9f><span>12 全局视野来看Dubbo3的服务启动生命周期</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022081111-dubboe590afe58aa8e599a8dubbobootstrape6b7bbe58aa0e58d8fe8aeaee9858de7bdaee4bfa1e681afprotocolconfig-li><input type=checkbox id=m-zh-cnblog2022081111-dubboe590afe58aa8e599a8dubbobootstrape6b7bbe58aa0e58d8fe8aeaee9858de7bdaee4bfa1e681afprotocolconfig-check>
<label for=m-zh-cnblog2022081111-dubboe590afe58aa8e599a8dubbobootstrape6b7bbe58aa0e58d8fe8aeaee9858de7bdaee4bfa1e681afprotocolconfig-check><a href=/zh-cn/blog/2022/08/11/11-dubbo%E5%90%AF%E5%8A%A8%E5%99%A8dubbobootstrap%E6%B7%BB%E5%8A%A0%E5%8D%8F%E8%AE%AE%E9%85%8D%E7%BD%AE%E4%BF%A1%E6%81%AFprotocolconfig/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022081111-dubboe590afe58aa8e599a8dubbobootstrape6b7bbe58aa0e58d8fe8aeaee9858de7bdaee4bfa1e681afprotocolconfig><span>11-Dubbo启动器DubboBootstrap添加协议配置信息ProtocolConfig</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022081010-dubboe590afe58aa8e599a8dubbobootstrape6b7bbe58aa0e6b3a8e5868ce4b8ade5bf83e9858de7bdaee4bfa1e681afregistryconfig-li><input type=checkbox id=m-zh-cnblog2022081010-dubboe590afe58aa8e599a8dubbobootstrape6b7bbe58aa0e6b3a8e5868ce4b8ade5bf83e9858de7bdaee4bfa1e681afregistryconfig-check>
<label for=m-zh-cnblog2022081010-dubboe590afe58aa8e599a8dubbobootstrape6b7bbe58aa0e6b3a8e5868ce4b8ade5bf83e9858de7bdaee4bfa1e681afregistryconfig-check><a href=/zh-cn/blog/2022/08/10/10-dubbo%E5%90%AF%E5%8A%A8%E5%99%A8dubbobootstrap%E6%B7%BB%E5%8A%A0%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83%E9%85%8D%E7%BD%AE%E4%BF%A1%E6%81%AFregistryconfig/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022081010-dubboe590afe58aa8e599a8dubbobootstrape6b7bbe58aa0e6b3a8e5868ce4b8ade5bf83e9858de7bdaee4bfa1e681afregistryconfig><span>10-Dubbo启动器DubboBootstrap添加注册中心配置信息RegistryConfig</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog202208099-dubboe590afe58aa8e599a8dubbobootstrape6b7bbe58aa0e5ba94e794a8e7a88be5ba8fe79a84e9858de7bdaee4bfa1e681afapplicationconfig-li><input type=checkbox id=m-zh-cnblog202208099-dubboe590afe58aa8e599a8dubbobootstrape6b7bbe58aa0e5ba94e794a8e7a88be5ba8fe79a84e9858de7bdaee4bfa1e681afapplicationconfig-check>
<label for=m-zh-cnblog202208099-dubboe590afe58aa8e599a8dubbobootstrape6b7bbe58aa0e5ba94e794a8e7a88be5ba8fe79a84e9858de7bdaee4bfa1e681afapplicationconfig-check><a href=/zh-cn/blog/2022/08/09/9-dubbo%E5%90%AF%E5%8A%A8%E5%99%A8dubbobootstrap%E6%B7%BB%E5%8A%A0%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E9%85%8D%E7%BD%AE%E4%BF%A1%E6%81%AFapplicationconfig/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog202208099-dubboe590afe58aa8e599a8dubbobootstrape6b7bbe58aa0e5ba94e794a8e7a88be5ba8fe79a84e9858de7bdaee4bfa1e681afapplicationconfig><span>9-Dubbo启动器DubboBootstrap添加应用程序的配置信息ApplicationConfig</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog202208088-dubboe590afe58aa8e599a8dubbobootstrape5809fe58aa9e58f8ce9878de6a0a1e9aa8ce99481e79a84e58d95e4be8be6a8a1e5bc8fe8bf9be8a18ce5afb9e8b1a1e79a84e5889de5a78be58c96-li><input type=checkbox id=m-zh-cnblog202208088-dubboe590afe58aa8e599a8dubbobootstrape5809fe58aa9e58f8ce9878de6a0a1e9aa8ce99481e79a84e58d95e4be8be6a8a1e5bc8fe8bf9be8a18ce5afb9e8b1a1e79a84e5889de5a78be58c96-check>
<label for=m-zh-cnblog202208088-dubboe590afe58aa8e599a8dubbobootstrape5809fe58aa9e58f8ce9878de6a0a1e9aa8ce99481e79a84e58d95e4be8be6a8a1e5bc8fe8bf9be8a18ce5afb9e8b1a1e79a84e5889de5a78be58c96-check><a href=/zh-cn/blog/2022/08/08/8-dubbo%E5%90%AF%E5%8A%A8%E5%99%A8dubbobootstrap%E5%80%9F%E5%8A%A9%E5%8F%8C%E9%87%8D%E6%A0%A1%E9%AA%8C%E9%94%81%E7%9A%84%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E8%BF%9B%E8%A1%8C%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog202208088-dubboe590afe58aa8e599a8dubbobootstrape5809fe58aa9e58f8ce9878de6a0a1e9aa8ce99481e79a84e58d95e4be8be6a8a1e5bc8fe8bf9be8a18ce5afb9e8b1a1e79a84e5889de5a78be58c96><span>8-Dubbo启动器DubboBootstrap借助双重校验锁的单例模式进行对象的初始化</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog202208077-dubboe79a84spie689a9e5b195e69cbae588b6e4b98be887aae58aa8e6bf80e6b4bbe689a9e5b195activatee6ba90e7a081e8a7a3e69e90-li><input type=checkbox id=m-zh-cnblog202208077-dubboe79a84spie689a9e5b195e69cbae588b6e4b98be887aae58aa8e6bf80e6b4bbe689a9e5b195activatee6ba90e7a081e8a7a3e69e90-check>
<label for=m-zh-cnblog202208077-dubboe79a84spie689a9e5b195e69cbae588b6e4b98be887aae58aa8e6bf80e6b4bbe689a9e5b195activatee6ba90e7a081e8a7a3e69e90-check><a href=/zh-cn/blog/2022/08/07/7-dubbo%E7%9A%84spi%E6%89%A9%E5%B1%95%E6%9C%BA%E5%88%B6%E4%B9%8B%E8%87%AA%E5%8A%A8%E6%BF%80%E6%B4%BB%E6%89%A9%E5%B1%95activate%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog202208077-dubboe79a84spie689a9e5b195e69cbae588b6e4b98be887aae58aa8e6bf80e6b4bbe689a9e5b195activatee6ba90e7a081e8a7a3e69e90><span>7-Dubbo的SPI扩展机制之自动激活扩展Activate源码解析</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022080606-dubboe79a84spie689a9e5b195e69cbae588b6e4b98be699aee9809ae689a9e5b195e5afb9e8b1a1e79a84e5889be5bbbae4b88ewrappere69cbae588b6e79a84e6ba90e7a081e8a7a3e69e90-li><input type=checkbox id=m-zh-cnblog2022080606-dubboe79a84spie689a9e5b195e69cbae588b6e4b98be699aee9809ae689a9e5b195e5afb9e8b1a1e79a84e5889be5bbbae4b88ewrappere69cbae588b6e79a84e6ba90e7a081e8a7a3e69e90-check>
<label for=m-zh-cnblog2022080606-dubboe79a84spie689a9e5b195e69cbae588b6e4b98be699aee9809ae689a9e5b195e5afb9e8b1a1e79a84e5889be5bbbae4b88ewrappere69cbae588b6e79a84e6ba90e7a081e8a7a3e69e90-check><a href=/zh-cn/blog/2022/08/06/06-dubbo%E7%9A%84spi%E6%89%A9%E5%B1%95%E6%9C%BA%E5%88%B6%E4%B9%8B%E6%99%AE%E9%80%9A%E6%89%A9%E5%B1%95%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%88%9B%E5%BB%BA%E4%B8%8Ewrapper%E6%9C%BA%E5%88%B6%E7%9A%84%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/ title=06-Dubbo的SPI扩展机制之普通扩展对象的创建与Wrapper机制的源码解析 class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022080606-dubboe79a84spie689a9e5b195e69cbae588b6e4b98be699aee9809ae689a9e5b195e5afb9e8b1a1e79a84e5889be5bbbae4b88ewrappere69cbae588b6e79a84e6ba90e7a081e8a7a3e69e90><span>6-Dubbo的SPI扩展机制之普通扩展对象的创建与Wrapper机制的源码解析</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022080505-e887aae98082e5ba94e689a9e5b195e5afb9e8b1a1e79a84e5889be5bbbagetadaptiveextensione696b9e6b395-li><input type=checkbox id=m-zh-cnblog2022080505-e887aae98082e5ba94e689a9e5b195e5afb9e8b1a1e79a84e5889be5bbbagetadaptiveextensione696b9e6b395-check>
<label for=m-zh-cnblog2022080505-e887aae98082e5ba94e689a9e5b195e5afb9e8b1a1e79a84e5889be5bbbagetadaptiveextensione696b9e6b395-check><a href=/zh-cn/blog/2022/08/05/05-%E8%87%AA%E9%80%82%E5%BA%94%E6%89%A9%E5%B1%95%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%88%9B%E5%BB%BAgetadaptiveextension%E6%96%B9%E6%B3%95/ title=05-自适应扩展对象的创建getAdaptiveExtension方法 class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022080505-e887aae98082e5ba94e689a9e5b195e5afb9e8b1a1e79a84e5889be5bbbagetadaptiveextensione696b9e6b395><span>5-自适应扩展对象的创建getAdaptiveExtension方法</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022080404-dubboe79a84e689a9e5b195e69cbae588b6-li><input type=checkbox id=m-zh-cnblog2022080404-dubboe79a84e689a9e5b195e69cbae588b6-check>
<label for=m-zh-cnblog2022080404-dubboe79a84e689a9e5b195e69cbae588b6-check><a href=/zh-cn/blog/2022/08/04/04-dubbo%E7%9A%84%E6%89%A9%E5%B1%95%E6%9C%BA%E5%88%B6/ title=04-Dubbo的扩展机制 class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022080404-dubboe79a84e689a9e5b195e69cbae588b6><span>4-Dubbo的扩展机制</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022080303-e6a186e69eb6e5ba94e794a8e7a88be5ba8fe6a8a1e59d97e9a286e59f9fe6a8a1e59e8bmodele5afb9e8b1a1e79a84e5889de5a78be58c96-li><input type=checkbox id=m-zh-cnblog2022080303-e6a186e69eb6e5ba94e794a8e7a88be5ba8fe6a8a1e59d97e9a286e59f9fe6a8a1e59e8bmodele5afb9e8b1a1e79a84e5889de5a78be58c96-check>
<label for=m-zh-cnblog2022080303-e6a186e69eb6e5ba94e794a8e7a88be5ba8fe6a8a1e59d97e9a286e59f9fe6a8a1e59e8bmodele5afb9e8b1a1e79a84e5889de5a78be58c96-check><a href=/zh-cn/blog/2022/08/03/03-%E6%A1%86%E6%9E%B6%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%A8%A1%E5%9D%97%E9%A2%86%E5%9F%9F%E6%A8%A1%E5%9E%8Bmodel%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96/ title=03-框架,应用程序,模块领域模型Model对象的初始化 class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022080303-e6a186e69eb6e5ba94e794a8e7a88be5ba8fe6a8a1e59d97e9a286e59f9fe6a8a1e59e8bmodele5afb9e8b1a1e79a84e5889de5a78be58c96><span>3-框架,应用程序,模块领域模型Model对象的初始化</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022080202-e590afe58aa8e69c8de58aa1e5898de69c8de58aa1e9858de7bdaeserviceconfige7b1bbe59e8be698afe5a682e4bd95e5889de5a78be58c96e79a84-li><input type=checkbox id=m-zh-cnblog2022080202-e590afe58aa8e69c8de58aa1e5898de69c8de58aa1e9858de7bdaeserviceconfige7b1bbe59e8be698afe5a682e4bd95e5889de5a78be58c96e79a84-check>
<label for=m-zh-cnblog2022080202-e590afe58aa8e69c8de58aa1e5898de69c8de58aa1e9858de7bdaeserviceconfige7b1bbe59e8be698afe5a682e4bd95e5889de5a78be58c96e79a84-check><a href=/zh-cn/blog/2022/08/02/02-%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1%E5%89%8D%E6%9C%8D%E5%8A%A1%E9%85%8D%E7%BD%AEserviceconfig%E7%B1%BB%E5%9E%8B%E6%98%AF%E5%A6%82%E4%BD%95%E5%88%9D%E5%A7%8B%E5%8C%96%E7%9A%84/ title=02-启动服务前服务配置ServiceConfig类型是如何初始化的? class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022080202-e590afe58aa8e69c8de58aa1e5898de69c8de58aa1e9858de7bdaeserviceconfige7b1bbe59e8be698afe5a682e4bd95e5889de5a78be58c96e79a84><span>2-ServiceConfig类型是如何初始化的?</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog2022080101-e4bb8ee4b880e4b8aae69c8de58aa1e68f90e4be9be88085e79a84demoe8afb4e8b5b7-li><input type=checkbox id=m-zh-cnblog2022080101-e4bb8ee4b880e4b8aae69c8de58aa1e68f90e4be9be88085e79a84demoe8afb4e8b5b7-check>
<label for=m-zh-cnblog2022080101-e4bb8ee4b880e4b8aae69c8de58aa1e68f90e4be9be88085e79a84demoe8afb4e8b5b7-check><a href=/zh-cn/blog/2022/08/01/01-%E4%BB%8E%E4%B8%80%E4%B8%AA%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9A%84demo%E8%AF%B4%E8%B5%B7/ title="01 从一个服务提供者的Demo说起" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog2022080101-e4bb8ee4b880e4b8aae69c8de58aa1e68f90e4be9be88085e79a84demoe8afb4e8b5b7><span>1-从一个服务提供者的Demo说起</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog10101dubbo-3-e4b8ade79a84e4b889e5b182e9858de7bdaee99a94e7a6bb-li><input type=checkbox id=m-zh-cnblog10101dubbo-3-e4b8ade79a84e4b889e5b182e9858de7bdaee99a94e7a6bb-check>
<label for=m-zh-cnblog10101dubbo-3-e4b8ade79a84e4b889e5b182e9858de7bdaee99a94e7a6bb-check><a href=/zh-cn/blog/1/01/01/dubbo-3-%E4%B8%AD%E7%9A%84%E4%B8%89%E5%B1%82%E9%85%8D%E7%BD%AE%E9%9A%94%E7%A6%BB/ title="Dubbo 3 中的三层配置隔离" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog10101dubbo-3-e4b8ade79a84e4b889e5b182e9858de7bdaee99a94e7a6bb><span>配置隔离</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20221228dubbo-3-e4b98b-triple-e6b581e68ea7e58f8de58e8be58e9fe79086e8a7a3e69e90-li><input type=checkbox id=m-zh-cnblog20221228dubbo-3-e4b98b-triple-e6b581e68ea7e58f8de58e8be58e9fe79086e8a7a3e69e90-check>
<label for=m-zh-cnblog20221228dubbo-3-e4b98b-triple-e6b581e68ea7e58f8de58e8be58e9fe79086e8a7a3e69e90-check><a href=/zh-cn/blog/2022/12/28/dubbo-3-%E4%B9%8B-triple-%E6%B5%81%E6%8E%A7%E5%8F%8D%E5%8E%8B%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20221228dubbo-3-e4b98b-triple-e6b581e68ea7e58f8de58e8be58e9fe79086e8a7a3e69e90><span>Dubbo 3 之 Triple 流控反压原理解析</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20221219triple-e58d8fe8aeaee694afe68c81-java-e5bc82e5b8b8e59b9ee4bca0e79a84e8aebee8aea1e4b88ee5ae9ee78eb0-li><input type=checkbox id=m-zh-cnblog20221219triple-e58d8fe8aeaee694afe68c81-java-e5bc82e5b8b8e59b9ee4bca0e79a84e8aebee8aea1e4b88ee5ae9ee78eb0-check>
<label for=m-zh-cnblog20221219triple-e58d8fe8aeaee694afe68c81-java-e5bc82e5b8b8e59b9ee4bca0e79a84e8aebee8aea1e4b88ee5ae9ee78eb0-check><a href=/zh-cn/blog/2022/12/19/triple-%E5%8D%8F%E8%AE%AE%E6%94%AF%E6%8C%81-java-%E5%BC%82%E5%B8%B8%E5%9B%9E%E4%BC%A0%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20221219triple-e58d8fe8aeaee694afe68c81-java-e5bc82e5b8b8e59b9ee4bca0e79a84e8aebee8aea1e4b88ee5ae9ee78eb0><span>Triple 协议支持 Java 异常回传的设计与实现</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20220623e6b585e69e90-dubbo-30-e4b8ade68ea5e58fa3e7baa7e59cb0e59d80e68ea8e98081e680a7e883bde79a84e4bc98e58c96-li><input type=checkbox id=m-zh-cnblog20220623e6b585e69e90-dubbo-30-e4b8ade68ea5e58fa3e7baa7e59cb0e59d80e68ea8e98081e680a7e883bde79a84e4bc98e58c96-check>
<label for=m-zh-cnblog20220623e6b585e69e90-dubbo-30-e4b8ade68ea5e58fa3e7baa7e59cb0e59d80e68ea8e98081e680a7e883bde79a84e4bc98e58c96-check><a href=/zh-cn/blog/2022/06/23/%E6%B5%85%E6%9E%90-dubbo-3.0-%E4%B8%AD%E6%8E%A5%E5%8F%A3%E7%BA%A7%E5%9C%B0%E5%9D%80%E6%8E%A8%E9%80%81%E6%80%A7%E8%83%BD%E7%9A%84%E4%BC%98%E5%8C%96/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20220623e6b585e69e90-dubbo-30-e4b8ade68ea5e58fa3e7baa7e59cb0e59d80e68ea8e98081e680a7e883bde79a84e4bc98e58c96><span>浅析 Dubbo 3.0 中接口级地址推送性能的优化</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210602dubbo3-e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0-li><input type=checkbox id=m-zh-cnblog20210602dubbo3-e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0-check>
<label for=m-zh-cnblog20210602dubbo3-e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0-check><a href=/zh-cn/blog/2021/06/02/dubbo3-%E5%BA%94%E7%94%A8%E7%BA%A7%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0/ title="Dubbo3 应用级服务发现" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210602dubbo3-e5ba94e794a8e7baa7e69c8de58aa1e58f91e78eb0><span>应用级服务发现</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20191017dubbo-e4b8ade79a84-url-e7bb9fe4b880e6a8a1e59e8b-li><input type=checkbox id=m-zh-cnblog20191017dubbo-e4b8ade79a84-url-e7bb9fe4b880e6a8a1e59e8b-check>
<label for=m-zh-cnblog20191017dubbo-e4b8ade79a84-url-e7bb9fe4b880e6a8a1e59e8b-check><a href=/zh-cn/blog/2019/10/17/dubbo-%E4%B8%AD%E7%9A%84-url-%E7%BB%9F%E4%B8%80%E6%A8%A1%E5%9E%8B/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20191017dubbo-e4b8ade79a84-url-e7bb9fe4b880e6a8a1e59e8b><span>Dubbo 中的 URL 统一模型</span></a></label></li></ul></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-zh-cnbloggolang-li><input type=checkbox id=m-zh-cnbloggolang-check>
<label for=m-zh-cnbloggolang-check><a href=/zh-cn/blog/golang/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnbloggolang><span>Golang</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210220dubbo-go-e799bde8af9de69687-li><input type=checkbox id=m-zh-cnblog20210220dubbo-go-e799bde8af9de69687-check>
<label for=m-zh-cnblog20210220dubbo-go-e799bde8af9de69687-check><a href=/zh-cn/blog/2021/02/20/dubbo-go-%E7%99%BD%E8%AF%9D%E6%96%87/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210220dubbo-go-e799bde8af9de69687><span>dubbo-go 白话文</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210115dubbo-goe6ba90e7a081e7ac94e8aeb0e4ba8ce5aea2e688b7e7abafe8b083e794a8e8bf87e7a88b-li><input type=checkbox id=m-zh-cnblog20210115dubbo-goe6ba90e7a081e7ac94e8aeb0e4ba8ce5aea2e688b7e7abafe8b083e794a8e8bf87e7a88b-check>
<label for=m-zh-cnblog20210115dubbo-goe6ba90e7a081e7ac94e8aeb0e4ba8ce5aea2e688b7e7abafe8b083e794a8e8bf87e7a88b-check><a href=/zh-cn/blog/2021/01/15/dubbo-go%E6%BA%90%E7%A0%81%E7%AC%94%E8%AE%B0%E4%BA%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%B0%83%E7%94%A8%E8%BF%87%E7%A8%8B/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210115dubbo-goe6ba90e7a081e7ac94e8aeb0e4ba8ce5aea2e688b7e7abafe8b083e794a8e8bf87e7a88b><span>dubbo-go源码笔记(二)客户端调用过程</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210115dubbogo-30e789b5e6898b-grpc-e8b5b0e59091e4ba91e58e9fe7949fe697b6e4bba3-li><input type=checkbox id=m-zh-cnblog20210115dubbogo-30e789b5e6898b-grpc-e8b5b0e59091e4ba91e58e9fe7949fe697b6e4bba3-check>
<label for=m-zh-cnblog20210115dubbogo-30e789b5e6898b-grpc-e8b5b0e59091e4ba91e58e9fe7949fe697b6e4bba3-check><a href=/zh-cn/blog/2021/01/15/dubbogo-3.0%E7%89%B5%E6%89%8B-grpc-%E8%B5%B0%E5%90%91%E4%BA%91%E5%8E%9F%E7%94%9F%E6%97%B6%E4%BB%A3/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210115dubbogo-30e789b5e6898b-grpc-e8b5b0e59091e4ba91e58e9fe7949fe697b6e4bba3><span>dubbogo 3.0:牵手 gRPC 走向云原生时代</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210115e58886e5b883e5bc8fe4ba8be58aa1e6a186e69eb6-seata-golang-e9809ae4bfa1e6a8a1e59e8be8afa6e8a7a3-li><input type=checkbox id=m-zh-cnblog20210115e58886e5b883e5bc8fe4ba8be58aa1e6a186e69eb6-seata-golang-e9809ae4bfa1e6a8a1e59e8be8afa6e8a7a3-check>
<label for=m-zh-cnblog20210115e58886e5b883e5bc8fe4ba8be58aa1e6a186e69eb6-seata-golang-e9809ae4bfa1e6a8a1e59e8be8afa6e8a7a3-check><a href=/zh-cn/blog/2021/01/15/%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1%E6%A1%86%E6%9E%B6-seata-golang-%E9%80%9A%E4%BF%A1%E6%A8%A1%E5%9E%8B%E8%AF%A6%E8%A7%A3/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210115e58886e5b883e5bc8fe4ba8be58aa1e6a186e69eb6-seata-golang-e9809ae4bfa1e6a8a1e59e8be8afa6e8a7a3><span>分布式事务框架 seata-golang 通信模型详解</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210114dubbo-go-e58fafe4bfa1e8b083e794a8e5ae9ee78eb0-li><input type=checkbox id=m-zh-cnblog20210114dubbo-go-e58fafe4bfa1e8b083e794a8e5ae9ee78eb0-check>
<label for=m-zh-cnblog20210114dubbo-go-e58fafe4bfa1e8b083e794a8e5ae9ee78eb0-check><a href=/zh-cn/blog/2021/01/14/dubbo-go-%E5%8F%AF%E4%BF%A1%E8%B0%83%E7%94%A8%E5%AE%9E%E7%8E%B0/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210114dubbo-go-e58fafe4bfa1e8b083e794a8e5ae9ee78eb0><span>dubbo-go 可信调用实现</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210114dubbo-go-e6ba90e7a081e7ac94e8aeb0e4b880server-e7abafe5bc80e590afe69c8de58aa1e8bf87e7a88b-li><input type=checkbox id=m-zh-cnblog20210114dubbo-go-e6ba90e7a081e7ac94e8aeb0e4b880server-e7abafe5bc80e590afe69c8de58aa1e8bf87e7a88b-check>
<label for=m-zh-cnblog20210114dubbo-go-e6ba90e7a081e7ac94e8aeb0e4b880server-e7abafe5bc80e590afe69c8de58aa1e8bf87e7a88b-check><a href=/zh-cn/blog/2021/01/14/dubbo-go-%E6%BA%90%E7%A0%81%E7%AC%94%E8%AE%B0%E4%B8%80server-%E7%AB%AF%E5%BC%80%E5%90%AF%E6%9C%8D%E5%8A%A1%E8%BF%87%E7%A8%8B/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210114dubbo-go-e6ba90e7a081e7ac94e8aeb0e4b880server-e7abafe5bc80e590afe69c8de58aa1e8bf87e7a88b><span>Dubbo-go 源码笔记(一)Server 端开启服务过程</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210114dubbo-go-e4b8ad-rest-e58d8fe8aeaee5ae9ee78eb0-li><input type=checkbox id=m-zh-cnblog20210114dubbo-go-e4b8ad-rest-e58d8fe8aeaee5ae9ee78eb0-check>
<label for=m-zh-cnblog20210114dubbo-go-e4b8ad-rest-e58d8fe8aeaee5ae9ee78eb0-check><a href=/zh-cn/blog/2021/01/14/dubbo-go-%E4%B8%AD-rest-%E5%8D%8F%E8%AE%AE%E5%AE%9E%E7%8E%B0/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210114dubbo-go-e4b8ad-rest-e58d8fe8aeaee5ae9ee78eb0><span>dubbo-go 中 REST 协议实现</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210114dubbo-go-e4b8ade5b086-kubernets-e58e9fe4bd9ce4b8bae6b3a8e5868ce4b8ade79a84e8aebee8aea1e5928ce5ae9ee78eb0-li><input type=checkbox id=m-zh-cnblog20210114dubbo-go-e4b8ade5b086-kubernets-e58e9fe4bd9ce4b8bae6b3a8e5868ce4b8ade79a84e8aebee8aea1e5928ce5ae9ee78eb0-check>
<label for=m-zh-cnblog20210114dubbo-go-e4b8ade5b086-kubernets-e58e9fe4bd9ce4b8bae6b3a8e5868ce4b8ade79a84e8aebee8aea1e5928ce5ae9ee78eb0-check><a href=/zh-cn/blog/2021/01/14/dubbo-go-%E4%B8%AD%E5%B0%86-kubernets-%E5%8E%9F%E4%BD%9C%E4%B8%BA%E6%B3%A8%E5%86%8C%E4%B8%AD%E7%9A%84%E8%AE%BE%E8%AE%A1%E5%92%8C%E5%AE%9E%E7%8E%B0/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210114dubbo-go-e4b8ade5b086-kubernets-e58e9fe4bd9ce4b8bae6b3a8e5868ce4b8ade79a84e8aebee8aea1e5928ce5ae9ee78eb0><span>dubbo-go 中将 Kubernets 原⽣作为注册中⼼的设计和实现</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210114dubbo-goe5ba94e794a8e7bbb4e5baa6e6b3a8e5868ce6a8a1e59e8b-li><input type=checkbox id=m-zh-cnblog20210114dubbo-goe5ba94e794a8e7bbb4e5baa6e6b3a8e5868ce6a8a1e59e8b-check>
<label for=m-zh-cnblog20210114dubbo-goe5ba94e794a8e7bbb4e5baa6e6b3a8e5868ce6a8a1e59e8b-check><a href=/zh-cn/blog/2021/01/14/dubbo-go%E5%BA%94%E7%94%A8%E7%BB%B4%E5%BA%A6%E6%B3%A8%E5%86%8C%E6%A8%A1%E5%9E%8B/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210114dubbo-goe5ba94e794a8e7bbb4e5baa6e6b3a8e5868ce6a8a1e59e8b><span>Dubbo-go应用维度注册模型</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210114go-e78988e69cace585a5-dubbo-e7949fe68081e4b880e591a8e5b9b4-li><input type=checkbox id=m-zh-cnblog20210114go-e78988e69cace585a5-dubbo-e7949fe68081e4b880e591a8e5b9b4-check>
<label for=m-zh-cnblog20210114go-e78988e69cace585a5-dubbo-e7949fe68081e4b880e591a8e5b9b4-check><a href=/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/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210114go-e78988e69cace585a5-dubbo-e7949fe68081e4b880e591a8e5b9b4><span>Go 版本入 Dubbo 生态一周年</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210114e8aeb0e4b880e6aca1e59ca8-mosn-e5afb9-dubbodubbo-go-hessian2-e79a84e680a7e883bde4bc98e58c96-li><input type=checkbox id=m-zh-cnblog20210114e8aeb0e4b880e6aca1e59ca8-mosn-e5afb9-dubbodubbo-go-hessian2-e79a84e680a7e883bde4bc98e58c96-check>
<label for=m-zh-cnblog20210114e8aeb0e4b880e6aca1e59ca8-mosn-e5afb9-dubbodubbo-go-hessian2-e79a84e680a7e883bde4bc98e58c96-check><a href=/zh-cn/blog/2021/01/14/%E8%AE%B0%E4%B8%80%E6%AC%A1%E5%9C%A8-mosn-%E5%AF%B9-dubbodubbo-go-hessian2-%E7%9A%84%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210114e8aeb0e4b880e6aca1e59ca8-mosn-e5afb9-dubbodubbo-go-hessian2-e79a84e680a7e883bde4bc98e58c96><span>记一次在 mosn 对 dubbo、dubbo-go-hessian2 的性能优化</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210114e8a7a3e69e84-dubbo-go-e79a84e6a0b8e5bf83e6b3a8e5868ce5bc95e6938e-nacos-li><input type=checkbox id=m-zh-cnblog20210114e8a7a3e69e84-dubbo-go-e79a84e6a0b8e5bf83e6b3a8e5868ce5bc95e6938e-nacos-check>
<label for=m-zh-cnblog20210114e8a7a3e69e84-dubbo-go-e79a84e6a0b8e5bf83e6b3a8e5868ce5bc95e6938e-nacos-check><a href=/zh-cn/blog/2021/01/14/%E8%A7%A3%E6%9E%84-dubbo-go-%E7%9A%84%E6%A0%B8%E5%BF%83%E6%B3%A8%E5%86%8C%E5%BC%95%E6%93%8E-nacos/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210114e8a7a3e69e84-dubbo-go-e79a84e6a0b8e5bf83e6b3a8e5868ce5bc95e6938e-nacos><span>解构 Dubbo-go 的核心注册引擎 Nacos</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210114e5bfabe9809fe4b88ae6898b-dubbo-go-li><input type=checkbox id=m-zh-cnblog20210114e5bfabe9809fe4b88ae6898b-dubbo-go-check>
<label for=m-zh-cnblog20210114e5bfabe9809fe4b88ae6898b-dubbo-go-check><a href=/zh-cn/blog/2021/01/14/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B-dubbo-go/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210114e5bfabe9809fe4b88ae6898b-dubbo-go><span>快速上手 dubbo-go</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210114e6b682e9b8a6e699bae883bd-dubbo-go-e4babfe7baa7e6b581e9878fe79a84e5ae9ee8b7b5e4b88ee68ea2e7b4a2-li><input type=checkbox id=m-zh-cnblog20210114e6b682e9b8a6e699bae883bd-dubbo-go-e4babfe7baa7e6b581e9878fe79a84e5ae9ee8b7b5e4b88ee68ea2e7b4a2-check>
<label for=m-zh-cnblog20210114e6b682e9b8a6e699bae883bd-dubbo-go-e4babfe7baa7e6b581e9878fe79a84e5ae9ee8b7b5e4b88ee68ea2e7b4a2-check><a href=/zh-cn/blog/2021/01/14/%E6%B6%82%E9%B8%A6%E6%99%BA%E8%83%BD-dubbo-go-%E4%BA%BF%E7%BA%A7%E6%B5%81%E9%87%8F%E7%9A%84%E5%AE%9E%E8%B7%B5%E4%B8%8E%E6%8E%A2%E7%B4%A2/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210114e6b682e9b8a6e699bae883bd-dubbo-go-e4babfe7baa7e6b581e9878fe79a84e5ae9ee8b7b5e4b88ee68ea2e7b4a2><span>涂鸦智能 dubbo-go 亿级流量的实践与探索</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210112dubbo-go-e4b8ade5a682e4bd95e5ae9ee78eb0e8b7afe794b1e8a784e58899e58a9fe883bd-li><input type=checkbox id=m-zh-cnblog20210112dubbo-go-e4b8ade5a682e4bd95e5ae9ee78eb0e8b7afe794b1e8a784e58899e58a9fe883bd-check>
<label for=m-zh-cnblog20210112dubbo-go-e4b8ade5a682e4bd95e5ae9ee78eb0e8b7afe794b1e8a784e58899e58a9fe883bd-check><a href=/zh-cn/blog/2021/01/12/dubbo-go-%E4%B8%AD%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E8%B7%AF%E7%94%B1%E8%A7%84%E5%88%99%E5%8A%9F%E8%83%BD/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210112dubbo-go-e4b8ade5a682e4bd95e5ae9ee78eb0e8b7afe794b1e8a784e58899e58a9fe883bd><span>dubbo-go 中如何实现路由规则功能</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210112e8aeb0e4b880e6aca1e5afb9-dubbo-go-hessian2-e79a84e680a7e883bde4bc98e58c96-li><input type=checkbox id=m-zh-cnblog20210112e8aeb0e4b880e6aca1e5afb9-dubbo-go-hessian2-e79a84e680a7e883bde4bc98e58c96-check>
<label for=m-zh-cnblog20210112e8aeb0e4b880e6aca1e5afb9-dubbo-go-hessian2-e79a84e680a7e883bde4bc98e58c96-check><a href=/zh-cn/blog/2021/01/12/%E8%AE%B0%E4%B8%80%E6%AC%A1%E5%AF%B9-dubbo-go-hessian2-%E7%9A%84%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210112e8aeb0e4b880e6aca1e5afb9-dubbo-go-hessian2-e79a84e680a7e883bde4bc98e58c96><span>记一次对 dubbo-go-hessian2 的性能优化</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210111dubbo-go-e8b8a9e59d91e8aeb0-li><input type=checkbox id=m-zh-cnblog20210111dubbo-go-e8b8a9e59d91e8aeb0-check>
<label for=m-zh-cnblog20210111dubbo-go-e8b8a9e59d91e8aeb0-check><a href=/zh-cn/blog/2021/01/11/dubbo-go-%E8%B8%A9%E5%9D%91%E8%AE%B0/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210111dubbo-go-e8b8a9e59d91e8aeb0><span>Dubbo Go 踩坑记</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210111dubbo-go-e79a84e5898de4b896e4bb8ae7949f-li><input type=checkbox id=m-zh-cnblog20210111dubbo-go-e79a84e5898de4b896e4bb8ae7949f-check>
<label for=m-zh-cnblog20210111dubbo-go-e79a84e5898de4b896e4bb8ae7949f-check><a href=/zh-cn/blog/2021/01/11/dubbo-go-%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210111dubbo-go-e79a84e5898de4b896e4bb8ae7949f><span>Dubbo Go 的前世今生</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210111e586b2e4b88ae4ba91e58e9fe7949fdubbo-e58f91e5b883-go-e78988e69cac-li><input type=checkbox id=m-zh-cnblog20210111e586b2e4b88ae4ba91e58e9fe7949fdubbo-e58f91e5b883-go-e78988e69cac-check>
<label for=m-zh-cnblog20210111e586b2e4b88ae4ba91e58e9fe7949fdubbo-e58f91e5b883-go-e78988e69cac-check><a href=/zh-cn/blog/2021/01/11/%E5%86%B2%E4%B8%8A%E4%BA%91%E5%8E%9F%E7%94%9Fdubbo-%E5%8F%91%E5%B8%83-go-%E7%89%88%E6%9C%AC/ title="冲上云原生,Dubbo 发布 Go 版本" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210111e586b2e4b88ae4ba91e58e9fe7949fdubbo-e58f91e5b883-go-e78988e69cac><span>Dubbo Go 发布</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210111dubbo-go-e5bfabe9809fe5bc80e5a78b-li><input type=checkbox id=m-zh-cnblog20210111dubbo-go-e5bfabe9809fe5bc80e5a78b-check>
<label for=m-zh-cnblog20210111dubbo-go-e5bfabe9809fe5bc80e5a78b-check><a href=/zh-cn/blog/2021/01/11/dubbo-go-%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210111dubbo-go-e5bfabe9809fe5bc80e5a78b><span>Dubbo Go 快速开始</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210111dubbo-go-e4b8ad-metrics-e79a84e8aebee8aea1-li><input type=checkbox id=m-zh-cnblog20210111dubbo-go-e4b8ad-metrics-e79a84e8aebee8aea1-check>
<label for=m-zh-cnblog20210111dubbo-go-e4b8ad-metrics-e79a84e8aebee8aea1-check><a href=/zh-cn/blog/2021/01/11/dubbo-go-%E4%B8%AD-metrics-%E7%9A%84%E8%AE%BE%E8%AE%A1/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210111dubbo-go-e4b8ad-metrics-e79a84e8aebee8aea1><span>Dubbo Go 中 metrics 的设计</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210111dubbo-go-e4b8ade79a84-tps-limit-e8aebee8aea1e4b88ee5ae9ee78eb0-li><input type=checkbox id=m-zh-cnblog20210111dubbo-go-e4b8ade79a84-tps-limit-e8aebee8aea1e4b88ee5ae9ee78eb0-check>
<label for=m-zh-cnblog20210111dubbo-go-e4b8ade79a84-tps-limit-e8aebee8aea1e4b88ee5ae9ee78eb0-check><a href=/zh-cn/blog/2021/01/11/dubbo-go-%E4%B8%AD%E7%9A%84-tps-limit-%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/ title="Dubbo Go 中的 TPS Limit 设计与实现" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210111dubbo-go-e4b8ade79a84-tps-limit-e8aebee8aea1e4b88ee5ae9ee78eb0><span>dubbo-go tps limit</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210111dubbo-go-e4b8ade5a682e4bd95e5ae9ee78eb0e8bf9ce7a88be9858de7bdaee7aea1e79086-li><input type=checkbox id=m-zh-cnblog20210111dubbo-go-e4b8ade5a682e4bd95e5ae9ee78eb0e8bf9ce7a88be9858de7bdaee7aea1e79086-check>
<label for=m-zh-cnblog20210111dubbo-go-e4b8ade5a682e4bd95e5ae9ee78eb0e8bf9ce7a88be9858de7bdaee7aea1e79086-check><a href=/zh-cn/blog/2021/01/11/dubbo-go-%E4%B8%AD%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E8%BF%9C%E7%A8%8B%E9%85%8D%E7%BD%AE%E7%AE%A1%E7%90%86/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210111dubbo-go-e4b8ade5a682e4bd95e5ae9ee78eb0e8bf9ce7a88be9858de7bdaee7aea1e79086><span>dubbo-go 中如何实现远程配置管理?</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210111dubbo-go-getty-e5bc80e58f91e697a5e5bf97-li><input type=checkbox id=m-zh-cnblog20210111dubbo-go-getty-e5bc80e58f91e697a5e5bf97-check>
<label for=m-zh-cnblog20210111dubbo-go-getty-e5bc80e58f91e697a5e5bf97-check><a href=/zh-cn/blog/2021/01/11/dubbo-go-getty-%E5%BC%80%E5%8F%91%E6%97%A5%E5%BF%97/ title="Dubbo Go Getty 开发日志" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210111dubbo-go-getty-e5bc80e58f91e697a5e5bf97><span>getty 开发日志</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210111e697a0e7bc9de8a194e68ea5-grpc-e4b88e-dubbo-go-li><input type=checkbox id=m-zh-cnblog20210111e697a0e7bc9de8a194e68ea5-grpc-e4b88e-dubbo-go-check>
<label for=m-zh-cnblog20210111e697a0e7bc9de8a194e68ea5-grpc-e4b88e-dubbo-go-check><a href=/zh-cn/blog/2021/01/11/%E6%97%A0%E7%BC%9D%E8%A1%94%E6%8E%A5-grpc-%E4%B8%8E-dubbo-go/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210111e697a0e7bc9de8a194e68ea5-grpc-e4b88e-dubbo-go><span>无缝衔接 gRPC 与 dubbo-go</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210111e59ca8dubbo-goe4b8ade4bdbfe794a8sentinel-li><input type=checkbox id=m-zh-cnblog20210111e59ca8dubbo-goe4b8ade4bdbfe794a8sentinel-check>
<label for=m-zh-cnblog20210111e59ca8dubbo-goe4b8ade4bdbfe794a8sentinel-check><a href=/zh-cn/blog/2021/01/11/%E5%9C%A8dubbo-go%E4%B8%AD%E4%BD%BF%E7%94%A8sentinel/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210111e59ca8dubbo-goe4b8ade4bdbfe794a8sentinel><span>在dubbo-go中使用sentinel</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-zh-cnblogrust-li><input type=checkbox id=m-zh-cnblogrust-check>
<label for=m-zh-cnblogrust-check><a href=/zh-cn/blog/rust/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnblogrust><span>Rust</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20221023apache-dubbo-e5a49ae8afade8a880e4bd93e7b3bbe5868de6b7bbe696b0e59198e9a696e4b8aa-rust-e8afade8a880e78988e69cace6ada3e5bc8fe58f91e5b883-li><input type=checkbox id=m-zh-cnblog20221023apache-dubbo-e5a49ae8afade8a880e4bd93e7b3bbe5868de6b7bbe696b0e59198e9a696e4b8aa-rust-e8afade8a880e78988e69cace6ada3e5bc8fe58f91e5b883-check>
<label for=m-zh-cnblog20221023apache-dubbo-e5a49ae8afade8a880e4bd93e7b3bbe5868de6b7bbe696b0e59198e9a696e4b8aa-rust-e8afade8a880e78988e69cace6ada3e5bc8fe58f91e5b883-check><a href=/zh-cn/blog/2022/10/23/apache-dubbo-%E5%A4%9A%E8%AF%AD%E8%A8%80%E4%BD%93%E7%B3%BB%E5%86%8D%E6%B7%BB%E6%96%B0%E5%91%98%E9%A6%96%E4%B8%AA-rust-%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/ title="Apache Dubbo 多语言体系再添新员:首个 Rust 语言版本正式发布" class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20221023apache-dubbo-e5a49ae8afade8a880e4bd93e7b3bbe5868de6b7bbe696b0e59198e9a696e4b8aa-rust-e8afade8a880e78988e69cace6ada3e5bc8fe58f91e5b883><span>Dubbo 发布首个 Rust 语言版本实现</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id=m-zh-cnblogpixiu-li><input type=checkbox id=m-zh-cnblogpixiu-check>
<label for=m-zh-cnblogpixiu-check><a href=/zh-cn/blog/pixiu/ class="align-left pl-0 td-sidebar-link td-sidebar-link__section" id=m-zh-cnblogpixiu><span>Pixiu</span></a></label><ul class="ul-2 foldable"><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20220219e8b088e8b088pixiue79a84filter-li><input type=checkbox id=m-zh-cnblog20220219e8b088e8b088pixiue79a84filter-check>
<label for=m-zh-cnblog20220219e8b088e8b088pixiue79a84filter-check><a href=/zh-cn/blog/2022/02/19/%E8%B0%88%E8%B0%88pixiu%E7%9A%84filter/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20220219e8b088e8b088pixiue79a84filter><span>谈谈Pixiu的Filter</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20210825dubbo-e8b7a8e8afade8a880e8b083e794a8e7a59ee585bddubbo-go-pixiu-li><input type=checkbox id=m-zh-cnblog20210825dubbo-e8b7a8e8afade8a880e8b083e794a8e7a59ee585bddubbo-go-pixiu-check>
<label for=m-zh-cnblog20210825dubbo-e8b7a8e8afade8a880e8b083e794a8e7a59ee585bddubbo-go-pixiu-check><a href=/zh-cn/blog/2021/08/25/dubbo-%E8%B7%A8%E8%AF%AD%E8%A8%80%E8%B0%83%E7%94%A8%E7%A5%9E%E5%85%BDdubbo-go-pixiu/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20210825dubbo-e8b7a8e8afade8a880e8b083e794a8e7a59ee585bddubbo-go-pixiu><span>Dubbo 跨语言调用神兽:dubbo-go-pixiu</span></a></label></li></ul></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20231007apache-dubbo-e9a696e4b8aa-nodejs-30-alpha-e78988e69cace6ada3e5bc8fe58f91e5b883-li><input type=checkbox id=m-zh-cnblog20231007apache-dubbo-e9a696e4b8aa-nodejs-30-alpha-e78988e69cace6ada3e5bc8fe58f91e5b883-check>
<label for=m-zh-cnblog20231007apache-dubbo-e9a696e4b8aa-nodejs-30-alpha-e78988e69cace6ada3e5bc8fe58f91e5b883-check><a href=/zh-cn/blog/2023/10/07/apache-dubbo-%E9%A6%96%E4%B8%AA-node.js-3.0-alpha-%E7%89%88%E6%9C%AC%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20231007apache-dubbo-e9a696e4b8aa-nodejs-30-alpha-e78988e69cace6ada3e5bc8fe58f91e5b883><span>Apache Dubbo 首个 Node.js 3.0-alpha 版本正式发布</span></a></label></li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id=m-zh-cnblog20231007web-e6b58fe8a788e599a8e9a1b5e99da2e4b99fe883bde8aebfe997aedubbogrpce5beaee69c8de58aa1dubbo-js-alphae78988e69cace6ada3e5bc8fe58f91e5b883-li><input type=checkbox id=m-zh-cnblog20231007web-e6b58fe8a788e599a8e9a1b5e99da2e4b99fe883bde8aebfe997aedubbogrpce5beaee69c8de58aa1dubbo-js-alphae78988e69cace6ada3e5bc8fe58f91e5b883-check>
<label for=m-zh-cnblog20231007web-e6b58fe8a788e599a8e9a1b5e99da2e4b99fe883bde8aebfe997aedubbogrpce5beaee69c8de58aa1dubbo-js-alphae78988e69cace6ada3e5bc8fe58f91e5b883-check><a href=/zh-cn/blog/2023/10/07/web-%E6%B5%8F%E8%A7%88%E5%99%A8%E9%A1%B5%E9%9D%A2%E4%B9%9F%E8%83%BD%E8%AE%BF%E9%97%AEdubbogrpc%E5%BE%AE%E6%9C%8D%E5%8A%A1dubbo-js-alpha%E7%89%88%E6%9C%AC%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/ class="align-left pl-0 td-sidebar-link td-sidebar-link__page" id=m-zh-cnblog20231007web-e6b58fe8a788e599a8e9a1b5e99da2e4b99fe883bde8aebfe997aedubbogrpce5beaee69c8de58aa1dubbo-js-alphae78988e69cace6ada3e5bc8fe58f91e5b883><span>Web 浏览器页面也能访问dubbo、grpc微服务?Dubbo-js alpha版本正式发布</span></a></label></li></ul></li></ul></nav></div></div><main class="col-12 col-md-9 col-xl-8 pl-md-5" role=main><nav aria-label=breadcrumb class=td-breadcrumbs><ol class=breadcrumb><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/zh-cn/blog/>博客</a></li><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/zh-cn/blog/java/>Java</a></li><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/zh-cn/blog/java/codeanalysis/>源码分析</a></li><li class=breadcrumb-item><a href=https://cn.dubbo.apache.org/zh-cn/blog/java/codeanalysis/3.0.8/>Dubbo3 [v3.0.8] 源码解析</a></li><li class="breadcrumb-item active" aria-current=page><a href=https://cn.dubbo.apache.org/zh-cn/blog/2022/08/16/16-%E6%A8%A1%E5%9D%97%E5%8F%91%E5%B8%83%E5%99%A8%E5%8F%91%E5%B8%83%E6%9C%8D%E5%8A%A1%E5%85%A8%E8%BF%87%E7%A8%8B/ aria-disabled=true class="btn-link disabled">16-模块发布器发布服务全过程</a></li></ol></nav><section id=deprecation-warning><div class="content deprecation-warning pageinfo outdated-blog"><p>该文章内容发布已经超过一年,请注意检查文章中内容是否过时。</p></div></section><div class=td-content><h1>16-模块发布器发布服务全过程</h1><div class=lead>[Dubbo 3.0.8源码解析] DefaultModuleDeployer模块器启动的流程,其中在start代码的模版方法中开始了导出服务的功能,。</div><div class="td-byline mb-4">借由 <b>宋小生</b> |
<time datetime=2022-08-16 class=text-muted>Tuesday, August 16, 2022</time></div><header class=article-meta><div class="taxonomy taxonomy-terms-article taxo-tags"><h5 class=taxonomy-title>Tags:</h5><ul class=taxonomy-terms><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/ data-taxonomy-term=%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90><span class=taxonomy-label>源码解析</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/java/ data-taxonomy-term=java><span class=taxonomy-label>Java</span></a></li></ul></div></header><h1 id=16-模块发布器发布服务全过程>16-模块发布器发布服务全过程</h1><h2 id=161-简介>16.1 简介</h2><p>Dubbo做为服务治理框架,比较核心的就是服务相关的概念,这里我先贴个找到的关于Dubbo工作原理的架构图:
<img src=/imgs/blog/source-blog/16-deploy.png alt=在这里插入图片描述>
如果按完整服务启动与订阅的顺序我们可以归结为以下6点:</p><ul><li>导出服务(提供者)<ul><li>服务提供方通过指定端口对外暴露服务</li></ul></li><li>注册服务(提供者)<ul><li>提供方向注册中心注册自己的信息</li></ul></li><li>(服务发现)-订阅服务(消费者)<ul><li>服务调用方通过注册中心订阅自己感兴趣的服务</li></ul></li><li>(服务发现)-服务推送(消费者)<ul><li>注册中心向调用方推送地址列表</li></ul></li><li>调用服务(消费者调用提供者)<ul><li>调用方选择一个地址发起RPC调用</li></ul></li><li>监控服务<ul><li>服务提供方和调用方的统计数据由监控模块收集展示</li></ul></li></ul><p>上面的完整的服务启动订阅与调用流程不仅仅适用于Dubbo 同样也适用于其他服务治理与发现的模型, 一般服务发现与服务调用的思路就是这样的,我们将以上内容扩展,暴漏服务可以使用http,tcp,udp等各种协议,注册服务可以注册到Redis,Dns,Etcd,Zookeeper等注册中心中,订阅服务可以主动去注册中心查询服务列表,服务发现可以让注册中心将服务数据动态推送给消费者.Dubbo其实就是基于这种简单的服务模型来扩展出各种功能的支持,来满足服务治理的各种场景,了解了这里可能各位同学就想着自行开发一个简单的微服务框架了。</p><p>回到主题,从以上的服务完整发布调用流程可以看到,所有的功能都是由导出服务(提供者)开始的,只有提供者先提供了服务才可以有真正的服务让消费者调用。</p><p>之前的博客内容 链接:<a href=https://blog.elastic.link/2022/07/10/dubbo/12-quan-ju-shi-ye-lai-kan-dubbo3.0.8-de-fu-wu-qi-dong-sheng-ming-zhou-qi/>&#171;12-全局视野来看Dubbo3.0.8的服务启动生命周期&#187;</a> 我们了解了 DefaultModuleDeployer模块器启动的流程,其中在start代码的模版方法中开始了导出服务的功能,这里我们来详细看下服务发布的全过程:</p><p>入口代码: DefaultModuleDeployer的发布服务方法</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>private</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>exportServices</span>() {
</span></span><span style=display:flex><span> <span style=color:#586e75>//从配置管缓存中查询缓存的所有的服务配置然后逐个服务发布</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>for</span> (ServiceConfigBase sc : configManager.getServices()) {
</span></span><span style=display:flex><span> exportServiceInternal(sc);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h2 id=162-导出服务的入口>16.2 导出服务的入口</h2><p>入口代码: DefaultModuleDeployer的发布服务方法</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>private</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>exportServices</span>() {
</span></span><span style=display:flex><span> <span style=color:#586e75>//从配置管缓存中查询缓存的所有的服务配置然后逐个服务发布</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>for</span> (ServiceConfigBase sc : configManager.getServices()) {
</span></span><span style=display:flex><span> exportServiceInternal(sc);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p>主要流程为遍历初始化的服务配置列表然后逐个服务开始到处
内部导出服务代码:
exportServiceInternal方法:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>private</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>exportServiceInternal</span>(ServiceConfigBase sc) {
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> ServiceConfig<span style=color:#719e07>&lt;?&gt;</span> serviceConfig <span style=color:#719e07>=</span> (ServiceConfig<span style=color:#719e07>&lt;?&gt;</span>) sc;
</span></span><span style=display:flex><span> <span style=color:#586e75>//服务配置刷新 配置优先级覆盖</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>serviceConfig.isRefreshed()) {
</span></span><span style=display:flex><span> serviceConfig.refresh();
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//服务已经导出过了就直接返回</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (sc.isExported()) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span>;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//是否异步方式导出 全局配置或者服务级其中一个配置了异步则异步处理</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (exportAsync <span style=color:#719e07>||</span> sc.shouldExportAsync()) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//异步其实就是使用线程来导出服务serviceExportExecutor</span>
</span></span><span style=display:flex><span> ExecutorService executor <span style=color:#719e07>=</span> executorRepository.getServiceExportExecutor();
</span></span><span style=display:flex><span> CompletableFuture<span style=color:#719e07>&lt;</span>Void<span style=color:#719e07>&gt;</span> future <span style=color:#719e07>=</span> CompletableFuture.runAsync(() <span style=color:#719e07>-&gt;</span> {
</span></span><span style=display:flex><span> <span style=color:#719e07>try</span> {
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>sc.isExported()) {
</span></span><span style=display:flex><span> sc.export();
</span></span><span style=display:flex><span> exportedServices.add(sc);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> } <span style=color:#719e07>catch</span> (Throwable t) {
</span></span><span style=display:flex><span> logger.error(getIdentifier() <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34; export async catch error : &#34;</span> <span style=color:#719e07>+</span> t.getMessage(), t);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }, executor);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> asyncExportingFutures.add(future);
</span></span><span style=display:flex><span> } <span style=color:#719e07>else</span> {
</span></span><span style=display:flex><span> <span style=color:#586e75>//同步导出服务</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>sc.isExported()) {
</span></span><span style=display:flex><span> sc.export();
</span></span><span style=display:flex><span> exportedServices.add(sc);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p>这个逻辑里面做了一些基本的操作,可以直接看注释然后调用ServiceConfig的export的来导出服务,继续往后看服务配置的导出服务方法。</p><h2 id=163-服务配置导出服务模板方法>16.3 服务配置导出服务模板方法</h2><p>核心的服务导出代码是在服务配置中来做的ServiceConfig的 export() 方法
ServiceConfig的 export() 方法代码如下:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>export</span>() {
</span></span><span style=display:flex><span> <span style=color:#586e75>//已经导出过服务直接放那会</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>this</span>.exported) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span>;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// ensure start module, compatible with old api usage</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//确保模块启动了(基本的初始化操作执行了)</span>
</span></span><span style=display:flex><span> getScopeModel().getDeployer().start();
</span></span><span style=display:flex><span> <span style=color:#586e75>//悲观锁</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>synchronized</span> (<span style=color:#719e07>this</span>) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//双重校验</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>this</span>.exported) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span>;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//配置是否刷新 前面初始化时候已经刷新过配置</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span><span style=color:#719e07>this</span>.isRefreshed()) {
</span></span><span style=display:flex><span> <span style=color:#719e07>this</span>.refresh();
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//服务导出配置配置为false则不导出</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>this</span>.shouldExport()) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//服务发布前初始化一下元数据对象</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>this</span>.init();
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (shouldDelay()) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//配置了服务的延迟发布配置则走延迟发布逻辑</span>
</span></span><span style=display:flex><span> doDelayExport();
</span></span><span style=display:flex><span> } <span style=color:#719e07>else</span> {
</span></span><span style=display:flex><span> <span style=color:#586e75>//导出服务</span>
</span></span><span style=display:flex><span> doExport();
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h3 id=1631-服务配置导出服务前的初始化方法>16.3.1 服务配置导出服务前的初始化方法</h3><p>ServiceConfig 导出服务之前的初始化方法init</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>init</span>() {
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>this</span>.initialized.compareAndSet(<span style=color:#cb4b16>false</span>, <span style=color:#cb4b16>true</span>)) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//加载服务监听器 这里暂时没有服务监听器扩展</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// load ServiceListeners from extension</span>
</span></span><span style=display:flex><span> ExtensionLoader<span style=color:#719e07>&lt;</span>ServiceListener<span style=color:#719e07>&gt;</span> extensionLoader <span style=color:#719e07>=</span> <span style=color:#719e07>this</span>.getExtensionLoader(ServiceListener.class);
</span></span><span style=display:flex><span> <span style=color:#719e07>this</span>.serviceListeners.addAll(extensionLoader.getSupportedExtensionInstances());
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//服务提供者配置传递给元数据配置对象 一个服务提供者配置会有一个元数据配置,服务配置</span>
</span></span><span style=display:flex><span> initServiceMetadata(provider);
</span></span><span style=display:flex><span> <span style=color:#586e75>//元数据</span>
</span></span><span style=display:flex><span> serviceMetadata.setServiceType(getInterfaceClass());
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> serviceMetadata.setTarget(getRef());
</span></span><span style=display:flex><span> <span style=color:#586e75>//元数据的key格式为 group/服务接口:版本号</span>
</span></span><span style=display:flex><span> serviceMetadata.generateServiceKey();
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h2 id=164-服务配置导出服务模板方法2>16.4 服务配置导出服务模板方法2</h2><p>ServiceConfig 导出服务核心逻辑</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>protected</span> <span style=color:#268bd2>synchronized</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>doExport</span>() {
</span></span><span style=display:flex><span> <span style=color:#586e75>//取消发布</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (unexported) {
</span></span><span style=display:flex><span> <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> IllegalStateException(<span style=color:#2aa198>&#34;The service &#34;</span> <span style=color:#719e07>+</span> interfaceClass.getName() <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34; has already unexported!&#34;</span>);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//已经发布</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (exported) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span>;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//服务路径 为空则设置为接口名,本例子中为link.elastic.dubbo.entity.DemoService</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (StringUtils.isEmpty(path)) {
</span></span><span style=display:flex><span> path <span style=color:#719e07>=</span> interfaceName;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//导出URL</span>
</span></span><span style=display:flex><span> doExportUrls();
</span></span><span style=display:flex><span> <span style=color:#586e75>//</span>
</span></span><span style=display:flex><span> exported();
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h3 id=1641-导出服务的url配置逻辑>16.4.1 导出服务的URL配置逻辑</h3><p>ServiceConfig 导出URL核心逻辑</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>private</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>doExportUrls</span>() {
</span></span><span style=display:flex><span> <span style=color:#586e75>//模块服务存储库</span>
</span></span><span style=display:flex><span> ModuleServiceRepository repository <span style=color:#719e07>=</span> getScopeModel().getServiceRepository();
</span></span><span style=display:flex><span> ServiceDescriptor serviceDescriptor;
</span></span><span style=display:flex><span> <span style=color:#586e75>//ref为服务实现类型 这里对应我们例子的DemoServiceImpl</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>final</span> <span style=color:#dc322f>boolean</span> serverService <span style=color:#719e07>=</span> ref <span style=color:#719e07>instanceof</span> ServerService;
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span>(serverService){
</span></span><span style=display:flex><span> serviceDescriptor<span style=color:#719e07>=</span>((ServerService) ref).getServiceDescriptor();
</span></span><span style=display:flex><span> repository.registerService(serviceDescriptor);
</span></span><span style=display:flex><span> }<span style=color:#719e07>else</span>{
</span></span><span style=display:flex><span> <span style=color:#586e75>//我们代码走这个逻辑 注册服务 这个注册不是向注册中心注册 这个是解析服务接口将服务方法等描述信息存放在了服务存储ModuleServiceRepository类型对象的成员变量services中</span>
</span></span><span style=display:flex><span> serviceDescriptor <span style=color:#719e07>=</span> repository.registerService(getInterfaceClass());
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//提供者领域模型, 提供者领域模型 封装了一些提供者需要的就基本属性同时内部解析封装方法信息 ProviderMethodModel 列表 , 服务标识符 格式group/服务接:版本号</span>
</span></span><span style=display:flex><span> providerModel <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ProviderModel(getUniqueServiceName(),
</span></span><span style=display:flex><span> <span style=color:#586e75>//服务实现类DemoServiceImpl</span>
</span></span><span style=display:flex><span> ref,
</span></span><span style=display:flex><span> <span style=color:#586e75>//服务描述符 描述符里面包含了服务接口的方法信息,不过服务接口通过反射也可以拿到方法信息</span>
</span></span><span style=display:flex><span> serviceDescriptor,
</span></span><span style=display:flex><span> <span style=color:#586e75>//服务配置</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>this</span>,
</span></span><span style=display:flex><span> <span style=color:#586e75>//当前所处模型</span>
</span></span><span style=display:flex><span> getScopeModel(),
</span></span><span style=display:flex><span> <span style=color:#586e75>//当前服务接口的元数据对象</span>
</span></span><span style=display:flex><span> serviceMetadata);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//模块服务存储库存储提供者模型对象ModuleServiceRepository</span>
</span></span><span style=display:flex><span> repository.registerProvider(providerModel);
</span></span><span style=display:flex><span> <span style=color:#586e75>//获取配置的注册中心列表 ,同时将注册中心配置转URL (在Dubbo中URL就是配置信息的一种形式)</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//这里会获取到两个 由dubbo.application.register-mode 双注册配置决定</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//注册中心 registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&amp;dubbo=2.0.2&amp;pid=9008&amp;registry=zookeeper&amp;release=3.0.8&amp;timestamp=1653703292768</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//service-discovery-registry://8.131.79.126:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&amp;dubbo=2.0.2&amp;pid=10275&amp;registry=zookeeper&amp;release=3.0.8&amp;timestamp=1653704425920</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//参数dubbo是dubbo协议的版本不是Dubbo版本 Dubbo RPC protocol version, for compatibility, it must not be between 2.0.10 ~ 2.6.2</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//这里后面详细说下 服务双注册 dubbo.application.register-mode</span>
</span></span><span style=display:flex><span> List<span style=color:#719e07>&lt;</span>URL<span style=color:#719e07>&gt;</span> registryURLs <span style=color:#719e07>=</span> ConfigValidationUtils.loadRegistries(<span style=color:#719e07>this</span>, <span style=color:#cb4b16>true</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#719e07>for</span> (ProtocolConfig protocolConfig : protocols) {
</span></span><span style=display:flex><span> String pathKey <span style=color:#719e07>=</span> URL.buildKey(getContextPath(protocolConfig)
</span></span><span style=display:flex><span> .map(p <span style=color:#719e07>-&gt;</span> p <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34;/&#34;</span> <span style=color:#719e07>+</span> path)
</span></span><span style=display:flex><span> .orElse(path), group, version);
</span></span><span style=display:flex><span> <span style=color:#586e75>// stub service will use generated service name</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span>(<span style=color:#719e07>!</span>serverService) {
</span></span><span style=display:flex><span> <span style=color:#586e75>// In case user specified path, register service one more time to map it to path.</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//模块服务存储库ModuleServiceRepository存储服务接口信息</span>
</span></span><span style=display:flex><span> repository.registerService(pathKey, interfaceClass);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//导出根据协议导出配置到注册中心</span>
</span></span><span style=display:flex><span> doExportUrlsFor1Protocol(protocolConfig, registryURLs);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h3 id=1642-应用级和接口级服务注册地址获取>16.4.2 应用级和接口级服务注册地址获取</h3><p>这里主要看下注册中心的获取,这里涉及到服务的双注册配置</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>List<span style=color:#719e07>&lt;</span>URL<span style=color:#719e07>&gt;</span> registryURLs <span style=color:#719e07>=</span> ConfigValidationUtils.loadRegistries(<span style=color:#719e07>this</span>, <span style=color:#cb4b16>true</span>);
</span></span></code></pre></div><p>关于loadRegistries方法的详情我们就不看了主要看loadRegistries方法中调用的genCompatibleRegistries添加服务发现注册中心</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#586e75>/**
</span></span></span><span style=display:flex><span><span style=color:#586e75> * @param scopeModel 域模型
</span></span></span><span style=display:flex><span><span style=color:#586e75> * @param registryList 配置的注册中心列表 例如:registry://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&amp;dubbo=2.0.2&amp;pid=9008&amp;registry=zookeeper&amp;release=3.0.8&amp;timestamp=1653703292768
</span></span></span><span style=display:flex><span><span style=color:#586e75> *
</span></span></span><span style=display:flex><span><span style=color:#586e75> * @param provider 是否为服务提供者 这里Demo为true
</span></span></span><span style=display:flex><span><span style=color:#586e75> */</span>
</span></span><span style=display:flex><span><span style=color:#268bd2>private</span> <span style=color:#268bd2>static</span> List<span style=color:#719e07>&lt;</span>URL<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>genCompatibleRegistries</span>(ScopeModel scopeModel, List<span style=color:#719e07>&lt;</span>URL<span style=color:#719e07>&gt;</span> registryList, <span style=color:#dc322f>boolean</span> provider) {
</span></span><span style=display:flex><span> List<span style=color:#719e07>&lt;</span>URL<span style=color:#719e07>&gt;</span> result <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ArrayList<span style=color:#719e07>&lt;&gt;</span>(registryList.size());
</span></span><span style=display:flex><span> <span style=color:#586e75>//遍历所有的注册中心 为每个注册中心增加兼容的服务发现注册中心地址配置</span>
</span></span><span style=display:flex><span> registryList.forEach(registryURL <span style=color:#719e07>-&gt;</span> {
</span></span><span style=display:flex><span> <span style=color:#586e75>//是否为提供者 </span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (provider) {
</span></span><span style=display:flex><span> <span style=color:#586e75>// for registries enabled service discovery, automatically register interface compatible addresses.</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> String registerMode;
</span></span><span style=display:flex><span> <span style=color:#586e75>//注册协议配置了service-discovery-registry 走这个逻辑</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//前面这个逻辑是直接接给result结果中添加应用级注册,如果是all配置则增加接口级注册信息</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (SERVICE_REGISTRY_PROTOCOL.equals(registryURL.getProtocol())) {
</span></span><span style=display:flex><span> registerMode <span style=color:#719e07>=</span> registryURL.getParameter(REGISTER_MODE_KEY, ConfigurationUtils.getCachedDynamicProperty(scopeModel, DUBBO_REGISTER_MODE_DEFAULT_KEY, DEFAULT_REGISTER_MODE_INSTANCE));
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>isValidRegisterMode(registerMode)) {
</span></span><span style=display:flex><span> registerMode <span style=color:#719e07>=</span> DEFAULT_REGISTER_MODE_INSTANCE;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//这里配置的就是应用级配置 则先添加应用级地址,再根据条件判断是否添加接口级注册中心地址</span>
</span></span><span style=display:flex><span> result.add(registryURL);
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (DEFAULT_REGISTER_MODE_ALL.equalsIgnoreCase(registerMode)
</span></span><span style=display:flex><span> <span style=color:#719e07>&amp;&amp;</span> registryNotExists(registryURL, registryList, REGISTRY_PROTOCOL)) {
</span></span><span style=display:flex><span> URL interfaceCompatibleRegistryURL <span style=color:#719e07>=</span> URLBuilder.from(registryURL)
</span></span><span style=display:flex><span> .setProtocol(REGISTRY_PROTOCOL)
</span></span><span style=display:flex><span> .removeParameter(REGISTRY_TYPE_KEY)
</span></span><span style=display:flex><span> .build();
</span></span><span style=display:flex><span> result.add(interfaceCompatibleRegistryURL);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> } <span style=color:#719e07>else</span> {
</span></span><span style=display:flex><span> <span style=color:#586e75>//正常情况下我们的配置会走这个逻辑</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// 获取服务注册的注册模式 配置为dubbo.application.register-mode 默认值为all 既注册接口数据又注册应用级信息</span>
</span></span><span style=display:flex><span> registerMode <span style=color:#719e07>=</span> registryURL.getParameter(REGISTER_MODE_KEY, ConfigurationUtils.getCachedDynamicProperty(scopeModel, DUBBO_REGISTER_MODE_DEFAULT_KEY, DEFAULT_REGISTER_MODE_ALL));
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>isValidRegisterMode(registerMode)) {
</span></span><span style=display:flex><span> registerMode <span style=color:#719e07>=</span> DEFAULT_REGISTER_MODE_INTERFACE;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//根据逻辑条件判断是否添加应用级注册中心地址</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> ((DEFAULT_REGISTER_MODE_INSTANCE.equalsIgnoreCase(registerMode) <span style=color:#719e07>||</span> DEFAULT_REGISTER_MODE_ALL.equalsIgnoreCase(registerMode))
</span></span><span style=display:flex><span> <span style=color:#719e07>&amp;&amp;</span> registryNotExists(registryURL, registryList, SERVICE_REGISTRY_PROTOCOL)) {
</span></span><span style=display:flex><span> URL serviceDiscoveryRegistryURL <span style=color:#719e07>=</span> URLBuilder.from(registryURL)
</span></span><span style=display:flex><span> .setProtocol(SERVICE_REGISTRY_PROTOCOL)
</span></span><span style=display:flex><span> .removeParameter(REGISTRY_TYPE_KEY)
</span></span><span style=display:flex><span> .build();
</span></span><span style=display:flex><span> result.add(serviceDiscoveryRegistryURL);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//根据逻辑条件判断是否添加接口级注册中心地址</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (DEFAULT_REGISTER_MODE_INTERFACE.equalsIgnoreCase(registerMode) <span style=color:#719e07>||</span> DEFAULT_REGISTER_MODE_ALL.equalsIgnoreCase(registerMode)) {
</span></span><span style=display:flex><span> result.add(registryURL);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> FrameworkStatusReportService reportService <span style=color:#719e07>=</span> ScopeModelUtil.getApplicationModel(scopeModel).getBeanFactory().getBean(FrameworkStatusReportService.class);
</span></span><span style=display:flex><span> reportService.reportRegistrationStatus(reportService.createRegistrationReport(registerMode));
</span></span><span style=display:flex><span> } <span style=color:#719e07>else</span> {
</span></span><span style=display:flex><span> result.add(registryURL);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> });
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> result;
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p>这个方法是根据服务注册模式来判断使用接口级注册地址还是应用级注册地址分别如下所示:
配置信息:
dubbo.application.register-mode
配置值:</p><ul><li>interface<ul><li>接口级注册</li></ul></li><li>instance<ul><li>应用级注册</li></ul></li><li>all<ul><li>接口级别和应用级都注册</li></ul></li></ul><p>接口级注册地址:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>registry:<span style=color:#586e75>//127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&amp;dubbo=2.0.2&amp;pid=9008&amp;registry=zookeeper&amp;release=3.0.8&amp;timestamp=1653703292768</span>
</span></span></code></pre></div><p>应用级注册地址:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>service<span style=color:#719e07>-</span>discovery<span style=color:#719e07>-</span>registry:<span style=color:#586e75>//8.131.79.126:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&amp;dubbo=2.0.2&amp;pid=10275&amp;registry=zookeeper&amp;release=3.0.8&amp;timestamp=1653704425920</span>
</span></span></code></pre></div><h2 id=165-导出服务配置到本地和注册中心>16.5 导出服务配置到本地和注册中心</h2><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> doExportUrlsFor1Protocol(protocolConfig, registryURLs);
</span></span></code></pre></div><p>protocolConfig为:dubbo协议的配置
&lt;dubbo:protocol port="-1" name=&ldquo;dubbo&rdquo; /></p><p>registryURLs目前有两个 应用级注册地址和接口级注册地址:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>registry:<span style=color:#586e75>//127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&amp;dubbo=2.0.2&amp;pid=9008&amp;registry=zookeeper&amp;release=3.0.8&amp;timestamp=1653703292768</span>
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>service<span style=color:#719e07>-</span>discovery<span style=color:#719e07>-</span>registry:<span style=color:#586e75>//8.131.79.126:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&amp;dubbo=2.0.2&amp;pid=10275&amp;registry=zookeeper&amp;release=3.0.8&amp;timestamp=1653704425920</span>
</span></span></code></pre></div><h3 id=1651-导出服务配置的doexporturlsfor1protocol方法>16.5.1 导出服务配置的doExportUrlsFor1Protocol方法</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>private</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>doExportUrlsFor1Protocol</span>(ProtocolConfig protocolConfig, List<span style=color:#719e07>&lt;</span>URL<span style=color:#719e07>&gt;</span> registryURLs) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//生成协议配置具体可见下图中的元数据配置中的attachments</span>
</span></span><span style=display:flex><span> Map<span style=color:#719e07>&lt;</span>String, String<span style=color:#719e07>&gt;</span> map <span style=color:#719e07>=</span> buildAttributes(protocolConfig);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// remove null key and null value</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//移除空值 简化配置</span>
</span></span><span style=display:flex><span> map.keySet().removeIf(key <span style=color:#719e07>-&gt;</span> key <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>||</span> map.get(key) <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span>);
</span></span><span style=display:flex><span> <span style=color:#586e75>// init serviceMetadata attachments</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//协议配置放到元数据对象中</span>
</span></span><span style=display:flex><span> serviceMetadata.getAttachments().putAll(map);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//协议配置 + 默认协议配置转URL类型的配置存储</span>
</span></span><span style=display:flex><span> URL url <span style=color:#719e07>=</span> buildUrl(protocolConfig, map);
</span></span><span style=display:flex><span> <span style=color:#586e75>//导出url</span>
</span></span><span style=display:flex><span> exportUrl(url, registryURLs);
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p><img src=/imgs/blog/source-blog/16-deploy2.png alt=在这里插入图片描述></p><h3 id=1652-导出服务配置模板方法>16.5.2 导出服务配置模板方法</h3><p>继续看导出服务的模板方法,分为本地导出和注册中心导出
//参数url为协议配置url可以参考:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>dubbo:<span style=color:#586e75>//192.168.1.9:20880/link.elastic.dubbo.entity.DemoService?anyhost=true&amp;application=dubbo-demo-api-provider&amp;background=false&amp;bind.ip=192.168.1.9&amp;bind.port=20880&amp;deprecated=false&amp;dubbo=2.0.2&amp;dynamic=true&amp;generic=false&amp;interface=link.elastic.dubbo.entity.DemoService&amp;methods=sayHello,sayHelloAsync&amp;pid=10953&amp;release=3.0.8&amp;side=provider&amp;timestamp=1653705630518</span>
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>private</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>exportUrl</span>(URL url, List<span style=color:#719e07>&lt;</span>URL<span style=color:#719e07>&gt;</span> registryURLs) {
</span></span><span style=display:flex><span> String scope <span style=color:#719e07>=</span> url.getParameter(SCOPE_KEY);
</span></span><span style=display:flex><span> <span style=color:#586e75>// don&#39;t export when none is configured</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>SCOPE_NONE.equalsIgnoreCase(scope)) {
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// export to local if the config is not remote (export to remote only when config is remote)</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//未明确指定远程导出 则开启本地导出</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>SCOPE_REMOTE.equalsIgnoreCase(scope)) {
</span></span><span style=display:flex><span> exportLocal(url);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//未明确指定本地导出 则开启远程导出</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// export to remote if the config is not local (export to local only when config is local)</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>SCOPE_LOCAL.equalsIgnoreCase(scope)) {
</span></span><span style=display:flex><span> url <span style=color:#719e07>=</span> exportRemote(url, registryURLs);
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>isGeneric(generic) <span style=color:#719e07>&amp;&amp;</span> <span style=color:#719e07>!</span>getScopeModel().isInternal()) {
</span></span><span style=display:flex><span> MetadataUtils.publishServiceDefinition(url, providerModel.getServiceModel(), getApplicationModel());
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#719e07>this</span>.urls.add(url);
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h2 id=166-导出服务到本地>16.6 导出服务到本地</h2><p>本地调用使用了 injvm 协议,是一个伪协议,它不开启端口,不发起远程调用,只在 JVM 内直接关联,但执行 Dubbo 的 Filter 链。</p><p>直接通过代码来看吧</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>private</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>exportLocal</span>(URL url) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//协议转为injvm 代表本地导出 host为127.0.0.1</span>
</span></span><span style=display:flex><span> URL local <span style=color:#719e07>=</span> URLBuilder.from(url)
</span></span><span style=display:flex><span> .setProtocol(LOCAL_PROTOCOL)
</span></span><span style=display:flex><span> .setHost(LOCALHOST_VALUE)
</span></span><span style=display:flex><span> .setPort(0)
</span></span><span style=display:flex><span> .build();
</span></span><span style=display:flex><span> local <span style=color:#719e07>=</span> local.setScopeModel(getScopeModel())
</span></span><span style=display:flex><span> .setServiceModel(providerModel);
</span></span><span style=display:flex><span> doExportUrl(local, <span style=color:#cb4b16>false</span>);
</span></span><span style=display:flex><span> logger.info(<span style=color:#2aa198>&#34;Export dubbo service &#34;</span> <span style=color:#719e07>+</span> interfaceClass.getName() <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34; to local registry url : &#34;</span> <span style=color:#719e07>+</span> local);
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h3 id=1661-doexporturl方法>16.6.1 doExportUrl方法</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>private</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>doExportUrl</span>(URL url, <span style=color:#dc322f>boolean</span> withMetaData) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//这里是由adaptor扩展类型处理过的 我们直接看默认的类型javassist 对应JavassistProxyFactory代理工厂 获取调用对象 (</span>
</span></span><span style=display:flex><span> Invoker<span style=color:#719e07>&lt;?&gt;</span> invoker <span style=color:#719e07>=</span> proxyFactory.getInvoker(ref, (Class) interfaceClass, url);
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (withMetaData) {
</span></span><span style=display:flex><span> invoker <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> DelegateProviderMetaDataInvoker(invoker, <span style=color:#719e07>this</span>);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> Exporter<span style=color:#719e07>&lt;?&gt;</span> exporter <span style=color:#719e07>=</span> protocolSPI.export(invoker);
</span></span><span style=display:flex><span> exporters.add(exporter);
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h3 id=1662-javassistproxyfactory类型的getinvoker方法>16.6.2 JavassistProxyFactory类型的getInvoker方法</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>getInvoker</span>(T proxy, Class<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> type, URL url) {
</span></span><span style=display:flex><span> <span style=color:#719e07>try</span> {
</span></span><span style=display:flex><span> <span style=color:#586e75>// TODO Wrapper cannot handle this scenario correctly: the classname contains &#39;$&#39;</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// 创建实际服务提供者的代理类型,代理类型后缀为DubboWrap在这里类型为 link.elastic.dubbo.entity.DemoServiceImplDubboWrap0</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>final</span> Wrapper wrapper <span style=color:#719e07>=</span> Wrapper.getWrapper(proxy.getClass().getName().indexOf(<span style=color:#2aa198>&#39;$&#39;</span>) <span style=color:#719e07>&lt;</span> 0 <span style=color:#719e07>?</span> proxy.getClass() : type);
</span></span><span style=display:flex><span> <span style=color:#586e75>//创建一个匿名内部类对象 继承自AbstractProxyInvoker的Invoker对象</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> <span style=color:#719e07>new</span> AbstractProxyInvoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span>(proxy, type, url) {
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>protected</span> Object <span style=color:#268bd2>doInvoke</span>(T proxy, String methodName,
</span></span><span style=display:flex><span> Class<span style=color:#719e07>&lt;?&gt;[]</span> parameterTypes,
</span></span><span style=display:flex><span> Object<span style=color:#719e07>[]</span> arguments) <span style=color:#268bd2>throws</span> Throwable {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> };
</span></span><span style=display:flex><span> } <span style=color:#719e07>catch</span> (Throwable fromJavassist) {
</span></span><span style=display:flex><span> <span style=color:#586e75>// try fall back to JDK proxy factory</span>
</span></span><span style=display:flex><span> ...
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h3 id=1663-使用协议导出调用对象-export>16.6.3 使用协议导出调用对象 export</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> Exporter<span style=color:#719e07>&lt;?&gt;</span> exporter <span style=color:#719e07>=</span> protocolSPI.export(invoker);
</span></span></code></pre></div><p>这个使用了Adaptor扩展和Wrapper机制Debug起来不太方便这里贴一下调用堆栈<img src=/imgs/blog/source-blog/16-deploy3.png alt=在这里插入图片描述></p><h3 id=16631-协议序列化机制protocolserializationwrapper>16.6.3.1 协议序列化机制ProtocolSerializationWrapper</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Exporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>export</span>(Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> invoker) <span style=color:#268bd2>throws</span> RpcException {
</span></span><span style=display:flex><span> <span style=color:#586e75>//这里主要逻辑是将服务提供者url添加到服务存储仓库中</span>
</span></span><span style=display:flex><span> getFrameworkModel(invoker.getUrl().getScopeModel()).getServiceRepository().registerProviderUrl(invoker.getUrl());
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> protocol.export(invoker);
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h3 id=16632-协议过滤器wrapper-protocolfilterwrapper>16.6.3.2 协议过滤器Wrapper ProtocolFilterWrapper</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Exporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>export</span>(Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> invoker) <span style=color:#268bd2>throws</span> RpcException {
</span></span><span style=display:flex><span> <span style=color:#586e75>//注册中心的协议导出直接执行</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (UrlUtils.isRegistry(invoker.getUrl())) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> protocol.export(invoker);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//过滤器调用链FilterChainBuilder的扩展对象查询</span>
</span></span><span style=display:flex><span> FilterChainBuilder builder <span style=color:#719e07>=</span> getFilterChainBuilder(invoker.getUrl());
</span></span><span style=display:flex><span> <span style=color:#586e75>//这里分为2步 生成过滤器调用链 然后使用链表中的节点调用 这里值查询provider类型的过滤器</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> protocol.export(builder.buildInvokerChain(invoker, SERVICE_FILTER_KEY, CommonConstants.PROVIDER));
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p>过滤器调用链的生成 对用DefaultFilterChainBuilder类型的buildInvokerChain方法</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>buildInvokerChain</span>(<span style=color:#268bd2>final</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> originalInvoker, String key, String group) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//originalInvoker代表真正的服务调用器</span>
</span></span><span style=display:flex><span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> last <span style=color:#719e07>=</span> originalInvoker;
</span></span><span style=display:flex><span> URL url <span style=color:#719e07>=</span> originalInvoker.getUrl();
</span></span><span style=display:flex><span> List<span style=color:#719e07>&lt;</span>ModuleModel<span style=color:#719e07>&gt;</span> moduleModels <span style=color:#719e07>=</span> getModuleModelsFromUrl(url);
</span></span><span style=display:flex><span> List<span style=color:#719e07>&lt;</span>Filter<span style=color:#719e07>&gt;</span> filters;
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (moduleModels <span style=color:#719e07>!=</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>&amp;&amp;</span> moduleModels.size() <span style=color:#719e07>==</span> 1) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//类型Filter key为service.filter 分组为provider 所有提供者过滤器拉取</span>
</span></span><span style=display:flex><span> filters <span style=color:#719e07>=</span> ScopeModelUtil.getExtensionLoader(Filter.class, moduleModels.get(0)).getActivateExtension(url, key, group);
</span></span><span style=display:flex><span> } <span style=color:#719e07>else</span> <span style=color:#719e07>if</span> (moduleModels <span style=color:#719e07>!=</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>&amp;&amp;</span> moduleModels.size() <span style=color:#719e07>&gt;</span> 1) {
</span></span><span style=display:flex><span> filters <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ArrayList<span style=color:#719e07>&lt;&gt;</span>();
</span></span><span style=display:flex><span> List<span style=color:#719e07>&lt;</span>ExtensionDirector<span style=color:#719e07>&gt;</span> directors <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ArrayList<span style=color:#719e07>&lt;&gt;</span>();
</span></span><span style=display:flex><span> <span style=color:#719e07>for</span> (ModuleModel moduleModel : moduleModels) {
</span></span><span style=display:flex><span> List<span style=color:#719e07>&lt;</span>Filter<span style=color:#719e07>&gt;</span> tempFilters <span style=color:#719e07>=</span> ScopeModelUtil.getExtensionLoader(Filter.class, moduleModel).getActivateExtension(url, key, group);
</span></span><span style=display:flex><span> filters.addAll(tempFilters);
</span></span><span style=display:flex><span> directors.add(moduleModel.getExtensionDirector());
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> filters <span style=color:#719e07>=</span> sortingAndDeduplication(filters, directors);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> } <span style=color:#719e07>else</span> {
</span></span><span style=display:flex><span> filters <span style=color:#719e07>=</span> ScopeModelUtil.getExtensionLoader(Filter.class, <span style=color:#cb4b16>null</span>).getActivateExtension(url, key, group);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//倒序拼接,将过滤器的调用对象添加到链表中 最后倒序遍历之后 last节点指向了调用链路链表头节点的对象</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>CollectionUtils.isEmpty(filters)) {
</span></span><span style=display:flex><span> <span style=color:#719e07>for</span> (<span style=color:#dc322f>int</span> i <span style=color:#719e07>=</span> filters.size() <span style=color:#719e07>-</span> 1; i <span style=color:#719e07>&gt;=</span> 0; i<span style=color:#719e07>--</span>) {
</span></span><span style=display:flex><span> <span style=color:#268bd2>final</span> Filter filter <span style=color:#719e07>=</span> filters.get(i);
</span></span><span style=display:flex><span> <span style=color:#268bd2>final</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> next <span style=color:#719e07>=</span> last;
</span></span><span style=display:flex><span> <span style=color:#586e75>//每个invoker对象中都有originalInvoker对象</span>
</span></span><span style=display:flex><span> last <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> CopyOfFilterChainNode<span style=color:#719e07>&lt;&gt;</span>(originalInvoker, next, filter);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> <span style=color:#719e07>new</span> CallbackRegistrationInvoker<span style=color:#719e07>&lt;&gt;</span>(last, filters);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> last;
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p><img src=/imgs/blog/source-blog/16-deploy4.png alt=在这里插入图片描述></p><h3 id=16633-协议监听器wrapper-protocollistenerwrapper>16.6.3.3 协议监听器Wrapper ProtocolListenerWrapper</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Exporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>export</span>(Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> invoker) <span style=color:#268bd2>throws</span> RpcException {
</span></span><span style=display:flex><span> <span style=color:#586e75>//注册中心地址则直接导出</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (UrlUtils.isRegistry(invoker.getUrl())) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> protocol.export(invoker);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>// 先导出对象 再创建过滤器包装对象 执行监听器逻辑</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> <span style=color:#719e07>new</span> ListenerExporterWrapper<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span>(protocol.export(invoker),
</span></span><span style=display:flex><span> Collections.unmodifiableList(ScopeModelUtil.getExtensionLoader(ExporterListener.class, invoker.getUrl().getScopeModel())
</span></span><span style=display:flex><span> .getActivateExtension(invoker.getUrl(), EXPORTER_LISTENER_KEY)));
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h3 id=16634-qos的协议wrapper-qosprotocolwrapper>16.6.3.4 QOS的协议Wrapper QosProtocolWrapper</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Exporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>export</span>(Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> invoker) <span style=color:#268bd2>throws</span> RpcException {
</span></span><span style=display:flex><span> <span style=color:#586e75>//注册中心导出的时候开启QOS 默认端口22222</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (UrlUtils.isRegistry(invoker.getUrl())) {
</span></span><span style=display:flex><span> startQosServer(invoker.getUrl());
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> protocol.export(invoker);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> protocol.export(invoker);
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h3 id=16635-injvmprotocol-的导出方法>16.6.3.5 InjvmProtocol 的导出方法</h3><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Exporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>export</span>(Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> invoker) <span style=color:#268bd2>throws</span> RpcException {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> <span style=color:#719e07>new</span> InjvmExporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span>(invoker, invoker.getUrl().getServiceKey(), exporterMap);
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h2 id=167-导出服务到注册中心>16.7 导出服务到注册中心</h2><p>16.5.2 导出服务配置模板方法 中我们看到了服务导出会导出到本地和远程,接下来就看下导出到远程的方法exportRemote
参数url:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>dubbo:<span style=color:#586e75>//192.168.1.9:20880/link.elastic.dubbo.entity.DemoService?anyhost=true&amp;application=dubbo-demo-api-provider&amp;background=false&amp;bind.ip=192.168.1.9&amp;bind.port=20880&amp;deprecated=false&amp;dubbo=2.0.2&amp;dynamic=true&amp;generic=false&amp;interface=link.elastic.dubbo.entity.DemoService&amp;methods=sayHello,sayHelloAsync&amp;pid=12865&amp;release=3.0.8&amp;side=provider&amp;timestamp=1653708351378</span>
</span></span></code></pre></div><p>参数registryURLs目前有两个 应用级注册地址和接口级注册地址:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>registry:<span style=color:#586e75>//127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&amp;dubbo=2.0.2&amp;pid=9008&amp;registry=zookeeper&amp;release=3.0.8&amp;timestamp=1653703292768</span>
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span>service<span style=color:#719e07>-</span>discovery<span style=color:#719e07>-</span>registry:<span style=color:#586e75>//8.131.79.126:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&amp;dubbo=2.0.2&amp;pid=10275&amp;registry=zookeeper&amp;release=3.0.8&amp;timestamp=1653704425920</span>
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>private</span> URL <span style=color:#268bd2>exportRemote</span>(URL url, List<span style=color:#719e07>&lt;</span>URL<span style=color:#719e07>&gt;</span> registryURLs) {
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (CollectionUtils.isNotEmpty(registryURLs)) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//遍历所有注册地址与注册模式 逐个注册</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>for</span> (URL registryURL : registryURLs) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//为协议URL 添加应用级注册service-discovery-registry参数service-name-mapping为true</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (SERVICE_REGISTRY_PROTOCOL.equals(registryURL.getProtocol())) {
</span></span><span style=display:flex><span> url <span style=color:#719e07>=</span> url.addParameterIfAbsent(SERVICE_NAME_MAPPING_KEY, <span style=color:#2aa198>&#34;true&#34;</span>);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//if protocol is only injvm ,not register</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (LOCAL_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {
</span></span><span style=display:flex><span> <span style=color:#719e07>continue</span>;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//为协议url 添加动态配置dynamic</span>
</span></span><span style=display:flex><span> url <span style=color:#719e07>=</span> url.addParameterIfAbsent(DYNAMIC_KEY, registryURL.getParameter(DYNAMIC_KEY));
</span></span><span style=display:flex><span> <span style=color:#586e75>//监控配置暂时为null</span>
</span></span><span style=display:flex><span> URL monitorUrl <span style=color:#719e07>=</span> ConfigValidationUtils.loadMonitor(<span style=color:#719e07>this</span>, registryURL);
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (monitorUrl <span style=color:#719e07>!=</span> <span style=color:#cb4b16>null</span>) {
</span></span><span style=display:flex><span> url <span style=color:#719e07>=</span> url.putAttribute(MONITOR_KEY, monitorUrl);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// For providers, this is used to enable custom proxy to generate invoker</span>
</span></span><span style=display:flex><span> String proxy <span style=color:#719e07>=</span> url.getParameter(PROXY_KEY);
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (StringUtils.isNotEmpty(proxy)) {
</span></span><span style=display:flex><span> registryURL <span style=color:#719e07>=</span> registryURL.addParameter(PROXY_KEY, proxy);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//开始注册服务了 打印个认知 提示下</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (logger.isInfoEnabled()) {
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (url.getParameter(REGISTER_KEY, <span style=color:#cb4b16>true</span>)) {
</span></span><span style=display:flex><span> logger.info(<span style=color:#2aa198>&#34;Register dubbo service &#34;</span> <span style=color:#719e07>+</span> interfaceClass.getName() <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34; url &#34;</span> <span style=color:#719e07>+</span> url <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34; to registry &#34;</span> <span style=color:#719e07>+</span> registryURL.getAddress());
</span></span><span style=display:flex><span> } <span style=color:#719e07>else</span> {
</span></span><span style=display:flex><span> logger.info(<span style=color:#2aa198>&#34;Export dubbo service &#34;</span> <span style=color:#719e07>+</span> interfaceClass.getName() <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34; to url &#34;</span> <span style=color:#719e07>+</span> url);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> doExportUrl(registryURL.putAttribute(EXPORT_KEY, url), <span style=color:#cb4b16>true</span>);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> } <span style=color:#719e07>else</span> {
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (logger.isInfoEnabled()) {
</span></span><span style=display:flex><span> logger.info(<span style=color:#2aa198>&#34;Export dubbo service &#34;</span> <span style=color:#719e07>+</span> interfaceClass.getName() <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34; to url &#34;</span> <span style=color:#719e07>+</span> url);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> doExportUrl(url, <span style=color:#cb4b16>true</span>);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> url;
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h3 id=1671---doexporturl方法>16.7.1 doExportUrl方法</h3><p>与 16.6.1 doExportUrl方法 导出本地协议是一样的逻辑 ,我们来看看点不同地方</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>private</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>doExportUrl</span>(URL url, <span style=color:#dc322f>boolean</span> withMetaData) {
</span></span><span style=display:flex><span> Invoker<span style=color:#719e07>&lt;?&gt;</span> invoker <span style=color:#719e07>=</span> proxyFactory.getInvoker(ref, (Class) interfaceClass, url);
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (withMetaData) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//远程服务导出逐个值为true 元数据invoker包装一下</span>
</span></span><span style=display:flex><span> invoker <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> DelegateProviderMetaDataInvoker(invoker, <span style=color:#719e07>this</span>);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> Exporter<span style=color:#719e07>&lt;?&gt;</span> exporter <span style=color:#719e07>=</span> protocolSPI.export(invoker);
</span></span><span style=display:flex><span> exporters.add(exporter);
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p>与本地导出ProtocolFilterWrapper的不同之处
服务发现service-discovery-registry的导出UrlUtils.isRegistry(invoker.getUrl() 判断结果为true会走这个逻辑</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Exporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>export</span>(Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> invoker) <span style=color:#268bd2>throws</span> RpcException {
</span></span><span style=display:flex><span> <span style=color:#586e75>//注册中心的协议导出直接执行</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// 服务发现service-discovery-registry的导出会走这个逻辑</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (UrlUtils.isRegistry(invoker.getUrl())) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> protocol.export(invoker);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//过滤器调用链FilterChainBuilder的扩展对象查询</span>
</span></span><span style=display:flex><span> FilterChainBuilder builder <span style=color:#719e07>=</span> getFilterChainBuilder(invoker.getUrl());
</span></span><span style=display:flex><span> <span style=color:#586e75>//这里分为2步 生成过滤器调用链 然后使用链表中的节点调用 这里值查询provider类型的过滤器</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> protocol.export(builder.buildInvokerChain(invoker, SERVICE_FILTER_KEY, CommonConstants.PROVIDER));
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p>与 协议监听器Wrapper ProtocolListenerWrapper 的不同之处</p><p>服务发现service-discovery-registry的导出UrlUtils.isRegistry(invoker.getUrl() 判断结果为true会走这个逻辑</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Exporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>export</span>(Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> invoker) <span style=color:#268bd2>throws</span> RpcException {
</span></span><span style=display:flex><span> <span style=color:#586e75>//注册中心地址则直接导出</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// 服务发现service-discovery-registry的导出会走这个逻辑</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (UrlUtils.isRegistry(invoker.getUrl())) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> protocol.export(invoker);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>// 先导出对象 再创建过滤器包装对象 执行监听器逻辑</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> <span style=color:#719e07>new</span> ListenerExporterWrapper<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span>(protocol.export(invoker),
</span></span><span style=display:flex><span> Collections.unmodifiableList(ScopeModelUtil.getExtensionLoader(ExporterListener.class, invoker.getUrl().getScopeModel())
</span></span><span style=display:flex><span> .getActivateExtension(invoker.getUrl(), EXPORTER_LISTENER_KEY)));
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p>与 16.6.3.4 QOS的协议Wrapper QosProtocolWrapper 不同之处</p><p>服务发现service-discovery-registry的导出UrlUtils.isRegistry(invoker.getUrl() 判断结果为true会走这个逻辑</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Exporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>export</span>(Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> invoker) <span style=color:#268bd2>throws</span> RpcException {
</span></span><span style=display:flex><span> <span style=color:#586e75>//注册中心导出的时候开启QOS 默认端口22222</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (UrlUtils.isRegistry(invoker.getUrl())) {
</span></span><span style=display:flex><span> startQosServer(invoker.getUrl());
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> protocol.export(invoker);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> protocol.export(invoker);
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p>启动QOS服务startQosServer</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>private</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>startQosServer</span>(URL url) {
</span></span><span style=display:flex><span> <span style=color:#719e07>try</span> {
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>hasStarted.compareAndSet(<span style=color:#cb4b16>false</span>, <span style=color:#cb4b16>true</span>)) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span>;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#dc322f>boolean</span> qosEnable <span style=color:#719e07>=</span> url.getParameter(QOS_ENABLE, <span style=color:#cb4b16>true</span>);
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>qosEnable) {
</span></span><span style=display:flex><span> logger.info(<span style=color:#2aa198>&#34;qos won&#39;t be started because it is disabled. &#34;</span> <span style=color:#719e07>+</span>
</span></span><span style=display:flex><span> <span style=color:#2aa198>&#34;Please check dubbo.application.qos.enable is configured either in system property, &#34;</span> <span style=color:#719e07>+</span>
</span></span><span style=display:flex><span> <span style=color:#2aa198>&#34;dubbo.properties or XML/spring-boot configuration.&#34;</span>);
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span>;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> String host <span style=color:#719e07>=</span> url.getParameter(QOS_HOST);
</span></span><span style=display:flex><span> <span style=color:#dc322f>int</span> port <span style=color:#719e07>=</span> url.getParameter(QOS_PORT, QosConstants.DEFAULT_PORT);
</span></span><span style=display:flex><span> <span style=color:#dc322f>boolean</span> acceptForeignIp <span style=color:#719e07>=</span> Boolean.parseBoolean(url.getParameter(ACCEPT_FOREIGN_IP, <span style=color:#2aa198>&#34;false&#34;</span>));
</span></span><span style=display:flex><span> Server server <span style=color:#719e07>=</span> frameworkModel.getBeanFactory().getBean(Server.class);
</span></span><span style=display:flex><span> server.setHost(host);
</span></span><span style=display:flex><span> server.setPort(port);
</span></span><span style=display:flex><span> server.setAcceptForeignIp(acceptForeignIp);
</span></span><span style=display:flex><span> server.start();
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> } <span style=color:#719e07>catch</span> (Throwable throwable) {
</span></span><span style=display:flex><span> logger.warn(<span style=color:#2aa198>&#34;Fail to start qos server: &#34;</span>, throwable);
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p>QOS的Server的启动方法start</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>public</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>start</span>() <span style=color:#268bd2>throws</span> Throwable {
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>started.compareAndSet(<span style=color:#cb4b16>false</span>, <span style=color:#cb4b16>true</span>)) {
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span>;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//1个主线程</span>
</span></span><span style=display:flex><span> boss <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> NioEventLoopGroup(1, <span style=color:#719e07>new</span> DefaultThreadFactory(<span style=color:#2aa198>&#34;qos-boss&#34;</span>, <span style=color:#cb4b16>true</span>));
</span></span><span style=display:flex><span> <span style=color:#586e75>//0个从线程</span>
</span></span><span style=display:flex><span> worker <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> NioEventLoopGroup(0, <span style=color:#719e07>new</span> DefaultThreadFactory(<span style=color:#2aa198>&#34;qos-worker&#34;</span>, <span style=color:#cb4b16>true</span>));
</span></span><span style=display:flex><span> <span style=color:#586e75>//服务端启动器,和参数设置</span>
</span></span><span style=display:flex><span> ServerBootstrap serverBootstrap <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> ServerBootstrap();
</span></span><span style=display:flex><span> serverBootstrap.group(boss, worker);
</span></span><span style=display:flex><span> serverBootstrap.channel(NioServerSocketChannel.class);
</span></span><span style=display:flex><span> serverBootstrap.option(ChannelOption.SO_REUSEADDR, <span style=color:#cb4b16>true</span>);
</span></span><span style=display:flex><span> serverBootstrap.childOption(ChannelOption.TCP_NODELAY, <span style=color:#cb4b16>true</span>);
</span></span><span style=display:flex><span> serverBootstrap.childHandler(<span style=color:#719e07>new</span> ChannelInitializer<span style=color:#719e07>&lt;</span>Channel<span style=color:#719e07>&gt;</span>() {
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>protected</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>initChannel</span>(Channel ch) <span style=color:#268bd2>throws</span> Exception {
</span></span><span style=display:flex><span> ch.pipeline().addLast(<span style=color:#719e07>new</span> QosProcessHandler(frameworkModel, welcome, acceptForeignIp));
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> });
</span></span><span style=display:flex><span> <span style=color:#719e07>try</span> {
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (StringUtils.isBlank(host)) {
</span></span><span style=display:flex><span> serverBootstrap.bind(port).sync();
</span></span><span style=display:flex><span> } <span style=color:#719e07>else</span> {
</span></span><span style=display:flex><span> serverBootstrap.bind(host, port).sync();
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> logger.info(<span style=color:#2aa198>&#34;qos-server bind localhost:&#34;</span> <span style=color:#719e07>+</span> port);
</span></span><span style=display:flex><span> } <span style=color:#719e07>catch</span> (Throwable throwable) {
</span></span><span style=display:flex><span> logger.error(<span style=color:#2aa198>&#34;qos-server can not bind localhost:&#34;</span> <span style=color:#719e07>+</span> port, throwable);
</span></span><span style=display:flex><span> <span style=color:#719e07>throw</span> throwable;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p>QOS处理器为QosProcessHandler关于QosProcessHandler的细节这里先不说</p><p>最后一个不同的地方调用链路走的这个 RegistryProtocol</p><h3 id=1672-通过注册协议导出服务与注册服务的流程>16.7.2 通过注册协议导出服务与注册服务的流程</h3><p>RegistryProtocol的导出方法:
这个方法非常重要也是服务注册的核心代码,先概括下包含了哪些步骤</p><ul><li>覆盖配置</li><li>导出协议端口开启TCP服务</li><li>注册到注册中心</li><li>通知服务启动了</li></ul><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Exporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>export</span>(<span style=color:#268bd2>final</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> originInvoker) <span style=color:#268bd2>throws</span> RpcException {
</span></span><span style=display:flex><span> <span style=color:#586e75>//service-discovery-registry://8.131.79.126:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-provider&amp;dubbo=2.0.2&amp;pid=14256&amp;registry=zookeeper&amp;release=3.0.8&amp;timestamp=1653710477057</span>
</span></span><span style=display:flex><span> URL registryUrl <span style=color:#719e07>=</span> getRegistryUrl(originInvoker);
</span></span><span style=display:flex><span> <span style=color:#586e75>// url to export locally</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//dubbo://192.168.1.9:20880/link.elastic.dubbo.entity.DemoService?anyhost=true&amp;application=dubbo-demo-api-provider&amp;background=false&amp;bind.ip=192.168.1.9&amp;bind.port=20880&amp;deprecated=false&amp;dubbo=2.0.2&amp;dynamic=true&amp;generic=false&amp;interface=link.elastic.dubbo.entity.DemoService&amp;methods=sayHello,sayHelloAsync&amp;pid=14256&amp;release=3.0.8&amp;service-name-mapping=true&amp;side=provider&amp;timestamp=1653710479073</span>
</span></span><span style=display:flex><span> URL providerUrl <span style=color:#719e07>=</span> getProviderUrl(originInvoker);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// Subscribe the override data</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// FIXME When the provider subscribes, it will affect the scene : a certain JVM exposes the service and call</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// the same service. Because the subscribed is cached key with the name of the service, it causes the</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// subscription information to cover.</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//provider://192.168.1.9:20880/link.elastic.dubbo.entity.DemoService?anyhost=true&amp;application=dubbo-demo-api-provider&amp;background=false&amp;bind.ip=192.168.1.9&amp;bind.port=20880&amp;category=configurators&amp;check=false&amp;deprecated=false&amp;dubbo=2.0.2&amp;dynamic=true&amp;generic=false&amp;interface=link.elastic.dubbo.entity.DemoService&amp;methods=sayHello,sayHelloAsync&amp;pid=14256&amp;release=3.0.8&amp;service-name-mapping=true&amp;side=provider&amp;timestamp=1653710479073</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>final</span> URL overrideSubscribeUrl <span style=color:#719e07>=</span> getSubscribedOverrideUrl(providerUrl);
</span></span><span style=display:flex><span> <span style=color:#586e75>//override配置</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>final</span> OverrideListener overrideSubscribeListener <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> OverrideListener(overrideSubscribeUrl, originInvoker);
</span></span><span style=display:flex><span> Map<span style=color:#719e07>&lt;</span>URL, NotifyListener<span style=color:#719e07>&gt;</span> overrideListeners <span style=color:#719e07>=</span> getProviderConfigurationListener(providerUrl).getOverrideListeners();
</span></span><span style=display:flex><span> overrideListeners.put(registryUrl, overrideSubscribeListener);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> providerUrl <span style=color:#719e07>=</span> overrideUrlWithConfig(providerUrl, overrideSubscribeListener);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//export invoker</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>final</span> ExporterChangeableWrapper<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> exporter <span style=color:#719e07>=</span> doLocalExport(originInvoker, providerUrl);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// url to registry</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//通过URL获取 注册中心Registry操作对象</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>final</span> Registry registry <span style=color:#719e07>=</span> getRegistry(registryUrl);
</span></span><span style=display:flex><span> <span style=color:#586e75>//需要向注册中心注册地址转换</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//dubbo://192.168.1.9:20880/link.elastic.dubbo.entity.DemoService?anyhost=true&amp;application=dubbo-demo-api-provider&amp;background=false&amp;deprecated=false&amp;dubbo=2.0.2&amp;dynamic=true&amp;generic=false&amp;interface=link.elastic.dubbo.entity.DemoService&amp;methods=sayHello,sayHelloAsync&amp;pid=14656&amp;release=3.0.8&amp;service-name-mapping=true&amp;side=provider&amp;timestamp=1653711086189</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>final</span> URL registeredProviderUrl <span style=color:#719e07>=</span> getUrlToRegistry(providerUrl, registryUrl);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// decide if we need to delay publish (provider itself and registry should both need to register)</span>
</span></span><span style=display:flex><span> <span style=color:#dc322f>boolean</span> register <span style=color:#719e07>=</span> providerUrl.getParameter(REGISTER_KEY, <span style=color:#cb4b16>true</span>) <span style=color:#719e07>&amp;&amp;</span> registryUrl.getParameter(REGISTER_KEY, <span style=color:#cb4b16>true</span>);
</span></span><span style=display:flex><span> <span style=color:#586e75>//是否向注册中心注册</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (register) {
</span></span><span style=display:flex><span> register(registry, registeredProviderUrl);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// register stated url on provider model</span>
</span></span><span style=display:flex><span> registerStatedUrl(registryUrl, registeredProviderUrl, register);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> exporter.setRegisterUrl(registeredProviderUrl);
</span></span><span style=display:flex><span> exporter.setSubscribeUrl(overrideSubscribeUrl);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>registry.isServiceDiscovery()) {
</span></span><span style=display:flex><span> <span style=color:#586e75>// Deprecated! Subscribe to override rules in 2.6.x or before.</span>
</span></span><span style=display:flex><span> registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//内置监听器通知 这个不是通知消费者的</span>
</span></span><span style=display:flex><span> notifyExport(exporter);
</span></span><span style=display:flex><span> <span style=color:#586e75>//Ensure that a new exporter instance is returned every time export</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> <span style=color:#719e07>new</span> DestroyableExporter<span style=color:#719e07>&lt;&gt;</span>(exporter);
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h2 id=168-dolocalexport本地导出协议开启端口>16.8 doLocalExport本地导出协议开启端口</h2><p>前面已经看过了本地协议JVM协议的服务导出和注册中心配置的导出,这里可以直接看一些关键代码:</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>private</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> ExporterChangeableWrapper<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>doLocalExport</span>(<span style=color:#268bd2>final</span> Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> originInvoker, URL providerUrl) {
</span></span><span style=display:flex><span> String key <span style=color:#719e07>=</span> getCacheKey(originInvoker);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> (ExporterChangeableWrapper<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span>) bounds.computeIfAbsent(key, s <span style=color:#719e07>-&gt;</span> {
</span></span><span style=display:flex><span> Invoker<span style=color:#719e07>&lt;?&gt;</span> invokerDelegate <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> InvokerDelegate<span style=color:#719e07>&lt;&gt;</span>(originInvoker, providerUrl);
</span></span><span style=display:flex><span> <span style=color:#586e75>//代码中用的这个protoco对象是dubbo自动生成的适配器对象protocol$Adaptive 适配器对象会根据当前协议的参数来查询具体的协议扩展对象</span>
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> <span style=color:#719e07>new</span> ExporterChangeableWrapper<span style=color:#719e07>&lt;&gt;</span>((Exporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span>) protocol.export(invokerDelegate), originInvoker);
</span></span><span style=display:flex><span> });
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p>上面这个protocol$Adaptive 协议的export导出方法与之前的一样也会经历下面几个过程,具体细节可以参考JVM协议的导出:</p><ul><li>ProtocolSerializationWrapper</li><li>ProtocolFilterWrapper</li><li>ProtocolListenerWrapper</li><li>QosProtocolWrapper</li><li>唯一不同的是我们这里对应的协议扩展类型为DubboProtocol、
接下来来看下DubboProtocol的导出服务export方法实现:</li></ul><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>@Override</span>
</span></span><span style=display:flex><span> <span style=color:#268bd2>public</span> <span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> Exporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> <span style=color:#268bd2>export</span>(Invoker<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> invoker) <span style=color:#268bd2>throws</span> RpcException {
</span></span><span style=display:flex><span> checkDestroyed();
</span></span><span style=display:flex><span> <span style=color:#586e75>//服务提供者的url参考例子dubbo://192.168.1.9:20880/link.elastic.dubbo.entity.DemoService?anyhost=true&amp;application=dubbo-demo-api-provider&amp;background=false&amp;bind.ip=192.168.1.9&amp;bind.port=20880&amp;deprecated=false&amp;dubbo=2.0.2&amp;dynamic=true&amp;generic=false&amp;interface=link.elastic.dubbo.entity.DemoService&amp;methods=sayHello,sayHelloAsync&amp;pid=6043&amp;release=3.0.8&amp;service-name-mapping=true&amp;side=provider&amp;timestamp=1654224285437</span>
</span></span><span style=display:flex><span> URL url <span style=color:#719e07>=</span> invoker.getUrl();
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>// export service.</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//生成服务的key参考:link.elastic.dubbo.entity.DemoService:20880</span>
</span></span><span style=display:flex><span> String key <span style=color:#719e07>=</span> serviceKey(url);
</span></span><span style=display:flex><span> <span style=color:#586e75>//创建导出服务用的导出器DubboExporter</span>
</span></span><span style=display:flex><span> DubboExporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span> exporter <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> DubboExporter<span style=color:#719e07>&lt;</span>T<span style=color:#719e07>&gt;</span>(invoker, key, exporterMap);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//export a stub service for dispatching event</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//stub配置校验</span>
</span></span><span style=display:flex><span> Boolean isStubSupportEvent <span style=color:#719e07>=</span> url.getParameter(STUB_EVENT_KEY, DEFAULT_STUB_EVENT);
</span></span><span style=display:flex><span> Boolean isCallbackservice <span style=color:#719e07>=</span> url.getParameter(IS_CALLBACK_SERVICE, <span style=color:#cb4b16>false</span>);
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (isStubSupportEvent <span style=color:#719e07>&amp;&amp;</span> <span style=color:#719e07>!</span>isCallbackservice) {
</span></span><span style=display:flex><span> String stubServiceMethods <span style=color:#719e07>=</span> url.getParameter(STUB_EVENT_METHODS_KEY);
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (stubServiceMethods <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span> <span style=color:#719e07>||</span> stubServiceMethods.length() <span style=color:#719e07>==</span> 0) {
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (logger.isWarnEnabled()) {
</span></span><span style=display:flex><span> logger.warn(<span style=color:#719e07>new</span> IllegalStateException(<span style=color:#2aa198>&#34;consumer [&#34;</span> <span style=color:#719e07>+</span> url.getParameter(INTERFACE_KEY) <span style=color:#719e07>+</span>
</span></span><span style=display:flex><span> <span style=color:#2aa198>&#34;], has set stubproxy support event ,but no stub methods founded.&#34;</span>));
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//创建服务开启服务端口</span>
</span></span><span style=display:flex><span> openServer(url);
</span></span><span style=display:flex><span> <span style=color:#586e75>//</span>
</span></span><span style=display:flex><span> optimizeSerialization(url);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> exporter;
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h3 id=开启服务端口>开启服务端口</h3><p>这里就到了RPC协议的TCP通信模块了,对应DubboProtocol 的 openServer(url);方法</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span> <span style=color:#268bd2>private</span> <span style=color:#dc322f>void</span> <span style=color:#268bd2>openServer</span>(URL url) {
</span></span><span style=display:flex><span> checkDestroyed();
</span></span><span style=display:flex><span> <span style=color:#586e75>// find server. 地址作为key这里是192.168.1.9:20880</span>
</span></span><span style=display:flex><span> String key <span style=color:#719e07>=</span> url.getAddress();
</span></span><span style=display:flex><span> <span style=color:#586e75>// client can export a service which only for server to invoke</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//默认提供者开启服务,消费者是不能开启服务的</span>
</span></span><span style=display:flex><span> <span style=color:#dc322f>boolean</span> isServer <span style=color:#719e07>=</span> url.getParameter(IS_SERVER_KEY, <span style=color:#cb4b16>true</span>);
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (isServer) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//协议服务器 下面一个双重校验锁检查,如果为空则创建服务</span>
</span></span><span style=display:flex><span> ProtocolServer server <span style=color:#719e07>=</span> serverMap.get(key);
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (server <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span>) {
</span></span><span style=display:flex><span> <span style=color:#268bd2>synchronized</span> (<span style=color:#719e07>this</span>) {
</span></span><span style=display:flex><span> server <span style=color:#719e07>=</span> serverMap.get(key);
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (server <span style=color:#719e07>==</span> <span style=color:#cb4b16>null</span>) {
</span></span><span style=display:flex><span> serverMap.put(key, createServer(url));
</span></span><span style=display:flex><span> }<span style=color:#719e07>else</span> {
</span></span><span style=display:flex><span> server.reset(url);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> } <span style=color:#719e07>else</span> {
</span></span><span style=display:flex><span> <span style=color:#586e75>// server supports reset, use together with override</span>
</span></span><span style=display:flex><span> server.reset(url);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><p>为当前地址创建协议服务对应方法如下:
DubboProtocol的createServer方法</p><div class=highlight><pre tabindex=0 style=color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-java data-lang=java><span style=display:flex><span><span style=color:#268bd2>private</span> ProtocolServer <span style=color:#268bd2>createServer</span>(URL url) {
</span></span><span style=display:flex><span> <span style=color:#586e75>//下面将url增加了心跳参数最终如下dubbo://192.168.1.9:20880/link.elastic.dubbo.entity.DemoService?anyhost=true&amp;application=dubbo-demo-api-provider&amp;background=false&amp;bind.ip=192.168.1.9&amp;bind.port=20880&amp;channel.readonly.sent=true&amp;codec=dubbo&amp;deprecated=false&amp;dubbo=2.0.2&amp;dynamic=true&amp;generic=false&amp;heartbeat=60000&amp;interface=link.elastic.dubbo.entity.DemoService&amp;methods=sayHello,sayHelloAsync&amp;pid=6700&amp;release=3.0.8&amp;service-name-mapping=true&amp;side=provider&amp;timestamp=1654225251112</span>
</span></span><span style=display:flex><span> url <span style=color:#719e07>=</span> URLBuilder.from(url)
</span></span><span style=display:flex><span> <span style=color:#586e75>// send readonly event when server closes, it&#39;s enabled by default</span>
</span></span><span style=display:flex><span> .addParameterIfAbsent(CHANNEL_READONLYEVENT_SENT_KEY, Boolean.TRUE.toString())
</span></span><span style=display:flex><span> <span style=color:#586e75>// enable heartbeat by default</span>
</span></span><span style=display:flex><span> .addParameterIfAbsent(HEARTBEAT_KEY, String.valueOf(DEFAULT_HEARTBEAT))
</span></span><span style=display:flex><span> .addParameter(CODEC_KEY, DubboCodec.NAME)
</span></span><span style=display:flex><span> .build();
</span></span><span style=display:flex><span> <span style=color:#586e75>//这里服务端使用的网络库这里是默认值netty</span>
</span></span><span style=display:flex><span> String str <span style=color:#719e07>=</span> url.getParameter(SERVER_KEY, DEFAULT_REMOTING_SERVER);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (StringUtils.isNotEmpty(str) <span style=color:#719e07>&amp;&amp;</span> <span style=color:#719e07>!</span>url.getOrDefaultFrameworkModel().getExtensionLoader(Transporter.class).hasExtension(str)) {
</span></span><span style=display:flex><span> <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> RpcException(<span style=color:#2aa198>&#34;Unsupported server type: &#34;</span> <span style=color:#719e07>+</span> str <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34;, url: &#34;</span> <span style=color:#719e07>+</span> url);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#586e75>//dubbo交换器层对象创建</span>
</span></span><span style=display:flex><span> ExchangeServer server;
</span></span><span style=display:flex><span> <span style=color:#719e07>try</span> {
</span></span><span style=display:flex><span> <span style=color:#586e75>//这个方法会绑定端口,关于交换器与传输网络层到后面统一说</span>
</span></span><span style=display:flex><span> <span style=color:#586e75>//这里通过绑定url和请求处理器来创建交换器对象</span>
</span></span><span style=display:flex><span> server <span style=color:#719e07>=</span> Exchangers.bind(url, requestHandler);
</span></span><span style=display:flex><span> } <span style=color:#719e07>catch</span> (RemotingException e) {
</span></span><span style=display:flex><span> <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> RpcException(<span style=color:#2aa198>&#34;Fail to start server(url: &#34;</span> <span style=color:#719e07>+</span> url <span style=color:#719e07>+</span> <span style=color:#2aa198>&#34;) &#34;</span> <span style=color:#719e07>+</span> e.getMessage(), e);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> str <span style=color:#719e07>=</span> url.getParameter(CLIENT_KEY);
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (StringUtils.isNotEmpty(str)) {
</span></span><span style=display:flex><span> Set<span style=color:#719e07>&lt;</span>String<span style=color:#719e07>&gt;</span> supportedTypes <span style=color:#719e07>=</span> url.getOrDefaultFrameworkModel().getExtensionLoader(Transporter.class).getSupportedExtensions();
</span></span><span style=display:flex><span> <span style=color:#719e07>if</span> (<span style=color:#719e07>!</span>supportedTypes.contains(str)) {
</span></span><span style=display:flex><span> <span style=color:#719e07>throw</span> <span style=color:#719e07>new</span> RpcException(<span style=color:#2aa198>&#34;Unsupported client type: &#34;</span> <span style=color:#719e07>+</span> str);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> DubboProtocolServer protocolServer <span style=color:#719e07>=</span> <span style=color:#719e07>new</span> DubboProtocolServer(server);
</span></span><span style=display:flex><span> <span style=color:#586e75>//关闭等待时长默认为10秒</span>
</span></span><span style=display:flex><span> loadServerProperties(protocolServer);
</span></span><span style=display:flex><span> <span style=color:#719e07>return</span> protocolServer;
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><h2 id=169-向注册中心注册服务register>16.9 向注册中心注册服务register</h2><p>这个细节在下个博客中说涉及到Dubbo3的双注册</p><p>原文地址:<a href=https://blog.elastic.link/2022/07/10/dubbo/16-mo-kuai-fa-bu-qi-fa-bu-fu-wu-quan-guo-cheng/>16-模块发布器发布服务全过程</a></p><ul class="list-unstyled d-flex justify-content-between align-items-center mb-0 pt-5"><li><a href=/zh-cn/blog/2022/08/15/15-dubbo%E7%9A%84%E4%B8%89%E5%A4%A7%E4%B8%AD%E5%BF%83%E4%B9%8B%E5%85%83%E6%95%B0%E6%8D%AE%E4%B8%AD%E5%BF%83%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/ aria-label="上一页 - 15-Dubbo的三大中心之元数据中心源码解析" class="btn btn-primary"><span class=mr-1></span>上一页</a></li><li><a href=/zh-cn/blog/2022/08/17/17-dubbo%E6%9C%8D%E5%8A%A1%E6%8F%90%E4%BE%9B%E8%80%85%E7%9A%84%E5%8F%8C%E6%B3%A8%E5%86%8C%E5%8E%9F%E7%90%86/ aria-label="下一页 - 17-Dubbo服务提供者的双注册原理" class="btn btn-primary">下一页<span class=ml-1></span></a></li></ul></div><div id=pre-footer><h2>反馈</h2><p class=feedback--prompt>此页是否对您有帮助?</p><button class="btn btn-primary mb-4 feedback--yes"></button>
<button class="btn btn-primary mb-4 feedback--no"></button></div><script>const yes=document.querySelector(".feedback--yes"),no=document.querySelector(".feedback--no");document.querySelectorAll(".feedback--link").forEach(e=>{e.href=e.href+window.location.pathname});const sendFeedback=e=>{gtag||console.log("!gtag"),gtag("event","click",{event_category:"Helpful",event_label:window.location.pathname,value:e})},disableButtons=()=>{yes.disabled=!0,yes.classList.add("feedback--button__disabled"),no.disabled=!0,no.classList.add("feedback--button__disabled")};yes.addEventListener("click",()=>{sendFeedback(1),disableButtons(),document.querySelector(".feedback--response").classList.remove("feedback--response__hidden")}),no.addEventListener("click",()=>{sendFeedback(0),disableButtons(),document.querySelector(".feedback--response").classList.remove("feedback--response__hidden")})</script></main><div class="d-none d-xl-block col-xl-2 td-toc d-print-none"><div class="td-page-meta ml-2 pb-1 pt-2 mb-0"><a href=https://github.com/apache/dubbo-website/edit/master/content/zh-cn/blog/java/codeanalysis/3.0.8/16-%e6%a8%a1%e5%9d%97%e5%8f%91%e5%b8%83%e5%99%a8%e5%8f%91%e5%b8%83%e6%9c%8d%e5%8a%a1%e5%85%a8%e8%bf%87%e7%a8%8b.md target=_blank><i class="fa fa-edit fa-fw"></i> 编辑此页</a>
<a href="https://github.com/apache/dubbo-website/new/master/content/zh-cn/blog/java/codeanalysis/3.0.8/16-%e6%a8%a1%e5%9d%97%e5%8f%91%e5%b8%83%e5%99%a8%e5%8f%91%e5%b8%83%e6%9c%8d%e5%8a%a1%e5%85%a8%e8%bf%87%e7%a8%8b.md?filename=change-me.md&amp;value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+the+top+of+the+page+%28weight+controls+how+its+ordered+amongst+other+pages+in+the+same+directory%3B+lowest+number+first%29.%0A%2A+Add+a+good+commit+message+at+the+bottom+of+the+page+%28%3C80+characters%3B+use+the+extended+description+field+for+more+detail%29.%0A%2A+Create+a+new+branch+so+you+can+preview+your+new+file+and+request+a+review+via+Pull+Request.%0A" target=_blank><i class="fa fa-edit fa-fw"></i> 创建子页面</a>
<a href="https://github.com/apache/dubbo-website/issues/new?title=16-%e6%a8%a1%e5%9d%97%e5%8f%91%e5%b8%83%e5%99%a8%e5%8f%91%e5%b8%83%e6%9c%8d%e5%8a%a1%e5%85%a8%e8%bf%87%e7%a8%8b" target=_blank><i class="fab fa-github fa-fw"></i> 登记问题</a>
<a href=https://github.com/apache/dubbo/issues/new target=_blank><i class="fas fa-tasks fa-fw"></i> 提交项目问题</a></div><nav id=TableOfContents><ul><li><a href=#161-简介>16.1 简介</a></li><li><a href=#162-导出服务的入口>16.2 导出服务的入口</a></li><li><a href=#163-服务配置导出服务模板方法>16.3 服务配置导出服务模板方法</a><ul><li><a href=#1631-服务配置导出服务前的初始化方法>16.3.1 服务配置导出服务前的初始化方法</a></li></ul></li><li><a href=#164-服务配置导出服务模板方法2>16.4 服务配置导出服务模板方法2</a><ul><li><a href=#1641-导出服务的url配置逻辑>16.4.1 导出服务的URL配置逻辑</a></li><li><a href=#1642-应用级和接口级服务注册地址获取>16.4.2 应用级和接口级服务注册地址获取</a></li></ul></li><li><a href=#165-导出服务配置到本地和注册中心>16.5 导出服务配置到本地和注册中心</a><ul><li><a href=#1651-导出服务配置的doexporturlsfor1protocol方法>16.5.1 导出服务配置的doExportUrlsFor1Protocol方法</a></li><li><a href=#1652-导出服务配置模板方法>16.5.2 导出服务配置模板方法</a></li></ul></li><li><a href=#166-导出服务到本地>16.6 导出服务到本地</a><ul><li><a href=#1661-doexporturl方法>16.6.1 doExportUrl方法</a></li><li><a href=#1662-javassistproxyfactory类型的getinvoker方法>16.6.2 JavassistProxyFactory类型的getInvoker方法</a></li><li><a href=#1663-使用协议导出调用对象-export>16.6.3 使用协议导出调用对象 export</a></li><li><a href=#16631-协议序列化机制protocolserializationwrapper>16.6.3.1 协议序列化机制ProtocolSerializationWrapper</a></li><li><a href=#16632-协议过滤器wrapper-protocolfilterwrapper>16.6.3.2 协议过滤器Wrapper ProtocolFilterWrapper</a></li><li><a href=#16633-协议监听器wrapper-protocollistenerwrapper>16.6.3.3 协议监听器Wrapper ProtocolListenerWrapper</a></li><li><a href=#16634-qos的协议wrapper-qosprotocolwrapper>16.6.3.4 QOS的协议Wrapper QosProtocolWrapper</a></li><li><a href=#16635-injvmprotocol-的导出方法>16.6.3.5 InjvmProtocol 的导出方法</a></li></ul></li><li><a href=#167-导出服务到注册中心>16.7 导出服务到注册中心</a><ul><li><a href=#1671---doexporturl方法>16.7.1 doExportUrl方法</a></li><li><a href=#1672-通过注册协议导出服务与注册服务的流程>16.7.2 通过注册协议导出服务与注册服务的流程</a></li></ul></li><li><a href=#168-dolocalexport本地导出协议开启端口>16.8 doLocalExport本地导出协议开启端口</a><ul><li><a href=#开启服务端口>开启服务端口</a></li></ul></li><li><a href=#169-向注册中心注册服务register>16.9 向注册中心注册服务register</a></li></ul></nav><div class="taxonomy taxonomy-terms-cloud taxo-tags"><h5 class=taxonomy-title>Tags</h5><ul class=taxonomy-terms><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/apachecon2023/ data-taxonomy-term=apachecon2023><span class=taxonomy-label>apachecon2023</span><span class=taxonomy-count>7</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/browser/ data-taxonomy-term=browser><span class=taxonomy-label>browser</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/dubbo-aot/ data-taxonomy-term=dubbo-aot><span class=taxonomy-label>dubbo aot</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/dubbo-js/ data-taxonomy-term=dubbo-js><span class=taxonomy-label>dubbo-js</span><span class=taxonomy-count>2</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/ecosystem/ data-taxonomy-term=ecosystem><span class=taxonomy-label>ecosystem</span><span class=taxonomy-count>2</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/go/ data-taxonomy-term=go><span class=taxonomy-label>Go</span><span class=taxonomy-count>28</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/graalvm/ data-taxonomy-term=graalvm><span class=taxonomy-label>GraalVM</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/java/ data-taxonomy-term=java><span class=taxonomy-label>Java</span><span class=taxonomy-count>92</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/metrics/ data-taxonomy-term=metrics><span class=taxonomy-label>metrics</span><span class=taxonomy-count>2</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/native-image/ data-taxonomy-term=native-image><span class=taxonomy-label>Native Image</span><span class=taxonomy-count>2</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/node.js/ data-taxonomy-term=node.js><span class=taxonomy-label>node.js</span><span class=taxonomy-count>2</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/observability/ data-taxonomy-term=observability><span class=taxonomy-label>observability</span><span class=taxonomy-count>2</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/opensergo/ data-taxonomy-term=opensergo><span class=taxonomy-label>opensergo</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/pixiu/ data-taxonomy-term=pixiu><span class=taxonomy-label>Pixiu</span><span class=taxonomy-count>2</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/proposals/ data-taxonomy-term=proposals><span class=taxonomy-label>Proposals</span><span class=taxonomy-count>2</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/protocol/ data-taxonomy-term=protocol><span class=taxonomy-label>protocol</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/release-notes/ data-taxonomy-term=release-notes><span class=taxonomy-label>Release Notes</span><span class=taxonomy-count>11</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/rust/ data-taxonomy-term=rust><span class=taxonomy-label>Rust</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/seata/ data-taxonomy-term=seata><span class=taxonomy-label>seata</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/spring-cloud/ data-taxonomy-term=spring-cloud><span class=taxonomy-label>spring-cloud</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/tracing/ data-taxonomy-term=tracing><span class=taxonomy-label>tracing</span><span class=taxonomy-count>2</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/triple/ data-taxonomy-term=triple><span class=taxonomy-label>triple</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/web/ data-taxonomy-term=web><span class=taxonomy-label>web</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/%E6%94%BF%E9%87%87%E4%BA%91/ data-taxonomy-term=%E6%94%BF%E9%87%87%E4%BA%91><span class=taxonomy-label>政采云</span><span class=taxonomy-count>1</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/%E6%96%B0%E9%97%BB%E5%8A%A8%E6%80%81/ data-taxonomy-term=%E6%96%B0%E9%97%BB%E5%8A%A8%E6%80%81><span class=taxonomy-label>新闻动态</span><span class=taxonomy-count>24</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90/ data-taxonomy-term=%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90><span class=taxonomy-label>源码解析</span><span class=taxonomy-count>34</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/%E7%94%9F%E6%80%81/ data-taxonomy-term=%E7%94%9F%E6%80%81><span class=taxonomy-label>生态</span><span class=taxonomy-count>14</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/%E7%94%A8%E6%88%B7%E6%A1%88%E4%BE%8B/ data-taxonomy-term=%E7%94%A8%E6%88%B7%E6%A1%88%E4%BE%8B><span class=taxonomy-label>用户案例</span><span class=taxonomy-count>11</span></a></li><li><a class=taxonomy-term href=https://cn.dubbo.apache.org/zh-cn/tags/%E7%BD%91%E5%85%B3/ data-taxonomy-term=%E7%BD%91%E5%85%B3><span class=taxonomy-label>网关</span><span class=taxonomy-count>4</span></a></li></ul></div></div></div></div></div><footer class="bg-dark py-5 row d-print-none footer-margin-0"><div class="container-fluid mx-sm-5"><div class=row><div class="col-6 col-sm-4 text-xs-center order-sm-2"><ul class="list-inline mb-0"><li class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top title="Dubbo mailing list archive" aria-label="Dubbo mailing list archive"><a class=text-white target=_blank rel="noopener noreferrer" href=https://lists.apache.org/list.html?dev@dubbo.apache.org><i class="fa fa-envelope"></i></a></li></ul></div><div class="col-6 col-sm-4 text-right text-xs-center order-sm-3"><ul class="list-inline mb-0"><li class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top title=GitHub aria-label=GitHub><a class=text-white target=_blank rel="noopener noreferrer" href=https://github.com/apache/dubbo><i class="fab fa-github"></i></a></li><li class="list-inline-item mx-2 h3" data-toggle=tooltip data-placement=top title="Subscribe to mailing list" aria-label="Subscribe to mailing list"><a class=text-white target=_blank rel="noopener noreferrer" href=mailto:dev-subscribe@dubbo.apache.org><i class="fa fa-envelope"></i></a></li></ul></div><div class="col-12 col-sm-4 text-center py-2 order-sm-2"><small class=text-white>&copy; 2024 The Apache Software Foundation. Apache and the Apache feather logo are trademarks of The Apache Software Foundation. 保留所有权利</small></div></div></div></footer><div class="row pt-2 pb-2 footer-margin-0"><div class="container-fluid mx-sm-5"><div class=text-center id=my-footer><img alt=apache_logo src=/imgs/apache_logo.png><ul><li><a href=https://www.apache.org>Foundation</a></li><li><a href=https://www.apache.org/licenses/>License</a></li><li><a href=https://dubbo.apache.org/en/overview/notices/>Security</a></li><li><a href=https://www.apache.org/events/current-event>Events</a></li><li><a href=https://www.apache.org/foundation/sponsorship.html>Sponsorship</a></li><li><a href=https://privacy.apache.org/policies/privacy-policy-public.html>Privacy</a></li><li><a href=https://www.apache.org/foundation/thanks.html>Thanks</a></li></ul></div></div></div><script src=/js/popper.min.js integrity=sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49 crossorigin=anonymous></script><script src=/js/bootstrap.min.js integrity=sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy crossorigin=anonymous></script><script src=/js/main.min.b075178d232d3b0039b3cb6af2fc2e9d90071820167a60f4eea3a79169975ee8.js integrity="sha256-sHUXjSMtOwA5s8tq8vwunZAHGCAWemD07qOnkWmXXug=" crossorigin=anonymous></script><script async src=https://widget.kapa.ai/kapa-widget.bundle.js data-website-id=d763c4f2-f871-400b-aeca-d986c4af73c2 data-project-name="Apache Dubbo" data-project-color=#E8442E data-button-text="Ask AI" data-search-mode-enabled=true data-modal-open-on-command-k=true data-modal-disclaimer="The AI supports multiple languages, but it may not be accessible in China due to recaptcha, a proxy is required." data-project-logo=https://pbs.twimg.com/profile_images/1011849068283191302/FJbH5vbF_400x400.jpg data-modal-example-questions="What is Apache Dubbo?,How to run Apache Dubbo?" data-button-position-top data-button-position-right=20px data-button-position-bottom=200px data-button-position-left></script><script>(function(e,t,n,s){e[s]=e[s]||[];var a=t.getElementsByTagName(n)[0],i=t.createElement(n);i.async=!0,i.id="beacon-aplus",i.setAttribute("exparams","userid=&aplus&sidx=aplusSidex&ckx=aplusCkx"),i.src="//g.alicdn.com/alilog/mlog/aplus_v2.js",i.crossorigin="anonymous",a.parentNode.insertBefore(i,a)})(window,document,"script","aplus_queue"),function(e){var t=e.createElement("script");t.type="text/javascript",t.async=!0,t.src="//g.alicdn.com/aes/??tracker/3.3.4/index.js,tracker-plugin-pv/3.0.5/index.js,tracker-plugin-event/3.0.0/index.js,tracker-plugin-autolog/3.0.3/index.js,tracker-plugin-survey/3.0.3/index.js,tracker-plugin-jserror/3.0.3/index.js,tracker-plugin-resourceError/3.0.3/index.js",t.onload=function(){window.AES_CONFIG=window.AES_CONFIG||{env:"prod"},window.aes=new AES({pid:"zN245h",user_type:6}),window.AESPluginAutologConfig={exposure:"auto"},window.AEMPluginInstances=[aes.use(AESPluginPV,window.AESPluginPVConfig||{enableHistory:!0}),aes.use(AESPluginEvent,window.AESPluginEventConfig||{}),aes.use(AESPluginSurvey,window.AESPluginEventConfig||{}),aes.use(AESPluginAutolog,window.AESPluginAutologConfig||{}),aes.use(AESPluginJSError,window.AESPluginJSError||{}),aes.use(AESPluginResourceError,window.AESPluginResourceError||{})]},setTimeout(function(){e.getElementsByTagName("body")[0].appendChild(t)},800)}(document)</script></body></html>