SpringBoot+zk+dubbo架構實踐(五):搭建微服務電商架構(內附GitHub地址)
阿新 • • 發佈:2019-01-19
往期回顧
前言
我們的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>
<