| <!doctype html> |
| <html lang="en" dir="ltr" class="blog-wrapper blog-post-page plugin-blog plugin-id-default" data-has-hydrated="false"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="generator" content="Docusaurus v3.10.1"> |
| <title data-rh="true">Register Center Source Code Analysis of Http Register | Apache ShenYu</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://shenyu.apache.org/blog/RegisterCenter-SourceCode-Analysis-Http-Register"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" property="og:locale:alternate" content="zh"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="Register Center Source Code Analysis of Http Register | Apache ShenYu"><meta data-rh="true" name="description" content="Apache ShenYu is an asynchronous, high-performance, cross-language, responsive API gateway."><meta data-rh="true" property="og:description" content="Apache ShenYu is an asynchronous, high-performance, cross-language, responsive API gateway."><meta data-rh="true" property="og:type" content="article"><meta data-rh="true" property="article:published_time" content="2026-07-04T04:51:57.000Z"><meta data-rh="true" property="article:author" content="https://github.com/midnight2104"><meta data-rh="true" property="article:tag" content="http,register center,Apache ShenYu"><link data-rh="true" rel="icon" href="/img/favicon.svg"><link data-rh="true" rel="canonical" href="https://shenyu.apache.org/blog/RegisterCenter-SourceCode-Analysis-Http-Register"><link data-rh="true" rel="alternate" href="https://shenyu.apache.org/blog/RegisterCenter-SourceCode-Analysis-Http-Register" hreflang="en"><link data-rh="true" rel="alternate" href="https://shenyu.apache.org/zh/blog/RegisterCenter-SourceCode-Analysis-Http-Register" hreflang="zh"><link data-rh="true" rel="alternate" href="https://shenyu.apache.org/blog/RegisterCenter-SourceCode-Analysis-Http-Register" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BlogPosting","@id":"https://shenyu.apache.org/blog/RegisterCenter-SourceCode-Analysis-Http-Register","mainEntityOfPage":"https://shenyu.apache.org/blog/RegisterCenter-SourceCode-Analysis-Http-Register","url":"https://shenyu.apache.org/blog/RegisterCenter-SourceCode-Analysis-Http-Register","headline":"Register Center Source Code Analysis of Http Register","name":"Register Center Source Code Analysis of Http Register","description":"Apache ShenYu is an asynchronous, high-performance, cross-language, responsive API gateway.","datePublished":"2026-07-04T04:51:57.000Z","author":{"@type":"Person","name":"midnight2104","description":"Apache ShenYu Committer","url":"https://github.com/midnight2104"},"keywords":[],"isPartOf":{"@type":"Blog","@id":"https://shenyu.apache.org/blog","name":"Blog"}}</script><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Apache ShenYu RSS Feed"> |
| <link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache ShenYu Atom Feed"> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <link rel="alternate" type="application/rss+xml" href="/news/rss.xml" title="Apache ShenYu RSS Feed"> |
| <link rel="alternate" type="application/atom+xml" href="/news/atom.xml" title="Apache ShenYu Atom Feed"> |
| |
| <script src="/js/error-suppression.js"></script><link rel="stylesheet" href="/assets/css/styles.be5ddbfc.css"> |
| <script src="/assets/js/runtime~main.8ca3dc91.js" defer="defer"></script> |
| <script src="/assets/js/main.e927b711.js" defer="defer"></script> |
| </head> |
| <body> |
| <svg style="display: none;"><defs> |
| <symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol> |
| </defs></svg> |
| <script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||"light"),document.documentElement.setAttribute("data-theme-choice",t||"light")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logo.svg" alt="Apache ShenYu Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/img/logo-light.svg" alt="Apache ShenYu Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div></a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a class="navbar__item navbar__link" href="/download">Download</a><a class="navbar__item navbar__link" href="/document">Docs</a><a class="navbar__item navbar__link" href="/community/contributor-guide">Community</a><a class="navbar__item navbar__link" href="/team">Team</a><a class="navbar__item navbar__link" href="/event">Event</a><a class="navbar__item navbar__link" href="/news">News</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/blog">Blog</a><a class="navbar__item navbar__link" href="/users">Users</a><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">ASF</a><ul class="dropdown__menu"><li><a href="https://www.apache.org/" target="_blank" rel="noopener noreferrer" class="dropdown__link">Foundation</a></li><li><a href="https://www.apache.org/licenses/" target="_blank" rel="noopener noreferrer" class="dropdown__link">License</a></li><li><a href="https://www.apache.org/events/current-event" target="_blank" rel="noopener noreferrer" class="dropdown__link">Events</a></li><li><a href="https://www.apache.org/security/" target="_blank" rel="noopener noreferrer" class="dropdown__link">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html" target="_blank" rel="noopener noreferrer" class="dropdown__link">Sponsorship</a></li><li><a href="https://www.apache.org/foundation/policies/privacy.html" target="_blank" rel="noopener noreferrer" class="dropdown__link">Privacy</a></li><li><a href="https://www.apache.org/foundation/thanks.html" target="_blank" rel="noopener noreferrer" class="dropdown__link">Thanks</a></li></ul></div><a href="https://github.com/apache/shenyu" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link"><svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true" class="iconLanguage_nlXk"><path fill="currentColor" d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path></svg>English</a><ul class="dropdown__menu"><li><a href="/blog/RegisterCenter-SourceCode-Analysis-Http-Register" target="_self" rel="noopener noreferrer" class="dropdown__link dropdown__link--active" lang="en">English</a></li><li><a href="/zh/blog/RegisterCenter-SourceCode-Analysis-Http-Register" target="_self" rel="noopener noreferrer" class="dropdown__link" lang="zh">简体中文</a></li></ul></div><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search searchBarContainer_NW3z" dir="ltr"><input placeholder="Search" aria-label="Search" class="navbar__search-input" value=""><div class="loadingRing_RJI3 searchBarLoadingRing_YnHq"><div></div><div></div><div></div><div></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><main class="col col--9 col--offset-1"><article class=""><header><h1 class="title_f1Hy">Register Center Source Code Analysis of Http Register</h1><div class="container_mt6G margin-vert--md"><time datetime="2026-07-04T04:51:57.000Z">July 4, 2026</time> · <!-- -->29 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--12 authorCol_Hf19"><div class="avatar margin-bottom--sm"><div class="avatar__intro authorDetails_lV9A"><div class="avatar__name"><a href="https://github.com/midnight2104" target="_blank" rel="noopener noreferrer"><span class="authorName_yefp" translate="no">midnight2104</span></a></div><small class="authorTitle_nd0D" title="Apache ShenYu Committer">Apache ShenYu Committer</small><div class="authorSocials_rSDt"></div></div></div></div></div></header><div id="__blog-post-container" class="markdown"><blockquote> |
| <p><a href="https://shenyu.apache.org/docs/index" target="_blank" rel="noopener noreferrer" class="">Apache ShenYu</a> is an asynchronous, high-performance, cross-language, responsive API gateway.</p> |
| </blockquote> |
| <p>In <code>ShenYu</code> gateway, the registration center is used to register the client information to <code>shenyu-admin</code>, <code>admin</code> then synchronizes this information to the gateway through data synchronization, and the gateway completes traffic filtering through these data. The client information mainly includes <code>interface information</code> and <code>URI information</code>.</p> |
| <blockquote> |
| <p>This article is based on <code>shenyu-2.5.0</code> version for source code analysis, please refer to <a href="https://shenyu.apache.org/docs/design/register-center-design" target="_blank" rel="noopener noreferrer" class="">Client Access Principles</a> for the introduction of the official website.</p> |
| </blockquote> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-registration-center-principle">1. Registration Center Principle<a href="#1-registration-center-principle" class="hash-link" aria-label="Direct link to 1. Registration Center Principle" title="Direct link to 1. Registration Center Principle" translate="no"></a></h3> |
| <p>When the client starts, it reads the interface information and <code>uri information</code>, and sends the data to <code>shenyu-admin</code> by the specified registration type.</p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/register-center-en-d38e8150e48eec9bef3727dbadc124ec.png" width="1609" height="327" class="img_ev3q"></p> |
| <p>The registration center in the figure requires the user to specify which registration type to use. <code>ShenYu</code> currently supports <code>Http</code>, <code>Zookeeper</code>, <code>Etcd</code>, <code>Consul</code> and <code>Nacos</code> for registration. Please refer to <a href="https://shenyu.apache.org/docs/user-guide/property-config/register-center-access" target="_blank" rel="noopener noreferrer" class="">Client Access Configuration</a> for details on how to configure them.</p> |
| <p><code>ShenYu</code> introduces <code>Disruptor</code> in the principle design of the registration center, in which the <code>Disruptor</code> queue plays a role in decoupling data and operations, which is conducive to expansion. If too many registration requests lead to registration exceptions, it also has a data buffering role.</p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/shenyu-register-center-en-732853d1dc114c56034d14f70e92be06.png" width="1946" height="470" class="img_ev3q"></p> |
| <p>As shown in the figure, the registration center is divided into two parts, one is the registration center client <code>register-client</code>, the load processing client data reading. The other is the registration center server <code>register-server</code>, which is loaded to handle the server side (that is <code>shenyu-admin</code>) data writing. Data is sent and received by specifying the registration type.</p> |
| <ul> |
| <li class="">Client: Usually it is a microservice, which can be <code>springmvc</code>, <code>spring-cloud</code>, <code>dubbo</code>, <code>grpc</code>, etc.</li> |
| <li class=""><code>register-client</code>: register the central client, read the client interface and <code>uri</code> information.</li> |
| <li class=""><code>Disruptor</code>: decoupling data from operations, data buffering role.</li> |
| <li class=""><code>register-server</code>: registry server, here is <code>shenyu-admin</code>, receive data, write to database, send data synchronization events.</li> |
| <li class="">registration-type: specify the registration type, complete data registration, currently supports <code>Http</code>, <code>Zookeeper</code>, <code>Etcd</code>, <code>Consul</code> and <code>Nacos</code>.</li> |
| </ul> |
| <p>This article analyzes the use of <code>Http</code> for registration, so the specific processing flow is as follows.</p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/shenyu-register-center-http-en-2bf3e3a1e2c72d3fca6059fae46886f8.png" width="2214" height="518" class="img_ev3q"></p> |
| <p>On the client side, after the data is out of the queue, the data is transferred via <code>http</code> and on the server side, the corresponding interface is provided to receive the data and then write it to the queue.</p> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-client-registration-process">2. Client Registration Process<a href="#2-client-registration-process" class="hash-link" aria-label="Direct link to 2. Client Registration Process" title="Direct link to 2. Client Registration Process" translate="no"></a></h3> |
| <p>When the client starts, it reads the attribute information according to the relevant configuration, and then writes it to the queue. Let's take the official <a href="https://github.com/apache/shenyu/tree/master/shenyu-examples/shenyu-examples-http" target="_blank" rel="noopener noreferrer" class="">shenyu-examples-http</a> as an example and start the source code analysis . The official example is a microservice built by <code>springboot</code>. For the configuration of the registration center, please refer to the official website <a href="https://shenyu.apache.org/docs/user-guide/property-config/register-center-access" target="_blank" rel="noopener noreferrer" class="">client access configuration</a> .</p> |
| <h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="21-load-configuration-read-properties">2.1 Load configuration, read properties<a href="#21-load-configuration-read-properties" class="hash-link" aria-label="Direct link to 2.1 Load configuration, read properties" title="Direct link to 2.1 Load configuration, read properties" translate="no"></a></h4> |
| <p>Let's start with a diagram that ties together the initialization process of the registry client.</p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/client-register-init-en-782b6467880bcb85cee72f2beba708c5.png" width="1460" height="631" class="img_ev3q"></p> |
| <p>We are analyzing registration by means of <code>http</code>, so the following configuration is required.</p> |
| <div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">shenyu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">register</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">registerType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">serverLists</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//localhost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">9095</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">props</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">username</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> admin</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">123456</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">client</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">props</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">contextPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /http</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">appName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8189</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">isFull</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><br></div></code></pre></div></div> |
| <p>Each attribute indicates the following meaning.</p> |
| <ul> |
| <li class=""><code>registerType</code>: the service registration type, fill in <code>http</code>.</li> |
| <li class=""><code>serverList</code>: The address of the <code>Shenyu-Admin</code> project to fill in for the <code>http</code> registration type, note the addition of <code>http://</code> and separate multiple addresses with English commas.</li> |
| <li class=""><code>username</code>: The username of the <code>Shenyu-Admin</code></li> |
| <li class=""><code>password</code>: The password of the <code>Shenyu-Admin</code></li> |
| <li class=""><code>port</code>: the start port of your project, currently <code>springmvc/tars/grpc</code> needs to be filled in.</li> |
| <li class=""><code>contextPath</code>: the routing prefix for your <code>mvc</code> project in <code>shenyu</code> gateway, such as <code>/order</code>, <code>/product</code>, etc. The gateway will route according to your prefix.</li> |
| <li class=""><code>appName</code>: the name of your application, if not configured, it will take the value of <code>spring.application.name</code> by default.</li> |
| <li class=""><code>isFull</code>: set <code>true</code> to proxy your entire service, <code>false</code> to proxy one of your <code>controllers</code>; currently applies to <code>springmvc/springcloud</code>.</li> |
| </ul> |
| <p>After the project starts, it will first load the configuration file, read the property information and generate the corresponding <code>Bean</code>.</p> |
| <p>The first configuration file read is <code>ShenyuSpringMvcClientConfiguration</code>, which is the <code>http</code> registration configuration class for the <code>shenyu</code> client, indicated by <code>@Configuration</code> which is a configuration class, and by <code>@ImportAutoConfiguration</code> which is a configuration class. to introduce other configuration classes. Create <code>SpringMvcClientEventListener</code>, which mainly handles metadata and <code>URI</code> information.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * Shenyu SpringMvc Client Configuration</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token annotation punctuation" style="color:#393A34">@Configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token annotation punctuation" style="color:#393A34">@ImportAutoConfiguration</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuClientCommonBeanConfiguration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token annotation punctuation" style="color:#393A34">@ConditionalOnProperty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">value </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"shenyu.register.enabled"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> matchIfMissing </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> havingValue </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">ShenyuSpringMvcClientConfiguration</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// create SpringMvcClientEventListener to handle metadata and URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Bean</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">SpringMvcClientEventListener</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">springHttpClientEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuClientConfig</span><span class="token plain"> clientConfig</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepository</span><span class="token plain"> shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">SpringMvcClientEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">clientConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">RpcTypeEnum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">HTTP</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div> |
| <p><code>ShenyuClientCommonBeanConfiguration</code> is a <code>shenyu</code> client common configuration class that will create the <code>bean</code> common to the registry client.</p> |
| <ul> |
| <li class="">Create <code>ShenyuClientRegisterRepository</code>, which is created by factory class.</li> |
| <li class="">Create <code>ShenyuRegisterCenterConfig</code>, which reads the <code>shenyu.register</code> property configuration.</li> |
| <li class="">Create <code>ShenyuClientConfig</code>, read the <code>shenyu.client</code> property configuration.</li> |
| </ul> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * Shenyu Client Common Bean Configuration</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token annotation punctuation" style="color:#393A34">@Configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">ShenyuClientCommonBeanConfiguration</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// create ShenyuClientRegisterRepository by factory </span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Bean</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepository</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuRegisterCenterConfig</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepositoryFactory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">newInstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// create ShenyuRegisterCenterConfig to read shenyu.register properties</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Bean</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@ConfigurationProperties</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">prefix </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"shenyu.register"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">ShenyuRegisterCenterConfig</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ShenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// create ShenyuClientConfig to read shenyu.client properties</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Bean</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@ConfigurationProperties</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">prefix </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"shenyu"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">ShenyuClientConfig</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">shenyuClientConfig</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ShenyuClientConfig</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div> |
| <h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="22-httpclientregisterrepository">2.2 HttpClientRegisterRepository<a href="#22-httpclientregisterrepository" class="hash-link" aria-label="Direct link to 2.2 HttpClientRegisterRepository" title="Direct link to 2.2 HttpClientRegisterRepository" translate="no"></a></h4> |
| <p>The <code>ShenyuClientRegisterRepository</code> generated in the configuration file above is a concrete implementation of the client registration, which is an interface with the following implementation class.</p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/shenyu-client-register-repository-dba8edf50af1be31d8b53c9573b1e015.png" width="3020" height="620" class="img_ev3q"></p> |
| <ul> |
| <li class=""><code>HttpClientRegisterRepository</code>: registration via <code>http</code>.</li> |
| <li class=""><code>ConsulClientRegisterRepository</code>: registration via <code>Consul</code>.</li> |
| <li class=""><code>EtcdClientRegisterRepository</code>: registration via <code>Etcd</code>; <code>EtcdClientRegisterRepository</code>: registration via <code>Etcd</code>.</li> |
| <li class=""><code>NacosClientRegisterRepository</code>: registration via <code>nacos</code>; <code>NacosClientRegisterRepository</code>: registration via <code>nacos</code>.</li> |
| <li class=""><code>ZookeeperClientRegisterRepository</code>: registration through <code>Zookeeper</code>.</li> |
| </ul> |
| <p>The specific way which is achieved by loading through <code>SPI</code>, the implementation logic is as follows.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * load ShenyuClientRegisterRepository</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepositoryFactory</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Map</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">ShenyuClientRegisterRepository</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">REPOSITORY_MAP</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ConcurrentHashMap</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * create ShenyuClientRegisterRepository</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepository</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">newInstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuRegisterCenterConfig</span><span class="token plain"> shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token constant" style="color:#36acaa">REPOSITORY_MAP</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">containsKey</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getRegisterType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Loading by means of SPI, type determined by registerType</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepository</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">ExtensionLoader</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getExtensionLoader</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getJoin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getRegisterType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//init ShenyuClientRegisterRepository</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">init</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">ShenyuClientShutdownHook</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token constant" style="color:#36acaa">REPOSITORY_MAP</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">put</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getRegisterType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">REPOSITORY_MAP</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getRegisterType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>The load type is specified by <code>registerType</code>, which is the type we specify in the configuration file at</p> |
| <div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">shenyu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">register</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">registerType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">serverLists</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//localhost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">9095</span><br></div></code></pre></div></div> |
| <p>We specified <code>http</code>, so it will go to load <code>HttpClientRegisterRepository</code>. After the object is successfully created, the initialization method <code>init()</code> is executed as follows.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token annotation punctuation" style="color:#393A34">@Join</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">HttpClientRegisterRepository</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepository</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">init</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuRegisterCenterConfig</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">username </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProperty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">USER_NAME</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">password </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProperty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">PASS_WORD</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">serverList </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Lists</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">newArrayList</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Splitter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">","</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">split</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getServerLists</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setAccessToken</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ......</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>Read <code>username</code>, <code>password</code> and <code>serverLists</code> from the configuration file, the username, password and address of <code>sheenyu-admin</code>, in preparation for subsequent data sending. The class annotation <code>@Join</code> is used for <code>SPI</code> loading.</p> |
| <blockquote> |
| <p><code>SPI</code>, known as <code>Service Provider Interface</code>, is a service provider discovery feature built into the <code>JDK</code>, a mechanism for dynamic replacement discovery.</p> |
| <p><a href="https://github.com/apache/shenyu/tree/master/shenyu-spi" target="_blank" rel="noopener noreferrer" class="">shenyu-spi</a> is a custom <code>SPI</code> extension implementation for the <code>Apache ShenYu</code> gateway, designed and implemented with reference to Dubbo <a href="https://dubbo.apache.org/zh/docs/v2.7/dev/impls/" target="_blank" rel="noopener noreferrer" class="">SPI extension implementation</a>.</p> |
| </blockquote> |
| <h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="23-springmvcclienteventlistener">2.3 SpringMvcClientEventListener<a href="#23-springmvcclienteventlistener" class="hash-link" aria-label="Direct link to 2.3 SpringMvcClientEventListener" title="Direct link to 2.3 SpringMvcClientEventListener" translate="no"></a></h4> |
| <p>Create <code>SpringMvcClientEventListener</code>, which is responsible for the construction and registration of client-side metadata and <code>URI</code> data, and its creation is done in the configuration file.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token annotation punctuation" style="color:#393A34">@Configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token annotation punctuation" style="color:#393A34">@ImportAutoConfiguration</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuClientCommonBeanConfiguration</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">ShenyuSpringMvcClientConfiguration</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ......</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// create SpringMvcClientEventListener</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Bean</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">SpringMvcClientEventListener</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">springHttpClientEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuClientConfig</span><span class="token plain"> clientConfig</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepository</span><span class="token plain"> shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">SpringMvcClientEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">clientConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">RpcTypeEnum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">HTTP</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p><code>SpringMvcClientEventListener</code> implements the <code>AbstractContextRefreshedEventListener</code></p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/shenyu-client-event-listener-0cd56409c59f2546a285a6426f9c8fee.png" width="4618" height="500" class="img_ev3q"></p> |
| <p>The <code>AbstractContextRefreshedEventListener</code> is an abstract class. it implements the <code>ApplicationListener</code> interface and overrides the <code>onApplicationEvent()</code> method, which is executed when a Spring event occurs. It has several implementation classes, which support different kind of <code>RPC</code> styles.</p> |
| <ul> |
| <li class=""><code>AlibabaDubboServiceBeanListener</code>:handles <code>Alibaba Dubbo</code> protocol.</li> |
| <li class=""><code>ApacheDubboServiceBeanListener</code>:handles <code>Apache Dubbo</code> protocol.</li> |
| <li class=""><code>GrpcClientEventListener</code>:handles <code>grpc</code> protocol.</li> |
| <li class=""><code>MotanServiceEventListener</code>:handles <code>Motan</code> protocol.</li> |
| <li class=""><code>SofaServiceEventListener</code>:handles <code>Sofa</code> protocol.</li> |
| <li class=""><code>SpringMvcClientEventListener</code>:handles <code>http</code> protocol.</li> |
| <li class=""><code>SpringWebSocketClientEventListener</code>:handles <code>Websocket</code> protocol.</li> |
| <li class=""><code>TarsServiceBeanEventListener</code>:handles <code>Tars</code> protocol.</li> |
| </ul> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">AbstractContextRefreshedEventListener</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">A</span><span class="token generics"> </span><span class="token generics keyword" style="color:#00009f">extends</span><span class="token generics"> </span><span class="token generics class-name">Annotation</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">ApplicationListener</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">ContextRefreshedEvent</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//......</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Instantiation is done through the constructor</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">AbstractContextRefreshedEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">PropertiesConfig</span><span class="token plain"> clientConfig</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepository</span><span class="token plain"> shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// read shenyu.client.http properties</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Properties</span><span class="token plain"> props </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> clientConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// appName </span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">appName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> props</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProperty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuClientConstants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">APP_NAME</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// contextPath</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">contextPath </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Optional</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ofNullable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">props</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProperty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuClientConstants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">CONTEXT_PATH</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">UriUtils</span><span class="token operator" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">repairData</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">orElse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">StringUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isBlank</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">appName</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&&</span><span class="token plain"> </span><span class="token class-name">StringUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isBlank</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">contextPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> errorMsg </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"client register param must config the appName or contextPath"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token constant" style="color:#36acaa">LOG</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">errorMsg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">throw</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ShenyuClientIllegalArgumentException</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">errorMsg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ipAndPort </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> props</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProperty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuClientConstants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">IP_PORT</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// host</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">host </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> props</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProperty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuClientConstants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">HOST</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// port</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">port </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> props</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProperty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuClientConstants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">PORT</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// publish event</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> publisher</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">start</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// This method is executed when a context refresh event(ContextRefreshedEvent), occurs</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">onApplicationEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token annotation punctuation" style="color:#393A34">@NonNull</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ContextRefreshedEvent</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// The contents of the method are guaranteed to be executed only once</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">registered</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">compareAndSet</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ApplicationContext</span><span class="token plain"> context </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getApplicationContext</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// get the specific beans </span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Map</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> beans </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getBeans</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">MapUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isEmpty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">beans</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// build URI data and register it</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> publisher</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">publishEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">buildURIRegisterDTO</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> beans</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// build metadata and register it</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> beans</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token operator" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">handle</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@SuppressWarnings</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"all"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">protected</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">abstract</span><span class="token plain"> </span><span class="token class-name">URIRegisterDTO</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">buildURIRegisterDTO</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ApplicationContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Map</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> beans</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">protected</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> beanName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">T</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Class</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics operator" style="color:#393A34">?</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> clazz </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getCorrectedClass</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bean</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">A</span><span class="token plain"> beanShenyuClient </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">AnnotatedElementUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">findMergedAnnotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getAnnotationType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> superPath </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">buildApiSuperPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> beanShenyuClient</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Objects</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">nonNull</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">beanShenyuClient</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&&</span><span class="token plain"> superPath</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">contains</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"*"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">handleClass</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> beanShenyuClient</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> superPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Method</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> methods </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">ReflectionUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getUniqueDeclaredMethods</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">clazz</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Method</span><span class="token plain"> method </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> methods</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">handleMethod</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> beanShenyuClient</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> method</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> superPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// default implementation. build URI data and register it</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">protected</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handleClass</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Class</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics operator" style="color:#393A34">?</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">T</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@NonNull</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">A</span><span class="token plain"> beanShenyuClient</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> superPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> publisher</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">publishEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">buildMetaDataDTO</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> beanShenyuClient</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">pathJoin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">contextPath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> superPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// default implementation. build metadata and register it</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">protected</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handleMethod</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">T</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Class</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics operator" style="color:#393A34">?</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Nullable</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">A</span><span class="token plain"> beanShenyuClient</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Method</span><span class="token plain"> method</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> superPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// get the annotation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">A</span><span class="token plain"> methodShenyuClient </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">AnnotatedElementUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">findMergedAnnotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">method</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getAnnotationType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Objects</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">nonNull</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">methodShenyuClient</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 构建元数据,发送注册事件</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> publisher</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">publishEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">buildMetaDataDTO</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> methodShenyuClient</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">buildApiPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">method</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> superPath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> methodShenyuClient</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> method</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">protected</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">abstract</span><span class="token plain"> </span><span class="token class-name">MetaDataRegisterDTO</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">buildMetaDataDTO</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">T</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@NonNull</span><span class="token plain"> </span><span class="token class-name">A</span><span class="token plain"> shenyuClient</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> path</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Class</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics operator" style="color:#393A34">?</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Method</span><span class="token plain"> method</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div> |
| <p>In the constructor, the main purpose is to read the property information and then perform the checksum.</p> |
| <div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">shenyu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">client</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">props</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">contextPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /http</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">appName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">8189</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">isFull</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><br></div></code></pre></div></div> |
| <p>Finally, publisher.start() is executed to start event publishing and prepare for registration.</p> |
| <p>ShenyuClientRegisterEventPublisher is implemented via singleton pattern, mainly generating metadata and URI subscribers (subsequently used for data publishing), and then starting the Disruptor queue. A common method publishEvent() is provided to publish events and send data to the Disruptor queue.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterEventPublisher</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterEventPublisher</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">INSTANCE</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterEventPublisher</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token class-name">DisruptorProviderManage</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">DataTypeParent</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> providerManage</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterEventPublisher</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getInstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">INSTANCE</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">start</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepository</span><span class="token plain"> shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">RegisterClientExecutorFactory</span><span class="token plain"> factory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">RegisterClientExecutorFactory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> factory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addSubscribers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ShenyuClientMetadataExecutorSubscriber</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> factory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addSubscribers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ShenyuClientURIExecutorSubscriber</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> providerManage </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">DisruptorProviderManage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">factory</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> providerManage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">startup</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">publishEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">DataTypeParent</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">DisruptorProvider</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">DataTypeParent</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> provider </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> providerManage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProvider</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> provider</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">onData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>The logic of the constructor of <code>AbstractContextRefreshedEventListener</code> is analyzed, it mainly reads the property configuration, creates metadata and URI subscribers, and starts the Disruptor queue.</p> |
| <p>The <code>onApplicationEvent()</code> method is executed when a <code>Spring</code> event occurs, the parameter here is <code>ContextRefreshedEvent</code>, which means the context refresh event.</p> |
| <blockquote> |
| <p><code>ContextRefreshedEvent</code> is a <code>Spring</code> built-in event. It is fired when the <code>ApplicationContext</code> is initialized or refreshed. This can also happen in the <code>ConfigurableApplicationContext</code> interface using the <code>refresh()</code> method. Initialization here means that all <code>Bean</code>s have been successfully loaded, post-processing <code>Bean</code>s have been detected and activated, all <code>Singleton Bean</code>s have been pre-instantiated, and the <code>ApplicationContext</code> container is ready to be used.</p> |
| </blockquote> |
| <ul> |
| <li class=""><code>SpringMvcClientEventListener</code>: the <code>http</code> implementation of <code>AbstractContextRefreshedEventListener</code>:</li> |
| </ul> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SpringMvcClientEventListener</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">AbstractContextRefreshedEventListener</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">Object</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">ShenyuSpringMvcClient</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">List</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">Class</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics operator" style="color:#393A34">?</span><span class="token generics"> </span><span class="token generics keyword" style="color:#00009f">extends</span><span class="token generics"> </span><span class="token generics class-name">Annotation</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> mappingAnnotation </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ArrayList</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Boolean</span><span class="token plain"> isFull</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> protocol</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 构造函数</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">SpringMvcClientEventListener</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">PropertiesConfig</span><span class="token plain"> clientConfig</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepository</span><span class="token plain"> shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">super</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">clientConfig</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Properties</span><span class="token plain"> props </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> clientConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// get isFull</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">isFull </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Boolean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">parseBoolean</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">props</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProperty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuClientConstants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">IS_FULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Boolean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">FALSE</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toString</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// http protocol</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">protocol </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> props</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProperty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuClientConstants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">PROTOCOL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">ShenyuClientConstants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">HTTP</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> mappingAnnotation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuSpringMvcClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> mappingAnnotation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">RequestMapping</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">protected</span><span class="token plain"> </span><span class="token class-name">Map</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">Object</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getBeans</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ApplicationContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Configuration attribute, if isFull=true, means register the whole microservice</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Boolean</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">TRUE</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">equals</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">isFull</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">getPublisher</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">publishEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">MetaDataRegisterDTO</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">contextPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">getContextPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">appName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">getAppName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">path</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">PathUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">decoratorPathWithSlash</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">getContextPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">rpcType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">RpcTypeEnum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">HTTP</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">enabled</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ruleName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">getContextPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// get bean with Controller annotation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getBeansWithAnnotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Controller</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">protected</span><span class="token plain"> </span><span class="token class-name">URIRegisterDTO</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">buildURIRegisterDTO</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ApplicationContext</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Map</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">Object</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> beans</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">protected</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">buildApiSuperPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Class</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics operator" style="color:#393A34">?</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Nullable</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuSpringMvcClient</span><span class="token plain"> beanShenyuClient</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Objects</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">nonNull</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">beanShenyuClient</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&&</span><span class="token plain"> </span><span class="token class-name">StringUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isNotBlank</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">beanShenyuClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">path</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> beanShenyuClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">path</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">RequestMapping</span><span class="token plain"> requestMapping </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">AnnotationUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">findAnnotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">RequestMapping</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Only the first path is supported temporarily</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Objects</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">nonNull</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">requestMapping</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&&</span><span class="token plain"> </span><span class="token class-name">ArrayUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isNotEmpty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">requestMapping</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">path</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&&</span><span class="token plain"> </span><span class="token class-name">StringUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isNotBlank</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">requestMapping</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">path</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> requestMapping</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">path</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">protected</span><span class="token plain"> </span><span class="token class-name">Class</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">ShenyuSpringMvcClient</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getAnnotationType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token class-name">ShenyuSpringMvcClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">protected</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handleMethod</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Object</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Class</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics operator" style="color:#393A34">?</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Nullable</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuSpringMvcClient</span><span class="token plain"> beanShenyuClient</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Method</span><span class="token plain"> method</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> superPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// get RequestMapping annotation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">RequestMapping</span><span class="token plain"> requestMapping </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">AnnotatedElementUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">findMergedAnnotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">method</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">RequestMapping</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// get ShenyuSpringMvcClient annotation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">ShenyuSpringMvcClient</span><span class="token plain"> methodShenyuClient </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">AnnotatedElementUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">findMergedAnnotation</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">method</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">ShenyuSpringMvcClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> methodShenyuClient </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Objects</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isNull</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">methodShenyuClient</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> beanShenyuClient </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> methodShenyuClient</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// the result of ReflectionUtils#getUniqueDeclaredMethods contains method such as hashCode, wait, toSting</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// add Objects.nonNull(requestMapping) to make sure not register wrong method</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Objects</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">nonNull</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">methodShenyuClient</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&&</span><span class="token plain"> </span><span class="token class-name">Objects</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">nonNull</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">requestMapping</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">getPublisher</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">publishEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">buildMetaDataDTO</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">bean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> methodShenyuClient</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">buildApiPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">method</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> superPath</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> methodShenyuClient</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> method</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 构造元数据</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">protected</span><span class="token plain"> </span><span class="token class-name">MetaDataRegisterDTO</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">buildMetaDataDTO</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Object</span><span class="token plain"> bean</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@NonNull</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuSpringMvcClient</span><span class="token plain"> shenyuClient</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> path</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Class</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics operator" style="color:#393A34">?</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> clazz</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Method</span><span class="token plain"> method</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>The registration logic is done through <code>publisher.publishEvent()</code>.</p> |
| <p>The <code>Controller</code> annotation and the <code>RequestMapping</code> annotation are provided by <code>Spring</code>, which you should be familiar with, so I won't go into details. The <code>ShenyuSpringMvcClient</code> annotation is provided by <code>Apache ShenYu</code> to register the <code>SpringMvc</code> client, which is defined as follows.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * ShenyuSpringMvcClient</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token annotation punctuation" style="color:#393A34">@Retention</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">RetentionPolicy</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">RUNTIME</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token annotation punctuation" style="color:#393A34">@Target</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token class-name">ElementType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">TYPE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">ElementType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">METHOD</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@interface</span><span class="token plain"> </span><span class="token class-name">ShenyuSpringMvcClient</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// path</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@AliasFor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">attribute </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"path"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">value</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">default</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// path</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@AliasFor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">attribute </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">path</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ruleName</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ruleName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">default</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// desc info</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">desc</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">default</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// enabled</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">boolean</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">enabled</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">default</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// register MetaData </span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">boolean</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">registerMetaData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">default</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div> |
| <p>It is used as follows.</p> |
| <ul> |
| <li class="">register the entire interface</li> |
| </ul> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token annotation punctuation" style="color:#393A34">@RestController</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token annotation punctuation" style="color:#393A34">@RequestMapping</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/test"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token annotation punctuation" style="color:#393A34">@ShenyuSpringMvcClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">path </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/test/**"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// register the entire interface</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">HttpTestController</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//......</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <ul> |
| <li class="">register current method</li> |
| </ul> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token annotation punctuation" style="color:#393A34">@RestController</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token annotation punctuation" style="color:#393A34">@RequestMapping</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/order"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token annotation punctuation" style="color:#393A34">@ShenyuSpringMvcClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">path </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/order"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">OrderController</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * Save order dto.</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> *</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * @param orderDTO the order dto</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * @return the order dto</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@PostMapping</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/save"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@ShenyuSpringMvcClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">path </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/save"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> desc </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Save order"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// register current method</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">OrderDTO</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">save</span><span class="token punctuation" style="color:#393A34">(</span><span class="token annotation punctuation" style="color:#393A34">@RequestBody</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">OrderDTO</span><span class="token plain"> orderDTO</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> orderDTO</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"hello world save order"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> orderDTO</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <ul> |
| <li class="">publisher.publishEvent()</li> |
| </ul> |
| <p>This method sends the data to the <code>Disruptor</code> queue. More details about the <code>Disruptor</code> queue are not described here, which does not affect the flow of analyzing the registration.</p> |
| <p>When the data is sent, the consumers of the <code>Disruptor</code> queue will process the data for consumption.</p> |
| <p>This method sends the data to the <code>Disruptor</code> queue. More details about the <code>Disruptor</code> queue are not described here, which does not affect the flow of analyzing the registration.</p> |
| <ul> |
| <li class="">QueueConsumer</li> |
| </ul> |
| <p><code>QueueConsumer</code> is a consumer that implements the <code>WorkHandler</code> interface, which is created in the <code>providerManage.startup()</code> logic. The <code>WorkHandler</code> interface is the data consumption interface for <code>Disruptor</code>, and the only method is <code>onEvent()</code>.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">com</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">lmax</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">disruptor</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">interface</span><span class="token plain"> </span><span class="token class-name">WorkHandler</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">onEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">T</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">throws</span><span class="token plain"> </span><span class="token class-name">Exception</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>The <code>QueueConsumer</code> overrides the <code>onEvent()</code> method, and the main logic is to generate the consumption task and then go to the thread pool to execute it.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * </span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * QueueConsumer</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">QueueConsumer</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">WorkHandler</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">DataEvent</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ......</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">onEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">DataEvent</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> t</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">t </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Use different thread pools based on DataEvent type</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">ThreadPoolExecutor</span><span class="token plain"> executor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">orderly</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">t</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// create queue consumption tasks via factory</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">QueueConsumerExecutor</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> queueConsumerExecutor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> factory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// set data</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> queueConsumerExecutor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">t</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// help gc</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> t</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// put in the thread pool to execute the consumption task</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> executor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">queueConsumerExecutor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p><code>QueueConsumerExecutor</code> is the task that is executed in the thread pool, it implements the <code>Runnable</code> interface, and there are two specific implementation classes.</p> |
| <ul> |
| <li class=""><code>RegisterClientConsumerExecutor</code>:the client-side consumer executor.</li> |
| <li class=""><code>RegisterServerConsumerExecutor</code>:server-side consumer executor.</li> |
| </ul> |
| <p>As the name implies, one is responsible for handling client-side tasks, and one is responsible for handling server-side tasks (the server side is <code>admin</code>, which is analyzed below).</p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/consumer-executor-f7ad67d35abaa5a2fac94ef913445a19.png" width="1310" height="483" class="img_ev3q"></p> |
| <ul> |
| <li class="">RegisterClientConsumerExecutor</li> |
| </ul> |
| <p>The logic of the rewritten <code>run()</code> is as follows.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">RegisterClientConsumerExecutor</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics"> </span><span class="token generics keyword" style="color:#00009f">extends</span><span class="token generics"> </span><span class="token generics class-name">DataTypeParent</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">QueueConsumerExecutor</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//...... </span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// get data</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">T</span><span class="token plain"> data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// call the appropriate processor for processing according to the data type</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> subscribers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">executor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Lists</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">newArrayList</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>Different processors are called to perform the corresponding tasks based on different data types. There are two types of data, one is metadata, which records the client registration information. One is the <code>URI</code> data, which records the client service information.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">enum</span><span class="token plain"> </span><span class="token class-name">DataType</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token constant" style="color:#36acaa">META_DATA</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token constant" style="color:#36acaa">URI</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <ul> |
| <li class="">ExecutorSubscriber#executor()</li> |
| </ul> |
| <p>The actuator subscribers are divided into two categories, one that handles metadata and one that handles <code>URIs</code>. There are two on the client side and two on the server side, so there are four in total.</p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/executor-subscriber-86d5645d204ad1d05fe12dd30992c8d1.png" width="1732" height="403" class="img_ev3q"></p> |
| <p>Here is the registration metadata information, so the execution class is <code>ShenyuClientMetadataExecutorSubscriber</code>.</p> |
| <ul> |
| <li class="">ShenyuClientMetadataExecutorSubscriber#executor()</li> |
| </ul> |
| <p>The metadata processing logic on the client side is: iterate through the metadata information and call the interface method <code>persistInterface()</code> to finish publishing the data.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">ShenyuClientMetadataExecutorSubscriber</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">ExecutorTypeSubscriber</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">MetaDataRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//......</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">DataType</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token class-name">DataType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">META_DATA</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">executor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Collection</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">MetaDataRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> metaDataRegisterDTOList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">MetaDataRegisterDTO</span><span class="token plain"> metaDataRegisterDTO </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> metaDataRegisterDTOList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// call the interface method persistInterface() to finish publishing the data</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">persistInterface</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">metaDataRegisterDTO</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>The two registration interfaces get the data well and call the <code>publish()</code> method to publish the data to the <code>Disruptor</code> queue.</p> |
| <ul> |
| <li class=""><code>ShenyuServerRegisterRepository</code></li> |
| </ul> |
| <p>The <code>ShenyuServerRegisterRepository</code> interface is a service registration interface, which has five implementation classes, indicating five types of registration.</p> |
| <ul> |
| <li class=""><code>ConsulServerRegisterRepository</code>: registration is achieved through <code>Consul</code>;</li> |
| <li class=""><code>EtcdServerRegisterRepository</code>: registration through <code>Etcd</code>.</li> |
| <li class=""><code>NacosServerRegisterRepository</code>: registration through <code>Nacos</code>.</li> |
| <li class=""><code>ShenyuHttpRegistryController</code>: registration via <code>Http</code>; <code>ShenyuHttpRegistryController</code>: registration via <code>Http</code>.</li> |
| <li class=""><code>ZookeeperServerRegisterRepository</code>: registration through <code>Zookeeper</code>.</li> |
| </ul> |
| <p><img decoding="async" loading="lazy" src="/assets/images/client-register-repository-61756e3284c1d3a27083b25d393edf9c.png" width="1956" height="473" class="img_ev3q"></p> |
| <p>As you can see from the diagram, the loading of the registry is done by means of SPI. This was mentioned earlier, and the specific class loading is done in the client-side generic configuration file by specifying the properties in the configuration file.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * load ShenyuClientRegisterRepository</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepositoryFactory</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Map</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">ShenyuClientRegisterRepository</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">REPOSITORY_MAP</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ConcurrentHashMap</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * create ShenyuClientRegisterRepository</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepository</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">newInstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuRegisterCenterConfig</span><span class="token plain"> shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token constant" style="color:#36acaa">REPOSITORY_MAP</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">containsKey</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getRegisterType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// loading by means of SPI, type determined by registerType</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterRepository</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">ExtensionLoader</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getExtensionLoader</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getJoin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getRegisterType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// perform initialization operations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">init</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">ShenyuClientShutdownHook</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token constant" style="color:#36acaa">REPOSITORY_MAP</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">put</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getRegisterType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">REPOSITORY_MAP</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getRegisterType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>The source code analysis in this article is based on the Http way of registration, so we first analyze the HttpClientRegisterRepository, and the other registration methods will be analyzed afterwards.</p> |
| <p>Registration by way of <code>http</code> is very simple, it is to call the tool class to send http requests. The registration metadata and URI are both called by the same method <code>doRegister()</code>, specifying the interface and type.</p> |
| <ul> |
| <li class=""><code>Constants.URI_PATH</code> = <code>/shenyu-client/register-metadata</code>: the interface provided by the server for registering metadata.</li> |
| <li class=""><code>Constants.META_PATH</code> = <code>/shenyu-client/register-uri</code>: Server-side interface for registering URIs.</li> |
| </ul> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token annotation punctuation" style="color:#393A34">@Join</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">HttpClientRegisterRepository</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">FailbackRegistryRepository</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Logger</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">LOGGER</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">LoggerFactory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getLogger</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">HttpClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token class-name">URIRegisterDTO</span><span class="token plain"> uriRegisterDTO</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> username</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> password</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token class-name">List</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> serverList</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> accessToken</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">HttpClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">HttpClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuRegisterCenterConfig</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">init</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">init</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuRegisterCenterConfig</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// admin username</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">username </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProperty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">USER_NAME</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// admin paaword</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">password </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProps</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProperty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">PASS_WORD</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// admin server address</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">serverList </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Lists</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">newArrayList</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Splitter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">","</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">split</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">config</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getServerLists</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// set access token</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setAccessToken</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * Persist uri.</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> *</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * @param registerDTO the register dto</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">doPersistURI</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">URIRegisterDTO</span><span class="token plain"> registerDTO</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">RuntimeUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">listenByOther</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">registerDTO</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getPort</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">doRegister</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">registerDTO</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">URI_PATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">URI</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> uriRegisterDTO </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> registerDTO</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">doPersistInterface</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">MetaDataRegisterDTO</span><span class="token plain"> metadata</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">doRegister</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">metadata</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">META_PATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">META_TYPE</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">close</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uriRegisterDTO </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> uriRegisterDTO</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setEventType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">EventType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">DELETED</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">doRegister</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uriRegisterDTO</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">URI_PATH</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">URI</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">setAccessToken</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">String</span><span class="token plain"> server </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> serverList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Optional</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics operator" style="color:#393A34">?</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> login </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">RegisterUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">doLogin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">username</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> password</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> server</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">concat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">LOGIN_PATH</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> login</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ifPresent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">v </span><span class="token operator" style="color:#393A34">-></span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">accessToken </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">valueOf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">v</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Exception</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token constant" style="color:#36acaa">LOGGER</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Login admin url :{} is fail, will retry. cause: {} "</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> server</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">doRegister</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">T</span><span class="token plain"> t</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> path</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> type</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> i </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// iterate through the list of admin services (admin may be clustered)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">String</span><span class="token plain"> server </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> serverList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> i</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> concat </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> server</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">concat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">path</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 设置访问token</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">StringUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isBlank</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">accessToken</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setAccessToken</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">StringUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isBlank</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">accessToken</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">throw</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">NullPointerException</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"accessToken is null"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// calling the tool class to send http requests</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">RegisterUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">doRegister</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">GsonUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getInstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toJson</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">t</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> concat</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> type</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> accessToken</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Exception</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token constant" style="color:#36acaa">LOGGER</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Register admin url :{} is fail, will retry. cause:{}"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> server</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getMessage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">i </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> serverList</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">size</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">throw</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">RuntimeException</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>Serialize the data and send it via OkHttp.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">RegisterUtils</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//...... </span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Sending data via OkHttp</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">doRegister</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> json</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> url</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> type</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">throws</span><span class="token plain"> </span><span class="token class-name">IOException</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token class-name">StringUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">hasLength</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">accessToken</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token constant" style="color:#36acaa">LOGGER</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"{} client register error accessToken is null, please check the config : {} "</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> type</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> json</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Headers</span><span class="token plain"> headers </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Headers</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">Builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Constants</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">X_ACCESS_TOKEN</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> accessToken</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">OkHttpTools</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getInstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">post</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> json</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> headers</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Objects</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">equals</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">SUCCESS</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token constant" style="color:#36acaa">LOGGER</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">info</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"{} client register success: {} "</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> type</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> json</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token constant" style="color:#36acaa">LOGGER</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"{} client register error: {} "</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> type</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> json</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>At this point, the logic of the client registering metadata by means of <code>http</code> is finished. To summarize: construct metadata by reading custom annotation information, send the data to the <code>Disruptor</code> queue, then consume the data from the queue, put the consumer into the thread pool to execute, and finally send an <code>http</code> request to the <code>admin</code>.</p> |
| <p>Similarly, <code>ShenyuClientURIExecutorSubscriber</code> is the execution class of registering <code>URI</code> information.</p> |
| <ul> |
| <li class="">ShenyuClientURIExecutorSubscriber#executor()</li> |
| </ul> |
| <p>The main logic is to iterate through the URI data collection and implement data registration through the persistURI() method.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">ShenyuClientURIExecutorSubscriber</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">ExecutorTypeSubscriber</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">URIRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//......</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">DataType</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token class-name">DataType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">URI</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// register URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">executor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Collection</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">URIRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> dataList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">URIRegisterDTO</span><span class="token plain"> uriRegisterDTO </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> dataList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Stopwatch</span><span class="token plain"> stopwatch </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Stopwatch</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">createStarted</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Socket</span><span class="token plain"> ignored </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Socket</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uriRegisterDTO</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getHost</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> uriRegisterDTO</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getPort</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">IOException</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">long</span><span class="token plain"> sleepTime </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// maybe the port is delay exposed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">stopwatch</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">elapsed</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">TimeUnit</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">SECONDS</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">></span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token constant" style="color:#36acaa">LOG</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"host:{}, port:{} connection failed, will retry"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> uriRegisterDTO</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getHost</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> uriRegisterDTO</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getPort</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// If the connection fails for a long time, Increase sleep time</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">stopwatch</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">elapsed</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">TimeUnit</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">SECONDS</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">></span><span class="token plain"> </span><span class="token number" style="color:#36acaa">180</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> sleepTime </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10000</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">try</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">TimeUnit</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">MILLISECONDS</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sleepTime</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">InterruptedException</span><span class="token plain"> ex</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ex</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">printStackTrace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">ShenyuClientShutdownHook</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">delayOtherHooks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> shenyuClientRegisterRepository</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">persistURI</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uriRegisterDTO</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>The <code>while(true)</code> loop in the code is to ensure that the client has been successfully started and can connect via <code>host</code> and <code>port</code>.</p> |
| <p>The logic behind it is: add the <code>hook</code> function for gracefully stopping the client .</p> |
| <p>Data registration is achieved through the <code>persistURI()</code> method. The whole logic is also analyzed in the previous section, and ultimately it is the <code>OkHttp</code> client that initiates <code>http</code> to <code>shenyu-admin</code> and registers the <code>URI</code> by way of <code>http</code>.</p> |
| <p>The analysis of the registration logic of the client is finished here, and the metadata and URI data constructed are sent to the <code>Disruptor</code> queue, from which they are then consumed, read, and sent to <code>admin</code> via <code>http</code>.</p> |
| <p>The source code analysis of the client-side metadata and <code>URI</code> registration process is complete, with the following flow chart.</p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/client-metadata-uri-register-en-7ccc8df4fc77fdf28480f15a6de6022b.png" width="1491" height="657" class="img_ev3q"></p> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-server-side-registration-process">3. Server-side registration process<a href="#3-server-side-registration-process" class="hash-link" aria-label="Direct link to 3. Server-side registration process" title="Direct link to 3. Server-side registration process" translate="no"></a></h3> |
| <h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="31-shenyuhttpregistrycontroller">3.1 ShenyuHttpRegistryController<a href="#31-shenyuhttpregistrycontroller" class="hash-link" aria-label="Direct link to 3.1 ShenyuHttpRegistryController" title="Direct link to 3.1 ShenyuHttpRegistryController" translate="no"></a></h4> |
| <p>From the previous analysis, we know that the server side provides two interfaces for registration.</p> |
| <ul> |
| <li class=""><code>/shenyu-client/register-metadata</code>: The interface provided by the server side is used to register metadata.</li> |
| <li class=""><code>/shenyu-client/register-uri</code>: The server-side interface is provided for registering URIs.</li> |
| </ul> |
| <p>These two interfaces are located in <code>ShenyuHttpRegistryController</code>, which implements the <code>ShenyuServerRegisterRepository</code> interface and is the implementation class for server-side registration. It is marked with <code>@Join</code> to indicate loading via <code>SPI</code>.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token annotation punctuation" style="color:#393A34">@RequestMapping</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/shenyu-client"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token annotation punctuation" style="color:#393A34">@Join</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">ShenyuHttpRegistryController</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">ShenyuServerRegisterRepository</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token class-name">ShenyuServerRegisterPublisher</span><span class="token plain"> publisher</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">init</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuServerRegisterPublisher</span><span class="token plain"> publisher</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuRegisterCenterConfig</span><span class="token plain"> config</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">publisher </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> publisher</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// register Metadata</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@PostMapping</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/register-metadata"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@ResponseBody</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">registerMetadata</span><span class="token punctuation" style="color:#393A34">(</span><span class="token annotation punctuation" style="color:#393A34">@RequestBody</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">MetaDataRegisterDTO</span><span class="token plain"> metaDataRegisterDTO</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> publisher</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">publish</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">metaDataRegisterDTO</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token class-name">ShenyuResultMessage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">SUCCESS</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// register URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@PostMapping</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/register-uri"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@ResponseBody</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">registerURI</span><span class="token punctuation" style="color:#393A34">(</span><span class="token annotation punctuation" style="color:#393A34">@RequestBody</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">URIRegisterDTO</span><span class="token plain"> uriRegisterDTO</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> publisher</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">publish</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uriRegisterDTO</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token class-name">ShenyuResultMessage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">SUCCESS</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div> |
| <p>The exact method used is specified by the configuration file and then loaded via <code>SPI</code>.</p> |
| <p>In the <code>application.yml</code> file in <code>shenyu-admin</code> configure the registration method, <code>registerType</code> specify the registration type, when registering with <code>http</code>, <code>serverLists</code> do not need to be filled in, for more configuration instructions you can refer to the official website <a href="https://shenyu.apache.org/zh/docs/user-guide/property-config/register-center-access" target="_blank" rel="noopener noreferrer" class="">Client Access Configuration</a>.</p> |
| <div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">shenyu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">register</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">registerType</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">serverLists</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><br></div></code></pre></div></div> |
| <ul> |
| <li class="">RegisterCenterConfiguration</li> |
| </ul> |
| <p>After introducing the relevant dependencies and properties configuration, when starting <code>shenyu-admin</code>, the configuration file will be loaded first, and the configuration file class related to the registration center is <code>RegisterCenterConfiguration</code>.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token annotation punctuation" style="color:#393A34">@Configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">RegisterCenterConfiguration</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Bean</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@ConfigurationProperties</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">prefix </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"shenyu.register"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">ShenyuRegisterCenterConfig</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">ShenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//create ShenyuServerRegisterRepository to register in admin</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Bean</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">destroyMethod </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"close"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">ShenyuServerRegisterRepository</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">shenyuServerRegisterRepository</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ShenyuRegisterCenterConfig</span><span class="token plain"> shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">List</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">ShenyuClientRegisterService</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> shenyuClientRegisterService</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 1. get the registration type from the configuration property</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> registerType </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getRegisterType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 2. load the implementation class by registering the type with the SPI method</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">ShenyuServerRegisterRepository</span><span class="token plain"> registerRepository </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">ExtensionLoader</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getExtensionLoader</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuServerRegisterRepository</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getJoin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">registerType</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 3. get the publisher and write data to the Disruptor queue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">RegisterServerDisruptorPublisher</span><span class="token plain"> publisher </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">RegisterServerDisruptorPublisher</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getInstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 4. ShenyuClientRegisterService, rpcType -> registerService</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Map</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">ShenyuClientRegisterService</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> registerServiceMap </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> shenyuClientRegisterService</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">stream</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">collect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Collectors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toMap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ShenyuClientRegisterService</span><span class="token operator" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">rpcType</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> e </span><span class="token operator" style="color:#393A34">-></span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 5. start publisher</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> publisher</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">start</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">registerServiceMap</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 6. init registerRepository</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> registerRepository</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">init</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">publisher</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> shenyuRegisterCenterConfig</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> registerRepository</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div> |
| <p>Two <code>bean</code>s are generated in the configuration class.</p> |
| <ul> |
| <li class=""> |
| <p><code>shenyuRegisterCenterConfig</code>: to read the attribute configuration.</p> |
| </li> |
| <li class=""> |
| <p><code>shenyuServerRegisterRepository</code>: for server-side registration.</p> |
| </li> |
| </ul> |
| <p>In the process of creating <code>shenyuServerRegisterRepository</code>, a series of preparations are also performed.</p> |
| <ul> |
| <li class=""> |
| <ol> |
| <li class="">get the registration type from the configuration property.</li> |
| </ol> |
| </li> |
| <li class=""> |
| <ol start="2"> |
| <li class="">Load the implementation class by the registration type with the <code>SPI</code> method: for example, if the specified type is <code>http</code>, <code>ShenyuHttpRegistryController</code> will be loaded.</li> |
| </ol> |
| </li> |
| <li class=""> |
| <ol start="3"> |
| <li class="">Get <code>publisher</code> and write data to the <code>Disruptor</code> queue.</li> |
| </ol> |
| </li> |
| <li class=""> |
| <ol start="4"> |
| <li class="">Register <code>Service</code>, <code>rpcType -> registerService</code>: get the registered <code>Service</code>, each <code>rpc</code> has a corresponding <code>Service</code>. The client for this article is built through <code>springboot</code>, which belongs to the <code>http</code> type, and other client types: <code>dubbo</code>, <code>Spring Cloud</code>, <code>gRPC</code>, etc.</li> |
| </ol> |
| </li> |
| <li class=""> |
| <ol start="5"> |
| <li class="">Preparation for event publishing: add server-side metadata and <code>URI</code> subscribers, process the data. And start the <code>Disruptor</code> queue.</li> |
| </ol> |
| </li> |
| <li class=""> |
| <ol start="6"> |
| <li class="">Initialization operation for registration: <code>http</code> type registration initialization operation is to save <code>publisher</code>.</li> |
| </ol> |
| </li> |
| <li class=""> |
| <p>RegisterClientServerDisruptorPublisher#publish()</p> |
| </li> |
| </ul> |
| <p>The server-side publisher that writes data to the <code>Disruptor</code> queue , built via the singleton pattern.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">RegisterClientServerDisruptorPublisher</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">ShenyuServerRegisterPublisher</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">RegisterClientServerDisruptorPublisher</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">INSTANCE</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">RegisterClientServerDisruptorPublisher</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">INSTANCE</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">RegisterServerDisruptorPublisher</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> </span><span class="token class-name">RegisterClientServerDisruptorPublisher</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getInstance</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">INSTANCE</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//prepare for event publishing, add server-side metadata and URI subscribers, process data. And start the Disruptor queue.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">start</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Map</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">ShenyuClientRegisterService</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> shenyuClientRegisterService</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">RegisterServerExecutorFactory</span><span class="token plain"> factory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">RegisterServerExecutorFactory</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// add URI data subscriber</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> factory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addSubscribers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">URIRegisterExecutorSubscriber</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuClientRegisterService</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// add Metadata subscriber</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> factory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">addSubscribers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">MetadataExecutorSubscriber</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuClientRegisterService</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//start Disruptor</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> providerManage </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">DisruptorProviderManage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">factory</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> providerManage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">startup</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// write data to queue</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">publish</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">DataTypeParent</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">DisruptorProvider</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">Object</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> provider </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> providerManage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProvider</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> provider</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">onData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Collections</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">singleton</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// write data to queue on batch</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">publish</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Collection</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics operator" style="color:#393A34">?</span><span class="token generics"> </span><span class="token generics keyword" style="color:#00009f">extends</span><span class="token generics"> </span><span class="token generics class-name">DataTypeParent</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> dataList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">DisruptorProvider</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">Collection</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">DataTypeParent</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> provider </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> providerManage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProvider</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> provider</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">onData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dataList</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">stream</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">DataTypeParent</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">class</span><span class="token operator" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">cast</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">collect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Collectors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toList</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">close</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> providerManage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getProvider</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">shutdown</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>The loading of the configuration file, which can be seen as the initialization process of the registry server, is described in the following diagram.</p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/server-register-init-en-c20ecd9991817e159730a8aea38db110.png" width="2477" height="595" class="img_ev3q"></p> |
| <h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="32-queueconsumer">3.2 QueueConsumer<a href="#32-queueconsumer" class="hash-link" aria-label="Direct link to 3.2 QueueConsumer" title="Direct link to 3.2 QueueConsumer" translate="no"></a></h4> |
| <p>In the previous analysis of the client-side <code>disruptor</code> queue consumption of data over. The server side has the same logic, except that the executor performing the task changes.</p> |
| <p>The <code>QueueConsumer</code> is a consumer that implements the <code>WorkHandler</code> interface, which is created in the <code>providerManage.startup()</code> logic. The <code>WorkHandler</code> interface is the data consumption interface for <code>disruptor</code>, and the only method is <code>onEvent()</code>.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">com</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">lmax</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">.</span><span class="token namespace" style="opacity:0.7">disruptor</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">interface</span><span class="token plain"> </span><span class="token class-name">WorkHandler</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">onEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">T</span><span class="token plain"> var1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">throws</span><span class="token plain"> </span><span class="token class-name">Exception</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>The <code>QueueConsumer</code> overrides the <code>onEvent()</code> method, and the main logic is to generate the consumption task and then go to the thread pool to execute it.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * </span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * QueueConsumer</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">QueueConsumer</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">WorkHandler</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">DataEvent</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ......</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">onEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">DataEvent</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> t</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">t </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Use different thread pools based on DataEvent type</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">ThreadPoolExecutor</span><span class="token plain"> executor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">orderly</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">t</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// create queue consumption tasks via factory</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">QueueConsumerExecutor</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">T</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> queueConsumerExecutor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> factory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// set data</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> queueConsumerExecutor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">t</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// help gc</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> t</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// put in the thread pool to execute the consumption task</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> executor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">queueConsumerExecutor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p><code>QueueConsumerExecutor</code> is the task that is executed in the thread pool, it implements the <code>Runnable</code> interface, and there are two specific implementation classes.</p> |
| <ul> |
| <li class=""><code>RegisterClientConsumerExecutor</code>: the client-side consumer executor.</li> |
| <li class=""><code>RegisterServerConsumerExecutor</code>: server-side consumer executor.</li> |
| </ul> |
| <p>As the name implies, one is responsible for handling client-side tasks and one is responsible for handling server-side tasks.</p> |
| <ul> |
| <li class=""><code>RegisterServerConsumerExecutor#run()</code></li> |
| </ul> |
| <p><code>RegisterServerConsumerExecutor</code> is a server-side consumer executor that indirectly implements the <code>Runnable</code> interface via <code>QueueConsumerExecutor</code> and overrides the <code>run()</code> method.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">RegisterServerConsumerExecutor</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">QueueConsumerExecutor</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">List</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">DataTypeParent</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//get the data from the disruptor queue and check data</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Collection</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">DataTypeParent</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> results </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">stream</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">filter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token operator" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">isValidData</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">collect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Collectors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">toList</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">CollectionUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isEmpty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">results</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//execute operations according to type</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">getType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">results</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">executor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">results</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// get subscribers by type</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token class-name">ExecutorSubscriber</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">DataTypeParent</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token function" style="color:#d73a49">selectExecutor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Collection</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">DataTypeParent</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Optional</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">DataTypeParent</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> first </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> list</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">stream</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">findFirst</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> subscribers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">first</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">orElseThrow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-></span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">RuntimeException</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"the data type is not found"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div> |
| <ul> |
| <li class="">ExecutorSubscriber#executor()</li> |
| </ul> |
| <p>The actuator subscribers are divided into two categories, one that handles metadata and one that handles <code>URIs</code>. There are two on the client side and two on the server side, so there are four in total.</p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/executor-subscriber-86d5645d204ad1d05fe12dd30992c8d1.png" width="1732" height="403" class="img_ev3q"></p> |
| <ul> |
| <li class="">MetadataExecutorSubscriber#executor()</li> |
| </ul> |
| <p>In case of registering metadata, this is achieved by <code>MetadataExecutorSubscriber#executor()</code>: get the registered <code>Service</code> according to the type and call <code>register()</code>.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">MetadataExecutorSubscriber</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">ExecutorTypeSubscriber</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">MetaDataRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//......</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">DataType</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token class-name">DataType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">META_DATA</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">executor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Collection</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">MetaDataRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> metaDataRegisterDTOList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Traversing the metadata list</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> metaDataRegisterDTOList</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">meta </span><span class="token operator" style="color:#393A34">-></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Optional</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ofNullable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">shenyuClientRegisterService</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">meta</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getRpcType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Get registered Service by type</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ifPresent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuClientRegisterService </span><span class="token operator" style="color:#393A34">-></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Registration of metadata, locking to ensure sequential execution and prevent concurrent errors</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">synchronized</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuClientRegisterService</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> shenyuClientRegisterService</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">meta</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <ul> |
| <li class="">URIRegisterExecutorSubscriber#executor()</li> |
| </ul> |
| <p>In case of registration metadata, this is achieved by <code>URIRegisterExecutorSubscriber#executor()</code>: construct <code>URI</code> data, find <code>Service</code> according to the registration type, and achieve registration by the <code>registerURI</code> method.</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">URIRegisterExecutorSubscriber</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">ExecutorTypeSubscriber</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">URIRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//......</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">DataType</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token class-name">DataType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">URI</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token annotation punctuation" style="color:#393A34">@Override</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">executor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Collection</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">URIRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> dataList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">CollectionUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isEmpty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dataList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">findService</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dataList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ifPresent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">service </span><span class="token operator" style="color:#393A34">-></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Map</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">List</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">URIRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> listMap </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">buildData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dataList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> listMap</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">service</span><span class="token operator" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">registerURI</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Map</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">List</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">URIRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> groupByRpcType </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> dataList</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">stream</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">filter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data </span><span class="token operator" style="color:#393A34">-></span><span class="token plain"> </span><span class="token class-name">StringUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isNotBlank</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getRpcType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">collect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Collectors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">groupingBy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">URIRegisterDTO</span><span class="token operator" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">getRpcType</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Map</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">Entry</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">List</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">URIRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> entry </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> groupByRpcType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">entrySet</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> rpcType </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> entry</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getKey</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Get registered Service by type</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Optional</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ofNullable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">shenyuClientRegisterService</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rpcType</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ifPresent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">service </span><span class="token operator" style="color:#393A34">-></span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">List</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">URIRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> list </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> entry</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getValue</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Build URI data types and register them with the registerURI method</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">Map</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:#393A34">,</span><span class="token generics"> </span><span class="token generics class-name">List</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">URIRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> listMap </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">buildData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> listMap</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">service</span><span class="token operator" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">registerURI</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Find Service by type</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token class-name">Optional</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">ShenyuClientRegisterService</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> </span><span class="token function" style="color:#d73a49">findService</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">Collection</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">URIRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> dataList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> dataList</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">stream</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto </span><span class="token operator" style="color:#393A34">-></span><span class="token plain"> shenyuClientRegisterService</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getRpcType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">findFirst</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div> |
| <ul> |
| <li class="">ShenyuClientRegisterService#register()</li> |
| </ul> |
| <p><code>ShenyuClientRegisterService</code> is the registration method interface, which has several implementation classes.</p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/client-register-service-949e3110cb57db2f250dafdc41446eb4.png" width="4978" height="800" class="img_ev3q"></p> |
| <ul> |
| <li class=""><code>AbstractContextPathRegisterService</code>: abstract class, handling part of the public logic.</li> |
| <li class=""><code>AbstractShenyuClientRegisterServiceImpl</code>: : abstract class, handles part of the public logic.</li> |
| <li class=""><code>ShenyuClientRegisterDivideServiceImpl</code>: <code>divide</code> class, handles <code>http</code> registration types.</li> |
| <li class=""><code>ShenyuClientRegisterDubboServiceImpl</code>: <code>dubbo</code> class, handles <code>dubbo</code> registration types.</li> |
| <li class=""><code>ShenyuClientRegisterGrpcServiceImpl</code>: <code>gRPC</code> class, handles <code>gRPC</code> registration types.</li> |
| <li class=""><code>ShenyuClientRegisterMotanServiceImpl</code>: <code>Motan</code> class, handles <code>Motan</code> registration types.</li> |
| <li class=""><code>ShenyuClientRegisterSofaServiceImpl</code>: <code>Sofa</code> class, handles <code>Sofa</code> registration types.</li> |
| <li class=""><code>ShenyuClientRegisterSpringCloudServiceImpl</code>: <code>SpringCloud</code> class, handles <code>SpringCloud</code> registration types.</li> |
| <li class=""><code>ShenyuClientRegisterTarsServiceImpl</code>: <code>Tars</code> class, handles <code>Tars</code> registration types.</li> |
| <li class=""><code>ShenyuClientRegisterWebSocketServiceImpl</code>: <code>Websocket</code> class,handles <code>Websocket</code> registration types.</li> |
| </ul> |
| <p>From the above, we can see that each microservice has a corresponding registration implementation class. The source code analysis in this article is based on the official <a href="https://github.com/apache/shenyu/tree/master/shenyu-examples/shenyu-examples-http" target="_blank" rel="noopener noreferrer" class="">shenyu-examples-http</a> as an example, it is of <code>http</code> registration type, so the registration implementation class for metadata and URI data is <code>ShenyuClientRegisterDivideServiceImpl</code>: <code>ShenyuClientRegisterDivideServiceImpl</code>.</p> |
| <ul> |
| <li class="">register():</li> |
| </ul> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">AbstractShenyuClientRegisterServiceImpl</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">FallbackShenyuClientRegisterService</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterService</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//......</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">register</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">MetaDataRegisterDTO</span><span class="token plain"> dto</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 1.register selector information</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> selectorHandler </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">selectorHandler</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> selectorId </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> selectorService</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">registerDefault</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">PluginNameAdapter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">rpcTypeAdapter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">rpcType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> selectorHandler</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 2.register rule information</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> ruleHandler </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ruleHandler</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">RuleDTO</span><span class="token plain"> ruleDTO </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">buildRpcDefaultRuleDTO</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">selectorId</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> dto</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ruleHandler</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> ruleService</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">registerDefault</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ruleDTO</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 3.register metadata information</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">registerMetadata</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 4.register contextPath</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> contextPath </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> dto</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getContextPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">StringUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isNotEmpty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">contextPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">registerContextPath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">dto</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token class-name">ShenyuResultMessage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">SUCCESS</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>The whole registration logic can be divided into 4 steps.</p> |
| <ul> |
| <li class=""> |
| <ol> |
| <li class="">Register selector information</li> |
| </ol> |
| </li> |
| <li class=""> |
| <ol start="2"> |
| <li class="">Register rule information</li> |
| </ol> |
| </li> |
| <li class=""> |
| <ol start="3"> |
| <li class="">Register metadata information</li> |
| </ol> |
| </li> |
| <li class=""> |
| <ol start="4"> |
| <li class="">Register `contextPath</li> |
| </ol> |
| </li> |
| </ul> |
| <p>This side of <code>admin</code> requires the construction of selectors, rules, metadata and <code>ContextPath</code> through the metadata information of the client. The specific registration process and details of processing are related to the <code>rpc</code> type. We will not continue to track down the logical analysis of the registration center, tracking to this point is enough.</p> |
| <p>The source code of the server-side metadata registration process is analyzed and the flow chart is described as follows.</p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/server-metadata-register-en-8290907a57a1189a4b5863f3c47254bb.png" width="2471" height="989" class="img_ev3q"></p> |
| <ul> |
| <li class="">registerURI()</li> |
| </ul> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">abstract</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">AbstractShenyuClientRegisterServiceImpl</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">FallbackShenyuClientRegisterService</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">implements</span><span class="token plain"> </span><span class="token class-name">ShenyuClientRegisterService</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">//......</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">registerURI</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> selectorName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">List</span><span class="token generics punctuation" style="color:#393A34"><</span><span class="token generics class-name">URIRegisterDTO</span><span class="token generics punctuation" style="color:#393A34">></span><span class="token plain"> uriList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">CollectionUtils</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isEmpty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uriList</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Does the corresponding selector exist</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">SelectorDO</span><span class="token plain"> selectorDO </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> selectorService</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">findByNameAndPluginName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">selectorName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">PluginNameAdapter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">rpcTypeAdapter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">rpcType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Objects</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">isNull</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">selectorDO</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Handle handler information in the selector</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> handler </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">buildHandle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">uriList</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> selectorDO</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> selectorDO</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setHandle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">handler</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token class-name">SelectorData</span><span class="token plain"> selectorData </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> selectorService</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">buildByName</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">selectorName</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">PluginNameAdapter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">rpcTypeAdapter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">rpcType</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> selectorData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">setHandle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">handler</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Update records in the database</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> selectorService</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">updateSelective</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">selectorDO</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// publish Event to gateway</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> eventPublisher</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">publishEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">DataChangedEvent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ConfigGroupEnum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">SELECTOR</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">DataEventTypeEnum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">UPDATE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Collections</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">singletonList</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">selectorData</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token class-name">ShenyuResultMessage</span><span class="token punctuation" style="color:#393A34">.</span><span class="token constant" style="color:#36acaa">SUCCESS</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div> |
| <p>After <code>admin</code> gets the <code>URI</code> data, it mainly updates the <code>handler</code> information in the selector, then writes it to the database, and finally publishes the event notification gateway. The logic of notifying the gateway is done by the data synchronization operation, which has been analyzed in the previous article, so we will not repeat it.</p> |
| <p>The source code analysis of the server-side <code>URI</code> registration process is complete and is described in the following diagram.</p> |
| <p><img decoding="async" loading="lazy" src="/assets/images/server-uri-register-en-6026d791dbc404cadee04b237add0691.png" width="2100" height="1000" class="img_ev3q"></p> |
| <p>At this point, the server-side registration process is also analyzed, mainly through the interface provided externally, accept the registration information from the client, and then write to the <code>Disruptor</code> queue, and then consume data from it, and update the <code>admin</code> selector, rules, metadata and selector <code>handler</code> according to the received metadata and <code>URI</code> data.</p> |
| <h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-summary">4. Summary<a href="#4-summary" class="hash-link" aria-label="Direct link to 4. Summary" title="Direct link to 4. Summary" translate="no"></a></h3> |
| <p>This article focuses on the <code>http registration</code> module of the <code>Apache ShenYu</code> gateway for source code analysis. The main knowledge points involved are summarized as follows.</p> |
| <ul> |
| <li class="">The register center is for registering client information to <code>admin</code> to facilitate traffic filtering.</li> |
| <li class=""><code>http</code> registration is to register client metadata information and <code>URI</code> information to <code>admin</code>.</li> |
| <li class=""><code>http</code> service access is identified by the annotation <code>@ShenyuSpringMvcClient</code>.</li> |
| <li class="">construction of the registration information mainly through the application listener <code>ApplicationListener</code>.</li> |
| <li class="">loading of the registration type is done through <code>SPI</code>.</li> |
| <li class="">The <code>Disruptor</code> queue was introduced to decouple data from operations, and data buffering.</li> |
| <li class="">The implementation of the registry uses interface-oriented programming, using design patterns such as template methods, singleton, and observer.</li> |
| </ul></div><footer class="docusaurus-mt-lg"><div class="row margin-top--sm theme-blog-footer-edit-meta-row"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blog/tags/http">http</a></li><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blog/tags/register-center">register center</a></li><li class="tag_QGVx"><a rel="tag" class="tag_zVej tagRegular_sFm0" href="/blog/tags/apache-shen-yu">Apache ShenYu</a></li></ul></div></div><div class="row margin-top--sm theme-blog-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href="https://github.com/apache/shenyu-website/edit/main/blog/RegisterCenter-SourceCode-Analysis-Http-Register.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Blog post page navigation"><a class="pagination-nav__link pagination-nav__link--prev" href="/blog/Plugin-SourceCode-Analysis-Param-Mapping-Plugin"><div class="pagination-nav__sublabel">Newer post</div><div class="pagination-nav__label">Code Analysis For Param-Mapping Plugin</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/blog/SPI-SourceCode-Analysis-LoadBalance-SPI"><div class="pagination-nav__sublabel">Older post</div><div class="pagination-nav__label">LoadBalancer SPI Source Code Analysis</div></a></nav></main><div class="col col--2"><div class="tableOfContents_bqdL thin-scrollbar"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#1-registration-center-principle" class="table-of-contents__link toc-highlight">1. Registration Center Principle</a></li><li><a href="#2-client-registration-process" class="table-of-contents__link toc-highlight">2. Client Registration Process</a></li><li><a href="#3-server-side-registration-process" class="table-of-contents__link toc-highlight">3. Server-side registration process</a></li><li><a href="#4-summary" class="table-of-contents__link toc-highlight">4. Summary</a></li></ul></div></div></div></div></div></div> |
| </body> |
| </html> |