前言
前阵子有网友询问, 如何优化网站? 这个问题真的很大, 跟他简单的聊了一下, 随便说了几点, 觉得有必要整理一篇文章出来, 正好前阵子在做爬虫博客, 于是把大体思路分享出来, 与大家互通有无, 共同进步.
优化
版本一
系统开始是这样子的, 一个 Tomcat 拖着一个 MySQL 服务, 跑在一个 2C 4G 的 Linux 服务器上, 所有的请求都走 Tomcat, 所有的查询都走 MySQL, 看起来像一句废话?
资源是有限的, 那么如何有效的利用资源, 提升服务性能? Tomcat 号称能抗住数十万并发访问, 但是这事也得分场景, 还得有足够牛逼的机器.
Tomcat 优化
Tomcat 支持以下三种模式:
BIO: 一个线程处理一个请求, 缺点: 并发量高时, 线程数较多, 浪费资源, Tomcat7 或以下在 Linux 系统中默认使用这种方式.
NIO: 利用 Java 的异步 IO 处理, 可以通过少量的线程处理大量的请求. Tomcat8 在 Linux 系统中默认使用这种方式. Tomcat7 必须修改 Connector 配置来启 (conf/server.xml 配置文件):
- <Connector port="8080"
- protocol="org.apache.coyote.http11.Http11NioProtocol"
- connectionTimeout="20000"
- redirectPort="8443"/>
APR(Apache Portable Runtime): 从操作系统层面解决 io 阻塞问题. Linux 如果安装了 apr 和 native,Tomcat 直接启动就支持 apr.
为了方便易用这里我们选择 NIO 模式, 小伙伴们直接下载使用 Tomcat8 以上版本即可, 连接池什么的一般使用默认的即可.
版本二
可能部分小伙伴知道 Tomcat 容器处理静态请求的性能力并不强, 所以这里需要一款能处理静态文件请求又超牛逼的服务, 这里推荐 Nginx, 当然你可以使用其变种 Tengine,OpenResty 才实现动静分离.
版本三
后端服务链接资源是宝贵的, 在高并发下, 会拖慢整个系统的响应时间. 这里我们可以把一些热点数据进行缓存, 后端读取缓存, 如果数据存在则直接返回, 否则再去读取数据库.
版本四
资源是有限的, 但用户可能是无限的, 还可能有一些恶意用户, 爬虫, 热点搜索. 为了大部门用户可以正常访问, 这里我们使用前置限流, 通过令牌桶算法或者漏桶算法实现多样的限流方案.
版本五
在博客系统中, 为了提升响应速度, 加入了 Redis 缓存, 把文章主键 ID 作为 key 值去缓存查询, 如果不存在对应的 value, 就去数据库中查找 . 这个时候, 如果请求的并发量很大, 就会对后端的数据库服务造成很大的压力. 这里我们使用布隆过滤器对空命中进行拦截处理.
终极版
如果仅仅对于一个博客而已一个 Nginx 足够了, 后面可以带多个 Tomcat 做负载均衡进群
Nginx 应用层面做限流, 后端单个服务可以做接口限流
后端服务用户 Session 可以集中存储到 Redsi 中
布隆过滤拦截防止缓存穿透
热点数据读取 Redis 缓存
如有必要 Redis ,MySQL 可以做主从集群
小结
优化过程可能仅仅是冰山一角, 但大体思路差不多就是这个样子, 发现问题然后解决问题, 本来架构就是演进而来的.
参考
从 SpringBoot 构建十万博文聊聊缓存穿透 https://blog.52itstyle.vip/archives/4259/
SpringBoot 开发案例之打造十万博文 web 篇 https://blog.52itstyle.vip/archives/4219/
从 SpringBoot 构建十万博文聊聊高并发文章浏览量设计 https://blog.52itstyle.vip/archives/4271/
从 0 到 1 构建分布式秒杀系统, 脱离案例讲架构都是耍流氓 https://gitee.com/52itstyle/spring-boot-seckill
来源: https://www.cnblogs.com/smallSevens/p/11427689.html