0、前言
以前使用标准的SSM框架与Dubbo做过集成,但是未曾实现与数据库的交互。最近,一方面工作在向微服务倾斜,另一方面也是为了有一个更深层次的理解,所以搭建了相应的开发环境,并分享完整的开发过程。
因考虑到今后的一些使用便利性,开发环境、jar包基本都使用了最新版本。主要的开发环境如下:
系统:mac os 10.13.6
IDE:Idea 2018.2
JDK:1.8.0_131,64位
Spring Boot:2.0.5.RELEASE
ZooKeeper:3.4.12
Dubbo:2.6.3
其余使用的jar包版本将在工程构建时进行说明(完整的工程下载地址见文末)。
整个工程的框架如下图所示:
ssm-boot-dubbo:父工程,进行依赖管理。
ssm-boot-dubbo-common:存放POJO,以及一些公共类。
ssm-boot-dubbo-mapper:存放DAO及Mapper.xml。
ssm-boot-dubbo-api:定义接口,此处只包含接口的声明。
ssm-boot-dubbo-service:实现接口,服务提供方。
ssm-boot-dubbo-restful:Controller层,同时是服务消费方。
1、基础环境的准备
1.1、jdk准备
因Spring Boot2需要jdk 1.8的支持,故jdk需要准备1.8版本。
1.2、mysql准备
mysql不一定需要在本地安装,只要能够有一个能够访问到的mysql数据库即可。
/*
Navicat Premium Data Transfer
Source Server : myself
Source Server Type : MySQL
Source Server Version : 80012
Source Host : 127.0.0.1:3306
Source Schema : test
Target Server Type : MySQL
Target Server Version : 80012
File Encoding : 65001
Date: 05/10/2018 11:43:53
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for org_group
-- ----------------------------
DROP TABLE IF EXISTS `org_group`;
CREATE TABLE `org_group` (
`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`code` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '编码',
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '名称',
`notes` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 1;
1.3、ZooKeeper准备
在mac环境下,直接使用HomeBrew安装即可。在Windows环境下,直接去ZooKeeper官方下载即可。如没有特殊的需求,可以不用进行任何的配置。
另外,在mac下,启动zk的命令为zkServer start,查看zk版本的命令为echo stat | nc 127.0.0.1 2181。
2、父工程创建
最终的工程结构为多模块工程,所以首先进行父工程的创建。
父工程的作用主要为:对依赖进行统一的管理和版本控制。这样以后在进行组件升级时,直接在父工程进行更新即可。
2.1、新建Maven工程(父工程)
此处新建的是Maven工程,并非Spring Boot工程,如下图所示:
groupId、artifactId可根据实际的需要来确定,本工程的groupId为com.ysp,artifactId为ssmboot-dubbo,直接将version设置为1.0.0,工程名为ssm-boot-dubbo。设置完成后,新工程的pom文件如下图所示:
注意,此处的packing为pom。
2.2、依赖管理
在pom文件中,添加各种依赖,包括spring-boot-starter-parent及其它相关内容,完整的pom文件如下所示:
<?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>
<!-- 作为父工程存在,主要作用就是引入各种jar包 -->
<groupId>com.ysp</groupId>
<artifactId>ssmboot-dubbo</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<!-- 模块 -->
<modules>
<module>ssm-boot-dubbo-common</module>
<module>ssm-boot-dubbo-mapper</module>
<module>ssm-boot-dubbo-api</module>
<module>ssm-boot-dubbo-service</module>
<module>ssm-boot-dubbo-restful</module>
</modules>
<!-- 公共属性,配置版本信息 -->
<properties>
<spring.boot.version>2.0.5.RELEASE</spring.boot.version>
<mybatis.version>1.3.2</mybatis.version>
<pagehelper.version>5.1.4</pagehelper.version>
<druid.version>1.1.10</druid.version>
<mysql.version>8.0.12</mysql.version>
<lombok.version>1.18.2</lombok.version>
<dubbo.version>2.6.3</dubbo.version>
<curator.version>4.0.0</curator.version>
<zk.version>3.4.13</zk.version>
<zkclient.version>0.10</zkclient.version>
<!-- 编码相关 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<!-- lookup parent from repository -->
<relativePath />
</parent>
<!-- 依赖管理 -->
<dependencyManagement>
<dependencies>
<!-- Spring Boot Parent -->
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
-->
<!-- Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- PageHelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!-- Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- Mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
<scope>runtime</scope>
</dependency>
<!-- Log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<!-- Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>${spring.boot.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
<scope>test</scope>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<!-- 去除Spring -->
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- curator -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${curator.version}</version>
</dependency>
<!-- ZooKeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zk.version}</version>
<exclusions>
<!-- 去除日志相关内容 -->
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 工程构建 -->
<build>
<!-- Spring Boot 默认构建 -->
<!--
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
此处使用的是<dependencyManagement>,在各个模块中,根据实际需要引入jar包即可。
3、ssm-boot-dubbo-common构建
common这个子模块主要用来存放POJO以及一些公共类。
在父工程上右键新增,选择New>Module,如下图所示:
此处创建的工程依然为Maven工程,在此只需要设置artifactId为ssm-boot-dubbo-common即可,如下图所示:
之后,引入相关的依赖(只引入Lombok即可),完整的pom文件如下所示:
<?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 -->
<parent>
<artifactId>ssmboot-dubbo</artifactId>
<groupId>com.ysp</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ssm-boot-dubbo-common</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>ssm-boot-dubbo-common</name>
<description>基本的VO</description>
<dependencies>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
之后,手工编写或者自动生成相关POJO的代码,整个工程目录如下图所示。其中,common包用来存放分页信息及Controller返回的封装类(BaseDataResponse);domain用来存放普通的POJO;dto用来存放组装对象(在进行数据维护时,前后端应当通过dto包下的对象进行交互,此处暂时省略);query用来存放查询的Model。所有的类都要实现序列化接口。
至此,此子模块构建完成。
4、ssm-boot-dubbo-mapper构建
mapper这个子模块主要存放持久层相关的代码,也是一个Maven工程。其构建过程与ssm-boot-dubbo-common的构建过程一致,在此不再进行赘述。
因其需要依赖于ssm-boot-dubbo-common,故在pom文件中需要添加相应的依赖。完整的pom文件如下所示:
<?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 -->
<parent>
<artifactId>ssmboot-dubbo</artifactId>
<groupId>com.ysp</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ssm-boot-dubbo-mapper</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>ssm-boot-dubbo-mapper</name>
<description>Mapper</description>
<dependencies>
<!-- common -->
<dependency>
<groupId>com.ysp</groupId>
<artifactId>ssm-boot-dubbo-common</artifactId>
<version>1.0.0</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<!-- 防止不拷贝mybatis文件 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>*.yml</include>
<include>*.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
完整的工程结构如下图所示:
其中,java下存放接口,resources下存放Mapper.xml,可以认为是接口的实现。
至此,此子模块构建完成。
5、ssm-boot-dubbo-api构建
api子模块主要进行接口的定义,也是一个Maven工程。其构建过程与ssm-boot-dubbo-common的构建过程一致,在此不再进行赘述。
因其需要依赖于ssm-boot-dubbo-common,故在pom文件中需要添加相应的依赖。完整的pom文件如下所示:
<?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">
<!-- parenbt -->
<parent>
<artifactId>ssmboot-dubbo</artifactId>
<groupId>com.ysp</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ssm-boot-dubbo-api</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>ssm-boot-dubbo-api</name>
<description>接口定义</description>
<dependencies>
<!-- common -->
<dependency>
<groupId>com.ysp</groupId>
<artifactId>ssm-boot-dubbo-common</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
完整的工程结构如下图所示,只是提供了一个接口。
接口的代码如下所示。目前只提供了新增、查询两个接口。
package com.ysp.ssmdubbo.service;
import com.ysp.ssmdubbo.common.BaseDataResponse;
import com.ysp.ssmdubbo.domain.OrgGroup;
import com.ysp.ssmdubbo.query.OrgGroupQueryModel;
/**
* @author alex
* @version 1.0
* @title IOrgGroupService.java
* @package com.ysp.ssmdubbo.service
* @date 2018/10/4
* @description
*/
public interface IOrgGroupService {
/**
* 新增
*
* @param orgGroup
* @return
* @throws Exception
*/
public BaseDataResponse insert(OrgGroup orgGroup) throws Exception;
/**
* 查询
*
* @param qm
* @return
* @throws Exception
*/
public BaseDataResponse queryByCondition(OrgGroupQueryModel qm) throws Exception;
}
至此,此子模块构建完成。
6、ssm-boot-dubbo-service构建
service子模块是整个工程构建的两个核心之一(另外一个是restful)。此子模块的用途为向外提供服务。
在构建时,也是通过New>Module进行构建。直接将其构建为Spring Boot项目,并且不需要选择任何Dependencies,如下图所示。
之后,需要对pom文件进行修改,修改其<parent>,添加对ssm-boot-dubbo-mapper及ssm-boot-dubbo-api的依赖,并添加其它的依赖。完整的pom如下所示:
<?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 -->
<parent>
<groupId>com.ysp</groupId>
<artifactId>ssmboot-dubbo</artifactId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ssm-boot-dubbo-service</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>ssm-boot-dubbo-service</name>
<description>Spring Boot Service</description>
<dependencies>
<!-- api -->
<dependency>
<groupId>com.ysp</groupId>
<artifactId>ssm-boot-dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
<!-- mapper -->
<dependency>
<groupId>com.ysp</groupId>
<artifactId>ssm-boot-dubbo-mapper</artifactId>
<version>1.0.0</version>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 以下为mybatis部分 -->
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!-- mybatis完毕 -->
<!-- 以下为dubbo相关内容 -->
<!-- dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<!-- curator -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<!-- zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<!-- dubbo完毕 -->
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<build>
<!-- 防止不拷贝mybatis文件 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>*.yml</include>
<include>*.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
完整的工程结构如下图所示:
其中,service.impl包下存放接口的实现,其代码如下所示。此处的@Service,可以直接使用dubbo中的注解(使用Spring的注解也可以)。
package com.ysp.ssmdubbo.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.ysp.ssmdubbo.common.BaseDataResponse;
import com.ysp.ssmdubbo.domain.OrgGroup;
import com.ysp.ssmdubbo.mapper.OrgGroupMapper;
import com.ysp.ssmdubbo.query.OrgGroupQueryModel;
import com.ysp.ssmdubbo.service.IOrgGroupService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import javax.annotation.Resource;
import java.util.List;
/**
* group操作实现类
*
* @author alex
* @version 1.0
* @title OrgGroupServiceImpl.java
* @package com.ysp.ssmdubbo.service.impl
* @date 2018/10/5
* @description
*/
@Service(version = "1.0")
public class OrgGroupServiceImpl implements IOrgGroupService {
/**
* 此处使用Resource注解,能够解决Autowired的报错问题,虽然报错并不影响使用
*/
@Resource
private OrgGroupMapper orgGroupMapper;
@Transactional(rollbackFor = Exception.class)
@Override
public BaseDataResponse insert(OrgGroup orgGroup) throws Exception {
Assert.isTrue(orgGroupMapper.insert(orgGroup), "新增出现异常");
return BaseDataResponse.getCommonSuccessResponse(orgGroup);
}
@Override
public BaseDataResponse queryByCondition(OrgGroupQueryModel qm) throws Exception {
if (qm == null) {
qm = new OrgGroupQueryModel();
}
if (qm.getCurrentPage() == null) {
qm.setCurrentPage(1);
}
if (qm.getPageSize() == null) {
qm.setPageSize(5);
}
Integer totalCount = orgGroupMapper.queryByConditionCount(qm);
List<OrgGroup> list = orgGroupMapper.queryByCondition(qm);
// 构建page信息
return BaseDataResponse.getCommonSuccessResponse(list, totalCount, qm.getCurrentPage(), qm.getPageSize());
}
}
resoures下的application.yml进行数据库等相关的配置,mybatis-config.xml进行mybatis相关的配置,而dubbo-provider.xml则进行服务提供相关的配置。
application.yml如下所示(默认端口设置为了8085):
# 服务相关
server:
port: 8085
servlet:
context-path: /
# 数据库相关
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username: root
password: niukqwy369
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 10
min-idle: 10
max-active: 50
max-wait: 60000
validation-query: select 1 from dual
test-while-idle: true
test-on-borrow: false
test-on-return: false
filters: stat,wall,log4j2
# mybatis中mapper的位置
mybatis:
config-location: classpath:mybatis-config.xml
mapper-locations: classpath:mapper/*Mapper.xml
type-aliases-package: com.ysp.ssmdubbo.domain
# 监控
management:
endpoints:
web:
base-path: /
# logging:config: classpath:log4j2-config.xml
# dubbo
dubbo:
registry:
address: localhost:2181
默认的Spring Boot工程中,创建的是application.properties文件,将其重命名,修改为yml格式即可。
dubbo-provider.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="group-service" />
<!-- 注册中心服务地址 -->
<dubbo:registry id="zookeeper" protocol="zookeeper" address="${dubbo.registry.address}" />
<!-- 用dubbo协议在30001 -->
<dubbo:protocol name="dubbo" port="30001" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.ysp.ssmdubbo.service.IOrgGroupService" ref="orgGroupService"
version="1.0" registry="zookeeper" />
<!-- 具体服务接口的实现 -->
<bean id="orgGroupService" class="com.ysp.ssmdubbo.service.impl.OrgGroupServiceImpl" />
</beans>
SsmBootDubboServiceApplication为启动类,在此需要将dubbo-provider.xml配置进去,如下所示:
package com.ysp.ssmdubbo.service;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication
@MapperScan(basePackages = "com.ysp.ssmdubbo.mapper")
@ImportResource("classpath:dubbo-provider.xml")
public class SsmBootDubboServiceApplication {
public static void main(String[] args) {
SpringApplication.run(SsmBootDubboServiceApplication.class, args);
boolean needBlock = false;
if (needBlock) {
try {
//阻塞作用,否则会由于不是web项目,执行main方法后立即停止服务。
System.in.read();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
如果pom文件中没有spring-boot-starter-web,则needBlock需要设置为true。否则无法持续的提供服务。
至此,此子模块构建完成。
7、ssm-boot-dubbo-restful构建
restful子模块是整个工程构建的两个核心之一(另外一个是service)。此子模块的用途为提供各种Controller。
restful子模块的构建过程与ssm-boot-dubbo-service的构建过程一致,在此不在进行赘述。
其完整的pom文件如下所示。需添加对ssm-boot-dubbo-api的依赖。
<?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 -->
<parent>
<groupId>com.ysp</groupId>
<artifactId>ssmboot-dubbo</artifactId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ssm-boot-dubbo-restful</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>ssm-boot-dubbo-restful</name>
<description>Project Restful</description>
<dependencies>
<!-- common -->
<dependency>
<groupId>com.ysp</groupId>
<artifactId>ssm-boot-dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 以下为dubbo相关内容 -->
<!-- dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<!-- curator -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<!-- zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<!-- dubbo完毕 -->
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
完整的工程结构如下图所示:
controller包下存放各个Controller,其代码如下所示。dubbo提供的服务直接使用@Resource注解即可,@Reference容易出现空指针问题。
package com.ysp.rest.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.ysp.ssmdubbo.common.BaseDataResponse;
import com.ysp.ssmdubbo.domain.OrgGroup;
import com.ysp.ssmdubbo.query.OrgGroupQueryModel;
import com.ysp.ssmdubbo.service.IOrgGroupService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author alex
* @version 1.0
* @title OrgGroupController.java
* @package com.ysp.rest.controller
* @date 2018/10/4
* @description
*/
@RestController
@RequestMapping(value = "/group", produces = "application/json; charset=utf-8")
public class OrgGroupController {
// @Reference
@Resource
private IOrgGroupService orgGroupService;
/**
* post请求需要加RequestBody注解
*
* @param orgGroup
* @return
* @throws Exception
*/
@PostMapping("/insert")
public BaseDataResponse insert(@RequestBody OrgGroup orgGroup) throws Exception {
return orgGroupService.insert(orgGroup);
}
@GetMapping("/query")
public BaseDataResponse query(OrgGroupQueryModel qm) throws Exception {
return orgGroupService.queryByCondition(qm);
}
}
resources下的dubbo-consumer.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 id="zookeeper" protocol="zookeeper" address="${dubbo.registry.address}" />
<!-- 引用IOrgGroupService服务 -->
<dubbo:reference id="orgGroupService" interface="com.ysp.ssmdubbo.service.IOrgGroupService"
check="false" version="1.0" registry="zookeeper" protocol="dubbo" timeout="15000" />
</beans>
SsmBootDubboRestfulApplication是启动类,在此需要将dubbo-consumer.xml配置进去,如下所示:
package com.ysp.rest;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication
@ImportResource("classpath:dubbo-consumer.xml")
public class SsmBootDubboRestfulApplication {
public static void main(String[] args) {
SpringApplication.run(SsmBootDubboRestfulApplication.class, args);
}
}
至此,整个工程的构建完毕。
8、工程测试
依次运行SsmBootDubboServiceApplication及SsmBootDubboRestfulApplication。之后使用Postman进行测试,测试结果如下图所示:
9、总结
另外需要说明的是,日志使用了log4j2,但是没有做更多的配置。在实际生产环境下,需要根据实际情况做日志的配置。
Spring Boot为微服务、分布式的开发,带来了极大的便利性,推荐进行深入的学习。
工程下载地址:
链接:https://pan.baidu.com/s/1WL9UEBnAPkkWvwwAzXcvMw 密码:65u8