1. 程式人生 > >從零開始搭建一個dubbo框架及常見問題說明

從零開始搭建一個dubbo框架及常見問題說明

1.      dubbo框架理解:

dubbo是一種分散式框架,最早應用於電商專案。它經歷瞭如下幾個發展階段:

從單一應用框架(ORM):當網站流量很小時,只需一個應用,將所有功能都部署在一起以減少部署節點和成本;

垂直應用框架(MVC):當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率;

分散式應用架構(RPC):當垂直應用越來越多,應用之間互動不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求;

流動計算架構(SOA):當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個排程中心基於訪問壓力實時管理叢集容量,提高叢集利用率;

用圖形表示為:


而dubbo的工作圖:


其中:

0.服務容器負責啟動,載入,執行服務提供者。

1.服務提供者在啟動時,向註冊中心註冊自己提供的服務。

2.服務消費者在啟動時,向註冊中心訂閱自己所需的服務。

3.註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。

4.服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。

5.服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心

2.dubbo專案搭建

在專案搭建之前,需要安裝zookeeper與dubbo,具體過程請百度。這裡是兩個推薦地址:

關於dubbo的安裝,因為筆者參見網路搞了很久才出來,在這裡我詳細說下。

在啟動zookepeer不報錯以後,進行如下配置:

1) 配置一個獨立的tomcat準備作為dubbo-admin啟動的容器,下載dubbo-admin的war包釋出到tomcat中(拷貝到tomcat的webapp下);

2) 啟動tomcat,可以發現dubbo-admin.war被解壓了。開啟解壓包中/WEB-INF/dubbo.properties檔案,進行以下修改:

dubbo.registry.address=zookeeper://127.0.0.1:2181     //與你的zookeeper地址及埠一致

dubbo.admin.root.password=root  //dobbo-admin的登陸使用者root 密碼root

dubbo.admin.guest.password=guest      //dobbo-admin的登陸使用者guest 密碼suest

若報錯Errorcreating bean with name 'uriBrokerService': Cannot create inner bean '(innerbean)' of type[com.alibaba.citrus.service.uribroker.impl.URIBrokerServiceImpl$URIBrokerInfo]while setting bean property 'brokers' with key [0]…

這多半是由於你下載的dubbo-admin版本與你的jdk不相容引起的,如dubbo-admin2.5.4與jdk1.7以上版本都不相容。

此時有兩種方法,第一自不必說是替換低版本的jdk,可這樣會影響到我們正在開發的專案配置,很麻煩;第二種就是重新編譯打包dubbo-admin,下面簡述一下:

2) 修改你的maven/conf/settings.xml,新增如下內容後,檢查eclipse中是否將其配置到了maven中(preference-maven-userssting),若無則新增。

<mirror>

      <id>alimaven</id>

      <name>aliyun maven</name>

      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>

     <mirrorOf>central</mirrorOf>       

</mirror>

下面,我們從零開始來建立一個dubbo專案。

1.      關於Maven多模組建立dubb專案

為了便於理解和管理,博主使用了Maven多模組專案。主模組相當於一個容器,裡面有很多子專案,它們很多地方類似,因此放在一起。其中,主模組是一個site-simple專案,其pom.xml中得package一定是pom,表示它是一個被繼承的模組。子模組的package一定是jar。

去掉子模組的version,建立相互依賴時記得版本一定要和主模組的版本一致。

2.      只有web專案才能釋出到tomcat中,而在這個專案中,student-test與student-web分別作為需要執行在tomcat裡的消費者與提供者,故這兩個在建立時選擇web-app,同時要為它們配置完整的spring執行檔案,如applicationContext.xml和dispatcherServlet.xml,以及web.xml。而web-api和web-service只是在student-web中被內建呼叫的,只需在student-web中配置好呼叫即可。

3.      Dubbo-provider/consumer.xml怎麼被spring載入的問題:

這裡,筆者考慮既然這也是哥xml檔案,那它是否也和applicationContext.xml和dispatcherServlet.xml一樣,在web.xml中進行配置在spring中讀取。其實不然,spring中dubbo的啟動機制如下:

dubbo是基於Spring進行開發的,而且擴充套件了Spring的XML schema和註解標籤,其實這裡也就是整個dubbo的切入點。dubbo除去依賴其他的第三方框架外,整個框架只有一個jar包,可謂是精緻。在這個jar包的NET-INF目錄下有兩個檔案:spring.handlers和spring.schemas。其中spring.schemas中定義的就是擴充套件的spring配置標籤,而且spring.handlers中定義的就是這些schema的處理類,就是這個類將dubbo元件“插入”到spring這個平臺裡的。(關於如何自定義spring配置的schema,網上資料很多,這裡只簡單概括)Spring在啟動的時候會掃描MET-INF下所有的spring.handlers等檔案,找到其中的標籤處理類,並執行其init方法。

