分布式软件架构整合(一)

所需技术:spring、mybatis、druid、flyway、logback、nodejs、html、css3 ;
目标:创建一个业务框架,后端采用spring+mybatis,中间层采用node,前端html5,css3等;

分布式软件架构整合(一)_第1张图片

工程建成后目录如下:

分布式软件架构整合(一)_第2张图片

整合步骤:

1、创建maven工程,添加所有目标依赖;
2、创建spring目录,创建spring基础配置;
3、整合mybatis、durid、flyway;
4、整合logback工具;
5、添加测试类,测试通过,第一阶段完成;

一、创建soyann工程,添加项目依赖(IDEA)

1、创建一个新的工程soyann,添加business模块,目录结构如下;

分布式软件架构整合(一)_第3张图片

2、添加所有模块所需要的依赖,补全pom.xml



    4.0.0

    com.soyann
    Business
    1.0-SNAPSHOT
    war
    Business Maven Webapp
    http://maven.apache.org

    
        1.2
        4.12
        1.1.2
        5.1.39
        1.7.21
        1.1.0
        3.4.1
        1.1.7
        4.2.0
        1.2.33
        4.3.0.RELEASE
        5.0.3
        3.4
        1.2
        1.3.0
        1.0.3
        1.8.6
        3.3.1
        1.3
        1.0
    

    
        
        
            junit
            junit
            ${junit.version}
        

        
        
            org.slf4j
            slf4j-api
            ${slf4j.version}
        
        
            org.slf4j
            jul-to-slf4j
            ${slf4j.version}
        
        
            ch.qos.logback
            logback-core
            ${logback.version}
        
        
            ch.qos.logback
            logback-classic
            ${logback.version}
            
                
                    org.slf4j
                    slf4j-api
                
            
        
        
            commons-logging
            commons-logging
            ${commons-logging.version}
        
        
        
            org.logback-extensions
            logback-ext-spring
            0.1.4
        
        
        
            org.apache.commons
            commons-lang3
            ${commons-lang3.version}
        
        
            org.apache.commons
            commons-pool2
            2.4.2
        

        
        
            org.springframework
            spring-core
            ${spring.version}
        

        
            org.springframework
            spring-web
            ${spring.version}
        
        
            org.springframework
            spring-oxm
            ${spring.version}
        
        
            org.springframework
            spring-tx
            ${spring.version}
        

        
            org.springframework
            spring-jdbc
            ${spring.version}
        

        
            org.springframework
            spring-webmvc
            ${spring.version}
        
        
            org.springframework
            spring-aop
            ${spring.version}
        

        
            org.springframework
            spring-context-support
            ${spring.version}
        

        
            org.springframework
            spring-test
            ${spring.version}
        
        

        
        
            org.aspectj
            aspectjweaver
            ${aspectj.version}
        
        
            org.aspectj
            aspectjrt
            ${aspectj.version}
        
        
            asm
            asm
            ${asm.version}
        
        
            org.hamcrest
            hamcrest-core
            ${hamcrest.version}
        
        
            aopalliance
            aopalliance
            ${aopalliance.version}
        


        
        
            org.mybatis
            mybatis-spring
            ${mybatis-spring.version}
        
        
            org.mybatis
            mybatis
            ${mybatis.version}
        
        
        
            org.mybatis.generator
            mybatis-generator-core
            1.3.5
            jar
            test
        
        
            org.mybatis.caches
            mybatis-ehcache
            ${mybatis-ehcache.version}
        
        
            com.github.pagehelper
            pagehelper
            ${pagehelper.version}
        
        

        
        
            org.flywaydb
            flyway-core
            ${flywaydb.version}
        
        
        
            mysql
            mysql-connector-java
            ${mysql.version}
        
        
        
            com.alibaba
            druid
            ${druid.version}
        

        
        
            com.alibaba
            fastjson
            ${fastjson.version}
        

        
        
            jstl
            jstl
            ${jstl.version}
        
        
            taglibs
            standard
            ${taglibs.version}
        
    

    
        Business
        
            
            
                org.mybatis.generator
                mybatis-generator-maven-plugin
                1.3.5
                
                    
                        mysql
                        mysql-connector-java
                        ${mysql.version}
                    
                
                
                    true
                    true
                
            
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    1.6
                    1.6
                
            
        
    

二、创建spring配置项

分布式软件架构整合(一)_第4张图片

1、创建spring-applicationContest.xml,作为spring配置的根文件。在添加其它模块前,创建一个根配置,作为各模块的公共配置项;

2、根配置的内容如下,后期随着添加各个模块,将会作相应的改动。




    
    

    
    
    
    

三、整合mybatis,druid,flyway工具

分布式软件架构整合(一)_第5张图片

1、druid是阿里巴巴的数据库连接池。flyway为数据库版本管理工具。通过整合mybatis、druid及flyway,可以实现数据库查询后将数据持久化。接下来按顺序一个个文件添加进来。
2、添加spring-flyway.xml文件,配置如下:




    
    
        
        
        
        
        
        
        
            
                
            
        
    

这里需要注意的是,中描述的dataSource是指spring-mybatis.xml中描述的dataSource。中,描述了你数据库脚本的版本目录,工具从db/migration这个目录下读取数据库的脚本。

3、添加jdbc.properties文件,配置如下:

#数据库驱动
jdbc.driver=com.mysql.jdbc.Driver
#数据库连接url
jdbc.url=jdbc:mysql://127.0.0.1:3306/soyann?relaxAutoCommit=true&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&failOverReadOnly=false
#数据库连接用户名
jdbc.username=root
#数据库连接密码
jdbc.password=AXUE+dhMhCrtVF1usq8EB7bv4kBhkv6n81KtiG9HRnPEoQjWsPax84mMFAQONb3ireEifDcFFxdRnrZYomc3pA==
#配置数据库密码是否需要解密,这里需要注意druid 1.0.16版本及以上的解密时需要同时配置publicKey,配置方式如下
druid.connectionProperties=config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALBt81XVN/W8vchTvUPwUD6NLk9LpwRRhY/+TQvkvM1hZIpzX1+SB1JLjcWcIwu4AkELau0pyjJ4LfC0LoOA/q0CAwEAAQ==
#配置初始化大小、最小、最大
druid.initialSize=10
#最小连接池数量
druid.minIdle=10
#最大连接池数量
druid.maxActive=50
#获取连接时最大等待时间,单位毫秒
druid.maxWait=5000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒,有两个含义:1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接;2) testWhileIdle的判断依据
druid.timeBetweenEvictionRunsMillis=60000
#配置一个连接在池中最小生存的时间,单位是毫秒
druid.minEvictableIdleTimeMillis=300000
#验证语句
druid.validationQuery=SELECT 'x'
#检测连接是否有效的超时时间,单位:秒。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法
druid.validationQueryTimeout=5
#申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
druid.testOnBorrow=false
#归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
druid.testOnReturn=false
#建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效
druid.testWhileIdle=true
#打开PSCache,并且指定每个连接上PSCache的大小,如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。分库分表较多的数据库,建议配置为false
druid.poolPreparedStatements=false
druid.maxPoolPreparedStatementPerConnectionSize=100
#定期把监控数据输出到日志中
druid.timeBetweenLogStatsMillis=300000
#配置监控统计拦截的filters
druid.filters=config,stat,slf4j
#使用全局监控
druid.useGlobalDataSourceStat=true
#对于长时间不使用的连接强制关闭,禁用此配置,设置为false
druid.removeAbandoned=false
#超过30分钟开始关闭空闲连接
druid.removeAbandonedTimeout=1800
#将当前关闭动作记录到日志
druid.logAbandoned=true

这里采用了数据库连接密码加密功能,怎样生成连接加密下面再分解。

4、添加实体文件。在Resource根目录下,添加generatorConfig.xml配置,自动生成实体文件,内容如下:




    
    

    
    

        

        
        
            
            
            
        

        


        
        
            
            
        
        
        
            
        

        
        
            
            
        
        
        
            
        
        
        
            
        

        
        

接下来在idea中添加启动命令:

分布式软件架构整合(一)_第6张图片
添加此配置的作用是自动生成数据表实体跟mapper文件,无须手写容易出错。运行命令,将生成的实体文件添加到对应目录下:

分布式软件架构整合(一)_第7张图片

5、添加spring-mybatis.xml文件




    
        
        
        
        
    

    
        
        
    

    
    
        
        
    

    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        

        
        

        
        

        
            
                
                
                
            
        
    

    
    
        
        
        
        
        
        
        
    

    
    
        
        
    

    
    
        
    

    
    
    
        
            
            
            
            
            
            
            
            
            
            
            

            
            
            
            
            

            
        
    


    
        
        
        
    

    
    
    
    
        
            
                com.soyann.business.*.service.*
                com.soyann.business.*.mapper.*
            
        
    

添加文件后,发现还有点问题,spring-flyway.xml及spring-mybatis.xml不能相互调用,且往下。

6、更新spring-applicationContext.xml文件,引用spring-flyway.xml、spring-mybatis.xml、jdbc.properties配置




    
    
    

    
    
    
    

    
    
        
        
        
            
                classpath:jdbc.properties
                
            
        
    

    
    
    

7、添加web.xml文件,配置数据库连接池等内容:



    
    
        org.springframework.web.context.request.RequestContextListener
    

    
    
        webAppRootKey
        Business.root
    


    
    
        DruidWebStatFilter
        com.alibaba.druid.support.http.WebStatFilter
        
            exclusions
            *. js ,*. gif ,*. jpg ,*. png ,*. css ,*. ico ,/ druid /*
        
    
    
        DruidWebStatFilter
        /*
    
    
        DruidStatView
        com.alibaba.druid.support.http.StatViewServlet
    
    
        DruidStatView
        /druid/*
    
    


8、在IDEA工具中引入spring及web文件

分布式软件架构整合(一)_第8张图片

分布式软件架构整合(一)_第9张图片

四、整合logback工具

1、在resource目录下添加logback.xml,内容如下;










    
    
    
    
    
    

    
    
        
        
            %d{HH:mm:ss.SSS} [%thread] %-5level %logger{0} - %msg%n
            UTF-8
        
    

    
    
    
        
        
            ERROR
            ACCEPT
            DENY
        
        
        
            
            ${FILE_DIR}/%d{yyyy-MM-dd}/${FILE_NAME}_error.log
            
            ${maxHistory}
        

        
        

        
            %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n
        
    

    
    
        
        
            WARN
            ACCEPT
            DENY
        
        
            
            ${FILE_DIR}/%d{yyyy-MM-dd}/${FILE_NAME}_warn-log.log
            
            
            ${maxHistory}
        
        
            %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n
        
    

    
    
        ${FILE_DIR}/${FILE_NAME}.log
        
            
            ${FILE_DIR}/${FILE_NAME}.%d{yyyyMMdd}.%i.log
            50MB
            
            30
        
        
            %d{HH:mm:ss} [%thread] %-5level %logger{0} - %msg%n
            UTF-8
        
        
        
            INFO
        
    

    
    
        ${FILE_DIR}/${FILE_NAME}_debug.log
        
            
            ${FILE_DIR}/${FILE_NAME}_debug.%d{yyyyMMdd}.%i.log
            50MB
            
            30
        
        
            %d{HH:mm:ss} [%thread] %-5level %logger{0} - %msg%n
            UTF-8
        
        
            DEBUG
            ACCEPT
            DENY
        
    

    
    
        
        0
        
        512
        
        5000
        
        
    


    
    
        
        
            TRACE
            ACCEPT
            DENY
        
        
            
            ${FILE_DIR}/%d{yyyy-MM-dd}/${FILE_NAME}_trace-log.log
            
            
            ${maxHistory}
        
        
            %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n
        
    



    
        
    

    
        
    

    
        
        
    

    

    
    
        
        
        
        
        
        
        
        
    

2、web.xml中注册logback:


    
        contextConfigLocation
        classpath:spring/spring-applicationContext.xml
    
    
        logbackConfigLocation
        classpath:logback.xml
    
    
        ch.qos.logback.ext.spring.web.LogbackConfigListener
    
    
        org.springframework.web.context.ContextLoaderListener
    
    

到这里,spring+mybatis框架整合基本完成,下面就来测试下这个框架吧。

五、框架测试

1、resource/db/migration添加数据库脚本;这里我用了别人创建好的,不再贴代码;
2、在service目录下添加一个接口及实现类,代码如下:

分布式软件架构整合(一)_第10张图片

IUserService.java

package com.soyann.business.user.service;

import com.soyann.business.user.model.UserEntity;

import java.util.List;

/**
 * @ProjectName: soyann
 * @FileName: com.soyann.business.user.service
 * @Description: (do what)
 * @Copyright: Copyright(C) 2016-2017 All rights Reserved
 * @Company: ShenZhen Information Technology Co.,LTD.
 * @Author: dell657 neil
 * @Version V1.0
 * @Date: 2017/10/28
 * 

* Modification History: * Date Author Version Discription * ----------------------------------------------------------------------------------- * 2017/10/28 neil 1.0 1.0 * Why & What is modified: <修改原因描述> */ public interface IUserService { UserEntity getUserById(int userId); List getAllUser(); }

