前言


工作也有几多年了,无论是身边遇到的还是耳间闻到的,多多少少也积攒了自己的一些经验和思考,当然,博主并没有太多接触高大上的分布式架构实践,相对比较零碎,随时补充。俗话说得好,冰冻三尺非一日之寒,滴水穿石非一日之功,罗马也不是一天就建成的,当然对于我们开发人员来说,一个好的架构也不是一蹴而就的。

初始搭建

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

吃透这套架构演化图,从零搭建Web网站也不难!_连接数吃透这套架构演化图,从零搭建Web网站也不难!_负载均衡_02

服务分离吃透这套架构演化图,从零搭建Web网站也不难!_负载均衡_02

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

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

吃透这套架构演化图,从零搭建Web网站也不难!_服务器_04吃透这套架构演化图,从零搭建Web网站也不难!_负载均衡_02

反向代理吃透这套架构演化图,从零搭建Web网站也不难!_负载均衡_02

吃透这套架构演化图,从零搭建Web网站也不难!_负载均衡_07

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

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

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

反向代理的优势,如下:

  • 隐藏真实后端服务
  • 负载均衡集群
  • 高可用集群
  • 缓存静态内容实现动静分离
  • 安全限流
  • 静态文件压缩
  • 解决多个服务跨域问题
  • 合并静态请求(HTTP/2.0后已经被弱化)
  • 防火墙
  • SSL以及http2

动静分离

吃透这套架构演化图,从零搭建Web网站也不难!_连接数_08

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

Nginx 升级到1.9.5+可以开启HTTP/2.0时代,加速网站访问。

当然,如果公司不差钱,CDN也是一个不错的选择。

服务拆分

在这分布式微服务已经普遍流行的年代,其实我们没必要踩过多的坑,就很容易进行拆分。市面上已经有相对比较成熟的技术,比如阿里开源的Dubbo(官方明确表示已经开始维护了),Spring家族的Spring Cloud,当然具体如何去实施,无论是技术还是业务方面都要有很好的把控。

Dubbo 

吃透这套架构演化图,从零搭建Web网站也不难!_负载均衡_09

SpringCloud

  • 服务发现——Netflix Eureka
  • 客服端负载均衡——Netflix Ribbon
  • 断路器——Netflix Hystrix
  • 服务网关——Netflix Zuul
  • 分布式配置——Spring Cloud Config

微服务与轻量级通信

  • 同步通信和异步通信
  • 远程调用RPC
  • REST
  • 消息队列

持续集成部署

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

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

吃透这套架构演化图,从零搭建Web网站也不难!_连接数_10

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

吃透这套架构演化图,从零搭建Web网站也不难!_连接数_11吃透这套架构演化图,从零搭建Web网站也不难!_负载均衡_02

服务集群

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

吃透这套架构演化图,从零搭建Web网站也不难!_负载均衡_13

负载均衡实现

  • 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会丢失、容易造成单点故障

缓存集中式管理

  • 吃透这套架构演化图,从零搭建Web网站也不难!_连接数_14

目前生产中使用到的

  • 基于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的计算。

吃透这套架构演化图,从零搭建Web网站也不难!_负载均衡_15

读写分离

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

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

全文检索

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

吃透这套架构演化图,从零搭建Web网站也不难!_连接数_16

吃透这套架构演化图,从零搭建Web网站也不难!_服务器_17

吃透这套架构演化图,从零搭建Web网站也不难!_服务器_18

日志服务

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

吃透这套架构演化图,从零搭建Web网站也不难!_服务器_19吃透这套架构演化图,从零搭建Web网站也不难!_负载均衡_02

安全优化

吃透这套架构演化图,从零搭建Web网站也不难!_连接数_21

欢迎关注“互联网架构师”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们只聊互联网、只聊架构,不聊其他!打造最有价值的架构师圈子和社区。

本公众号覆盖中国主要首席架构师、高级架构师、CTO、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。

  • 长按下方的二维码可以快速关注我们
  • 吃透这套架构演化图,从零搭建Web网站也不难!_连接数_22