SpringBoot+zk+dubbo架构实践(五):搭建微服务电商架构(内附GitHub地址)

往期回顾

SpringBoot+zk+dubbo架构实践(一):本地部署zookeeper
SpringBoot+zk+dubbo架构实践(二):SpringBoot 集成 zookeeper

SpringBoot+zk+dubbo架构实践(三):部署Dubbo-admin管理平台

SpringBoot+zk+dubbo架构实践(四):sb+zk+dubbo框架搭建(内附源码Git地址)

先给大家看一个正在开发的一款小程序微商城项目-数据模型:https://100boot.cn/interface/wxshop.html (有小程序源码可以下载哦!)

前言

  
  
  1. 我们的sb+zk+dubbo微服务架构实践就要完结了。最后完成2件事情。
  2. 1、Spring boot + zk + dubbo 集成 mybatis 和 swagger
  3. 2、实现登录用户的 增删改查业务,附带一个pagehelpe实现的分页查询功能。

目的是让大家能够快速的使用起来,直接配置一下数据源就可以用喽~~~
我们基于 SpringBoot+zk+dubbo架构实践(四) 来完成今天内容。

user_info 数据库表脚本

  
  
  1. CREATE TABLE `user_info` (
  2.   `id` int( 11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  3.   `user_name` varchar( 30) DEFAULT NULL COMMENT '用户名',
  4.   `password` varchar( 30) DEFAULT NULL COMMENT '密码',
  5.   `sex` varchar( 2) NOT NULL COMMENT '性别(0 未知,1 男 ,2 女)',
  6.   `content` varchar( 255) DEFAULT NULL COMMENT '简介',
  7.   `create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  8.   `update_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间',
  9.  PRIMARY KEY ( `id`)
  10. ) ENGINE= InnoDB AUTO_INCREMENT= 1 DEFAULT CHARSET=utf8 COMMENT= '用户信息表'
shop-api 子项目
pom.xml 增加pagehelpe maven配置

  
  
  1. <dependency>
  2.       <groupId>com.github.pagehelper </groupId>
  3.       <artifactId>pagehelper </artifactId>
  4.       <version>4.1.6 </version>
    </dependency>
UserInfoService.java 增加用户信息接口

  
  
  1. 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; /**
  2. * 用户数据服务
  3. * Created by lin on 2018年06月07日21:12:04
  4. */ public interface UserInfoService {     /**
  5.     * 新增用户信息
  6.     */
  7.     int addUserInfo(UserInfoDto record);     /**
  8.     * 查询所有用户信息
  9.     */
  10.    List<UserInfoDto> getUserInfoList();     /**
  11.     * 根据用户ID删除用户信息
  12.     */
  13.     int delUserInfoById(Integer id);     /**
  14.     * 根据用户ID修改用户信息
  15.     */
  16.     int modifyUserInfoById(UserInfoDto record);     /**
  17.     * 分页查询
  18.     */
  19.     PageInfo getUserInfoListPage(UserInfoReqListDto userInfoReqListDto);
  20. }
增加UserInfoDto.java 和 UserInfoReqListDto.java

  
  
  1. UserInfoDto : 用户信息封装 (具体可以GitHub下载源码)
  2. UserInfoReqListDto : 分页数据封装(具体可以GitHub下载源码)
shop-ds 子项目 主要用来接口实现和读写数据库
pom.xml 增加maven配置

  
  
  1. <dependency>
  2.             <groupId>com.alibaba </groupId>
  3.             <artifactId>druid </artifactId>
  4.             <version>1.0.27 </version>
  5.         </dependency>
  6.         <dependency>
  7.             <groupId>mysql </groupId>
  8.             <artifactId>mysql-connector-java </artifactId>
  9.         </dependency>
  10.         <dependency>
  11.             <groupId>org.mybatis </groupId>
  12.             <artifactId>mybatis </artifactId>
  13.             <version>3.4.2 </version>
  14.         </dependency>
  15.         <dependency>
  16.             <groupId>org.mybatis </groupId>
  17.             <artifactId>mybatis-spring </artifactId>
  18.             <version>1.3.1 </version>
  19.         </dependency>
  20.         <dependency>
  21.             <groupId>com.github.pagehelper </groupId>
  22.             <artifactId>pagehelper </artifactId>
  23.             <version>4.1.6 </version>
  24.         </dependency>
mybatis-config.xml

  
  
  1. <?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>
  2.     <settings>
  3.         <setting name="cacheEnabled" value="true"/>
  4.         <setting name="lazyLoadingEnabled" value="true"/>
  5.         <setting name="aggressiveLazyLoading" value="true"/>
  6.         <setting name="useGeneratedKeys" value="true"/>
  7.         <setting name="defaultExecutorType" value="SIMPLE"/>
  8.         <setting name="defaultStatementTimeout" value="600"/>
  9.         <setting name="callSettersOnNulls" value="true"/>
  10.     </settings>
  11.     <plugins>
  12.         <plugin interceptor="com.github.pagehelper.PageHelper">
  13.             <property name="dialect" value="mysql"/>
  14.         </plugin>
  15.     </plugins>
  16.     <mappers>
  17.         <mapper resource="mappers/UserInfoMapper.xml"/>
  18.     </mappers> </configuration>
DatasourceConfig.java 链接数据源

  
  
  1. 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
  2.     public DataSource dataSource() {
  3.        DruidDataSource ds = new DruidDataSource();
  4.        ds.setDriverClassName(driverClassName);
  5.        ds.setUrl(url);
  6.        ds.setUsername(username);
  7.        ds.setPassword(password);
  8.        ds.setInitialSize(initSize);
  9.        ds.setMinIdle(minIdel);
  10.        ds.setMaxActive(maxActive);
  11.        ds.setLoginTimeout(loginTimeoutSeconds);
  12.        ds.setQueryTimeout(queryTimeoutSeconds);        
           return ds;
  13.    }    
       @Bean
  14.     public SqlSessionFactory sqlSessionFactory() throws Exception {         final SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
  15.        sqlSessionFactory.setDataSource(dataSource());
  16.        sqlSessionFactory.setConfigLocation( new ClassPathResource( "mybatis-config.xml"));
  17.        sqlSessionFactory.setFailFast( true);        
           return sqlSessionFactory.getObject();
  18.    }    
       public DataSourceTransactionManager dataSourceTransactionManager() {
  19.        log.debug( "> transactionManager");        
           return new DataSourceTransactionManager(dataSource());
  20.    }    
       @PostConstruct
  21.     public void postConstruct() {
  22.        log.info( "jdbc settings={}", this);
  23.    }
  24. }
UserInfo.java 、UserInfoMapper.java 和 UserInfoMapper.xml 自己生成(GitHub 源码里有)
UserInfoMapper.xml 增加 分页查询业务

  
  
  1. < select id= "getUserInfoList" parameterType= "com.itunion.shop.dto.UserInfoReqListDto" resultType= "com.itunion.shop.dto.UserInfoDto">
  2.         select
  3.        id, user_name as userName, password, sex, content, create_date as createDate, update_date as updateDate
  4.         from user_info
  5.    </ select>
shop-ds-rovider.xml 注册服务配置
    <dubbo:service interface="com.itunion.shop.service.UserInfoService" ref="userInfoService"/>
  
  
UserInfoMapper.xml 增加 查询用户信息集合业务

  
  
  1. /**
  2.     * 获取用户信息集合
  3.     * @return
  4.     */
  5.     List<UserInfoDto> getUserInfoList(UserInfoReqListDto userInfoReqListDto);
UserInfoServiceImpl.java 增加用户业务实现服务类

  
  
  1. 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;
    /**
  2. * 用户信息-服务提供方
  3. * Created by lin on 2018年06月07日21:48:13
  4. */

    public class UserInfoServiceImpl implements UserInfoService {    
    private final static Logger LOGGER = LoggerFactory.getLogger(UserInfoServiceImpl.class);    
       @Autowired
  5.     private UserInfoMapper userInfoMapper;    
       @Override
  6.     public int addUserInfo(UserInfoDto record) {
  7.        LOGGER.info( "进入用户信息-服务提供方-UserInfoServiceImpl.addUserInfo[" + new SimpleDateFormat( "HH:mm:ss").format( new Date()) + "]");
  8.        UserInfo userInfo = new UserInfo();
  9.        BeanUtils.copyProperties(record, userInfo);
  10.        userInfo.setUpdateDate( new Date());        
           return userInfoMapper.insertSelective(userInfo);
  11.    }  
        @Override
  12.     public List<UserInfoDto> getUserInfoList() {
  13.        LOGGER.info( "进入用户信息-服务提供方-UserInfoServiceImpl.getUserInfoList[" + new SimpleDateFormat( "HH:mm:ss").format( new Date()) + "]");         return userInfoMapper.getUserInfoList( null);
  14.    }    
        @Override
  15.     public int delUserInfoById(Integer id) {
  16.        LOGGER.info( "进入用户信息-服务提供方-UserInfoServiceImpl.delUserInfoById[" + new SimpleDateFormat( "HH:mm:ss").format( new Date()) + "]");         return userInfoMapper.deleteByPrimaryKey(id);
  17.    }    
        @Override
  18.     public int modifyUserInfoById(UserInfoDto record) {
  19.        LOGGER.info( "进入用户信息-服务提供方-UserInfoServiceImpl.modifyUserInfoById[" + new SimpleDateFormat( "HH:mm:ss").format( new Date()) + "]");
  20.        UserInfo userInfo = new UserInfo();
  21.        BeanUtils.copyProperties(record, userInfo);
  22.        userInfo.setUpdateDate( new Date());      
         return userInfoMapper.updateByPrimaryKeySelective(userInfo);
  23.    }  
         @Override
  24.     public PageInfo getUserInfoListPage(UserInfoReqListDto userInfoReqListDto) {
  25.        LOGGER.info( "进入用户信息-服务提供方-UserInfoServiceImpl.getUserInfoListPage[" + new SimpleDateFormat( "HH:mm:ss").format( new Date()) + "]");
  26.        PageHelper.startPage(userInfoReqListDto.getPage(), userInfoReqListDto.getSize());
  27.        List<UserInfoDto> userInfoDtos = userInfoMapper.getUserInfoList(userInfoReqListDto);
  28.        PageInfo<UserInfoDto> userInfoDtoPageInfo = new PageInfo<>(userInfoDtos);        
         return userInfoDtoPageInfo;
  29.    }
  30. }
ShopDSApplication.java 项目启动

  
  
  1. 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) {
  2.        SpringApplication.run(ShopDSApplication. class, args);
  3.    }
  4. }

好了, shop-ds 项目配置好了,接下来开始配是 移动端子项目和PC端子项目(我们文章只配置一下移动端的 PC端自己copy)

shop-web 子项目
pom.xml 增加 swagger 和 pagehelper maven配置

  
  
  1. <dependency>
  2.             <groupId>io.springfox </groupId>
  3.             <artifactId>springfox-swagger2 </artifactId>
  4.             <version>2.7.0 </version>
  5.         </dependency>
  6.         <dependency>
  7.             <groupId>io.springfox </groupId>
  8.             <artifactId>springfox-swagger-ui </artifactId>
  9.             <version>2.7.0 </version>
  10.         </dependency>
  11.         <dependency>
  12.             <groupId>com.github.pagehelper </groupId>
  13.             <artifactId>pagehelper </artifactId>
  14.             <version>4.1.6 </version>
  15.         </dependency>
shop-web-consumer.xml 注册服务配置
        <dubbo:reference id="userInfoService" check="false" interface="com.itunion.shop.service.UserInfoService"/>
  
  
UserInfoController.java 移动端业务入口

  
  
  1. package com.itunion.shop.web.controller;
    import com.github.pagehelper.PageInfo;
    import com.itunion.shop.common.UniformResultTemplate;
    import com.itunion.shop.dto.UserInfoDto;
    import com.itunion.shop.dto.UserInfoReqListDto;
    import com.itunion.shop.service.UserInfoService;
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiImplicitParam;
    import io.swagger.annotations.ApiOperation;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory. annotation.Autowired;
    import org.springframework.http.MediaType;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind. annotation.*;
    import javax.servlet.http.HttpServletRequest;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    /**
  2. * 用户信息-移动端消费方
  3. * Created by lin on 2018年06月07日22:02:07
  4. */

    @Controller @RequestMapping ( "userInfo" )
    @Api (description = "测试移动" )
    public class UserInfoController {    
    private Logger LOGGER = LoggerFactory.getLogger(UserInfoController. class);    
       @Autowired
  5.    UserInfoService userInfoService;    
       @ApiOperation (value = "getUserInfoList" , notes = "查询所有用户信息" )         @RequestMapping (value = "getUserInfoList" , method = RequestMethod.GET)    
       @ResponseBody
  6.     public UniformResultTemplate<List<UserInfoDto>> getUserInfoList() {
  7.        LOGGER.info( "进入用户信息-移动端消费方-UserInfoController.getUserInfoList[" + new SimpleDateFormat( "HH:mm:ss").format( new Date()) + "]");
  8.        UniformResultTemplate<List<UserInfoDto>> uniformResultTemplate = new UniformResultTemplate<>();
  9.        uniformResultTemplate.setCode( 100);
  10.        uniformResultTemplate.setMessage( "查询所有用户信息成功!");
  11.        uniformResultTemplate.setResult(userInfoService.getUserInfoList());        
           return uniformResultTemplate;
  12.    }    
       @ApiOperation (value = "getUserInfoListPage" , notes = "查询所有用户信息-分页" )    
       @ApiImplicitParam (name = "userInfoReqListDto" , value = "{\"page\":\"1\",\"size\":\"2\"}" )    
       @RequestMapping (value = "getUserInfoListPage" , method = RequestMethod.POST)    
       @ResponseBody
  13.     public UniformResultTemplate<PageInfo> getUserInfoList(@RequestBody UserInfoReqListDto userInfoReqListDto) {
  14.        LOGGER.info( "进入用户信息-移动端消费方-UserInfoController.getUserInfoListPage[" + new SimpleDateFormat( "HH:mm:ss").format( new Date()) + "]");
  15.        UniformResultTemplate<PageInfo> uniformResultTemplate = new UniformResultTemplate<>();
  16.        uniformResultTemplate.setCode( 100);
  17.        uniformResultTemplate.setMessage( "查询所有用户信息成功分页!");
  18.        uniformResultTemplate.setResult(userInfoService.getUserInfoListPage(userInfoReqListDto));        
           return uniformResultTemplate;
  19.    }    
    @ApiOperation (value = "addUserInfo" , notes = "新增用户信息" )  
      @ApiImplicitParam (name = "userInfoDto" , value = "{\"userName\":\"测试用户名\",\"password\":\"000000\",\"sex\":1,\"content\":\"这里是IT实战联哦~~~\"}" )    
      @RequestMapping (value= "addUserInfo" , method = RequestMethod.POST)    
      @ResponseBody
  20.     public UniformResultTemplate<String> addUserInfo(@RequestBody UserInfoDto userInfoDto) {
  21.    LOGGER.info( "进入用户信息-移动端消费方-UserInfoController.addUserInfo[" + new SimpleDateFormat( "HH:mm:ss").format( new Date()) + "]");
  22.        UniformResultTemplate<String> uniformResultTemplate = new UniformResultTemplate<>();
  23.        Integer num = userInfoService.addUserInfo(userInfoDto);         if(num > 0){
  24.            uniformResultTemplate.setCode( 100);
  25.            uniformResultTemplate.setMessage( "新增用户信息成功!");
  26.            uniformResultTemplate.setResult(num+ "");
  27.        } else{
  28.            uniformResultTemplate.setCode( 400);
  29.            uniformResultTemplate.setMessage( "新增用户信息失败!");
  30.            uniformResultTemplate.setResult(num+ "");
  31.        }        
              return uniformResultTemplate;
  32.    }    
        @ApiOperation (value= "delUserInfoById" , notes= "根据用户ID删除用户信息" )       @ApiImplicitParam (name = "id" , value = "4" , paramType= "path" , dataType= "Integer" )    
        @RequestMapping (value= "delUserInfoById/{id}" , method = RequestMethod.POST)    
        @ResponseBody
  33.     public UniformResultTemplate<String> deleteKdgVipItem(@PathVariable Integer id) {
  34.        LOGGER.info( "进入用户信息-移动端消费方-UserInfoController.delUserInfoById[" + new SimpleDateFormat( "HH:mm:ss").format( new Date()) + "]");
  35.        UniformResultTemplate<String> uniformResultTemplate = new UniformResultTemplate<>();
  36.        Integer num = userInfoService.delUserInfoById(id);         if(num > 0){
  37.            uniformResultTemplate.setCode( 100);
  38.            uniformResultTemplate.setMessage( "根据用户ID删除用户信息成功!");
  39.            uniformResultTemplate.setResult(num+ "");
  40.        } else{
  41.            uniformResultTemplate.setCode( 400);
  42.            uniformResultTemplate.setMessage( "根据用户ID删除用户信息失败!");
  43.            uniformResultTemplate.setResult(num+ "");
  44.        }        
            return uniformResultTemplate;
  45.    }    
        @ApiOperation (value = "modifyUserInfo" , notes = "修改用户信息" )  
          @ApiImplicitParam (name = "userInfoDto" , value = "{\"id\":10,\"userName\":\"测试修改用户名\",\"password\":55555,\"sex\":1,\"content\":\"这里是最新的IT实战联哦~~~\"}" )    
          @RequestMapping (value= "modifyUserInfo" , method = RequestMethod.POST, produces= MediaType.APPLICATION_JSON_UTF8_VALUE)    
          @ResponseBody
  46.     public UniformResultTemplate<String> modifyUserInfo(@RequestBody UserInfoDto userInfoDto) {
  47.        LOGGER.info( "进入用户信息-移动端消费方-UserInfoController.modifyUserInfo[" + new SimpleDateFormat( "HH:mm:ss").format( new Date()) + "]");
  48.        UniformResultTemplate<String> uniformResultTemplate = new UniformResultTemplate<>();
  49.        Integer num = userInfoService.modifyUserInfoById(userInfoDto);         if(num > 0){
  50.            uniformResultTemplate.setCode( 100);
  51.            uniformResultTemplate.setMessage( "修改用户信息成功!");
  52.            uniformResultTemplate.setResult(num+ "");
  53.        } else{
  54.            uniformResultTemplate.setCode( 400);
  55.            uniformResultTemplate.setMessage( "修改用户信息失败!");
  56.            uniformResultTemplate.setResult(num+ "");
  57.        }         return uniformResultTemplate;
  58.    }
  59. }

备注:工具类 可以GitHub下载源码

Application.java 项目启动

  
  
  1. package com.itunion.shop;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.support.SpringBootServletInitializer;
    import org.springframework.context.annotation.ImportResource;
    @SpringBootApplication @ImportResource(value = { "classpath:shop-web-consumer.xml" })
    public class Application extends SpringBootServletInitializer {  
      public static void main(String[] args) throws Exception {
  2.        SpringApplication.run(Application.class, args);
  3.    }
  4. }
application.properties

  
  
  1. server.port= 8081   #端口
    server.context-path=/wxShop #项目名称
    swagger.enable= true
    swagger.protocol=http
  2. swagger.host= 127.0 .0 .1: 8081

备注:shop-pc 子项目和 shop-web 配置都是一样的,不多做介绍

项目启动
访问地址
http://127.0.0.1:8081/wxShop/swagger-ui.html
  
  
效果



可以看到我们一共写了5个业务 用户的 增、删、改、查和分页查询。

总结

SpringBoot+zk+dubbo架构实践 分解为5篇文章写完,为了让大家能够最快入门微服务架构 并实现编码,没有做深入的剖析, 小编将源码上传GitHub:https://github.com/yundianzixun/weixin-shop。在具体工作中还会遇到更多复杂的问题,架构师之路就是不断解决问题的,一边解决问题一边进阶。小编能做的还很少,希望该实践系列能够对大家有用,谢谢支持!

关注我们

更多精彩内容请关注“IT实战联盟”公*众*号,平台会提供更多技术实践内容,也可以加入交流群和作者互撩哦~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值