springboot多模塊開發以及整合dubbo\zookeeper進行服務管理


  之前研究了springboot單工程的使用,參考git地址:https://github.com/qiao-zhi/springboot-ssm

  下面研究springboot多模塊開發的過程。

1.模塊簡介:

springboot-ssm-soa:  父工程

springboot-ssm-common:   公共類工程,包括工具類等(其實這一模塊還可以再分)
springboot-ssm-bean     實體類工程
springboot-ssm-service     服務層接口(不包括實現)
springboot-ssm-dao          dao層接口與實現
springboot-ssm-service-provider    服務層實現
springboot-ssm-web    控制層與頁面以及靜態資源

 2.模塊詳細介紹

 2.1  springboot-ssm-soa 父工程

 pom文件:定義公用的jar包以及引入相應模塊

<?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>cn.qlq</groupId>
    <artifactId>springboot-ssm-soa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>springboot-ssm-common</module>
        <module>springboot-ssm-bean</module>
        <module>springboot-ssm-service</module>
        <module>springboot-ssm-dao</module>
        <module>springboot-ssm-service-provider</module>
        <module>springboot-ssm-web</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--springboot單元測試 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--熱加載 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>

        <!-- spring-boot整合mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!-- mysql驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

        <!-- 使用事務需要引入這個包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- 引入 spring aop 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

        <!-- 引入 redis 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!--pagehelper插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.2</version>
        </dependency>

        <!-- 引入 freemarker 模板依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

        <!-- 引入 thymeleaf 模板依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!-- commons工具包 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <!-- 阿里的fastjson用於手動轉JSON -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.56</version>
        </dependency>
    </dependencies>

    <distributionManagement>
        <repository>
            <id>releases</id>
            <url>http://192.168.0.133:8081/repository/maven-releases/</url>
        </repository>
        <snapshotRepository>
            <id>snapshots</id>
            <url>http://192.168.0.133:8081/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

    <build>
        <!-- 配置了很多插件 -->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

   注意:多模塊項目僅僅需要在啟動類所在的模塊添加打包插件即可!不要在父類添加打包插件,因為那樣會導致全部子模塊都使用spring-boot-maven-plugin的方式來打包(例如BOOT-INF/com/xxx/xx)。

2.2  springboot-ssm-bean 子項目

   這個模塊存放的是項目的實體類。

pom文件如下:

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>cn.qlq</groupId>
        <artifactId>springboot-ssm-soa</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>cn.qlq</groupId>
    <artifactId>springboot-ssm-bean</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-ssm-bean</name>
    <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
    </dependencies>
</project>

2.3  springboot-ssm-common 子項目

   存放系統的工具類以及一些其他配置信息,其實這一模塊還可以再分。

pom如下:

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>cn.qlq</groupId>
        <artifactId>springboot-ssm-soa</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>cn.qlq</groupId>
    <artifactId>springboot-ssm-common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-ssm-common</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>cn.qlq</groupId>
            <artifactId>springboot-ssm-bean</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

2.4  springboot-ssm-dao 子項目

   dao模塊,用於寫dao層接口和mapp的xml實現。

pom如下:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>cn.qlq</groupId>
    <artifactId>springboot-ssm-soa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <groupId>cn.qlq</groupId>
  <artifactId>springboot-ssm-dao</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>springboot-ssm-dao</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
      <dependency>
          <groupId>cn.qlq</groupId>
          <artifactId>springboot-ssm-bean</artifactId>
          <version>0.0.1-SNAPSHOT</version>
      </dependency>
  </dependencies>
</project>

applications-dao.properties文件內容如下:

############################################################
#
# Mybatis settings
#
############################################################
#jiazai mybatis peizhiwenjian(**代表任意目錄,*代表任意多個字符)
mybatis.mapper-locations = classpath:mapper/**/*Mapper.xml
mybatis.config-location = classpath:mybatis/SqlMapConfig.xml
mybatis.type-aliases-package = cn.qlq.bean

############################################################
#
# datasource settings
#
############################################################
spring.datasource.driver-class-name= com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = 123456

2.5  springboot-ssm-service 子項目

   service層接口,不寫實現,實現類單獨抽取是為了發布dubbo服務。

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>cn.qlq</groupId>
    <artifactId>springboot-ssm-soa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <groupId>cn.qlq</groupId>
  <artifactId>springboot-ssm-service</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>springboot-ssm-service</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
      <dependency>
          <groupId>cn.qlq</groupId>
          <artifactId>springboot-ssm-dao</artifactId>
          <version>0.0.1-SNAPSHOT</version>
      </dependency>
  </dependencies>
</project>

2.6  springboot-ssm-service-provider 子項目

   service接口實現。單獨抽取是為了發布dubbo服務。

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>cn.qlq</groupId>
        <artifactId>springboot-ssm-soa</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>cn.qlq</groupId>
    <artifactId>springboot-ssm-service-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-ssm-service-provider</name>
    <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>cn.qlq</groupId>
            <artifactId>springboot-ssm-service</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>cn.qlq</groupId>
            <artifactId>springboot-ssm-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

2.7  springboot-ssm-web 子項目

   controller層以及頁面都在這一模塊。

pom文件:

  引入spring-boot-maven-plugin插件是為了打包、引入內嵌的tomcat是為了打包為jar包可以直接運行,並且pom文件中打包方式為jar包。

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>cn.qlq</groupId>
        <artifactId>springboot-ssm-soa</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>springboot-ssm-web</groupId>
    <artifactId>springboot-ssm-web</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springboot-ssm-web</name>
    <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>cn.qlq</groupId>
            <artifactId>springboot-ssm-service-provider</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!-- 設置Tomcat打包的時候不打包下面配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <!-- <scope>provided</scope> -->
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

 

applications.properties

  spring.profiles.active=dao是為了引入dao模塊的applications-dao.properties文件。

###引入多個properties文件配置
spring.profiles.active=dao

############################################################
#
# 日志相關配置(默認集成的有slf4j,Logback等)
#
############################################################
#指定配置文件的位置,只能是xml或者groovy結尾
#logging.config=classpath:logback.xml
#默認的日志級別
logging.level.root=INFO
# mapper 接口所在的包設置為 debug
logging.level.cn.qlq.mapper=DEBUG
#生成日志文件的位置
logging.file=G:/springboot.log
#生成日志文件的目錄,名稱默認為spring.log
#logging.path=e:/
#指定日志的格式
#logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %clr(%logger){cyan} %clr(%msg%n){green}
#logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n

############################################################
#
# Server 服務端相關配置
#
############################################################
# 配置api端口號
server.port=8088
# 配置context-path, 一般來說這個配置在正式發布的時候不配置
server.context-path=/MySpringboot
server.serverlet-path=*.do,*.action
# 錯誤頁,指定發生錯誤時,跳轉的URL --> BasicErrorController
#server.error.path=/error
# session最大超時時間(分鍾),默認為30分鍾
server.session-timeout=60
# 該服務綁定IP地址,啟動服務器時如本機不是該IP地址則拋出異常啟動失敗, 
# 只有特殊需求的情況下才配置, 具體根據各自的業務來設置
#server.address=192.168.1.2

############################################################
# Server - tomcat 相關常用配置
############################################################
# tomcat最大線程數, 默認為200
#server.tomcat.max-threads=250
# tomcat的URI編碼
server.tomcat.uri-encoding=UTF-8
# 存放Tomcat的日志、Dump等文件的臨時文件夾,默認為系統的tmp文件夾
#(如:C:%users\Shanhy\AppData\Local\Temp)
#server.tomcat.basedir=H:/springboot-tomcat-tmp
# 打開Tomcat的Access日志,並可以設置日志格式的方法:
#server.tomcat.access-log-enabled=true
#server.tomcat.access-log-pattern=
# accesslog目錄,默認在basedir/logs
#server.tomcat.accesslog.directory=
# 日志文件目錄
#logging.path=H:/springboot-tomcat-tmp
# 日志文件名稱,默認為spring.log
#logging.file=myapp.log


############################################################
#
# thymeleaf 靜態資源配置
#
############################################################
spring.thymeleaf.prefix=classpath:/templates/thymeleaf/x-admin/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
# 關閉緩存, 即時刷新, 上線生產環境需要改為true
spring.thymeleaf.cache=false
#關閉thymeleaf引擎
#spring.thymeleaf.enabled=false


spring.messages.basename=i18n/messages
spring.messages.cache-seconds=3600
spring.messages.encoding=UTF-8

spring.jackson.date-format=yyyy-MM-dd
spring.jackson.time-zone=GMT+8
spring.jackson.serialization.write-dates-as-timestamps=false

