一个秒杀系统的搭建

Posted aidata

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个秒杀系统的搭建相关的知识,希望对你有一定的参考价值。

 

新建父项目

youfanmiaosha2

pom文件

共有的依赖spring boot,spring boot有父依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.youfan.miaosha2</groupId>
    <artifactId>youfanmiaosha2</artifactId>
    <packaging>pom</packaging>
    <version>1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
    </parent>
    <properties>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>$spring-cloud.version</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

参考:dependencyManagement与dependencies区别

  最近在阅读maven项目代码时,dependencyManagement与dependencies之间的区别不是很了解,现通过项目实例进行总结:项目epps-demob-pom下有一个模块是epps-demob-war。

一、dependencyManagement应用场景

  为了项目的正确运行,必须让所有的子模块使用依赖项的统一版本,必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的结果。在我们项目顶层的pom文件中,我们会看到dependencyManagement元素。通过它元素来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。

  epps-demob-pom中dependencyManagement如下:

技术图片
    <modules>
        <module>epps-demob-war</module>
    </modules>
    <properties>
            <spring-version>3.1.1.RELEASE</spring-version>
    </properties>
    <dependencyManagement>
          <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>$spring-version</version>
          </dependency>
    </dependencyManagement>
技术图片

  epps-demob-war中dependency如下:

技术图片
    <dependencies>
            <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-web</artifactId>
            </dependency>
    </dependencies>
技术图片

  这样做的好处:统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,才能保证测试的和发布的是相同的成果,因此,在顶层pom中定义共同的依赖关系。同时可以避免在每个使用的子项目中都声明一个版本号,这样想升级或者切换到另一个版本时,只需要在父类容器里更新,不需要任何一个子项目的修改;如果某个子项目需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。

二、dependencies应用场景

  相对于dependencyManagement,如果在epps-demob-pom中通过dependencies引入jar,将默认被所有的子模块继承。

三、dependencyManagement与dependencies区别

  dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
  dependencies即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承)。

 

 

新建模块:注册中心

pom引入注册中心的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>youfanmiaosha2</artifactId>
        <groupId>com.youfan.miaosha2</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>youfanRegisterCenter</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>youfanRegisterCenter</finalName>

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <!-- 先指定 src/main/resources下所有文件及文件夹为资源文件 -->
            <resource>
                <directory>src/main/resources</directory>
                <targetPath>$project.build.directory/classes</targetPath>
                <includes>
                    <include>**/*</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
</project>

 

resources文件夹下配置文件application.yml

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false # 是否向 Eureka 注册服务。该应用为服务注册中心,不需要自注册,设置为 false
    fetchRegistry: false  # 是否检索服务。该应用为服务注册中心,职责为注册和发现服务,无需检索服务,设置为 false 
    serviceUrl:
      defaultZone: http://$eureka.instance.hostname:$server.port/eureka/

spring:
  application:
    name: youfanRegisterCenter

新建包com.youfan.controller

包下新建类eureka

package com.youfan.controller;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServer 
    public static void main(String[] args) 
        SpringApplication.run(EurekaServer.class,args);
    

 

 

用户模块设计

新建模块youfanUser

pom添加依赖

作为客户端,引入eureka

下面用到mybatis,引入

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>youfanmiaosha2</artifactId>
        <groupId>com.youfan.miaosha2</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>youfanUser</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

    </dependencies>

    </build>

resources文件夹下创建application.properties

server.port=8081
spring.application.name=youfanUser

新建com.youfan包

包下建YouFanUserApplication类

package com.youfan;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
public class YouFanUserApplication 
    public static void main(String[] args) 

        SpringApplication.run(YouFanUserApplication.class, args);
    

建control包

建测试类UserTest

package com.youfan.control;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
public class UserTest 
    @RequestMapping(value="sayHello", method= RequestMethod.GET)
    public String sayHello(HttpServletRequest req)
        String remoteAddr = req.getRemoteAddr();
        return "hello " + remoteAddr + "!!";
    

启动

技术图片

 

 

 

建service包

 

新建数据库youfanshop

新建表youfanuser

技术图片

 

 

新建模块youfanCommon

pom配置常用工具

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>youfanmiaosha2</artifactId>
        <groupId>com.youfan.miaosha2</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>youfanCommon</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.54</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.3.2</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.11</version>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
    </dependencies>

</project>

 

新建包com.youfan.entity

新建类UserInfo

package com.youfan.entity;

public class UserInfo 

    private int id;//主键
    private String account;//用户名
    private String encryptionPassword;//加密密码
    private String originalPassword;//未加密密码
    private int sex;//性别 0男1女
    private String telphone;//手机号
    private String birthday;//生日
    private String qq;//qq
    private String weixin;//微信号
    private String idCard;//身份证号
    private String name;//姓名
    private int age;//年龄

    public int getId() 
        return id;
    

    public void setId(int id) 
        this.id = id;
    

    public String getAccount() 
        return account;
    

    public void setAccount(String account) 
        this.account = account;
    

    public String getEncryptionPassword() 
        return encryptionPassword;
    

    public void setEncryptionPassword(String encryptionPassword) 
        this.encryptionPassword = encryptionPassword;
    

    public String getOriginalPassword() 
        return originalPassword;
    

    public void setOriginalPassword(String originalPassword) 
        this.originalPassword = originalPassword;
    

    public int getSex() 
        return sex;
    

    public void setSex(int sex) 
        this.sex = sex;
    

    public String getTelphone() 
        return telphone;
    

    public void setTelphone(String telphone) 
        this.telphone = telphone;
    

    public String getBirthday() 
        return birthday;
    

    public void setBirthday(String birthday) 
        this.birthday = birthday;
    

    public String getQq() 
        return qq;
    

    public void setQq(String qq) 
        this.qq = qq;
    

    public String getWeixin() 
        return weixin;
    

    public void setWeixin(String weixin) 
        this.weixin = weixin;
    

    public String getIdCard() 
        return idCard;
    

    public void setIdCard(String idCard) 
        this.idCard = idCard;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

 

整合mybatis

在youfanUser的pom中添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>youfanmiaosha2</artifactId>
        <groupId>com.youfan.miaosha2</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>youfanUser</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--mybaits-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>


        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>


    </dependencies>

    <build>
        <finalName>youfanUser</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <!-- 先指定 src/main/resources下所有文件及文件夹为资源文件 -->
            <resource>
                <directory>src/main/resources</directory>
                <targetPath>$project.build.directory/classes</targetPath>
                <includes>
                    <include>**/*</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
