高并发系统的三把利器:缓存
、降级
和限流
- 缓存 : 目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;
- 降级 : 是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;
- 限流 : 有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询(评论的最后几页),因此需有一种手段来限制这些场景的并发/请求量,即限流。
基于Hystrix实现服务隔离与降级:提供线程
池和信号量
隔离,以减少不同服务之间资源竞争带来的相互影响,提供优雅降级机制。
- 基于线程池:优点是使用线程池隔离可以完全隔离第三方应用,请求线程可以快速放回。请求线程可以继续接受新的请求,如果出现问题线程池隔离是独立的不会影响其他应用。当失败的应用再次变得可用时,线程池将清理并可立即恢复,而不需要一个长时间的恢复。独立的线程池提高了并发性。缺点是增加计算开销(CPU)。每个命令的执行涉及到排队、调度和上下文切换都是在一个单独的线程上运行的。
- 基于信号量:记录当前有多少个线程在运行,当请求进来时先判断计数 器的数值,若超过设置的最大线程个数则拒绝该请求,若不超过则通行,这时候计数器+1,请求返 回成功后计数器-1,与线程池隔离最大不同在于执行依赖代码的线程依然是请求线程 ,信号量的大小可以动态调整, 线程池大小不可以。
限流的解决方案:
- **限流算法:**如:令牌桶、漏桶、计数器
- 应用层解决
- 接入层解决(如Nginx):Nginx接入层限流可以使用Nginx自带了两个模块:连接数限流模块ngx_http_limit_conn_module和漏桶算法实现的请求限流模块ngx_http_limit_req_module。 还可以使用OpenResty提供的Lua限流模块lua-resty-limit-traffic进行更复杂的限流场景。
- 其它(Web前端优化):网站动静分离、JS/CSS压缩技术、CDN(CDN加速意思就是在用户和我们的服务器之间加一个缓存机制,动态获取IP地址根据地理位置,让用户到最近的服务器访问。)
限流算法:
- 计数器:如果计数器的值大于10并且与第一次请求的时间间隔在1分钟内,那么说明请求过多,如果该请求与第一次请求的时间间隔大于1分钟,并且该计数器的值还在限流范围内,那么重置该计数器。
- 滑动窗口计数器:相对于计数器,解决“临界值”问题。
- 令牌桶算法:按照固定速率往桶中添加令牌,请求是否被处理需要看桶中令牌是否足够,当令牌数减为零时则拒绝新的请求(RateLimiter.create(1.0);rateLimiter.tryAcquire(500, TimeUnit.MILLISECONDS);)
- 漏桶算法:按照常量固定速率流出请求,流入请求速率任意,当流入的请求数累积到漏桶容量时,则新流入的请求被拒绝
RateLimiter是guava提供的基于令牌桶算法的实现类,可以使用AOP的方式实现限流(注解:@ExtRateLimiter(value = 10.0, timeOut = 500),rateLimiter.tryAcquire(timeOut, TimeUnit.MILLISECONDS))
常见的Web漏洞:
- XSS攻击:使用Javascript脚本注入进行攻击,解决方式:脚本特殊字符,转换成html源代码进行展示。
- SQL注入攻击:它利用应用程序对用户输入的不正确处理,通过在用户输入中注入恶意的SQL代码,从而执行恶意的数据库查询。解决方式:使用#{}(解析为一个参数占位符),而不要是用${}(纯粹的字符串替换)。
- HTTP防盗链:A网站有一张图片,被B网站直接通过img标签属性引入,直接盗用A网站图片展示。解决方式:判断http请求头Referer域中的记录来源的值。
- CSRF(跨站域请求伪造):通过伪装来自受信任用户的请求来利用受信任的网站。解决方式:使用图形验证码 防止机器模拟接口请求攻击,在调用核心业务接口时,比如支付、下单、等接口,最好使用手机短信验证验证或是人脸识别,防止其他用户使用Token伪造请求。
- API幂等问题:由于重复点击或者网络重发,或者 nginx 重发等情况会导致数据被重复提交。解决方式:采用 token 加 redis。在请求头中,传递令牌参数,每次令牌只能用一次。
- 忘记密码漏洞:如果验证码数字比较短的话,很容易使用暴力破解方式攻击破。解决方式:使用图形验证码拦截,防止机器模拟。
- 上传文件漏洞:上传木马文件,直接得到WEBSHELL。文件格式进行校验、文件的权限进行设定,禁止文件下的执行权限。
OAuth2.0:用于授权的标准协议,允许第三方应用程序以受限制的方式访问资源,而无需获取用户的凭证(例如用户名和密码)。流程如下:
- 第一步:用户同意授权,获取code
- 第二步:通过code换取网页授权access_token
- 第三步:刷新access_token(如果需要)
- 第四步:拉取用户信息(需scope为 snsapi_userinfo)
单向散列加密:
- MD5:是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文
- MD5加盐:每次保存密码到数据库时,都生成一个随机16位数字,将这16位数字和密码相加再求MD5摘要,然后在摘要中再将这16位数字按规则掺入形成一个48位的字符串。
- SHA:对任意长度的数据运算生成一个160位的数值;
对称加密:发件人和收件人使用其共同拥有的单个密钥 ,这种密钥既用于加密,也用于解密,叫做机密密钥(也称为对称密钥或会话密钥)。常见的有:
- DES(数据加密标准):分组式加密,算法源于Lucifer,作为NIST对称式加密标准;64位(有效位56位、校验8位),分组算法
- 3DES:128位,分组算法
- IDEA(国际数据加密算法):128位,比DES快,分组算法
- Blowfish:32-448位,算法公开,分组算法
- RC4:流密码,密钥长度可变
- RC5:分组密码,密钥长度可变,最大2048位
- Rijndael:128位/196位/256位
- AES(高级加密标准):DES升级版,算法出自Rinjindael
案例:假设Alice和Bob是认识的,两人为了保证通信消息不被其它人截取,预先约定了一个密码,用来加密在他们之间传送的消息,这样即使有人截取了消息没有密码也无法知道消息的内容。由此便实现了机密性。
非对称加密:一个用于加密信息,另一个则用于解密信息。常见的有:
- RSA
- Elgamal
- 背包算法
- Rabin
- D-H
- ECC(椭圆曲线加密算法)
举例:
HTTPS:简单来讲就是加了安全的HTTP,即HTTP+SSL。与HTTP的区别:
- HTTPS的服务器需要到CA申请证书,以证明自己服务器的用途;
- HTTP信息是明文传输,HTTPS信息是密文传输;
- HTTP与HTTPS的端口不同,一个是80端口,一个是443端口。
HTTPS的几个加密算法:
- 握手的时候使用的非对称加密算法 ,用来加密握手之后的请求和应答;
- 传输信息的时候使用的对称加密;
- 保证数据的完整性用的是hash算法(数字签名)。
HTTPS加密过程:
文章评论