4.      將student-test與student-web部署到tomcat上後,執行,報錯” org.aspectj.lang.annotation.Around”.

要使用aspectj必須引入spring-aop和spring-aspects兩個依賴。而因為博主在test專案中啟用了aspectj,但在student-demo以及student-api中並沒有建立這兩個依賴。

此時,考慮到這只是一個dubbo例子,並無aspect呼叫,故去掉即可。

5.      student-web部署到tomcat上報錯無法啟動ContextLoaderListener與Log4jConfigListener。

這是因為tomcat在釋出專案的時候沒有同時釋出maven依賴所新增的jar包。解決方法:專案 —>properties -> Deployment Assembly -> Add -> Java Build Path Entries-> 選擇MavenDependencies -> Finish -> OK 把對應的Maven依賴包也釋出到tomcat。

6.      同時釋出時報錯Webapp root system property already set to different value

因為是兩個專案部署在統一個tomcat中,又都沒有定義webAppRootKey,故需分別在它們的web.xml中配置一個自己的webAppRootKey。方法如下:

<context-param>

   <param-name>webAppRootKey</param-name>

   <param-value>app1.root</param-value>

</context-param>

7.      Student-test的controller中引入的productApi註解失敗,即Noqualifying bean of type [com.product.api.ProductApi] found for dependency。

這是因為在dubbo遠端服務代理中,dubbo的service、reference的載入機制決定的。reference標註的物件不會被spring容器管理,是無法通過factory.getBean獲取的。

專案原始碼參見github:

提供者:https://github.com/Iwillloveyou/dubboSample-Provider.git

消費者:https://github.com/Iwillloveyou/dubboSample-Consumer.git

最後,感謝文中引用到的博文作者,謝謝你們的分享。文中可能部分內容有重複,還望別介意。

如有建議,歡迎留言。

相關推薦

開始搭建一個dubbo框架常見問題說明

1.      dubbo框架理解:dubbo是一種分散式框架,最早應用於電商專案。它經歷瞭如下幾個發展階段:從單一應用框架(ORM):當網站流量很小時,只需一個應用,將所有功能都部署在一起以減少部署節點和成本;垂直應用框架(MVC):當訪問量逐漸增大,單一應用增加機器帶來的

如何開始搭建一個Truffle框架的DAPP應用

1 摘要 開發實戰|3步教你在以太坊上開一家寵物店(附流程+程式碼)介紹瞭如何獲取寵物商店的TRUFLLE框架程式碼,並完成部署的過程。 但是這個是已經成熟的程式碼框架,一般使用者要開發自己的專案。那如何借用寵物商店成熟框架完成自有DAPP的搭建呢?我們以tiny熊老師的一

開始搭建一個專案框架MVVM(OC)

1.新建一個專案輸入你的ProductName(專案名稱)、組織、開發者賬號等一些簡單的選項 2.配置開發環境 3.修改個人配置 4.建立cocoaPod依賴庫 4.1:cd 專案 4.2:建立PodFile(touch PodFile) 4.3:

開始搭建一個主流專案框架(三)—RxJava2.0+Retrofit2.0+OkHttp

個人部落格:haichenyi.com。感謝關注   上一篇,我們把mvp+dagger加進去了,這一篇,我們把網路請求加上   我這裡的網路請求是用的裝飾者模式去寫的,什麼是裝飾者模式呢?在不必改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。

開始搭建一個主流專案框架(一)—簡單的框架

個人部落格:haichenyi.com。感謝關注 目的   首先先說出,最終的目的是現在主流的MVP+RxJava+Retrofit+OkHttp框架。讓大家心裡有底   開發工具Android Studio3.0,還在用eclipse的同鞋,強烈推薦

開始搭建一個主流專案框架(二)—MVP+Dagger2

個人部落格:haichenyi.com。感謝關注   接著上一篇簡單的框架,沒有看過的同鞋可以去喵一眼。上一篇我們搭好了簡單的框架,初始化一次的內容丟在Application裡面,所有的activity繼承一個類BaseActivity,還有Fragment繼

vue-用Vue-cli開始搭建一個Vue項目

-a htm sset VM bin size 過多 sets 掃描   Vue是近兩年來比較火的一個前端框架(漸進式框架吧)。 Vue兩大核心思想:組件化和數據驅動。組件化就是將一個整體合理拆分為一個一個小塊(組件),組件可重復使用;數據驅動是前端的未來發展方向,釋放了對

開始搭建輕量級JavaWeb框架

smartframework 黃勇<<架構探險:從零開始寫JavaWeb框架>>,輕量級javaweb框架smartframework原始碼,原始碼地址:https://github.com/letterZhao/smartframework.git 簡介

