項目簡介,該項目采用SpringMVC+Spring+MyBatis搭建,使用dubbo作為RPC框架。項目分為三個模塊,模塊dubbo-api存放的是一些公共的實體類和service接口。模塊dubbo-service是服務提供者,負責和數據庫交互,并將服務暴露出來。模塊dubbo-consumer是服務消費者,主要負責前端頁面的跳轉。
DUBBO簡介,官網 ,dubbo是一款高性能、開源的Java RPC框架。
dubbo運行原理圖
項目結構
構建父級項目
首先我們使用maven創建一個Java項目,父項目的屬性是pom,我們在父項目中先寫好項目依賴,如使用的spring的版本等,當然,我們采用軟引用,不強制依賴。
<properties>
<spring.version>4.3.7.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
....
</dependencies>
</dependencyManagement>
具體使用到的依賴,我們后續一一列出,這里就不寫出來了。
構建服務總線-api項目
使用maven創建dubbo-api項目,項目的packaging屬性為jar。我們要在里面存放service接口和entity實現類。
實體類Book
public class Book implements Serializable {
private String bookId;
private String bookName;
private Integer number;
...
}
接口BookService
public interface BookService {
public Book findById(String id);
}
構建服務提供者provider項目
-
使用maven創建dubbo-provider項目,我們首先添加響應的依賴。
- 項目是一個springweb項目,spring-web必不可少
- 要連接數據庫,那么必然存在事務,那么下一個就是spring-jdbc
- 聲明式事務,還要用到切面,spring-aspects也得加進去
- 數據庫連接,既然用了dubbo,那么另一個開源連接池必不可少,druid
- 當然,mysql也是需要驅動的mysql-connector-java
- 都說了是SSM框架,那么MyBatis框架必備mybaits,mybatis-spring
- 要將服務暴露出去,那么dubbo也是不能少的,我們這里用apache的2.7.0版本
- 沒有注冊中心,dubbo是不會工作的zookeeper也得加進去
- 既然加入了zookeeper,那么它的客戶端可不能忽視,curator-recipes,curator-framework
- 一個正規項目還是需要日志模塊的,log4j,slf4j-api加入
- 開發不單元測試,估計會被砍死,那么spring-test,junit進去吧。
上面11步把依賴添加好后,我們開始寫代碼了。(依賴就不貼出來了,占空間)
web.xml項目入口配置
我們回想下這個項目是為了干神馬的?主要是為了實現數據庫的調用了方法的實現。那么這個入口里面,只需要啟動spring即可。怎么啟動spring呢?官方提供的方案就是監聽ContextLoaderListener。spring是需要讀取xml里面的配置的,默認的文件是WEB-INF/applicationContext.xml
,不好意思,我們是maven項目,我更喜歡放到resource下面,那么如何設定呢?spring源碼中ContextLoader類告訴了我們有個contextConfigLocation的屬性,只需要設置這個屬性即可。代碼如下
<!-- 上下文配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-context.xml</param-value>
</context-param>
<!-- 監聽器 加載配置上下文配置文件-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
要使項目可擴展,那么spring-context.xml文件我們只干一件事情,就是聚合其他的配置文件。
<import resource="/config/*.xml"/>
數據庫的配置spring-jdbc
如何有條理的配置數據源呢?
第一步,讀取jdbc.properties
第二步,初始化DruidDataSource
第三步,初始化事務管理器DataSourceTransactionManager
第四步,設定事務的傳播級別和規則。
第五步,寫好一個切面mybatis的配置spring-mybatis
mybatis的配置比較簡單,我們先定義SqlSessionFactoryBean再定義MapperScannerConfigurerservice的配置spring-service
service干的活更少了,我們只需要加入包掃描就可以了。
<context:component-scan base-package="com.zwq.core.service"/>
dubbo的配置dubbo-provider
配置dubbo分五步:
第一步:定義服務名。<dubbo:application
第二步:指定注冊中心<dubbo:registry
第三步:指定暴露端口<dubbo:protocol
第四步:指定服務接口<dubbo:service
第五步:傳統的接口指向實現類定義。編寫Java代碼實現
簡單實現一個查詢功能,那么我們定義一個BookDao,然后定義一個BookServiceImpl就好了。這里發現,我們需要添加dubbo-api的依賴,否則無法實現BookService接口就沒法玩了。代碼太過簡單,這里不列出來了
構建服務消費者consumer項目
使用maven創建dubbo-consumer項目,老規矩,先看看依賴吧。
-
依賴
- 前端專用,那么spring-webmvc ~~get
- jsp頁面那么jstl
- dubbo還是要的
- zookeeper 還是不能少
- 客戶端,加入curator-client就可以了
- 先添加總線的dubbo-api依賴吧,別又忘了
項目入口,web.xml
spring mvc的入口DispatcherServlet配置然后配置攔截url-pattern:/就好了。還有DispatcherServlet的contextConfigLocation指定成classpath:spring-mvc.xmlspring-mvc.xml
- controller包掃描加入
- 靜態資源映射
- 定義下視圖解析器
<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步
第一步:定義名字
第二步:定義注冊中心,其實非必要
第三步:定義接口引用<dubbo:reference interface="com.zwq.core.service.BookService" id="bookService" url="dubbo://127.0.0.1:20880"/>
第四步:設置超時時間<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";
}
結束語
這個項目只是對dubbo的一個初級應用,在實際的生產環境中應該會更加額復雜,我也是出于學習階段并沒有實際開發過線上的dubbo項目,其中可能有很多不成熟的觀點,需要不斷的學習和進步。