############################################################
#
# REDIS 配置
#
############################################################
# Redis數據庫索引(默認為0)
spring.redis.database=1
# Redis服務器地址
spring.redis.host=localhost
# Redis服務器連接端口
spring.redis.port=6379
# Redis服務器連接密碼(默認為空)
spring.redis.password=
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.pool.max-active=1000
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1
# 連接池中的最大空閑連接
spring.redis.pool.max-idle=10
# 連接池中的最小空閑連接
spring.redis.pool.min-idle=2
# 連接超時時間(毫秒)
spring.redis.timeout=0

 

MySpringBootApplication.java是運行類的入口:

package cn.qlq;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan("cn") // Servlet、Filter、Listener可以直接通過@WebServlet、@WebFilter、@WebListener注解自動注冊,無需其他代碼。
public class MySpringBootApplication {
    public static void main(String[] args) {
        // 入口運行類
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}

 

  其運行方式依然是點擊上面主類運行即可。

  打包方式也是同普通的springboot項目,只不過打包方式選擇在web層進行打包,所以web層的pom文件加入了spring-boot-maven-plugin插件與內置的tomcat。參考:https://www.cnblogs.com/qlqwjy/p/8548690.html

 

注意:

  上面多個模塊之間相互依賴,所以要先執行maven install上傳到本地倉庫,然后對本地倉庫重新建立索引引入對應的jar包即可。而且父工程不可以引入spring-boot-maven-plugin插件,否則會影響打的jar包。(我們知道springboot打的jar包是其特有的目錄結構,會加入其自身的一些類)

        

 

git地址:https://github.com/qiao-zhi/springboot-ssm-soa

原來沒有分模塊的項目地址:https://github.com/qiao-zhi/springboot-ssm

項目需要的sql腳本也可以在沒有分模塊的git地址進行下載。

 

======對service的實現進行dubbo發布服務到zookeeper====

  上面已經對普通的springboot項目進行改造完成。在此基礎上對springboot-ssm-service-provider模塊進行改造,將服務發布到zookeeper中以及web層從dubbo消費服務。前期zookeeper的集群搭建以及啟動zookeeper參考之前的zookeeper學習。

   只是在上面的基礎上稍作修改。

1.父工程pom.xml文件增加dubbo-spring-boot-starter以及zkclient依賴

        <!-- 引入dubbo-spring-boot-starter以及zkclient依賴 -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.9</version>
        </dependency>

 

 2.bean工程的所有class都是些Serializable接口

 3.commons工程基本不變

 4.dao工程也基本不變

 5.service工程的UserService增加下面方法

public PageInfo<User> getPageInfoUsers(Map condition);

 

6.springboot-ssm-service-provider模塊修改如下

1.引入applications.properties文件 --引入dubbo服務相關配置與引入dao層的properties配置文件

###引入多個properties文件配置
spring.profiles.active=dao

############################################################
#
# DUBBO相關配置
#
############################################################
#當前服務/應用名稱
spring.dubbo.application.name=provider
#注冊中心的協議和地址
spring.dubbo.server=true
spring.dubbo.registry=zookeeper://127.0.0.1:2181
#通信規則(通信協議和接口)
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880

 

2.UserServiceImpl修改為如下:

  通過@com.alibaba.dubbo.config.annotation.Service(version = "1.0.0")發布dubbo服務;實現getPageInfoUsers方法(支持pagehelper分頁)

package cn.qlq.service.impl.user;

import java.util.List;
import java.util.Map;

import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import cn.qlq.bean.user.User;
import cn.qlq.bean.user.UserExample;
import cn.qlq.bean.user.UserExample.Criteria;
import cn.qlq.mapper.user.UserMapper;
import cn.qlq.service.user.UserService;

@Service
@com.alibaba.dubbo.config.annotation.Service(version = "1.0.0")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    public List<User> findAllUser() {
        UserExample userExample = new UserExample();
        List<User> list = userMapper.selectByExample(userExample);
        return list;
    }

    @Override
    public void addUser(User user) {
        userMapper.insert(user);
    }

    @Override
    public List<User> getUsers(Map condition) {
        UserExample userExample = new UserExample();
        if (StringUtils.isNotBlank(MapUtils.getString(condition, "username"))) {
            Criteria createCriteria = userExample.createCriteria();
            createCriteria.andUsernameLike("%" + MapUtils.getString(condition, "username") + "%");
        }
        List<User> list = userMapper.selectByExample(userExample);
        return list;
    }

    @Override
    public void deleteUser(int id) {
        userMapper.deleteByPrimaryKey(id);
    }

    @Override
    public User getUser(int id) {
        return userMapper.selectByPrimaryKey(id);
    }

    @Override
    public void updateUser(User user) {
        userMapper.updateByPrimaryKeySelective(user);
    }

