吃透这套架构演化图,从零搭建Web网站也不难

转载自 吃透这套架构演化图,从零搭建Web网站也不难



前言


工作也有几多年了,无论是身边遇到的还是耳间闻到的,多多少少也积攒了自己的一些经验和思考,当然,博主并没有太多接触高大上的分布式架构实践,相对比较零碎,随时补充。


俗话说得好,冰冻三尺非一日之寒,滴水穿石非一日之功,罗马也不是一天就建成的,当然对于我们开发人员来说,一个好的架构也不是一蹴而就的。



初始搭建


开始的开始,就是各种框架一搭,然后扔到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(官方明确表示已经开始维护了),Spring家族的Spring Cloud,当然具体如何去实施,无论是技术还是业务方面都要有很好的把控。


Dubbo



SpringCloud

  • 服务发现——Netflix Eureka

  • 客服端负载均衡——Netflix Ribbon

  • 断路器——Netflix Hystrix

  • 服务网关——Netflix Zuul

  • 分布式配置——Spring Cloud Config


微服务与轻量级通信

  • 同步通信和异步通信

  • 远程调用RPC

  • REST

  • 消息队列



持续集成部署


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


图片源于网络,基本拓扑结构如下所示:


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




服务集群


Linux集群主要分成三大类( 高可用集群, 负载均衡集群,科学计算集群)。其实,我们最常见的也是生产中最常接触到的就是负载均衡集群。



负载均衡实现


  • DNS负载均衡,一般域名注册商的dns服务器不支持,但博主用的阿里云解析已经支持

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

  • 七层负载均衡(Nginx、haproxy),工作在Http协议下


分布式session


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


分布式Session的几种实现方式


  • 基于数据库的Session共享

  • 基于resin/tomcat web容器本身的session复制机制

  • 基于oscache/Redis/memcached 进行 session 共享。

  • 基于cookie 进行session共享


分布式Session的几种管理方式


Session Replication 方式管理 (即session复制)


  • 简介:将一台机器上的Session数据广播复制到集群中其余机器上

  • 使用场景:机器较少,网络流量较小

  • 优点:实现简单、配置较少、当网络中有机器Down掉时不影响用户访问

  • 缺点:广播式复制到其余机器有一定廷时,带来一定网络开销


Session Sticky 方式管理


  • 简介:即粘性Session、当用户访问集群中某台机器后,强制指定后续所有请求均落到此机器上

  • 使用场景:机器数适中、对稳定性要求不是非常苛刻

  • 优点:实现简单、配置方便、没有额外网络开销

  • 缺点:网络中有机器Down掉时、用户Session会丢失、容易造成单点故障


缓存集中式管理


  • 简介:将Session存入分布式缓存集群中的某台机器上,当用户访问不同节点时先从缓存中拿Session信息

  • 使用场景:集群中机器数多、网络环境复杂

  • 优点:可靠性好

  • 缺点:实现复杂、稳定性依赖于缓存的稳定性、Session信息放入缓存时要有合理的策略写入


目前生产中使用到的


  • 基于tomcat配置实现的MemCache缓存管理session实现(麻烦)

  • 基于OsCache和shiro组播的方式实现(网络影响)

  • 基于spring-session+redis实现的(最适合)


负载均衡策略


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


1、rr 轮询调度算法。顾名思义,轮询分发请求。


优点:实现简单

缺点:不考虑每台服务器的处理能力


2、wrr 加权调度算法。我们给每个服务器设置权值weight,负载均衡调度器根据权值调度服务器,服务器被调用的次数跟权值成正比。


优点:考虑了服务器处理能力的不同


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


4、dh 目标地址散列:同上,只是现在提取的是目标地址的IP来做哈希。


优点:以上两种算法的都能实现同一个用户访问同一个服务器。


5、lc 最少连接。优先把请求转发给连接数少的服务器。


优点:使得集群中各个服务器的负载更加均匀。


6、wlc 加权最少连接。在lc的基础上,为每台服务器加上权值。算法为:(活动连接数*256+非活动连接数)÷权重 ,计算出来的值小的服务器优先被选择。


优点:可以根据服务器的能力分配请求。


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


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


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


10、LBLCR 带复制的基于局部性的最少连接。均衡器根据请求的目的IP地址,找出该IP地址最近使用的“服务器组”,注意,并不是具体某个服务器,然后采用最少连接数从该组中挑出具体的某台服务器出来,把请求转发之。若该服务器超载,那么根据最少连接数算法,在集群的非本服务器组的服务器中,找出一台服务器出来,加入本服务器组,然后把请求转发之。



读写分离


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


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



全文检索


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



缓存优化


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


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



消息队列


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



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


日志处理:系统中日志是必不可少的,但是如何去处理高并发下的日志确是一个技术活,一不小心可能会压垮整个服务。工作中我们常用到的开源日志ELK,为嘛中间会加一个Kafka或者redis就是这么一个道理(一群人涌入和排队进的区别)。


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



日志服务


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




安全优化


以上种种,没有安全做保证可能都会归于零。


  • 阿里云的VPN虚拟专有网络以及安全组配置

  • 自建机房的话,要自行配置防火墙安全策略

  • 相关服务访问,比如MySQL、Redis、Solr等如果没有特殊需求尽量使用内网访问并设置鉴权

  • 尽量使用代理服务器,不要对外开放过多的端口

  • https配合HTTP/2.0也是个不错的选择



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

书写JDBC工具类

1 将哪些操作抽取到工具类中 为什么要抽取工具类? 我们在执行CRUD的过程中,有太多的重复代码需要写,例如:注册驱动、获取连接、释放资源【可以优化dao层的代码】 1 加载properties配置文件,获取连接数据库的相关参数&…

完整的MIME类型列表

转自: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types 这是一份比较全面的MIME类型列表,关联了文档的类别,以它们常见的扩展名排序。两种主要的MIME类型在默认类型中扮演了重要的…

大众点评Java开发实时应用监控平台-CAT

转载自 【推荐】大众点评Java开发实时应用监控平台-CATCAT介绍 CAT是基于Java开发的实时应用监控平台,包括实时应用监控,业务监控。 CAT作为大众点评网基础监控组件,它已经在中间件框架(MVC框架,RPC框架,数…

第三方连接池

1 连接池的概念和作用 问题:连接池的本质是什么?有什么作用? 概念:连接池的本质就是一个容器,该容器中会初始化一些Connection对象,我们程序只需要从连接池中获取连接,使用完毕之后归还连接即…

think-in-java(9)接口

【9】接口 【9.1】抽象类和抽象方法1)抽象方法:仅有方法声明而没有方法体;由abstract 修饰的方法;2)抽象类:如果一个类包含一个或多个抽象方法, 则该类声明为抽象类,由 abstract修饰…

Spring Boot日志集成

转载自 Spring Boot日志集成Spring Boot日志框架 Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用Logback作为默认日志框架。无论使用哪种日志框架,Spring Boot都支持配置将日志输…

三大设计模式

1. 装饰者设计模式 <1>解决的问题&#xff1a;在不改变原有类方法源代码的情况下给方法进行增强&#xff0c;在实现的方法中调用原有对象的对应方法&#xff0c;也可对原有方法进行增强。 <2>要求&#xff1a;要实现接口的所有方法。 <3>弊端&#xff1a;…

硬盘与存储设备

转自鸟哥&#xff1a; http://cn.linux.vbird.org/linux_basic/0105computers_2.php#pc_hd 【1】基本概念 实际的数据都是写在具有磁性物质的磁碟盘上头&#xff0c;而读写主要是透过在机械手臂上的读取头(head)来达成。 实际运作时&#xff0c; 主轴马达让磁碟盘转动&#x…

17张图揭密支付宝系统架构

转载自 17张图揭密支付宝系统架构 支付宝的系统架构图&#xff0c;仅供参考。不管是不是支付行业&#xff0c;都值得我们参考&#xff0c;学习。

