架构演进

文章目录

  • 架构演进
      • 一、开发环境&生产环境
        • 1.1 开发环境
        • 1.2 生产环境
      • 二、WEB1.0&WEB2.0阶段
        • 2.1 WEB1.0时期
        • 2.2 WEB2.0时期
        • 2.3 搭建集群后的问题
      • 三、垂直架构
      • 四、分布式架构
        • 4.1 项目迭代
      • 五、分布式架构常见问题
        • 5.1 服务之间的异步通讯
        • 5.2 服务之间通讯地址的维护
        • 5.3 服务降级
        • 5.3 海量数据
      • 六、微服务架构
        • 6.1 微服务架构
        • 6.2 模块过多,运维成本增加
        • 6.3 分布式架构下的其他问题

架构演进

一、开发环境&生产环境

1.1 开发环境

平时在写代码时,大多都在是Win10win7/Mac,这些系统都可以称呼为开发环境,咱们会为了更高效的开发应用程序,安装很多很多的软件,会导致操作系统不安全,稳定性降低.

1.2 生产环境

在生产环境中,操作系统不会采用Win10/Mac,这种操作系统相对不安全,生产环境是要面向全体用户的,一般会采用专业的操作系统
大多市面上使用的都是基于Linux的操作系统还有windows版本的服务器操作系统Windows 2003 service.
第一知识点学会如何操作Linux操作系统.

二、WEB1.0&WEB2.0阶段

2.1 WEB1.0时期

在WEB1.0时期,由于带宽不足,这时的项目大多是内容少,用户量也不多,甚至有一些项目不需要对外开放,对安全性和稳定性的要求是不高的.

单体架构就足以应对.

2.2 WEB2.0时期

随之到来的WEB2.0,实现了ADSL拨号上网,宽带提速,最高可以达到8M,用户量也就不断增加,一些门户网站也开始活跃项目就需要考虑安全性和稳定性.
在基于上面的单体架构图中,无法满足WEB2.0对项目的需求.
在单体架构的基础上去搭建集

在搭建集群之后,可以提升项目的稳定性,并且并发量增加,也可以承受住.

2.3 搭建集群后的问题

  1. 用户的请求到底要发送到哪台服务器上如何保证请求平均的分发给不同的服务器,从而缓解用户量增加的压力.

  2. 编写项目时,如果用户登录成功了,将用户的标识放到Session域中,在搭建集群之后,数据共享问题。

  3. 当数据量特别庞大时,如果还直接去数据库查询,速度很慢,如何提升查询效率

  4. 针对大家在搜索一些数据时,where content like"%#x2%

为了解决上述的问题,需要使用到三门技术.
Nginx-解决用户请求平均分发.
Redis-解决数据共享并实现缓存功能.
Elasticsearch-解决搜索数据的功能.

这些都称为中间件

三、垂直架构

假设项目包含了三个模块,用户模块,商品模块,订单模块.
商品模块压过大,一般最直接有效的方式就是搭建集群在单体架构的基础上去搭建,效果相对比较差.
随着项目的不断更新,项目中的功能越来越多,最严重可能会导致项目无法启动.
关于单体架构中,完美的体现了低内聚,高耦合.

为了解决上述的各种问题,演进出了垂直架构.

四、分布式架构

4.1 项目迭代

随着项目的不断迭代,新老功能之间需要相互交互,服务器和服务器之间是需要通讯的.

项目一般是分为三层的,controller,Service pa.导致程序变慢的重灾区,一般是Service和Dag,在搭建集群时,却是针对三层都搭建集群,效果不是很好

架构从垂直架构演变到了分布式架构.

分布式架构落地的技术.
国内通讯的方式有两种:
Dubbo :RPC
Springcloud :HTTP

分布式架构图

五、分布式架构常见问题

5.1 服务之间的异步通讯

使用分布式架构之后,服务之间的通讯都是同步的.
在一些不是核心业务的功能上,咱们希望可以实现异步通讯。
为了实现服务之间的异步通讯需要学些MQ-RabbitMg(消息队列)

5.2 服务之间通讯地址的维护

由于服务越来越多,每个服务的访问地址都是一样的.
协议:/地址端口号
由于模块繁多,并且模块搭建的集群数量增加,会导致其他模块需要维护各种i地址等信息,导致项目的维护性极低耦合性变高,并且也无法实现负载均衡的功能.

需要使用一个技术来解决当前问题:

​ Eureka注册中心帮助我们管理服务信息

​ Robbin可以帮我们实现服务之间的负载均衡

Eureka实现通讯地址维护
Robbin实现服务之间的负载均衡

5.3 服务降级

在上述的架构中,如果说订单模块出现了问题。只要是涉及到订单模块的功能,全部都无法使用.
可能会导致服务器提供的线程池耗尽给用户友好的提示都是无法做到的.

为了解决上述的问题使用Hystrix处理.
Hystri提供了线程池隔离的方式,避免服务器线程池耗尽,在一个服务无法使用时,可以提供断路器的方式来解决

使用Hystrix实现断路器和隔壁,并最终服务降级
Eureka,Robbin,Hystrix都是SpringCloud中的组件

5.3 海量数据

海量数据会导致数据库无法存储全部的内容。

即便数据库可以存储海量的数据,在查询数据时,数据库的响应时及其缓慢的。

在用户高并发的情况下,数据库也时无法承受住的。

为了解决上述的问题,可以基于MyCat实现数据库的分库分表。

基于MyCat实现分库分表

六、微服务架构

6.1 微服务架构

虽然已经将每个模块独立的做开发,比如商品模块,压力最大的时商品的查询。

在单独模块中再次拆分项目的方式就可以称之为微服务架构。

微服务架构,在分布式架构的基础上再次拆分

6.2 模块过多,运维成本增加

为了解决模块过多,运维成本增加的问题。

采用Docker容器化技术来帮助我们管理。

后期在学习的时候,也需要大量的软件,可以使用Docker来帮助我们安装软件。

6.3 分布式架构下的其他问题

分布式架构帮助我们解决了很多的问题,但是随之也带来了很多问题:

1.分布式事务:

​ 最传统的操作事务的方式,是通过connection链接对象的方式操作,Spring也提供了声明式事务的操作。 为了解决事务的问题,后续会使用到RabbitMQ | LCN方式来解决。

2.分布式锁:

​ 传统的锁方式,synchronized | Lock锁,在分布式环境下,传统的锁是没有效果的。为了解决锁的问题后 续会使用到Redis | Zookeeper来解决。

3.分布式任务:

​ 在传统的定时任务下,由于分布式环境的问题,可能会造成任务重复执行,一个比较大的任务,需要可以 拆分。为了解决这个问题,后续会使用到Redis + quartz Elastic-Jb

你可能感兴趣的:(个人笔记)