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

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

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

注:我工作了几年,无论是身边遇到的,还是耳闻的,都积累了一些自己的经验和思考。当然,我没有接触过太多高层建筑上的分布式架构实践,所以总结的经验比较零碎。欢迎随时添加。

俗话说,冰冻三尺,非一日之寒,冰冻三尺,非一日之寒。对于开发者来说,一个好的架构不是一夜之间就能产生的。

初始安装

首先,各种框架被建立起来,然后被扔进Tomcat容器。此时,我们的文件、数据库和应用程序都在一台服务器上。

服务分离

随着系统上线,用户数量会逐渐增加,很快一台服务器就满足不了系统的负载。这时候就要在服务器过载之前提前做好准备。

由于我们是单一架构,短时间内优化架构不现实,加机器是个不错的选择。此时,如果条件允许,我们可能必须分别部署应用程序和数据库服务,或者分别部署文件服务器。

反向代理

为了提高服务处理能力,我们在Tomcat容器前面加了一个代理服务器,一般用Nginx。当然,如果你对Apache比较熟悉的话,你就能做到。

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

严格来说,Nginx属于Web服务器,一般处理静态的HTML、CSS、JS请求;Tomcat是一个Web容器,它处理JSP请求。当然Tomcat也支持Html,但是效果不如Nginx。