Linux系统分区和挂载浅谈

转自&#xff1a; https://blog.csdn.net/cc_net/article/details/2894510好久没有写BLOG了,之前出差了2个月,都没怎么看书,也没有太多时间写。回来后一个月人也有点放松。现在开始还是得继续努力啊。不废话了&#xff0c;下面就介绍下Linux系统的分区和挂载 一 Linux的安装 L…

jmap, jhat, jvisualvm:java堆内存对象分析利器

转载自 jmap, jhat, jvisualvm&#xff1a;java堆内存对象分析利器jmap -help查看命令用法。jmap -heap <pid> 查看堆使用情况。jmap -dump导出堆对象文件进行内存分析。jhat -J-Xmx512m -port 8888 1136.txt命令生成分析报告&#xff0c;可通过http访问。访问http://loc…

ajax异步请求

1 什么是异步请求&#xff1f; 在页面不重新加载的情况下&#xff0c;发送请求局部更新页面内容。2 jquery实现异步请求&#xff1f; $.ajax({url:"访问路径",data:"请求参数", //请求参数格式:"namevalue&namevalue&..." 或者 {name:…

Buffers与cached啥区别

转自&#xff1a; https://www.cnblogs.com/argb/p/3448744.html A buffer is something that has yet to be “written” to disk.A cache is something that has been “read” from the disk and stored for later use对于应用程序来说&#xff0c;buffers/cached 是等于可用…

Spring面试题(第一期)

转载自 Spring面试题&#xff08;第一期&#xff09;Spring作为现在最流行的java web开发框架&#xff0c;Spring的应用及其原理的深入了解是每个Java开发程序员必经之路&#xff0c;下面10道面试题是Java开发程序员面试时会经常遇到的题目。 1、为什么要使用Spring框架&#x…

vue的基本语法

vue的基本语法 new Vue({el:"css选择器",//表示vue对象接管的区域&#xff0c;只有在这一块区域内才可以使用vue的方法显示数据。data:{// 定义各种变量&#xff0c;将来变量的值在页面html标签中使用。name:"snake",age:20,user:{username:"jack&quo…

linux-basic(6)linux的文件权限与目录配置

【6.1】用户与用户组 1&#xff09;linux用户身份与用户组记录的文件/etc/passwd 默认情况下所有系统上的账号都记录在该文件&#xff1b;/etc/shadow 用户密码记录在该文件下&#xff1b;/etc/group linux的所有组名记录在该文件下&#xff1b;注意&#xff1a;这3个文件是 li…

阿里巴巴对Java编程【异常处理】的规约

转载自 阿里巴巴对Java编程【异常处理】的规约 异常处理 1. 【强制】 Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避&#xff0c;而不应该通过 catch 来处理&#xff0c;比如&#xff1a; IndexOutOfBoundsException &#xff0c; NullPointerException 等…

Http协议的请求和响应

1.HTTP协议介绍 HTTP(HyperTextTransferProtocol)&#xff1a;超文本传输协议。HTTP协议是基于TCP/IP协议的。基于请求/响应模型的: 一次请求对应一次响应。传输协议&#xff1a;客户端和服务器端的通信规则(握手规则)。 2.HTTP协议的请求 HTTP协议规定了客户端发给服务器的数…

centos上安装jdk

1&#xff09;下载jdk&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2&#xff09;放置到/usr/local/software/java 目录下&#xff0c;并解压 tar-xzv -f jdk*.gz 3&#xff09;配置环境变量 vim /etc/profile 追…

阿里巴巴对Java编程【单元测试】的规约

转载自 阿里巴巴对Java编程【单元测试】的规约 单元测试 1. 【强制】好的单元测试必须遵守 AIR 原则。 说明&#xff1a;单元测试在线上运行时&#xff0c;感觉像空气 &#xff08;AIR&#xff09; 一样并不存在&#xff0c;但在测试质量的保障上&#xff0c;却是非常关键的。好…