    @Override
    public PageInfo<User> getPageInfoUsers(Map condition) {

        PageHelper.startPage(MapUtils.getIntValue(condition, "pageNum"), MapUtils.getIntValue(condition, "pageSize"));
        UserExample userExample = new UserExample();
        if (StringUtils.isNotBlank(MapUtils.getString(condition, "username"))) {
            Criteria createCriteria = userExample.createCriteria();
            createCriteria.andUsernameLike("%" + MapUtils.getString(condition, "username") + "%");
        }
        List<User> list = userMapper.selectByExample(userExample);

        return new PageInfo<User>(list);
    }

}

 

3.編寫DubboServiceProvider.java發布dubbo服務

package cn.qlq.service.impl;

import java.util.concurrent.CountDownLatch;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

@SpringBootApplication
@EnableDubboConfiguration
@MapperScan("cn.qlq.mapper")
public class DubboServiceProvider {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(1);
        // 入口運行類
        SpringApplication.run(DubboServiceProvider.class, args);

        countDownLatch.await();
    }
}

7.  springboot-ssm-web如下修改

以UserController為例子:

  @Reference(version = "1.0.0")是從zookeeper注冊中心消費服務

package cn.qlq.controller;

import java.util.Date;
import java.util.Map;

import org.apache.commons.collections.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;

import cn.qlq.annotation.MyLogAnnotation;
import cn.qlq.bean.user.User;
import cn.qlq.service.user.UserService;
import cn.qlq.utils.JSONResultUtil;
import cn.qlq.utils.ValidateCheck;

@Controller /** 自動返回的是json格式數據 ***/
@RequestMapping("user")
public class UserController {

    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    @Reference(version = "1.0.0")
    private UserService userService;

    /**
     * 添加user
     * 
     * @param user
     *            springMVC自動映射的實體
     * @return
     */
    @RequestMapping("addUser")
    @ResponseBody
    public JSONResultUtil addUser(User user) {
        user.setCreatetime(new Date());
        logger.info("user -> {}", user);
        userService.addUser(user);
        return JSONResultUtil.ok();
    }

    /**
     * 分頁查詢user
     * 
     * @param condition
     * @return
     */
    @RequestMapping("getUsers")
    // @Cacheable(value = "usersCache", keyGenerator = "keyGenerator") //
    // 在redis中開啟key為findAllUser開頭的存儲空間。key和keyGenerator只能使用一個
    @MyLogAnnotation(operateDescription = "分頁查詢用戶")
    @ResponseBody
    public PageInfo<User> getUsers(@RequestParam Map condition) {
        if (ValidateCheck.isNull(MapUtils.getString(condition, "pageNum"))) { // 如果不為空的話改變當前頁號
            condition.put("pageNum", 1);
        }
        if (ValidateCheck.isNull(MapUtils.getString(condition, "pageSize"))) { // 如果不為空的話改變當前頁大小
            condition.put("pageSize", 6);
        }

        PageInfo<User> pageInfo = userService.getPageInfoUsers(condition);
        return pageInfo;
    }

    /**
     * 刪除user
     * 
     * @param user
     *            springMVC自動映射的實體
     * @return
     */
    @RequestMapping("deleteUser")
    @ResponseBody
    public JSONResultUtil deleteUser(int id) {
        userService.deleteUser(id);
        return JSONResultUtil.ok();
    }

    /**
     * 跳轉打修改用戶頁面
     * 
     * @param id
     * @return
     */
    @RequestMapping("updateUser")
    public String updateUser(int id, ModelMap map) {
        User user = userService.getUser(id);
        map.addAttribute("user", user);
        return "updateUser";
    }

    /**
     * 添加user
     * 
     * @param user
     *            springMVC自動映射的實體
     * @return
     */
    @RequestMapping("doUpdateUser")
    @ResponseBody
    public JSONResultUtil doUpdateUser(User user) {
        logger.info("user -> {}", user);
        userService.updateUser(user);
        return JSONResultUtil.ok();
    }
}

 

pom.xml依賴於接口,不依賴實現類。

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>cn.qlq</groupId>
        <artifactId>springboot-ssm-soa</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>springboot-ssm-web</groupId>
    <artifactId>springboot-ssm-web</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>springboot-ssm-web</name>
    <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!-- 設置Tomcat打包的時候不打包下面配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <!-- <scope>provided</scope> -->
        </dependency>
        <dependency>
            <groupId>cn.qlq</groupId>
            <artifactId>springboot-ssm-service</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>cn.qlq</groupId>
            <artifactId>springboot-ssm-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