如何開始搭建一個能夠顯示HelloWorld的網站

大學畢業後,在工地搬磚,搬磚的同事都說,現在是一個網際網路加的時代 ,搬磚行當也應該與時俱進,加入網際網路的大軍,然後大家開始討論如果建立一個公司叫滴滴搬磚應該挺賺錢的,畢竟現在房價那麼貴,但是我們搬磚的工資又很低,肯定是無良的房地產供應商賺了很多錢,但是有了滴滴搬磚就不一樣,需要住房子

開始搭建一個簡單的基於webpack的vue開發環境

都8102年了,現在還來談webpack的配置,額,是有點晚了。而且,基於vue-cli或者create-react-app生成的專案,也已經一鍵為我們配置好了webpack,看起來似乎並不需要我們深入瞭解。 不過,為了學習和理解webpack解決了前端的哪些痛點,還是有必要從零開始自己

怎樣0開始搭建一個測試框架_4——報告

怎樣從0開始搭建一個測試框架_4 這一步我們需要用到並修改HTMLTestRunner.py,它本身是基於PY2的,簡單而實用,之前博主對其進行了美化,並且改成了中文(下載連結)。 現在博主基於此進行了對PY3的修改,增加了對subTest的支援。

造輪子:搭建一個簡單的nodejs伺服器,開始搭建一個自用網站(0)

伺服器用的是阿里雲最早期的伺服器低配版本1Gcpu,512M記憶體,20G硬碟,1M頻寬,平常只是用來做測試,目前只處理業務邏輯,網站的設計上儘量避免佔用太多的頻寬, 靜態檔案的儲存用的是阿里雲oss,100G空間,夠放視訊,圖片什麼的, html/js/c

selenium學習之--0開始搭建一個測試框架(總章)

目錄 思考:我們需要一個什麼樣的框架 既然要搭一個框架,我們首先得弄明白我們需要一個什麼樣的框架,這個框架要支援什麼功能? 框架主要的作用就是幫助我們編寫更簡單並且好維護的用例。我們需要把所有除測試用例以外的東西抽象出來作為框架的部分。 那麼,額外的東西是

開始搭建一個簡易的伺服器(二)

超級大坑 第一篇部落格到現在拖坑有半年了(不過估計也沒人記得我),原本的打算是既然要寫伺服器,那自然要設計一門語言,類似於php這樣的工作於伺服器後端負責後端渲染,然後到目前為止的時間基本都花在寫編譯器上了囧,編譯器的專案在這裡。如果真的等編譯器全部寫

怎樣0開始搭建一個測試框架_2——日誌

怎樣從0開始搭建一個測試框架_2 這部分需要預先了解Python的內建庫logging,不會用的可以先看下博主的 【Python logging 模組】學習下logging使用 接下來我們為我們的框架加上log,在utils中建立一個log.py檔案

怎樣0開始搭建一個測試框架_8——斷言

怎樣從0開始搭建一個測試框架_8 上次我們的用例中增加了斷言。斷言(檢查點)這個東西對測試來說很重要。不然你怎麼知道一個測試結果是對是錯呢。unittest為我們提供了很多很好的斷言,但是對於我們的專案可能是不夠的。我們需要封裝自己的斷言方法。 這裡

怎樣0開始搭建一個測試框架_6——PageObject

怎樣從0開始搭建一個測試框架_6 針對UI自動化,接下來我們用PO思想進行下封裝。 對於不同的專案,不同的頁面,我們都需要選擇瀏覽器、開啟網址等,我們可以把這些操作抽象出來,讓不同的用例去呼叫,只需要傳入不同引數即可,不用一遍遍複製貼上。 為此,我

開始搭建一個ELKB日誌收集系統

當今的軟體開發多核以及分佈已經成為了常態,基本上稍大型的應用都是多臺機器分散式部署。分散式在提高效能的同時也帶來了很多問題,今天我們只討論一點,那就是如何處理多臺機器線上系統的日誌。 以我司的某個應用T為例,部署在了百度雲5臺機子上,其中一臺擁有公網IP,使用了百度雲提供的負載均衡服務。每次想要在日誌中檢索

react開發:開始搭建一個react專案

從頭開始建立一個React App - 專案基本配置 npm init 生成 package.json 檔案.安裝各種需要的依賴: npm install --save react - 安裝React.npm install --save reac

開始搭建一個簡易的伺服器(一)

前言 其實大家大可不必被伺服器這三個字嚇到,一個入門級後端框架,所需的僅僅是HTTP相關的知識與應用這些知識的程式設計工具。據本人的經驗,絕大多數人擁有搭建後端所涉及到的基礎理論知識,但是缺乏能將之應用出去的工具,而本文即是交給讀者這樣一個工具,並能夠運用之來