项目经验
安心撸码
这个作者很懒,什么都没留下…
展开
-
基于JWT+Refresh Token 的用户认证实践
HTTP 是一个无状态的协议,一次请求结束后,下次在发送服务器就不知道这个请求是谁发来的了(同一个 IP 不代表同一个用户),在 Web 应用中,用户的认证和鉴权是非常重要的一环,实践中有多种可用方案,并且各有千秋。基于 Session 的会话管理在 Web 应用发展的初期,大部分采用基于 Session 的会话管理方式,逻辑如下。客户端使用用户名密码进行认证 服务端生成并存储 Se...原创 2019-07-16 14:37:18 · 1421 阅读 · 0 评论 -
缓存穿透、雪崩解决方案及缓存击穿的四种解决方案
前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。解决方案有...原创 2019-07-30 10:52:00 · 317 阅读 · 0 评论 -
API接口安全性设计
接口的安全性主要围绕token、timestamp和sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看:Token授权机制:用户使用用户名密码登录后服务器给客户端返回一个Token(通常是UUID),并将Token-UserId以键值对的形式存放在缓存服务器中。服务端接收到请求后进行Token验证,如果Token不存在,说明请求无效。Token是客户端访问服务端的凭...原创 2019-07-30 10:47:37 · 135 阅读 · 0 评论 -
秒杀系统高并发请求排队处理
1.请求参数封装,有个随机的用户ID 用来区分不同用户的请求:import java.util.Random;public class OrderRequest { private int goodId = new Random().nextInt(100000);// 商品id private int userId = new Random().nextInt(1000...原创 2019-07-30 10:30:52 · 1364 阅读 · 0 评论 -
支撑百万并发的数据库架构如何设计
问题如果说此时你还是一台数据库服务器在支撑每秒上万的请求,负责任的告诉你,每次高峰期会出现下述问题:你的数据库服务器的磁盘 IO、网络带宽、CPU 负载、内存消耗,都会达到非常高的情况,数据库所在服务器的整体负载会非常重,甚至都快不堪重负了。 高峰期时,本来你单表数据量就很大,SQL 性能就不太好,这时加上你的数据库服务器负载太高导致性能下降,就会发现你的 SQL 性能更差了。 最明显...原创 2019-07-30 07:16:03 · 1729 阅读 · 0 评论 -
Guava的RateLimiter限流
为什么需要限流?在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。限流可以认为服务降级的一种,限流通过限制请求的流量以达到保护系统的目的。一般来说,系统的吞吐量是可以计算出一个阈值的,为了保证系统的稳定运行,一旦达到这个阈值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:延迟处理,拒绝处理,或者部分拒绝处理等等。否则,很容易导致服务器的宕机。一、限流算法常用...原创 2019-11-02 20:35:06 · 257 阅读 · 0 评论 -
JAVA获取客户端真实IP地址
1、我们一般在程序开发时,总会用到这种获取访问者IP的功能,以便记录客户端的登录和访问行为。一般情况下,我们可以使用 request 的 getRemoteAddr() 方法获取客户端实际 IP ,但是 Nginx 使用反向代理后,我们使用 getRemoteAddr() 是无法获取真实的 IP 的。2、经过代理之后,客户端和服务端之间加了一个中间层,在转发请求的HTTP头部增加了 x-for...原创 2019-07-15 17:39:30 · 491 阅读 · 0 评论 -
Log4j2为什么被广泛使用?
Log4j 1.x 已被广泛采用,并用于许多应用中。然而,经过多年的发展,它的发展已经放缓。由于它需要与非常老的Java版本兼容,因此维护变得更加困难,并且在2015年8月成为End of Life。它的替代方案SLF4J/Logback,对框架进行了许多必要的改进。 那么,为什么还要浪费心思去使用Log4j 2呢? 以下是一些原因。Log4j 2被设计成可用作审计日志框架。在重新配置时,Lo...转载 2019-07-23 20:37:23 · 506 阅读 · 0 评论 -
API接口幂等性设计
概念我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。例如1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果;2. 我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也应该只扣一次钱;3. 发送消息,也应该只发一次;4. 创建业务订单,一次业务请求只能创建一个,创建多个就会出大问题等等很多重要的...原创 2019-07-16 15:32:42 · 1143 阅读 · 0 评论 -
生产上SpringBoot2.x Scheduled定时任务重复执行两次解决方案
一、问题描述在SpringBoot2.x 的项目上写了个定时任务,每天凌晨1点执行,那么令人费解的是:定时任务在服务器上总是执行两次,这个bug就闹大了,但是在本机调试始终只执行一次,查了很多原因都说是实例化bean两次的问题,但是看了很多解决方案都没有解决…如下面代码块:@Scheduled(cron = "0 0 1 * * ?") //每天凌晨一点执行 public void...原创 2019-07-16 14:48:22 · 3017 阅读 · 0 评论 -
秒杀系统设计(JAVA)
高并发一、前端1.静态化页面,将页面缓存在用户的浏览器和CDN上2.提交后按钮disabled,禁止用户重复提交二、服务器集群1.通过nginx分发请求,提前预判会产生的PV数,部署合适数量的服务器集群,防止其中一台Web机器挂了,导致流量分散到其他正常工作的机器上,再导致正常的机器也挂,将整个Web系统拖垮2.优化服务器中间件如tomcat jvm优化(虚拟机初始化时的最小内...原创 2019-08-01 19:03:19 · 778 阅读 · 0 评论