- 基于秒杀场景的Java高并发实现
- 对秒杀场景的方案设计
- 仓库地址: https://github.com/logycoconut/springboot-seckill
技术体系
-
前端:
Bootstrap
+jQuery
-
后端:
SpringBoot2
+MyBatisPlus
+MySQL
-
中间件技术:
Redis
+RabbitMQ
+JWT
大约 2 分钟
- 基于秒杀场景的Java高并发实现
- 对秒杀场景的方案设计
- 仓库地址: https://github.com/logycoconut/springboot-seckill
前端: Bootstrap
+ jQuery
后端: SpringBoot2
+ MyBatisPlus
+ MySQL
中间件技术: Redis
+ RabbitMQ
+ JWT
Spring 的定时任务默认是单线程串行执行的, 那假设第一个任务比较耗时长, 直到超过任务二的设定时间之后才完成, 那么就会造成任务二不能及时完成, 进而造成其他问题
开启对定时任务的支持, 在启动类上加上@EnableScheduling
// 启动类
@EnableScheduling
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
// 定时任务类
@Slf4j
@Service
public class ScheduledService {
@Scheduled(fixedRate = 5000)
public void scheduled1() {
log.info("----{}----", Thread.currentThread().getName());
}
@Scheduled(cron = "0/5 * * * * *")
public void scheduled2() {
log.info("----{}----", Thread.currentThread().getName());
}
}
在 Web 开发中,我们经常需要对请求拦截并做一些动作,比如日志记录、权限检测或者性能检测等
SpringMVC中提供了HandlerInterceptor
接口, 我们来大致看一下它的源码 ( 省略参数和异常以方便阅读 )
public interface HandlerInterceptor {
// 请求处理之前调用, 当此方法返回true时才执行后续代码, 否则流程中断
default boolean preHandle() { return true; }
// 请求处理之后调用
default void postHandle() { }
// 请求完成之后调用, 一般用于资源的清理
default void afterCompletion() { }
}
- SpringCloud采用了Zuul作为微服务的网口
- Zuul网关为全部微服务提供唯一入口, 避免直接暴露接口, 后台服务更加安全
- 对每个请求鉴权
- 处理跨域请求
关于跨域问题,现在一般都采用 CORS 方案(一个 W3C 标准)解决, 需要服务器和浏览器同时支持,但是开发者只需要关心服务器实现即可,其他的都由浏览器完成
浏览器会在请求中加上一些头信息,例如 Origin,我们需要以此判断是否允许其跨域,然后在响应头中加入一些信息