</project>

YouFanUserApplication中添加bean和注解

package com.youfan;

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;


@SpringBootApplication
@EnableEurekaClient
@MappScan("com.youfan.mapper")
public class YouFanUserApplication @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() return new org.apache.tomcat.jdbc.pool.DataSource(); @Bean public SqlSessionFactory sqlSessionFactoryBean() throws Exception SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource()); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mappers/*.xml")); return sqlSessionFactoryBean.getObject(); @Bean public PlatformTransactionManager transactionManager() return new DataSourceTransactionManager(dataSource()); public static void main(String[] args) SpringApplication.run(YouFanUserApplication.class, args);

 

pom添加youfanCommon依赖

        <dependency>
            <groupId>com.youfan.miaosha2</groupId>
            <version>1.0</version>
            <artifactId>youfanCommon</artifactId>
        </dependency>

新建com.youfan.mapper包,下面新建UserMapper接口

package com.youfan.mapper;

import com.youfan.entity.UserInfo;

public interface UserMapper 
    public UserInfo findUserByid(int userid);

新建上面classpath路径和文件,resources下新建User.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.youfan.mapper.UserMapper">

    <select id="findUserByid" resultType="com.youfan.entity.UserInfo"  parameterType="int">
        select account,encryptionPassword,sex,telphone,qq,weixin,age,birthday from youfanuser where id = #userid
    </select>


</mapper>

application.properties中配置数据库

server.port=8081
spring.application.name=youfanUser

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

#mysql配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/youfanshop?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

 

 

新建com.youfan.dao包

新建UserDao

package com.youfan.dao;

import com.youfan.entity.UserInfo;
import com.youfan.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserDao 
    @Autowired
    private UserMapper userMapper;
    public UserInfo findUserByid(int userid)
        return userMapper.findUserByid(userid);
    

idea报Could not autowired解决办法

service下新建UserService

package com.youfan.service;

import com.youfan.dao.UserDao;
import com.youfan.entity.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService 
    @Autowired
    private UserDao userDao;
    public UserInfo findUserByid(int userid)
        return userDao.findUserByid(userid);
    

control下新建UserControl

package com.youfan.control;

import com.alibaba.fastjson.JSONObject;
import com.youfan.entity.UserInfo;
import com.youfan.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class UserControl 
    @Autowired
    private UserService userService;

    @RequestMapping(value = "findUserbyId", method = RequestMethod.GET)
    public String findUserbyId(int id)
        UserInfo userInfo = userService.findUserByid(id);
        String result = JSONObject.toJSONString(userInfo);
        return result;
    

配置maven仓库镜像,settings.xml中添加:

<mirror>
  <id>alimaven</id>
  <name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
  <mirrorOf>central</mirrorOf>
</mirror>
<!-- junit镜像地址 -->
<mirror>
  <id>junit</id>
  <name>junit Address/</name>
  <url>http://jcenter.bintray.com/</url>
  <mirrorOf>central</mirrorOf>
</mirror>

数据库插入一条数据

启动

技术图片

整合thymeleaf

pom依赖

<dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

resources下新建文件夹templates

新建viewUser.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
<table border="1">
    <tr>
        <td>账号</td>
        <td>手机号</td>
        <td>生日</td>
        <td>qq</td>
        <td>微信</td>
    </tr>
    <tr>
        <td><span th:text="$userInfo.account"/></td>
        <td><span th:text="$userInfo.telphone"/></td>
        <td><span th:text="$userInfo.birthday"/></td>
        <td><span th:text="$userInfo.qq"/></td>
        <td><span th:text="$userInfo.weixin"/></td>
    </tr>
</table>
</body>
</html>

修改UserControl

package com.youfan.control;

import com.alibaba.fastjson.JSONObject;
import com.youfan.entity.UserInfo;
import com.youfan.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.Controller;


@Controller
public class UserControl 
    @Autowired
    private UserService userService;

    @RequestMapping(value = "findUserbyId", method = RequestMethod.GET)
    public String findUserbyId(int id, Model model)
        UserInfo userInfo = userService.findUserByid(id);
        model.addAttribute("userInfo", userInfo);
        return "viewUser";
    

技术图片

 

 

报错org.thymeleaf.exceptions.TemplateInputException: Error resolving template解决方案

链接:https://blog.csdn.net/Lin_xiaofeng/article/details/79122053

 

以上是关于一个秒杀系统的搭建的主要内容,如果未能解决你的问题,请参考以下文章

阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统

从零搭建秒杀系统

一个秒杀系统的搭建

秒杀系统如何防止超卖?

秒杀系统秒杀系统之「防止超卖」一

秒杀系统从零打造秒杀系统:防止超卖