From 786dc6c311d6e718f277b8b39c90fb405f2f1f8a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=B0=8F=E6=9F=922012?= <345849402@qq.com>
Date: Tue, 15 May 2018 18:30:33 +0800
Subject: [PATCH] =?UTF-8?q?=E7=A7=92=E6=9D=80=E5=88=9D=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.classpath | 32 +++
.project | 42 ++++
.settings/.jsdtscope | 13 ++
.settings/org.eclipse.jdt.core.prefs | 13 ++
.settings/org.eclipse.m2e.core.prefs | 4 +
.settings/org.eclipse.wst.common.component | 11 +
....eclipse.wst.common.project.facet.core.xml | 7 +
...rg.eclipse.wst.jsdt.ui.superType.container | 1 +
.../org.eclipse.wst.jsdt.ui.superType.name | 1 +
.settings/org.eclipse.wst.validation.prefs | 2 +
pom.xml | 106 +++++++++
.../java/com/itstyle/seckill/Application.java | 24 +++
.../seckill/common/api/SwaggerConfig.java | 27 +++
.../common/config/IndexController.java | 35 +++
.../common/dynamicquery/DynamicQuery.java | 80 +++++++
.../common/dynamicquery/DynamicQueryImpl.java | 101 +++++++++
.../dynamicquery/NativeQueryResultEntity.java | 11 +
.../itstyle/seckill/common/entity/Result.java | 59 +++++
.../seckill/common/entity/Seckill.java | 81 +++++++
.../seckill/common/entity/SuccessKilled.java | 54 +++++
.../seckill/common/enums/SeckillStatEnum.java | 40 ++++
.../seckill/common/interceptor/MyAdapter.java | 19 ++
.../seckill/common/redis/RedisConfig.java | 90 ++++++++
.../seckill/common/redis/RedisUtil.java | 130 +++++++++++
.../distributedlock/redis/RedissLockDemo.java | 143 ++++++++++++
.../distributedlock/redis/RedissLockUtil.java | 101 +++++++++
.../redis/RedissonAutoConfiguration.java | 75 +++++++
.../redis/RedissonProperties.java | 97 +++++++++
.../distributedlock/zookeeper/ZkLockUtil.java | 59 +++++
.../seckill/queue/jvm/SeckillQueue.java | 55 +++++
.../itstyle/seckill/queue/jvm/TaskRunner.java | 31 +++
.../seckill/queue/kafka/KafkaConsumer.java | 26 +++
.../seckill/queue/kafka/KafkaSender.java | 21 ++
.../seckill/queue/redis/RedisConsumer.java | 22 ++
.../seckill/queue/redis/RedisSender.java | 18 ++
.../queue/redis/RedisSubListenerConfig.java | 32 +++
.../seckill/repository/SeckillRepository.java | 9 +
.../service/ISeckillDistributedService.java | 31 +++
.../seckill/service/ISeckillService.java | 73 +++++++
.../impl/SeckillDistributedServiceImpl.java | 114 ++++++++++
.../service/impl/SeckillServiceImpl.java | 173 +++++++++++++++
.../seckill/web/SeckillController.java | 203 ++++++++++++++++++
.../web/SeckillDistributedController.java | 145 +++++++++++++
src/main/resources/application.properties | 82 +++++++
src/main/resources/logback-spring.xml | 82 +++++++
src/main/resources/sql/seckill.sql | 55 +++++
src/main/webapp/WEB-INF/web.xml | 7 +
src/main/webapp/index.jsp | 5 +
target/classes/application.properties | 82 +++++++
target/classes/logback-spring.xml | 82 +++++++
target/classes/sql/seckill.sql | 55 +++++
51 files changed, 2861 insertions(+)
create mode 100644 .classpath
create mode 100644 .project
create mode 100644 .settings/.jsdtscope
create mode 100644 .settings/org.eclipse.jdt.core.prefs
create mode 100644 .settings/org.eclipse.m2e.core.prefs
create mode 100644 .settings/org.eclipse.wst.common.component
create mode 100644 .settings/org.eclipse.wst.common.project.facet.core.xml
create mode 100644 .settings/org.eclipse.wst.jsdt.ui.superType.container
create mode 100644 .settings/org.eclipse.wst.jsdt.ui.superType.name
create mode 100644 .settings/org.eclipse.wst.validation.prefs
create mode 100644 pom.xml
create mode 100644 src/main/java/com/itstyle/seckill/Application.java
create mode 100644 src/main/java/com/itstyle/seckill/common/api/SwaggerConfig.java
create mode 100644 src/main/java/com/itstyle/seckill/common/config/IndexController.java
create mode 100644 src/main/java/com/itstyle/seckill/common/dynamicquery/DynamicQuery.java
create mode 100644 src/main/java/com/itstyle/seckill/common/dynamicquery/DynamicQueryImpl.java
create mode 100644 src/main/java/com/itstyle/seckill/common/dynamicquery/NativeQueryResultEntity.java
create mode 100644 src/main/java/com/itstyle/seckill/common/entity/Result.java
create mode 100644 src/main/java/com/itstyle/seckill/common/entity/Seckill.java
create mode 100644 src/main/java/com/itstyle/seckill/common/entity/SuccessKilled.java
create mode 100644 src/main/java/com/itstyle/seckill/common/enums/SeckillStatEnum.java
create mode 100644 src/main/java/com/itstyle/seckill/common/interceptor/MyAdapter.java
create mode 100644 src/main/java/com/itstyle/seckill/common/redis/RedisConfig.java
create mode 100644 src/main/java/com/itstyle/seckill/common/redis/RedisUtil.java
create mode 100644 src/main/java/com/itstyle/seckill/distributedlock/redis/RedissLockDemo.java
create mode 100644 src/main/java/com/itstyle/seckill/distributedlock/redis/RedissLockUtil.java
create mode 100644 src/main/java/com/itstyle/seckill/distributedlock/redis/RedissonAutoConfiguration.java
create mode 100644 src/main/java/com/itstyle/seckill/distributedlock/redis/RedissonProperties.java
create mode 100644 src/main/java/com/itstyle/seckill/distributedlock/zookeeper/ZkLockUtil.java
create mode 100644 src/main/java/com/itstyle/seckill/queue/jvm/SeckillQueue.java
create mode 100644 src/main/java/com/itstyle/seckill/queue/jvm/TaskRunner.java
create mode 100644 src/main/java/com/itstyle/seckill/queue/kafka/KafkaConsumer.java
create mode 100644 src/main/java/com/itstyle/seckill/queue/kafka/KafkaSender.java
create mode 100644 src/main/java/com/itstyle/seckill/queue/redis/RedisConsumer.java
create mode 100644 src/main/java/com/itstyle/seckill/queue/redis/RedisSender.java
create mode 100644 src/main/java/com/itstyle/seckill/queue/redis/RedisSubListenerConfig.java
create mode 100644 src/main/java/com/itstyle/seckill/repository/SeckillRepository.java
create mode 100644 src/main/java/com/itstyle/seckill/service/ISeckillDistributedService.java
create mode 100644 src/main/java/com/itstyle/seckill/service/ISeckillService.java
create mode 100644 src/main/java/com/itstyle/seckill/service/impl/SeckillDistributedServiceImpl.java
create mode 100644 src/main/java/com/itstyle/seckill/service/impl/SeckillServiceImpl.java
create mode 100644 src/main/java/com/itstyle/seckill/web/SeckillController.java
create mode 100644 src/main/java/com/itstyle/seckill/web/SeckillDistributedController.java
create mode 100644 src/main/resources/application.properties
create mode 100644 src/main/resources/logback-spring.xml
create mode 100644 src/main/resources/sql/seckill.sql
create mode 100644 src/main/webapp/WEB-INF/web.xml
create mode 100644 src/main/webapp/index.jsp
create mode 100644 target/classes/application.properties
create mode 100644 target/classes/logback-spring.xml
create mode 100644 target/classes/sql/seckill.sql
diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..64f1662
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.project b/.project
new file mode 100644
index 0000000..5a89e97
--- /dev/null
+++ b/.project
@@ -0,0 +1,42 @@
+
+
+ spring-boot-seckill
+
+
+
+
+
+ org.eclipse.wst.jsdt.core.javascriptValidator
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.wst.common.project.facet.core.builder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+ org.eclipse.wst.validation.validationbuilder
+
+
+
+
+
+ org.eclipse.jem.workbench.JavaEMFNature
+ org.eclipse.wst.common.modulecore.ModuleCoreNature
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+ org.eclipse.wst.common.project.facet.core.nature
+ org.eclipse.wst.jsdt.core.jsNature
+
+
diff --git a/.settings/.jsdtscope b/.settings/.jsdtscope
new file mode 100644
index 0000000..585c967
--- /dev/null
+++ b/.settings/.jsdtscope
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..9c4403f
--- /dev/null
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,13 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..14b697b
--- /dev/null
+++ b/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component
new file mode 100644
index 0000000..f2e5363
--- /dev/null
+++ b/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..8988a5e
--- /dev/null
+++ b/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.container b/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000..3bd5d0a
--- /dev/null
+++ b/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.name b/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100644
index 0000000..05bd71b
--- /dev/null
+++ b/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/.settings/org.eclipse.wst.validation.prefs b/.settings/org.eclipse.wst.validation.prefs
new file mode 100644
index 0000000..6f1cba6
--- /dev/null
+++ b/.settings/org.eclipse.wst.validation.prefs
@@ -0,0 +1,2 @@
+disabled=06target
+eclipse.preferences.version=1
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..372a16b
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,106 @@
+
+ 4.0.0
+ com.itstyle.seckill
+ spring-boot-seckill
+ jar
+ 0.0.1-SNAPSHOT
+ spring-boot-seckill Maven
+ http://maven.apache.org
+
+ UTF-8
+ springboot
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.10.RELEASE
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+ net.sourceforge.nekohtml
+ nekohtml
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ mysql
+ mysql-connector-java
+
+
+
+ org.springframework.boot
+ spring-boot-starter-redis
+ 1.4.7.RELEASE
+
+
+
+ io.springfox
+ springfox-swagger2
+ 2.7.0
+
+
+ io.springfox
+ springfox-swagger-ui
+ 2.7.0
+
+
+
+ org.redisson
+ redisson
+ 2.11.5
+
+
+ org.apache.commons
+ commons-lang3
+ 3.7
+
+
+
+ org.springframework.kafka
+ spring-kafka
+ 1.3.5.RELEASE
+
+
+
+ org.apache.curator
+ curator-recipes
+ 2.10.0
+
+
+
+ spring-boot-seckill
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.springframework
+ springloaded
+ 1.2.7.RELEASE
+
+
+
+
+
+
diff --git a/src/main/java/com/itstyle/seckill/Application.java b/src/main/java/com/itstyle/seckill/Application.java
new file mode 100644
index 0000000..5d32a9e
--- /dev/null
+++ b/src/main/java/com/itstyle/seckill/Application.java
@@ -0,0 +1,24 @@
+package com.itstyle.seckill;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+/**
+ * 启动类
+ * 创建者 科帮网
+ * 创建时间 2018年5月12日
+ * API接口测试:http://localhost:8080/seckill/swagger-ui.html
+ */
+@SpringBootApplication
+public class Application {
+ private final static Logger LOGGER = LoggerFactory.getLogger(Application.class);
+ /**
+ * 1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁
+ * 4. redis 订阅监听;5.kafka消息队列
+ */
+ public static void main(String[] args) throws InterruptedException {
+ SpringApplication.run(Application.class, args);
+ LOGGER.info("项目启动 ");
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/itstyle/seckill/common/api/SwaggerConfig.java b/src/main/java/com/itstyle/seckill/common/api/SwaggerConfig.java
new file mode 100644
index 0000000..870a336
--- /dev/null
+++ b/src/main/java/com/itstyle/seckill/common/api/SwaggerConfig.java
@@ -0,0 +1,27 @@
+package com.itstyle.seckill.common.api;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+ @Bean
+ public Docket userApi() {
+ return new Docket(DocumentationType.SWAGGER_2).groupName("秒杀案例").apiInfo(apiInfo()).select()
+ .apis(RequestHandlerSelectors.basePackage("com.itstyle.seckill.web")).paths(PathSelectors.any()).build();
+ }
+ // 预览地址:swagger-ui.html
+ private ApiInfo apiInfo() {
+ return new ApiInfoBuilder().title("Spring 中使用Swagger2构建文档").termsOfServiceUrl("https://blog.52itstyle.com")
+ .contact(new Contact("科帮网 ", "https://blog.52itstyle.com/", "345849402@qq.com")).version("1.1").build();
+ }
+}
diff --git a/src/main/java/com/itstyle/seckill/common/config/IndexController.java b/src/main/java/com/itstyle/seckill/common/config/IndexController.java
new file mode 100644
index 0000000..37bc911
--- /dev/null
+++ b/src/main/java/com/itstyle/seckill/common/config/IndexController.java
@@ -0,0 +1,35 @@
+package com.itstyle.seckill.common.config;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+/**
+ * 通用访问拦截匹配
+ * 创建者 科帮网
+ * 创建时间 2018年4月3日
+ */
+@Controller
+public class IndexController {
+
+ /**
+ * 页面跳转
+ * @param module
+ * @param url
+ * @return
+ */
+ @RequestMapping("{url}.shtml")
+ public String page(@PathVariable("url") String url) {
+ return url;
+ }
+ /**
+ * 页面跳转(二级目录)
+ * @param module
+ * @param function
+ * @param url
+ * @return
+ */
+ @RequestMapping("{module}/{url}.shtml")
+ public String page(@PathVariable("module") String module,@PathVariable("url") String url) {
+ return module + "/" + url;
+ }
+
+}
diff --git a/src/main/java/com/itstyle/seckill/common/dynamicquery/DynamicQuery.java b/src/main/java/com/itstyle/seckill/common/dynamicquery/DynamicQuery.java
new file mode 100644
index 0000000..e03c3fe
--- /dev/null
+++ b/src/main/java/com/itstyle/seckill/common/dynamicquery/DynamicQuery.java
@@ -0,0 +1,80 @@
+package com.itstyle.seckill.common.dynamicquery;
+import java.util.List;
+/**
+ * 扩展SpringDataJpa, 支持动态jpql/nativesql查询并支持分页查询
+ * 使用方法:注入ServiceImpl
+ * 创建者 张志朋
+ * 创建时间 2018年3月8日
+ */
+public interface DynamicQuery {
+
+ public void save(Object entity);
+
+ public void update(Object entity);
+
+ public void delete(Class entityClass, Object entityid);
+
+ public void delete(Class entityClass, Object[] entityids);
+
+
+ /**
+ * 查询对象列表,返回List
+ * @param resultClass
+ * @param nativeSql
+ * @param params
+ * @return List
+ * @Date 2018年3月15日
+ * 更新日志
+ * 2018年3月15日 张志朋 首次创建
+ *
+ */
+ List nativeQueryList(String nativeSql, Object... params);
+
+ /**
+ * 查询对象列表,返回List