UserServiceImpl.java

package com.soyann.business.user.service.impl;

import com.soyann.business.user.mapper.UserMapper;
import com.soyann.business.user.model.UserEntity;
import com.soyann.business.user.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @ProjectName: soyann
 * @FileName: com.soyann.business.user.service.impl
 * @Description: (do what)
 * @Copyright: Copyright(C) 2016-2017 All rights Reserved
 * @Company: ShenZhen Information Technology Co.,LTD.
 * @Author: dell657 neil
 * @Version V1.0
 * @Date: 2017/10/28
 * 

* Modification History: * Date Author Version Discription * ----------------------------------------------------------------------------------- * 2017/10/28 neil 1.0 1.0 * Why & What is modified: <修改原因描述> */ @Service("userService") public class UserServiceImpl implements IUserService { @Autowired(required=false) private UserMapper userMapper; @Override public UserEntity getUserById(int userId) { return userMapper.selectByPrimaryKey(userId); } @Override public List getAllUser() { return userMapper.getAllUser(); } }

3、在test目录下添加测试类TestMyBatis.java,代码如下:

package com.soyann.business.mybatis;

import com.alibaba.fastjson.JSON;
import com.soyann.business.user.model.UserEntity;
import com.soyann.business.user.service.IUserService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;


/**
 * @ProjectName: soyann
 * @FileName: com.soyann.business.mybatis
 * @Description: (do what)
 * @Copyright: Copyright(C) 2016-2017 All rights Reserved
 * @Company: ShenZhen Information Technology Co.,LTD.
 * @Author: neil
 * @Version V1.0
 * @Date: 2017/10/28
 * 

* Modification History: * Date Author Version Discription * ----------------------------------------------------------------------------------- * 2017/10/28 neil 1.0 1.0 * Why & What is modified: <修改原因描述> */ //表示继承了SpringJUnit4ClassRunner类 /*@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:spring/spring-applicationContext.xml"})*/ public class TestMyBatis { private static Logger logger = LoggerFactory.getLogger(TestMyBatis.class); @Resource private IUserService userService = null; @Before public void before() { //使用"spring.xml"和"spring-mybatis.xml"这两个配置文件创建Spring上下文 ApplicationContext ac = new ClassPathXmlApplicationContext(new String[]{"spring/spring-applicationContext.xml", "spring/spring-mybatis.xml"}); //从Spring容器中根据bean的id取出我们要使用的userService对象 userService = (IUserService) ac.getBean("userService"); } @Test public void test1() { logger.info("任务开始执行..."); UserEntity userEntity = userService.getUserById(4); // System.out.println(user.getUserName()); // logger.info("值:"+user.getUserName()); //System.out.println(JSON.toJSONString(userEntity)); logger.info(JSON.toJSONString(userEntity)); logger.info("任务执行结束"); logger.error("任务执行结束"); logger.debug("任务执行结束"); } }

添加代码后,执行代码,查看控制台输出结果。

分布式软件架构整合(一)_第11张图片

分布式软件架构整合(一)_第12张图片

输出结果正确,证明本框架已经初步整合。本文到这里结束

参考资料:传送门

你可能感兴趣的:(java,spring,mybatis,druid,flyway)