SSM+DUBBO實(shí)戰(zhàn)(初級(jí)demo)

項(xiàng)目簡(jiǎn)介踱讨,該項(xiàng)目采用SpringMVC+Spring+MyBatis搭建祟同,使用dubbo作為RPC框架澈魄。項(xiàng)目分為三個(gè)模塊,模塊dubbo-api存放的是一些公共的實(shí)體類和service接口葛菇。模塊dubbo-service是服務(wù)提供者,負(fù)責(zé)和數(shù)據(jù)庫交互橡羞,并將服務(wù)暴露出來眯停。模塊dubbo-consumer是服務(wù)消費(fèi)者,主要負(fù)責(zé)前端頁面的跳轉(zhuǎn)卿泽。

DUBBO簡(jiǎn)介莺债,官網(wǎng) ,dubbo是一款高性能签夭、開源的Java RPC框架齐邦。

dubbo運(yùn)行原理圖

項(xiàng)目結(jié)構(gòu)

項(xiàng)目思維導(dǎo)圖

構(gòu)建父級(jí)項(xiàng)目

首先我們使用maven創(chuàng)建一個(gè)Java項(xiàng)目,父項(xiàng)目的屬性是pom第租,我們?cè)诟疙?xiàng)目中先寫好項(xiàng)目依賴措拇,如使用的spring的版本等,當(dāng)然慎宾,我們采用軟引用丐吓,不強(qiáng)制依賴浅悉。

 <properties>
        <spring.version>4.3.7.RELEASE</spring.version>
    </properties> 
<dependencyManagement>
  <dependencies>
    ....
   </dependencies>
    </dependencyManagement>

具體使用到的依賴,我們后續(xù)一一列出券犁,這里就不寫出來了术健。

構(gòu)建服務(wù)總線-api項(xiàng)目

使用maven創(chuàng)建dubbo-api項(xiàng)目,項(xiàng)目的packaging屬性為jar粘衬。我們要在里面存放service接口和entity實(shí)現(xiàn)類荞估。
實(shí)體類Book

public class Book implements Serializable {
    private String bookId;
    private String bookName;
    private Integer number;
    ...
}

接口BookService

public interface BookService {
    public Book findById(String id);
}
構(gòu)建服務(wù)提供者provider項(xiàng)目
  • 使用maven創(chuàng)建dubbo-provider項(xiàng)目,我們首先添加響應(yīng)的依賴色难。

    1. 項(xiàng)目是一個(gè)springweb項(xiàng)目泼舱,spring-web必不可少
    2. 要連接數(shù)據(jù)庫,那么必然存在事務(wù)枷莉,那么下一個(gè)就是spring-jdbc
    3. 聲明式事務(wù)娇昙,還要用到切面,spring-aspects也得加進(jìn)去
    4. 數(shù)據(jù)庫連接笤妙,既然用了dubbo,那么另一個(gè)開源連接池必不可少冒掌,druid
    5. 當(dāng)然,mysql也是需要驅(qū)動(dòng)的mysql-connector-java
    6. 都說了是SSM框架蹲盘,那么MyBatis框架必備mybaits,mybatis-spring
    7. 要將服務(wù)暴露出去股毫,那么dubbo也是不能少的,我們這里用apache的2.7.0版本
    8. 沒有注冊(cè)中心召衔,dubbo是不會(huì)工作的zookeeper也得加進(jìn)去
    9. 既然加入了zookeeper铃诬,那么它的客戶端可不能忽視,curator-recipes,curator-framework
    10. 一個(gè)正規(guī)項(xiàng)目還是需要日志模塊的苍凛,log4j,slf4j-api加入
    11. 開發(fā)不單元測(cè)試趣席,估計(jì)會(huì)被砍死,那么spring-test,junit進(jìn)去吧醇蝴。
      上面11步把依賴添加好后宣肚,我們開始寫代碼了。(依賴就不貼出來了悠栓,占空間)
  • web.xml項(xiàng)目入口配置
    我們回想下這個(gè)項(xiàng)目是為了干神馬的霉涨?主要是為了實(shí)現(xiàn)數(shù)據(jù)庫的調(diào)用了方法的實(shí)現(xiàn)。那么這個(gè)入口里面惭适,只需要啟動(dòng)spring即可笙瑟。怎么啟動(dòng)spring呢?官方提供的方案就是監(jiān)聽ContextLoaderListener腥沽。spring是需要讀取xml里面的配置的逮走,默認(rèn)的文件是WEB-INF/applicationContext.xml,不好意思,我們是maven項(xiàng)目师溅,我更喜歡放到resource下面茅信,那么如何設(shè)定呢?spring源碼中ContextLoader類告訴了我們有個(gè)contextConfigLocation的屬性墓臭,只需要設(shè)置這個(gè)屬性即可蘸鲸。代碼如下

   <!-- 上下文配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-context.xml</param-value>
    </context-param>

    <!-- 監(jiān)聽器 加載配置上下文配置文件-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

要使項(xiàng)目可擴(kuò)展,那么spring-context.xml文件我們只干一件事情窿锉,就是聚合其他的配置文件酌摇。

 <import resource="/config/*.xml"/>
  • 數(shù)據(jù)庫的配置spring-jdbc
    如何有條理的配置數(shù)據(jù)源呢?
    第一步嗡载,讀取jdbc.properties
    第二步窑多,初始化DruidDataSource
    第三步,初始化事務(wù)管理器DataSourceTransactionManager
    第四步洼滚,設(shè)定事務(wù)的傳播級(jí)別和規(guī)則埂息。
    第五步,寫好一個(gè)切面

  • mybatis的配置spring-mybatis
    mybatis的配置比較簡(jiǎn)單遥巴,我們先定義SqlSessionFactoryBean再定義MapperScannerConfigurer

  • service的配置spring-service
    service干的活更少了千康,我們只需要加入包掃描就可以了。

 <context:component-scan base-package="com.zwq.core.service"/>
  • dubbo的配置dubbo-provider
    配置dubbo分五步:
    第一步:定義服務(wù)名铲掐。<dubbo:application
    第二步:指定注冊(cè)中心<dubbo:registry
    第三步:指定暴露端口<dubbo:protocol
    第四步:指定服務(wù)接口<dubbo:service
    第五步:傳統(tǒng)的接口指向?qū)崿F(xiàn)類定義拾弃。

  • 編寫Java代碼實(shí)現(xiàn)
    簡(jiǎn)單實(shí)現(xiàn)一個(gè)查詢功能,那么我們定義一個(gè)BookDao,然后定義一個(gè)BookServiceImpl就好了摆霉。這里發(fā)現(xiàn)豪椿,我們需要添加dubbo-api的依賴,否則無法實(shí)現(xiàn)BookService接口就沒法玩了携栋。代碼太過簡(jiǎn)單砂碉,這里不列出來了

構(gòu)建服務(wù)消費(fèi)者consumer項(xiàng)目

使用maven創(chuàng)建dubbo-consumer項(xiàng)目,老規(guī)矩刻两,先看看依賴吧。

  • 依賴

    1. 前端專用滴某,那么spring-webmvc ~~get
    2. jsp頁面那么jstl
    3. dubbo還是要的
    4. zookeeper 還是不能少
    5. 客戶端磅摹,加入curator-client就可以了
    6. 先添加總線的dubbo-api依賴吧,別又忘了
  • 項(xiàng)目入口霎奢,web.xml
    spring mvc的入口DispatcherServlet配置然后配置攔截url-pattern:/就好了户誓。還有DispatcherServlet的contextConfigLocation指定成classpath:spring-mvc.xml

  • spring-mvc.xml

  1. controller包掃描加入
  2. 靜態(tài)資源映射
  3. 定義下視圖解析器
<context:component-scan base-package="com.zwq.core.controller"/>
 <mvc:annotation-driven/>
 <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
  • dubbo-consumer.xml
    首先在spring-mvc.xml中記得引入,要不然幕侠,讀不到的<import resource='dubbo-consumer.xml'.
    dubbo-consumer.xml配置分4步
    第一步:定義名字
    第二步:定義注冊(cè)中心帝美,其實(shí)非必要
    第三步:定義接口引用<dubbo:reference interface="com.zwq.core.service.BookService" id="bookService" url="dubbo://127.0.0.1:20880"/>
    第四步:設(shè)置超時(shí)時(shí)間<dubbo:consumer

  • 編寫controller

 @GetMapping("/listBookById.do")
    public String listBookById(Model model, @RequestParam String id){
        Book book = bookService.findById(id);
        log.info("book:{}",book.toString());
        model.addAttribute("book",book);
        return "showBook";
    }

結(jié)束語
這個(gè)項(xiàng)目只是對(duì)dubbo的一個(gè)初級(jí)應(yīng)用,在實(shí)際的生產(chǎn)環(huán)境中應(yīng)該會(huì)更加額復(fù)雜晤硕,我也是出于學(xué)習(xí)階段并沒有實(shí)際開發(fā)過線上的dubbo項(xiàng)目悼潭,其中可能有很多不成熟的觀點(diǎn)庇忌,需要不斷的學(xué)習(xí)和進(jìn)步。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舰褪,一起剝皮案震驚了整個(gè)濱河市皆疹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌占拍,老刑警劉巖略就,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異晃酒,居然都是意外死亡表牢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門贝次,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崔兴,“玉大人,你說我怎么就攤上這事浊闪∧詹迹” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵搁宾,是天一觀的道長折汞。 經(jīng)常有香客問我,道長盖腿,這世上最難降的妖魔是什么爽待? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮翩腐,結(jié)果婚禮上鸟款,老公的妹妹穿的比我還像新娘。我一直安慰自己茂卦,他們只是感情好何什,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著等龙,像睡著了一般处渣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛛砰,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天罐栈,我揣著相機(jī)與錄音,去河邊找鬼泥畅。 笑死荠诬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柑贞,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼方椎,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了凌外?” 一聲冷哼從身側(cè)響起辩尊,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎康辑,沒想到半個(gè)月后摄欲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疮薇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年胸墙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片按咒。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迟隅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出励七,到底是詐尸還是另有隱情智袭,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布掠抬,位于F島的核電站吼野,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏两波。R本人自食惡果不足惜瞳步,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腰奋。 院中可真熱鬧单起,春花似錦、人聲如沸劣坊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽局冰。三九已至括儒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锐想,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國打工乍狐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赠摇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像藕帜,于是被迫代替她去往敵國和親烫罩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容