Web互联网科技我爱编程

从 0 到 1,Java Web 网站架构搭建的技术演进

2017-11-30  本文已影响90人  雨中沙漠

初始搭建

最开始,就是各种框架一搭,然后扔到 Tomcat 容器中跑,这时候我们的文件、数据库、应用都在一个服务器上。

服务分离

随着系统的上线,用户量也会逐步上升,很快一台服务器已经满足不了系统的负载,这时我们就要在服务器还没有超载时,提前做好准备。

由于我们是单体架构,优化架构在短时间内是不现实的,增加机器是一个不错的选择。这时,我们可能要把应用和数据库服务单独部署,如果有条件也可以把文件服务器单独部署,欢迎加入群【大数据/运维/java架构】:649917651

反向代理

为了提升服务处理能力,我们在 Tomcat 容器前加一个代理服务器,一般使用 Nginx,当然你如果更熟悉 Apache 也未尝不可。

用户的请求发送给反向代理,然后反向代理把请求转发到后端的服务器。

从严格意义上说,Nginx 是属于 Web 服务器,一般处理静态 HTML、CSS、JS 请求;而 Tomcat 属于 Web 容器,专门处理 JSP 请求,当然 Tomcat 也是支持 Html 的,只是效果没 Nginx 好而已。

反向代理的优势,如下所示:

动静分离

基于以上 Nginx 反向代理,我们还可以实现动静分离,静态请求如 HTML、CSS、JS 等请求交给 Nginx 处理,动态请求分发给后端 Tomcat 处理。

Nginx 升级到 1.9.5+ 可以开启 HTTP/2.0 时代,加速网站访问。当然,如果公司不差钱,CDN 也是一个不错的选择。

服务拆分

在这分布式微服务已经普遍流行的年代,我们没必要踩过多的坑,就很容易进行拆分。

市面上已经有相对比较成熟的技术,比如阿里开源的 Dubbo(官方明确表示已经开始维护了),Spring 家族的 Spring Cloud,当然具体如何去实施,无论是技术还是业务方面都要有很好的把控。

01 Dubbo

02

SpringCloud

03

微服务

与轻量级通信

持续集成部署

服务拆分以后,随之而来的就是持续集成部署,你可能会用到以下工具:Docker、Jenkins、Git、Maven。

基本拓扑结构如下所示:

整个持续集成平台的架构演进,如下图所示:

服务集群

Linux 集群主要分成三大类:

我们最常见的也是生产中最常接触到的就是负载均衡集群。

01 负载均衡实现

负载均衡实现的三种方法:

02 分布式 Session

大家都知道,服务一般分为有状态和无状态,而分布式 Session 就是针对有状态的服务。

分布式 Session 的几种实现方式:

分布式 Session 的几种管理方式:

目前生产中使用到的:

03 负载均衡策略

负载均衡策略的优劣及其实现的难易程度有两个关键因素:负载均衡算法,对网络系统状况的检测方式和能力。

rr 轮询调度算法

顾名思义,轮询分发请求。优点是实现简单,缺点是不考虑每台服务器的处理能力。

wrr 加权调度算法

我们给每个服务器设置权值 weight,负载均衡调度器根据权值调度服务器,服务器被调用的次数跟权值成正比。优点是考虑了服务器处理能力的不同。

sh 原地址散列

提取用户 IP,根据散列函数得出一个 key,再根据静态映射表,查出对应的 value,即目标服务器 IP。一单目标机器超负荷,则返回空。

dh 目标地址散列

同上,只是现在提取的是目标地址的 IP 来做哈希。优点是以上两种算法都能实现同一个用户访问同一个服务器。

lc 最少连接

优先把请求转发给连接数少的服务器。优点是使得集群中各个服务器的负载更加均匀。

wlc 加权最少连接

在 lc 的基础上,为每台服务器加上权值。算法为:(活动连接数*256+非活动连接数)÷权重 ,计算出来的值小的服务器优先被选择。优点是可以根据服务器的能力分配请求。

sed 最短期望延迟

sed 跟 wlc 类似,区别是不考虑非活动连接数。算法为:(活动连接数+1)*256÷权重,同样计算出来的值小的服务器优先被选择。

nq 永不排队

改进的 sed 算法,我们想一下什么情况下才能“永不排队”,那就是服务器的连接数为 0 的时候,那么假如有服务器连接数为 0,均衡器直接把请求转发给它,无需经过 sed 的计算。

LBLC 基于局部性的最少连接

均衡器根据请求的目的 IP 地址,找出该 IP 地址最近被使用的服务器,把请求转发之,若该服务器超载,则采用最少连接数算法。

LBLCR 带复制的基于局部性的最少连接

均衡器根据请求的目的 IP 地址,找出该 IP 地址最近使用的“服务器组”,注意,这里不是具体某个服务器,然后采用最少连接数算法,从该组中挑出具体的某台服务器出来,把请求转发之。

若该服务器超载,那么根据最少连接数算法,从在集群的非本服务器组的服务器中,找出一台服务器出来,加入本服务器组,然后把请求转发之。

读写分离

MySQL 主从配置,读写分离并引入中间件,开源的 MyCat,阿里的 DRDS 都是不错的选择。

如果是对高可用要求比较高,但是又没有相应的技术保障,建议使用阿里云的 RDS 或者 Redis 相关数据库,省事省力又省钱。

全文检索

如果有搜索业务需求,引入 solr 或者 elasticsearch 也是一个不错的选择,不要什么都塞进关系型数据库。

缓存优化

引入缓存无非是为了减轻后端数据库服务的压力,防止其"罢工"。

常见的缓存服务有:Ehcache、OsCache、MemCache、Redis,它们都是主流经得起考验的缓存技术实现,特别是 Redis 已大规模运用于分布式集群服务中,并证明了自己优越的性能。

消息队列

异步通知:比如短信验证,邮件验证这些非实时反馈性的逻辑操作。

流量削锋:应该是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。

日志处理:系统中的日志是必不可少的,但是如何去处理高并发下的日志却是一个技术活,一不小心可能会压垮整个服务。

工作中我们常用到的开源日志 ELK,为嘛中间会加一个 Kafka 或者 Redis 就是这么一个道理(一群人涌入和排队进的区别)。

消息通讯:点对点通信(个人对个人)或发布订阅模式(聊天室)。

日志服务

消息队列中提到的 ELK 开源日志组件对于中小型创业公司是一个不错的选择。

安全优化

以上种种,没有安全做保证,一切都会归于零:

架构师必备词汇

01 高可用

03 分布式事务

04 队列

05

06 网络安全

架构师必备工具

01 操作系统

Linux(必备)、某软的

02 负载均衡

DNS、F5、LVS、Nginx、OpenResty、HAproxy、负载均衡SLB

03 分布式框架

Dubbo、Motan、Spring-Could

04 数据库中间件

DRDS 、Mycat、360 Atlas、Cobar (不维护了)

05 消息队列

RabbitMQ、ZeroMQ、Redis、ActiveMQ、Kafka

06 注册中心

Zookeeper、Redis

07 缓存

Redis、Oscache、Memcache、Ehcache

08 集成部署

Docker、Jenkins、Git、Maven

09 存储

OSS、NFS、FastDFS、MogileFS

10 数据库

MySQL、Redis、MongoDB、PostgreSQL、Memcache、HBase

11 网络

专用网络 VPC、弹性公网 IP、CDN

作者:张志朋
来源:https://blog.52itstyle.com

上一篇 下一篇

猜你喜欢

热点阅读