从零搭建 >
一开始,即创业初期或网站/产品初期,业务功能少,访问量小。通过使用经典的MVC架构和单个应用模式开发,然后发布到Tomcat容器中运行。此时,我们的文件、数据库和应用都在服务器上,没有缓存,不追求性能优化和网站架构。
服务分离 >
随着业务的发展,系统功能的增加和访问用户数量的增加,显然单个服务器的使用已经不能满足系统的负载。此时,我们需要提前采取相应的措施来应对访问流量的增加。由于我们是单体结构,优化结构在短时间内是不现实的,因此增加机器是一个不错的选择。此时,我们可以单独部署应用程序和数据库服务,如果条件允许,我们也可以单独部署文件服务器。
集群部署 >
为了提高服务处理能力,我们通常集群部署Tomcat容器。集群主要分为三类( 高可用集群, 负载均衡集群,科学计算集群)。负载均衡集群是我们生产中最常见的集群。
负载均衡 >
集群部署后,我们不能让用户通过两个入口访问我们的服务,而是统一访问入口。此时,我们可以在Tomcat容器前添加一个负载平衡代理服务器。Nginx在业内很受欢迎。当然,使用apache并非不可能。
向Nginx反向代理服务器发送用户请求,然后反向代理将请求转发到后端应用服务器。
严格地说,Nginx属于web服务器,通常用于处理静态html、css、js请求,Tomcat属于web容器,专门处理JSP请求。当然,Tomcat也支持html,但性能不如Nginx。
反向代理的优点如下:
隐藏真实的后端服务
负载均衡集群
高可用集群
缓存静态内容实现动静分离
安全限流
压缩静态文件
解决多服务跨域问题
静态请求合并(HTTP/2.0后已弱化)
防火墙
SSL、http2
实现负载均衡
DNS负载均衡,一般域名注册商的DNS服务器不支持,但博主使用的阿里云分析得到了支持
四层负载均衡(F5)、LVS),在TCP协议下工作
七层负载均衡(Nginx、haproxy),在HTTP协议下工作
动静分离 >
基于上述Nginx反向代理,我们还可以实现动态和静态分离,如html等静态请求、css、js等请求交Nginx处理,动态请求分发到后端Tomcat处理。
Nginx 升级到1.9.5+可以开启HTTP/2.0时代,加快网站访问。
当然,如果公司有条件,CDN也是一个不错的选择,它可以加速网站的访问,提高网站的稳定性。
服务拆分 >
在这个分布式微服务普遍流行的时代,业内已经有了比较成熟的技术,比如阿里开源的Dubo(官方已经开始维护,可以放心使用),Spring家族的Spring。 cloud,这些技术在业内已经有了很好的生产案例。
Dubbo
SpringCloud
服务发现——Netflix Eureka
客户服务端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
持续集成部署 >
服务拆分后,随之而来的是持续集成部署,您可能会使用以下工具:
Docker、Jenkins、Git、Maven
基本拓扑结构如下:
整个连续集成平台架构演变如下图所示:
分布式Session >
众所周知,服务一般分为有状态和无状态,而分布式sessoion是针对有状态的服务。
几种实现分布式Session的方法
基于数据库的Session共享
基于resin/tomcat web容器本身的session复制机制
基于oscache/Redis/memcached 进行 session 共享。
基于cookie session共享
读写分离 >
MySql主要从配置、读写分离、引入中间件、开源Mycat、奇虎360Atlas、当当网Sharding-jdbc等。
全文检索 >
如果有搜索业务需求,引入solr或elasticsearch也是不错的选择,不要把一切都塞进关系数据库。
缓存优化 >
引入缓存只是为了减轻后端数据库服务的压力,防止缓存"罢工"。
常见的缓存服务有,Ehcache、OsCache、MemCache、Redis,当然,这些都是经得起考验的主流缓存技术,特别是Redis在分布式集群服务中得到了广泛的应用,并证明了其优越的性能。
消息队列 >
异步通知:如短信验证、邮件验证等非实时反馈逻辑操作。
流量削锋:应该是消息队列中常见的场景,一般广泛应用于秒杀或促销活动。
日志处理:日志在系统中是必不可少的,但如何处理高并发日志确实是一项技术工作。如果你不小心,它可能会压垮整个服务。为什么我们在工作中经常使用的开源日志ELK会在中间添加一个?
Kafka或redis就是这个道理(一群人涌入和排队的区别)。
信息通讯:点对点通信(个人对个人)或发布订阅模式(聊天室)。
日志服务 >
ELK开源日志组间在新闻队列中提到,是中小企业供应商的好选择。
安全优化 >
没有安全保障,上述种类可能归零。
配置防火墙安全策略;
Mysql等相关服务访问、Redis、Solr等,如果没有特殊需要,尽量使用内网访问并设置鉴权;
尽量使用代理服务器,不要对外开放太多端口;
HTTP/2.0https也是不错的选择。