反向代理的优势如下:

  • 隐藏真实的后端服务。

  • 负载平衡群集。

    高可用性群集。

    缓存静态内容,实现动静分离。

    安全电流限制。

    静态文件压缩。

    解决多个服务的跨域问题。

    合并静态请求(从HTTP/2开始就被弱化了。0).

    防火墙。

    SSL和http2。

    静态和动态分离

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

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

    服务拆分

    在这个分布式微服务已经普及的时代,我们不用踩太多坑就可以轻松拆分。

    市面上已经有比较成熟的技术,比如阿里巴巴开源的Dubbo(官方表示已经开始维护)和Springfamily的SpringCloud。当然,如何实现,无论从技术上还是商业上,都要控制好。

    01、Dubbo

    春天的云

  • 服务发现――网飞尤里卡


  • 客户服务负载平衡-网飞功能区

    断路器-网飞·海斯特里克斯

    服务网关――网飞·祖尔

    分布式配置-Spring云配置

    03、微服务和轻量级通信

  • 同步通信和异步通信

  • 远程调用RPC

    休息

    消息队列

    持续集成部署

    服务拆分后,接下来是持续集成部署。你可以使用以下工具:Docker,Jenkins,Git,Maven。

    基本拓扑如下:

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

    服务集群

    Linux集群主要分为三类:

  • 高可用性集群。

  • 负载平衡群集。

    科学计算集群。

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

    01,负载平衡

    三种负载平衡方法:

  • 一般域名注册商的DNS服务器都不支持DNS负载均衡,但是我用的阿里云解析已经支持了。

  • 四层负载均衡(F5,LVS)工作在TCP协议下。

    七层负载均衡(Nginx,haproxy)工作在HTTP协议下。

    02,分布式会话

    众所周知,服务一般分为有状态和无状态,分布式会话是针对有状态服务的。

    分布式会话的几种实现方式:

  • 基于数据库的会话共享。

  • 基于resin/tomcatweb容器本身的会话复制机制。

    基于oscache/Redis/memcached的会话共享。

    基于cookie的会话共享。

    分布式会话的几种管理方法:

  • 会话复制模式管理(即会话复制)。

    简介:将一台机器上的会话数据广播复制到集群中的其他机器上。

    使用场景:机器少,网络流量少。

    优点:实现简单,配置少,网络中机器宕机时不影响用户访问。

    缺点:广播拷贝到其他机器有一定的延迟,带来一定的网络开销。

  • 会话粘性模式管理。

    简介:指粘性会话。当用户访问集群中的一台机器时,必须指定所有后续请求都落在这台机器上。

    使用场景:机器数量适中,对稳定性要求不是很严格。

    优点:实现简单,配置方便,没有额外的网络开销。

    缺点:网络中一台机器宕机,用户会话就会丢失,容易造成单点故障。

    缓存的集中管理。

    简介:会话存储在分布式缓存集群中的一台机器上,当用户访问不同的节点时,首先从缓存中获取会话信息。

    使用场景:集群内机器多,网络环境复杂。

    优点:可靠性好。

    缺点:实现复杂,稳定性依赖于缓存的稳定性。当会话信息被放入缓存时,应该编写一个合理的策略。

    当前用于生产:

  • 基于Tomcat配置的MemCache缓存管理会话的实现(麻烦)。

  • 基于Os缓存和shiro组播的实现(网络影响)。

    基于Spring-Session+Redis的实现(最适合)。

    03,负载均衡策略

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

    rr轮询调度算法

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

    wrr加权调度算法

    我们为每个服务器设置一个权重,负载平衡调度器根据权重来调度服务器。服务器被调用的次数和权重成正比。优点是考虑了服务器处理能力的差异。

    sh原始地址哈希

    提取用户IP,根据哈希函数得到一个密钥,然后根据静态映射表找出对应的值,即目标服务器IP。如果单个目标机器过载,它将返回空。

    dh目标地址哈希

    同上,但现在提取目标地址的IP进行哈希运算。优点是以上两种算法可以使同一个用户访问同一个服务器。

    lc至少连接了

    优先将请求转发给连接较少的服务器。这样做的好处是集群中每台服务器的负载更加均匀。

    wlc加权最小连接

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

    sed的最短预期延迟

    与sedwlc类似,不同之处在于不考虑非活动连接数。算法为:(活动连接数+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。为什么我们要在中间加一个卡夫卡或者雷迪斯?就是这个原因(一群人涌进来和排队进去的区别)。

    沟通方式:点对点沟通(人对人)或发布订阅模式(聊天室)。

    日志服务

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

    安全优化

    以上所有,没有安全保障,一切都将是零:

  • 阿里云VPN虚拟专用网和安全组配置。

  • 如果自己建机房,就要配置自己的防火墙安全策略。

    访问相关服务,如MySQL、Redis、Solr等。如果没有特殊需求,尽量使用内网访问,设置认证。

    尽量使用代理服务器,不要对外开放太多端口。

    带HTTP/2.0的HTTPS也是不错的选择。

    建筑师必备词汇

    01,高可用性

  • 负载平衡(负载平衡算法)

  • 反向代理

    服务隔离

    服务电流限制

    服务降级(自动平稳降级)

    故障转移

    超时重试(代理超时、容器超时、前端超时、中间件超时、数据库超时、NoSql超时)

    回滚机制(在线回滚、数据库版本回滚、事务回滚)

    02,高并发

  • 应用程序缓存

  • HTTP缓存

    多级缓存

    分布式缓存

    连接池

    异步并发

    03,分布式事务

  • 两阶段提交(强烈同意)

  • 三阶段提交(强烈同意)

    面向消息的中间件(最终一致性)。推荐阿里的RocketMQ。

    04,队列

  • 任务排队

  • 消息队列

    请求队列

    05,产能扩张

  • 单体垂直膨胀

  • 单体水平膨胀

    应用拆分

    数据库拆分

    数据库子数据库子表

    数据异构

    分布式任务

    06,网络安全

  • SQL注入

  • XSS袭击

    CSRF袭击

    拒绝服务(DoS)攻击

    建筑师必备工具

    01, *** 作系统

    Linux(必需),一些软件

    02,负载平衡

    DNS、F5、LVS、Nginx、OpenResty、HAproxy、负载均衡SLB(阿里云)

    03,分布式框架

    杜博、莫坦、春能

    04,数据库中间件

    DRDS(阿里云)、Mycat、360Atlas、Cobar(未维护)

    05,消息队列

    RabbitMQ、ZeroMQ、Redis、ActiveMQ、Kafka

    06,注册中心

    动物园管理员、雷迪斯

    07,缓存

    Redis、Oscache、Memcache、Ehcache

    08,集成部署

    Docker、Jenkins、Git、Maven

    09,存储

    OSS、NFS、FastDFS、MogileFS

    10,数据库

    MySQL、Redis、MongoDB、PostgreSQL、Memcache、HBase

    11、网络[/s2/]

    专用网VPC、灵活公网IP、CDN

    作者:张志鹏

    简介:资深Java爱好者,深耕在线教育领域。

    资料来源:https://blog.52itstyle.com

    欢迎分享,转载请注明来源:内存溢出

    原文地址: https://outofmemory.cn/zz/763457.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-01
    下一篇 2022-05-01

    发表评论

    登录后才能评论

    评论列表(0条)

    保存