用 Java 做一个大流量、高并发的网站应该怎么样进行底层构架?采用哪些框架技术比较适合?
一个大型网站架构包括前端架构、应用层架构、服务层架构、存储层架构、后台架构,以及数据采集与监控架构和安全架构等各个方面,以下做个简述。
前端架构
浏览器优化:优化响应页面,增加页面缓存,合并 HTTP 减少请求次数,使用页面压缩等。
静态页面使用 CDN 服务器,使用户可以通过最短路径访问内容;
动静分离,静态资源独立部署;
使用单独的图片服务;
反向代理:提供页面缓存服务;
DNS :利用 DNS 实现 DNS 负载均衡。
应用层架构
负载均衡:将多台应用服务器组成一个集群,通过负载均衡技术将用户请求分发到不同的服务器上,以应对大量用户同时访问产生的高并发负载压力,可以使用 Nginx 实现负载均衡。
Session 管理 :高可用应用服务集群,应用服务器通常是无状态的,所以需要专门的 Session 管理机制,使得集群内存甚至跨集群的应用服务可以共享 Session,可以使用 JWT 等技术实现。
业务拆分:通过业务拆分实现独立开发、部署、维护,降低系统耦合度。
服务层架构
分布式消息:利用消息队列,实现业务和业务,业务和服务之间的异步消息发送及低耦合的业务关系,可以使用 RabbitMQ\RocketMQ 等。
分布式缓存:提供热点数据的缓存服务,常见的可以使用 Redis。
分布式配置:系统运行需要配置很多参数,我们需要实现不停机更新参数,可以时候用 Apollo。
存储层架构
分布式文件:存储网站的图片、视频等,可以使用 FastDFS 等自己构建 文件服务器,或者直接使用阿里云OSS.
关系数据库:互联网架构中一般可以使用 MySQL,便于集群部署,而且开源免费。
NoSQL数据库:从内存管理、数据模型、集群分布式管理以及社区活跃性等综合角度来看,可以选择 HBase 等数据库。
后台架构
搜索引擎:一般需要快速的响应用户搜索需求,此处可是 Elasticsearch。
推荐系统:暂时未接触到,对此也不是很了解,还需学习补充这方面的知识。
限流组件:可以使用 Kong, 它从技术上来讲支持三种限流方式,分别是本地限流(local)、数据库限流(cluster)和Redis限流,这三种限流方式采用的限流算法都是计数器法。支持按照秒/分/小时/日/月/年等不同时间单位限流,并且可以组合,例如可以设置每秒最多 100 次并且每分钟最多 1000 次。
数据采集与监控
浏览器数据采集:一般直接使用 JS 脚本采集用户浏览器环境和操作记录,分析用户行为。
服务器业务数据采集:该采集包括两种,一种是采集在服务端记录的用户请求操作日志,一种是采集应用程序运行期间业务数据。
服务器性能数据采集:系统负载,内存使用率等。
系统监控以及系统报警
以上各方面都基本都可以使用 ELK 架构来实现,包括数据采集服务和检索分析服务
Elasticsearch 是源分布式搜索引擎,提供搜集、分析、存储数据三大功能。
Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。client 端安装在需要收集日志的主机上,server 端负责将收到的各节点日志进行过滤、修改等操作再一并发往 elasticsearch 上去。
Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
注意:如果采集数据量很大的话也可以使用 Kafka 来代替 Logstash。
安全架构
WEB 攻击:XSS 和 SQL 注入,这两者一般要从系统代码层面来防止。
数据保护:敏感信息加密传输、脱敏等。加密的话有很多加密算法都可以 比如常见的 DES,AES,3DES等等。