这章会利用maven进行分模块,并且引入dubbo和spring-boot,废话不多说,就开始一步步的搭建。
分模块
首先新建一个maven项目(其实目前好像更流行用gradle,虽然在android中我使用过,但仅仅是用gradle模块管理,以及引入一些包文件,具体的大作用还是没仔细了解,有兴趣的小伙伴可以去了解使用)项目目录如下图所示。因为我这个是作为一个父模块,并不需要src。我们这边可以直接删掉src,保留也可以,问题不大。
然后我们将子模块添加到父模块下,我们分别需要一个提供者,一个消费者和一个基础模块。创建完成后文件目录如图显示
我们在项目的pom.xml文件中添加需要的jar包。使用dependencyManagement标签,子项目pom不会自动使用父pom中的jar包,如果需要使用,就要给出groupId和artifactId,无需给出version
4.0.0
com.zym.test
SpringBoot_Dubbo_Demo
pom
1.0-SNAPSHOT
SpringBoot_Dubbo_Consumer
SpringBoot_Dubbo_Provider
SpringBoot_Dubbo_Common
UTF-8
1.7
2.5.5
0.10
1.16.18
1.5.7.RELEASE
org.springframework.boot
spring-boot-starter
${spring-boot.version}
org.springframework.boot
spring-boot-starter-web
${spring-boot.version}
org.projectlombok
lombok
${lombok.version}
provided
com.alibaba
dubbo
${dubbo.version}
com.101tec
zkclient
${zkclient.version}
接着基础模块都要被消费者和提供者模块引用。我们对基础模块的pom.xml导入需要的jar文件。以及创建基础模块存放的文件夹。现在我们仅仅将domin和service接口作为基础提供给消费者和提供者使用。在基础模块中引用lombok,一个非常好用减少get set 的编写,并且不影响速度。给出common项目的目录结构以及pom.xml。
Common项目的.pom.xml:
SpringBoot_Dubbo_Demo
com.zym.test
1.0-SNAPSHOT
4.0.0
SpringBoot_Dubbo_Common
org.projectlombok
lombok
provided
然后我们分别在两个模块中的pom.xml文件中引用基础模块,并且引入需要的jar包。
SpringBoot_Dubbo_Consumer pom.xml:
SpringBoot_Dubbo_Demo
com.zym.test
1.0-SNAPSHOT
4.0.0
SpringBoot_Dubbo_Consumer
com.zym.test
SpringBoot_Dubbo_Common
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-web
com.alibaba
dubbo
com.101tec
zkclient
org.springframework.boot
spring-boot-maven-plugin
SpringBoot_Dubbo_Provider 的pom.xml:
SpringBoot_Dubbo_Demo
com.zym.test
1.0-SNAPSHOT
4.0.0
SpringBoot_Dubbo_Provider
com.zym.test
SpringBoot_Dubbo_Common
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter
com.alibaba
dubbo
com.101tec
zkclient
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.1
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java
5.1.35
com.alibaba
druid
1.0.11
这样我们就将需要的Jar包以及各个模块之间的关系搭建完了,接着就是各个子项目中搭建配置文件了,比如提供者肯定需要去实现service然后去数据库查询数据返回给消费者所以提供者肯定需要配置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数据源
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:
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 需要的项目配置。消费者需要实现的是将返回的数据显示给前端.(这里涉及到如果你的项目是前后端分离的话,那你的项目就应该直接返回json格式数据就好,可以直接使用springboot的@RestController。但是如果你使用的模板引擎或者是jsp那就要根据自己选择方式去做,具体的话就不展现了.自行百度). 下面为该项目的项目结构以及dubbo的配置XML.
SpringBoot_Dubbo_Consumer 的 spring-dubbo.xml:
同样我们也要为这个项目写一个启动器。在启动器中加载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);
}
}
这样,所有的配置我们都完成了,接着就是添加我们要的业务逻辑以及相关代码了。这里,我就简单的从数据库根据ID查一个user信息为例子。
首先根据下面脚本创建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 getAll();
@Select("SELECT * FROM t_user WHERE user_id = #{id}")
@ResultMap("userMap")
User getOne(Long id);
}
并且在SpringBoot_Dubbo_Provider的impl中实现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();
}
}
执行程序发现运行失败,发现不能把启动类直接放在java文件下,新建了com.test包将之前的包都扔在了这下面,更改下配置中的包路径。先启动Provider再启动Consumer。
成功读取到数据,我们再到dubbo-admin的web看下,发现一个消费者和一个提供者。分别点击提供者和消费者发现有我们代码中注册的userService了。这样就完成了整个dubbo项目的搭建。
源码已经上传到了github上源码