资讯专栏INFORMATION COLUMN

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

mochixuan / 2000人阅读

摘要:通过整合及可以实现数据库查询后将数据持久化。但是可能出现幻像读这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。

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

工程建成后目录如下:

整合步骤:

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

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

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

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配置项

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

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




    
    

    
    
    
    
三、整合mybatis,druid,flyway工具

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中添加启动命令:


添加此配置的作用是自动生成数据表实体跟mapper文件,无须手写容易出错。运行命令,将生成的实体文件添加到对应目录下:

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文件

四、整合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目录下添加一个接口及实现类,代码如下:

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("任务执行结束"); } }

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

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

参考资料:传送门

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67919.html

相关文章

  • 哪种Scale out架构能更有效满足布式计算?

    摘要:那么,的架构是否真的需要多台小计算量的节点来实现才是最完美的架构呢,让我们来细细剖析什么样的架构才能最有效的满足分布式计算的特点。近些年,随着分布式计算的越来越火热,Scale out分布式应用架构也如雨后春笋般不断涌现,大到Big Data平台架构,小到前端应用App的架构,似乎都要基于Scale out 的架构才算是与时俱进的先进架构。分布式架构的优势显而易见,一方面,Scale out...

    idisfkj 评论0 收藏0
  • 【十年磨剑】我们能从阿里架构师的身上学到什么?

    摘要:正文本文是看到阿里巴巴系统架构师黄勇的采访记录有感而发,如有侵权,请联系我。下面就一起来看看阿里架构师的十年架构路。抱着这样的信心,我加入了易传媒,担任系统架构师职位。 showImg(https://segmentfault.com/img/remote/1460000016748965); 前言 做技术的,一定不能放弃技术。在精进技术的同时完善其他方面的能力,十年如一日。不忘初心,...

    OnlyMyRailgun 评论0 收藏0
  • 布式软件架构整合(二)

    摘要:续上篇所需技术等说明本编讲解一个分布式架构的整个流程,首先对上编中的工程作一些小小的改动,以支持接下来的实验。本篇中,定义了服务提供者,注册中心及客户端消费者三者关系。一服务提供者这里首先对服务端进行改造。 (续上篇) 所需技术:spring、mybatis、druid、flyway、logback、nodejs,zookeeper,dubbo,dubbo-admin等;说明:本编讲解...

    you_De 评论0 收藏0
  • 数据中心需要条25G新“跑道”

    摘要:面向未来的战略设计,年开放网络战略升级,进入开放网络时代,基于软件定义数据中心提供全方位的解决方案,建立一个开放式的网络体系。开放网络需要性能更强的硬件平台在软件定义数据中心战略进程中,计算存储网络三者不可或缺,相互配合又相互影响。现在,企业应用进入云计算阶段,企业对IT架构虚拟化的需求越来越高,虚拟机的频繁创建需要网络自动快速来配置,同时网络安全隔离、多个数据中心之间的容灾,对网络提出了更...

    jindong 评论0 收藏0
  • 云计算怎样影响网络基础架构

    摘要:在该阶段,云计算的网络基础架构如何结合新的趋势,更好地支撑云计算从试点到实用阶段的转型,显得尤为关键。对未来云计算网络架构的几点思考弹性网络易管理网络和开放的网络,这个需求的提出是适应未来云计算的支撑关键。 针对云计算的变革,文章分析云计算发展的几大趋势,阐述适应云计算的关键是要提供高弹性、高扩展性、易管理和开放的网络,并建议未来理想的云计算网络架构应是一个无阻塞、可自愈、即插即用的黑盒网络...

    stackfing 评论0 收藏0

发表评论

0条评论

mochixuan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<