1. 程式人生 > >SpringBoot+zk+dubbo架構實踐(五):搭建微服務電商架構(內附GitHub地址)

SpringBoot+zk+dubbo架構實踐(五):搭建微服務電商架構(內附GitHub地址)

往期回顧

前言

我們的sb+zk+dubbo微服務架構實踐就要完結了。最後完成2件事情。
1、Spring boot + zk + dubbo 整合 mybatis 和 swagger 
2、實現登入使用者的 增刪改查業務,附帶一個pagehelpe實現的分頁查詢功能。 

目的是讓大家能夠快速的使用起來,直接配置一下資料來源就可以用嘍~~~
我們基於 SpringBoot+zk+dubbo架構實踐(四) 來完成今天內容。

user_info 資料庫表指令碼

CREATE TABLE `user_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '使用者ID'
,  `user_name` varchar(30) DEFAULT NULL COMMENT '使用者名稱',  `password` varchar(30) DEFAULT NULL COMMENT '密碼',  `sex` varchar(2) NOT NULL COMMENT '性別(0 未知,1 男 ,2 女)',  `content` varchar(255) DEFAULT NULL COMMENT '簡介',  `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '建立時間'
,  `update_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新時間',  PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='使用者資訊表'

shop-api 子專案

pom.xml 增加pagehelpe maven配置
<dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>
pagehelper</artifactId>      <version>4.1.6</version>
</dependency>
UserInfoService.java 增加使用者資訊介面
package com.itunion.shop.service;
import com.github.pagehelper.PageInfo;
import com.itunion.shop.dto.UserInfoDto;
import com.itunion.shop.dto.UserInfoReqListDto;
import java.util.List;/** * 使用者資料服務 * Created by lin on 2018年06月07日21:12:04 */public interface UserInfoService {    /**     * 新增使用者資訊     */    int addUserInfo(UserInfoDto record);    /**     * 查詢所有使用者資訊     */    List<UserInfoDto> getUserInfoList();    /**     * 根據使用者ID刪除使用者資訊     */    int delUserInfoById(Integer id);    /**     * 根據使用者ID修改使用者資訊     */    int modifyUserInfoById(UserInfoDto record);    /**     * 分頁查詢     */    PageInfo getUserInfoListPage(UserInfoReqListDto userInfoReqListDto); }
增加UserInfoDto.java 和 UserInfoReqListDto.java
UserInfoDto : 使用者資訊封裝 (具體可以GitHub下載原始碼)
UserInfoReqListDto : 分頁資料封裝(具體可以GitHub下載原始碼)

shop-ds 子專案 主要用來介面實現和讀寫資料庫

pom.xml 增加maven配置
<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.27</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>4.1.6</version>
        </dependency>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <settings>        <setting name="cacheEnabled" value="true"/>        <setting name="lazyLoadingEnabled" value="true"/>        <setting name="aggressiveLazyLoading" value="true"/>        <setting name="useGeneratedKeys" value="true"/>        <setting name="defaultExecutorType" value="SIMPLE"/>        <setting name="defaultStatementTimeout" value="600"/>        <setting name="callSettersOnNulls" value="true"/>    </settings>    <plugins>        <plugin interceptor="com.github.pagehelper.PageHelper">            <property name="dialect" value="mysql"/>        </plugin>    </plugins>    <mappers>        <mapper resource="mappers/UserInfoMapper.xml"/>    </mappers></configuration>
DatasourceConfig.java 連結資料來源
package com.itunion.shop.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.annotation.PostConstruct;
import java.sql.DataSource;

@Configuration@MapperScan(basePackages = "com.itunion.shop.mapper")
public class DatasourceConfig {    
private static Logger log = LoggerFactory.getLogger(DatasourceConfig.class);    
@Value("${druid.driver}")    
private String driverClassName;    
@Value("${druid.url}")    
private String url;    
@Value("${druid.username}")    
private String username;    
@Value("${druid.password}")    
private String password;    
@Value("${druid.init-size}")    
private int initSize;    
@Value("${druid.min-idel}")    
private int minIdel;    
@Value("${druid.max-active}")    
private int maxActive;    
@Value("${druid.login.timeout.seconds}")    
private int loginTimeoutSeconds;    
@Value("${druid.query.timeout.seconds}")    
private int queryTimeoutSeconds;    
   @Bean    public DataSource dataSource() {        DruidDataSource ds = new DruidDataSource();        ds.setDriverClassName(driverClassName);        ds.setUrl(url);        ds.setUsername(username);        ds.setPassword(password);        ds.setInitialSize(initSize);        ds.setMinIdle(minIdel);        ds.setMaxActive(maxActive);        ds.setLoginTimeout(loginTimeoutSeconds);        ds.setQueryTimeout(queryTimeoutSeconds);        
       return ds;    }    
   @Bean    public SqlSessionFactory sqlSessionFactory() throws Exception {        final SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();        sqlSessionFactory.setDataSource(dataSource());        sqlSessionFactory.setConfigLocation(new ClassPathResource("mybatis-config.xml"));        sqlSessionFactory.setFailFast(true);        
       return sqlSessionFactory.getObject();    }    
   public DataSourceTransactionManager dataSourceTransactionManager() {        log.debug("> transactionManager");        
       return new DataSourceTransactionManager(dataSource());    }    
   @PostConstruct    public void postConstruct() {        log.info("jdbc settings={}", this);    } }
UserInfo.java 、UserInfoMapper.java 和 UserInfoMapper.xml 自己生成(GitHub 原始碼裡有)
UserInfoMapper.xml 增加 分頁查詢業務
 <select id="getUserInfoList" parameterType="com.itunion.shop.dto.UserInfoReqListDto" resultType="com.itunion.shop.dto.UserInfoDto">
        select
        id, user_name as userName, password, sex, content, create_date as createDate, update_date as updateDate
        from user_info
    </select>
shop-ds-rovider.xml 註冊服務配置
    <dubbo:service interface="com.itunion.shop.service.UserInfoService" ref="userInfoService"/>
UserInfoMapper.xml 增加 查詢使用者資訊集合業務
 /**
     * 獲取使用者資訊集合
     * @return
     */
    List<UserInfoDto> getUserInfoList(UserInfoReqListDto userInfoReqListDto);
UserInfoServiceImpl.java 增加使用者業務實現服務類
package com.itunion.shop.service.impl;
import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itunion.shop.dto.UserInfoDto;
import com.itunion.shop.dto.UserInfoReqListDto;
import com.itunion.shop.mapper.UserInfoMapper;
import com.itunion.shop.model.UserInfo;
import com.itunion.shop.service.UserInfoService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/** * 使用者資訊-服務提供方 * Created by lin on 2018年06月07日21:48:13 */

public class UserInfoServiceImpl implements UserInfoService {    
private final static Logger LOGGER = LoggerFactory.getLogger(UserInfoServiceImpl.class);    
   @Autowired    private UserInfoMapper userInfoMapper;    
   @Override    public int addUserInfo(UserInfoDto record) {        LOGGER.info("進入使用者資訊-服務提供方-UserInfoServiceImpl.addUserInfo[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "]");        UserInfo userInfo = new UserInfo();        BeanUtils.copyProperties(record, userInfo);        userInfo.setUpdateDate(new Date());        
       return userInfoMapper.insertSelective(userInfo);    }  
   @Override    public List<UserInfoDto> getUserInfoList() {        LOGGER.info("進入使用者資訊-服務提供方-UserInfoServiceImpl.getUserInfoList[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "]");        return userInfoMapper.getUserInfoList(null);    }    
   @Override    public int delUserInfoById(Integer id) {        LOGGER.info("進入使用者資訊-服務提供方-UserInfoServiceImpl.delUserInfoById[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "]");        return userInfoMapper.deleteByPrimaryKey(id);    }    
   @Override    public int modifyUserInfoById(UserInfoDto record) {        LOGGER.info("進入使用者資訊-服務提供方-UserInfoServiceImpl.modifyUserInfoById[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "]");        UserInfo userInfo = new UserInfo();        BeanUtils.copyProperties(record, userInfo);        userInfo.setUpdateDate(new Date());      
    return userInfoMapper.updateByPrimaryKeySelective(userInfo);    }  
    @Override    public PageInfo getUserInfoListPage(UserInfoReqListDto userInfoReqListDto) {        LOGGER.info("進入使用者資訊-服務提供方-UserInfoServiceImpl.getUserInfoListPage[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "]");        PageHelper.startPage(userInfoReqListDto.getPage(), userInfoReqListDto.getSize());        List<UserInfoDto> userInfoDtos = userInfoMapper.getUserInfoList(userInfoReqListDto);        PageInfo<UserInfoDto> userInfoDtoPageInfo = new PageInfo<>(userInfoDtos);        
    return userInfoDtoPageInfo;    } }
ShopDSApplication.java 專案啟動
package com.itunion.shop;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication

// 使用 providers.xml 配置

@ImportResource(value = {"classpath:shop-ds-rovider.xml"})
public class ShopDSApplication {    
public static void main(String[] args) {        SpringApplication.run(ShopDSApplication.class, args);    } }

好了, shop-ds 專案配置好了,接下來開始配是 移動端子專案和PC端子專案(我們文章只配置一下移動端的 PC端自己copy)

shop-web 子專案

pom.xml 增加 swagger 和 pagehelper maven配置
<dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <