這章會利用maven進行分模塊,并且引入dubbo和spring-boot,廢話不多說氮发,就開始一步步的搭建凡资。
分模塊
首先新建一個maven項目(其實目前好像更流行用gradle,雖然在android中我使用過砸捏,但僅僅是用gradle模塊管理,以及引入一些包文件隙赁,具體的大作用還是沒仔細了解垦藏,有興趣的小伙伴可以去了解使用)項目目錄如下圖所示。因為我這個是作為一個父模塊伞访,并不需要src掂骏。我們這邊可以直接刪掉src,保留也可以厚掷,問題不大弟灼。
然后我們將子模塊添加到父模塊下级解,我們分別需要一個提供者,一個消費者和一個基礎模塊田绑。創(chuàng)建完成后文件目錄如圖顯示
我們在項目的pom.xml文件中添加需要的jar包勤哗。使用dependencyManagement標簽,子項目pom不會自動使用父pom中的jar包掩驱,如果需要使用芒划,就要給出groupId和artifactId,無需給出version
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zym.test</groupId>
<artifactId>SpringBoot_Dubbo_Demo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>SpringBoot_Dubbo_Consumer</module>
<module>SpringBoot_Dubbo_Provider</module>
<module>SpringBoot_Dubbo_Common</module>
</modules>
<!-- 設置我們項目的一些版本屬性 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.7</java.version>
<dubbo.version>2.5.5</dubbo.version>
<zkclient.version>0.10</zkclient.version>
<lombok.version>1.16.18</lombok.version>
<spring-boot.version>1.5.7.RELEASE</spring-boot.version>
</properties>
<!-- 聲明一些項目依賴管理昙篙,方便我們的依賴版本管理 -->
<dependencyManagement>
<dependencies>
<!-- Springboot依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- Springboot-web依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- 使用lombok實現(xiàn)JavaBean的get腊状、set、toString苔可、hashCode缴挖、equals等方法的自動生成 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<!-- Dubbo依賴 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!-- zookeeper的客戶端依賴 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
接著基礎模塊都要被消費者和提供者模塊引用。我們對基礎模塊的pom.xml導入需要的jar文件焚辅。以及創(chuàng)建基礎模塊存放的文件夾∮澄荩現(xiàn)在我們僅僅將domin和service接口作為基礎提供給消費者和提供者使用。在基礎模塊中引用lombok同蜻,一個非常好用減少get set 的編寫棚点,并且不影響速度。給出common項目的目錄結構以及pom.xml湾蔓。
Common項目的.pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringBoot_Dubbo_Demo</artifactId>
<groupId>com.zym.test</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>SpringBoot_Dubbo_Common</artifactId>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
然后我們分別在兩個模塊中的pom.xml文件中引用基礎模塊瘫析,并且引入需要的jar包。
SpringBoot_Dubbo_Consumer pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringBoot_Dubbo_Demo</artifactId>
<groupId>com.zym.test</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>SpringBoot_Dubbo_Consumer</artifactId>
<dependencies>
<dependency>
<groupId>com.zym.test</groupId>
<artifactId>SpringBoot_Dubbo_Common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
SpringBoot_Dubbo_Provider 的pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringBoot_Dubbo_Demo</artifactId>
<groupId>com.zym.test</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>SpringBoot_Dubbo_Provider</artifactId>
<dependencies>
<dependency>
<groupId>com.zym.test</groupId>
<artifactId>SpringBoot_Dubbo_Common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
<!-- alibaba的druid數(shù)據(jù)庫連接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.11</version>
</dependency>
</dependencies>
</project>
這樣我們就將需要的Jar包以及各個模塊之間的關系搭建完了,接著就是各個子項目中搭建配置文件了,比如提供者肯定需要去實現(xiàn)service然后去數(shù)據(jù)庫查詢數(shù)據(jù)返回給消費者所以提供者肯定需要配置mybatis以及dubbo的文件配置默责。我們這邊使用springboot贬循,因為基本上都封裝好了,配置就很簡單了桃序。我們先新增一個application.yml杖虾,具體配置如下,這邊直接將mybatis的配置寫在配置文件里了媒熊,就不需要像ssm一樣需要xml文件配置了奇适。
application.yml:
server:
port: 8082
context-path: /
spring:
datasource:
name: test
url: jdbc:mysql://127.0.0.1:3306/test
username: root
password: 123456
# 使用druid數(shù)據(jù)源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
mybatis:
type-aliases-package: domain
同時,我們需要在項目中配置dubbo芦鳍,讓該項目成為提供者嚷往。
SpringBoot_Dubbo_Provider 的 spring-dubbo.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="provider"/>
<!-- 注冊中心的ip地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 掃描注解包路徑,多個包用逗號分隔怜校,不填pacakge表示掃描當前ApplicationContext中所有的類 -->
<dubbo:annotation package="service.mpl"/>
</beans>
Springboot是使用類來作為啟動器的间影,所以我們啟動添加一個啟動器ProviderApplication.java,在啟動器中將dubbo的配置文件引用茄茁,并且去掃描mapper包魂贬。
SpringBoot_Dubbo_Provider ProviderApplication.java:
@SpringBootApplication
@ImportResource({"classpath:config/spring-dubbo.xml"})
@MapperScan("mapper")
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
這樣SpringBoot_Dubbo_Provider這個項目就完成配置了。這是SpringBoot_Dubbo_Provider的項目結構
接下來完成SpringBoot_Dubbo_Consumer 需要的項目配置裙顽。消費者需要實現(xiàn)的是將返回的數(shù)據(jù)顯示給前端.(這里涉及到如果你的項目是前后端分離的話付燥,那你的項目就應該直接返回json格式數(shù)據(jù)就好,可以直接使用springboot的@RestController愈犹。但是如果你使用的模板引擎或者是jsp那就要根據(jù)自己選擇方式去做键科,具體的話就不展現(xiàn)了.自行百度). 下面為該項目的項目結構以及dubbo的配置XML.
SpringBoot_Dubbo_Consumer 的 spring-dubbo.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="consumer"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:annotation package="controller"/>
</beans>
同樣我們也要為這個項目寫一個啟動器。在啟動器中加載dubbo配置文件 漩怎。這里提供者和消費者兩個項目不能使用相同的端口號勋颖,所以消費者這邊端口我使用的是8081 提供者為8082。因為消費者這邊只是配置了一個端口號所以就不給出配置代碼了勋锤。
SpringBoot_Dubbo_Consumer 的ConsumerApplication .java:
@SpringBootApplication
@ImportResource({"classpath:config/spring-dubbo.xml"})
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
這樣饭玲,所有的配置我們都完成了,接著就是添加我們要的業(yè)務邏輯以及相關代碼了叁执。這里茄厘,我就簡單的從數(shù)據(jù)庫根據(jù)ID查一個user信息為例子。
首先根據(jù)下面腳本創(chuàng)建user表
CREATE TABLE t_user(
user_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(255) NOT NULL ,
password VARCHAR(255) NOT NULL ,
phone VARCHAR(255) NOT NULL
) ENGINE=INNODB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;
然后將表的映射java類谈宛,放在SpringBoot_Dubbo_Common的domin中次哈,并且在service的包中添加一個userService接口。
User.java:
@Data
public class User implements Serializable {
private Integer userId;
private String userName;
private String password;
private String phone;
}
userService.java
/**
* 用戶接口
*
* @author zym
* @create 2018-06-19 14:10
**/
public interface UserService {
User findUser();
}
在SpringBoot_Dubbo_Provider的mapper包中添加UserMapper.java吆录。(本來應該有mapper.xml文件窑滞,我這邊不知道什么原因,總是說找不到我的xml文件恢筝,我這邊就寫成了注解形式)
UserMapper.java:
public interface UserMapper {
@Results(id = "userMap", value = {
@Result(column = "user_id", property = "userId"),
@Result(column = "phone", property = "phone"),
@Result(column = "user_name", property = "userName"),
@Result(column = "password", property = "password")})
@Select("SELECT * FROM t_user")
List<User> getAll();
@Select("SELECT * FROM t_user WHERE user_id = #{id}")
@ResultMap("userMap")
User getOne(Long id);
}
并且在SpringBoot_Dubbo_Provider的impl中實現(xiàn)UserService接口
UserServiceImpl.java:
@Service(version = "1.0.0")
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User findUser() {
return userMapper.getOne(1L);
}
}
SpringBoot_Dubbo_Consumer中添加UserController哀卫,像普通的springmvc一樣,只是在RPC調用的時候需要帶上注解滋恬。這樣就完成了所有的代碼
@RestController
@RequestMapping("/user")
public class UserController {
@Reference(version = "1.0.0")
private UserService userService;
@GetMapping("getUser")
public User user() {
return userService.findUser();
}
}
執(zhí)行程序發(fā)現(xiàn)運行失敗聊训,發(fā)現(xiàn)不能把啟動類直接放在java文件下,新建了com.test包將之前的包都扔在了這下面恢氯,更改下配置中的包路徑带斑。先啟動Provider再啟動Consumer。
成功讀取到數(shù)據(jù)勋拟,我們再到dubbo-admin的web看下勋磕,發(fā)現(xiàn)一個消費者和一個提供者。分別點擊提供者和消費者發(fā)現(xiàn)有我們代碼中注冊的userService了敢靡。這樣就完成了整個dubbo項目的搭建挂滓。
源碼已經上傳到了github上源碼