8.測試:

(1) 先啟動springboot-ssm-service-provider模塊的生產服務類DubboServiceProvider,啟動后從dubbo-admin查看如下:

(2)啟動web模塊進行訪問之后查看消費者:

 

  至此基於dubbo服務的SOA搭建基本完成。

下面總結自己在集成dubbo服務時遇到的坑。

1.服務生產者類直接調用的時候報錯找不到mapper,也就是沒有掃描mapper包,因此在啟動類頭上增加注解如下:

package cn.qlq.service.impl;

import java.util.concurrent.CountDownLatch;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

@SpringBootApplication
@EnableDubboConfiguration
@MapperScan("cn.qlq.mapper")
public class DubboServiceProvider {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(1);
        // 入口運行類
        SpringApplication.run(DubboServiceProvider.class, args);

        countDownLatch.await();
    }
}

 

 2.dubbo服務整合pageHelper分頁的時候原來是在controller進行分頁,dubbo服務從注冊中心獲取之后分頁無效,因此修改為將條件傳到serivce層進行分頁

原來的controller:

    @RequestMapping("getUsers")
//    @Cacheable(value = "usersCache", keyGenerator = "keyGenerator") // 在redis中開啟key為findAllUser開頭的存儲空間。key和keyGenerator只能使用一個
    @MyLogAnnotation(operateDescription = "分頁查詢用戶")
    @ResponseBody
    public PageInfo<User> getUsers(@RequestParam Map condition) {
        int pageNum = 1;
        if (ValidateCheck.isNotNull(MapUtils.getString(condition, "pageNum"))) { // 如果不為空的話改變當前頁號
            pageNum = Integer.parseInt(MapUtils.getString(condition, "pageNum"));
        }
        int pageSize = DefaultValue.PAGE_SIZE;
        if (ValidateCheck.isNotNull(MapUtils.getString(condition, "pageSize"))) { // 如果不為空的話改變當前頁大小
            pageSize = Integer.parseInt(MapUtils.getString(condition, "pageSize"));
        }
        // 開始分頁
        PageHelper.startPage(pageNum, pageSize);
        List<User> users = new ArrayList<User>();
        try {
            users = userService.getUsers(condition);
        } catch (Exception e) {
            logger.error("getUsers error!", e);
        }
        PageInfo<User> pageInfo = new PageInfo<User>(users);
        return pageInfo;
    }

原來的serviceImpl:

    @Override
    public List<User> getUsers(Map condition) {
        UserExample userExample = new UserExample();
        if (StringUtils.isNotBlank(MapUtils.getString(condition, "username"))) {
            Criteria createCriteria = userExample.createCriteria();
            createCriteria.andUsernameLike("%" + MapUtils.getString(condition, "username") + "%");
        }
        List<User> list = userMapper.selectByExample(userExample);
        return list;
    }

 

 

整合dubbo服務的controller

    @RequestMapping("getUsers")
    // @Cacheable(value = "usersCache", keyGenerator = "keyGenerator") //
    // 在redis中開啟key為findAllUser開頭的存儲空間。key和keyGenerator只能使用一個
    @MyLogAnnotation(operateDescription = "分頁查詢用戶")
    @ResponseBody
    public PageInfo<User> getUsers(@RequestParam Map condition) {
        if (ValidateCheck.isNull(MapUtils.getString(condition, "pageNum"))) { // 如果不為空的話改變當前頁號
            condition.put("pageNum", 1);
        }
        if (ValidateCheck.isNull(MapUtils.getString(condition, "pageSize"))) { // 如果不為空的話改變當前頁大小
            condition.put("pageSize", 6);
        }

        PageInfo<User> pageInfo = userService.getPageInfoUsers(condition);
        return pageInfo;
    }

整合dubbo的serviceImpl

    @Override
    public PageInfo<User> getPageInfoUsers(Map condition) {

        PageHelper.startPage(MapUtils.getIntValue(condition, "pageNum"), MapUtils.getIntValue(condition, "pageSize"));
        UserExample userExample = new UserExample();
        if (StringUtils.isNotBlank(MapUtils.getString(condition, "username"))) {
            Criteria createCriteria = userExample.createCriteria();
            createCriteria.andUsernameLike("%" + MapUtils.getString(condition, "username") + "%");
        }
        List<User> list = userMapper.selectByExample(userExample);

        return new PageInfo<User>(list);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM