<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] **概要:** 1. 分布式項目開發與聯調 2. 控制管理后臺使用 3. Dubbo注冊中心詳解 ## 一、分布式項目開發與聯調 --- ### **接口暴露與引用** 在一個RPC場景中 ,調用方是通過接口來調用服務端,傳入參數并獲得返回結果。這樣服務端的接口和模型必須暴露給調用方項目。服務端如何暴露呢?客戶端如何引用呢? **接口信息** **、模型信息** **、異常** ![](https://img.kancloud.cn/bb/d0/bbd042b07614dd47b5e6f661a2531674_570x261.png) 暴露接口的通常做法是 接口與實現分離,服務端將 接口、模型、異常 等統一放置于一個模塊,實現置于另一個模塊。調用方通過Maven進行引用。 ![](https://img.kancloud.cn/64/a3/64a30ff7bd5c2a890f47b44f08b0ebbf_672x289.png) ### **自動化構建與協作** 當項目越來越多,服務依懶關系越發復雜的時候,為了提高協作效率,必須采用自動化工具 完成 接口從編寫到構建成JAR包,最后到引用的整個過程。 ![](https://img.kancloud.cn/51/0b/510b1d688d6f47e4387a1aef4983e044_1104x372.png) 流程描述: 1. 服務提供者項目發人員編寫Client 接口 2. push 至遠程倉庫 3. jenkins 構建指定版本 4. jenkins Deploye 至私服倉庫 nexus 5. 服務消費者項目開發人員基于maven 從私服務倉庫下載 ### **接口平滑升級:** 在項目迭代過程當中, 經常會有多個項目依懶同一個接口,如下圖 項目B、C都依懶了項目A當中的接口1,此時項目B業務需要,需要接口1多增加一個參數,升級完成后。項目B能正確構建上線,項目C卻不行。 ![](https://img.kancloud.cn/61/e1/61e15f1cfcf78c1fa55ce43d30a10dc1_632x269.png) 解決辦法與原則: 1. 接口要做到向下兼容:接口參數盡量以對象形式進行封裝。Model屬性只增不刪,如果需要作廢,可以添加@Deprecated? 標識。 2. 如果出現了不可兼容的變更,則必須通知調用方整改,并制定上線計劃。 ### **開發聯調:** 在項目開發過程當中,一個開發或測試環境的注冊中心很有可能會同時承載著多個服務,如果兩組服務正在聯調,如何保證調用的是目標服務呢? **1、基于臨時分組聯調** group 分組 ?在reference 和server 當中采用相同的臨時組 ,通過group 進行設置 **2、直連提供者:** 在reference 中指定提供者的url即可做到直連? ``` <dubbo:reference? url="dubbo://127.0.0.1:20880" id="demoService" ????????????????? timeout="2000" ????????????????? interface="com.tuling.teach.service.DemoService" check="false"/> ``` **3、只注冊:** 一個項目有可能同是為即是服務提供者又消費者,在測試時需要調用某一服務同時又不希望正在開發的服務影響到其它訂閱者如何實現? 通過修改 register=false 即可實現 ``` <dubbo:registry address="multicast://224.5.6.7:1234" register="false"/> ``` ## ## 二、Dubbo控制管理后臺使用 --- ### **Dubbo 控制后臺版本說明:** 2.5.8 duboo-admin 2.6 dubbo-admin ### **Dubbo 控制后臺的安裝:** ``` #從github 中下載dubbo 項目 git clone https://github.com/apache/incubator-dubbo.git #更新項目 git fetch #臨時切換至 dubbo-2.5.8 版本 git checkout dubbo-2.5.8 #進入 dubbo-admin 目錄 cd dubbo-admin #mvn 構建admin war 包 mvn clean pakcage -DskipTests #得到 dubbo-admin-2.5.8.war 即可直接部署至Tomcat #修改 dubbo.properties 配置文件 dubbo.registry.address=zookeeper://127.0.0.1:2181 ``` 注:如果實在懶的構建 可直接下載已構建好的: 鏈接:[https://pan.baidu.com/s/1zJFNPgwNVgZZ-xobAfi5eQ](https://pan.baidu.com/s/1zJFNPgwNVgZZ-xobAfi5eQ)?提取碼:gjtv? **控制后臺基本功能介紹 :** * 服務查找: * 服務關系查看: * 服務權重調配: * 服務路由: * 服務禁用 ## 三、Dubbo注冊中心詳解 --- ### 注冊中心的作用 為了到達服務集群動態擴容的目的,注冊中心存儲了服務的地址信息與可用狀態信息,并實時推送給訂閱了相關服務的客戶端。 ![](https://img.kancloud.cn/4c/9e/4c9e513f959134e01d89104b03dc918a_684x403.png) **一個完整的注冊中心需要實現以下功能:** 1. 接收服務端的注冊與客戶端的引用,即將引用與消費建立關聯,并支持多對多。 2. 當服務非正常關閉時能即時清除其狀態 3. 當注冊中心重啟時,能自動恢復注冊數據,以及訂閱請求 4. 注冊中心本身的集群 ### Dubbo所支持的注冊中心 1. **Multicast 注冊中心** 1. 基于組網廣播技術,只能用在局域網內,一般用于簡單的測試服務 2. **Zookeeper 注冊中心(****推薦****)** 1. [Zookeeper](http://zookeeper.apache.org/)?是 Apacahe Hadoop 的子項目,是一個樹型的目錄服務,支持變更推送,適合作為 Dubbo 服務的注冊中心,工業強度較高,可用于生產環境,并推薦使用 3. **Redis 注冊中心** 1. 基于Redis的注冊中心 4. **Simple 注冊中心** 1. 基于本身的Dubbo服務實現(SimpleRegistryService),不支持集群可作為自定義注冊中心的參考,但不適合直接用于生產環境。? ### **Redis 注冊中心** 關于Redis注冊中心我們需要了解兩點, 1. 如何存儲服務的注冊與訂閱關系 2. 是當服務狀態改變時如何即時更新 Dubbo使用Redis的發布訂閱特性實現 提供者與消費者之前數據實時同步其原理如下: **Redis 發布訂閱** Redis 發布訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。 Redis 客戶端可以訂閱任意數量的頻道。 下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關系: ![](https://img.kancloud.cn/a0/88/a088639cded1078abf0450c10b323765_319x198.png) 當有新消息通過 PUBLISH 命令發送給頻道 channel1 時, 這個消息就會被發送給訂閱它的三個客戶端: 演示使用Redis 做為注冊中心的使用。 - [ ] 啟動Redis服務 - [ ] 服務端配置注冊中心 - [ ] 啟動兩個服務端 - [ ] 通過RedisClient 客戶端觀察Redis中的數據 redis 注冊中心配置: ``` <dubbo:registry protocol="redis" address="192.168.0.147:6379"/> ``` 當我們啟動兩個服務端后發現,Reids中增加了一個Hash 類型的記錄,其key為/dubbo/tuling.dubbo.server.UserService/providers。Value中分別存儲了兩個服務提供者的URL和有效期。 ![](https://img.kancloud.cn/6b/6a/6b6adc4aff352f520ebf2a9411375075_1096x342.png) **同樣消費者也是類似其整體結構如下:** ``` //服務提供者注冊信息 /dubbbo/com.tuling.teach.service.DemoService/providers dubbo://192.168.246.1:20880/XXX.DemoService=1542619052964 dubbo://192.168.246.2:20880/XXX.DemoService=1542619052964 //服務消費訂閱信息 /dubbbo/com.tuling.teach.service.DemoService/consumers dubbo://192.168.246.1:20880/XXX.DemoService=1542619788641 ``` * 主 Key 為服務名和類型 * Map 中的 Key 為 URL 地址 * Map 中的 Value 為過期時間,用于判斷臟數據,臟數據由監控中心刪除 接下來回答第二個問題 **當提供者突然 宕機狀態能即里變更嗎**? 這里Dubbo采用的是定時心跳的機制 來維護服務URL的有效期,默認每30秒更新一次有效期。即URL對應的毫秒值。具體代碼參見:com.alibaba.dubbo.registry.redis.RedisRegistry#expireExecutor ![](https://img.kancloud.cn/43/25/432533f0ff9f90054ee67de2b3bf50a5_745x431.png) com.alibaba.dubbo.registry.redis.RedisRegistry#deferExpired com.alibaba.dubbo.registry.integration.RegistryDirectory com.alibaba.dubbo.registry.support.ProviderConsumerRegTable ### **Zookeeper 注冊中心** 關于Zookeeper 注冊中心同樣需要了解其存儲結構和更新機制。 Zookeper是一個樹型的目錄服務,本身支持變更推送相比redis的實現Publish/Subscribe功能更穩定。 **失敗重連** com.alibaba.dubbo.registry.support.FailbackRegistry **提供者突然斷開:** 基于Zookeeper 臨時節點機制實現,在客戶端會話超時后 Zookeeper會自動刪除所有臨時節點,默認為40秒。 // 創建臨時節點 ``` com.alibaba.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient#createEphemeral ``` 提問: 在zookeeper 斷開的40秒內 如果 有客戶端加入 會調用 已失效的提供者連接嗎? 答:不會,提供者宕機后 ,其與客戶端的鏈接也隨即斷開,客戶端在調用前會檢測長連接狀態。 ``` // 檢測連接是否有效 com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker#isAvailable ``` 創建 configurators與routers 會創建持久節點 // 創建持久節點 ``` com.alibaba.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient#createPersistent ``` **服務訂閱機制實現:** ``` // 注冊目錄 com.alibaba.dubbo.registry.integration.RegistryDirectory ``` 源碼解析: ![](https://img.kancloud.cn/03/bc/03bca4cc104a4381f1aa225285dc67d7_1336x581.png) com.alibaba.dubbo.registry.integration.RegistryDirectory
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看