一、什么是架构

架构,即项目的主题。

  • 是实现业务功能的工程模块
  • 为了应对业务功能之外的需求、压力给项目中增加的中间件等其他系统
  • 为了让整个项目能够顺畅、高效的运行,需要把业务功能和中间件以及其他系统有效的整合起来

二、单一架构

1、概念

一个工程 → 打成一个 war 包 → 运行在一个 Tomcat

2、演变

2.1、水平拆分

水平拆分就是把原来的一个工程拆分成多个模块分别进行开发,一定程度上提高了模块化程度。

水平拆分

2.2、垂直拆分

按照业务功能把项目拆分成多个模块工程,但是由于彼此之间不存在模块之间的调用,所以还不能算作一个真正的分布式架构。相当于把一个项目拆分成多个小项目分别开发。
垂直拆分

三、互联网时代面临的新挑战

1、高可扩

项目设计架构的时候要考虑到功能的持续更新。

2、高性能

提高响应速度,使系统处理一个请求的时间尽可能短,减少用户等待的时间,优化用 户体验。

3、高并发

当用户访问量非常大时,会增加系统的并发压力。

四、分布式架构

1、概念

一个项目拆分成多个模块工程,每个模块工程都是一个 war 包,运行在各自的 Tomcat 上,模块之间可以通过网络互相调用。

2、方法远程调用

2.1、本地调用

在同一个项目内部,不经过网络直接调用方法。不管是我们自己声明的方法还是调用的第三方的 jar 包中得方法都算本地调用。

2.2、远程调用

远程方法调用

2.3、意义

  • 对内:让我们能够实现分布式架构
  • 对外:让我们能够调用第三方接口

    • 发送短信
    • 查询物流
    • 执行支付
    • 天气预报
    • 股票行情
    • 等等。。。

3、思想

3.1、SOA

Service Oriented Architecture 面向服务的架构
在整个系统中,把相同的功能抽取出来作为一个服务,供系统中的其他模块调用,提高代码的复用性。

SOA面向服务的架构

服务消费者关系

3.2、微服务

3.2.1、微服务简介

微服务官网

The term "Microservice Architecture" has sprung up over the last few years to describe a particular way of designing software applications as suites of independently deployable services. While there is no precise definition of this architectural style, there are certain common characteristics around organization around business capability, automated deployment, intelligence in the endpoints, and decentralized control of languages and data.

“微服务体系结构”这个术语在过去几年里迅速兴起,它描述了一种将软件应用程序设计为独立部署服务套件的特殊方法。 虽然没有这种架构风格的精确定义,但是围绕着业务能力、自动化部署、端点中的智能以及语言和数据的分散控制,组织有一些共同的特征。

其中:微服务强调的特征:独立可部署

4、技术演进

一些主要的技术演进:

4.1、WebService

解决程序之间的跨平台访问问题。基于SOAP/WSDL协议,让应用程序之间可以进行远程通信。

4.2、Dubbo+Zookeeper

Dubbo:基于RPC的远程过程调用框架

Dubbo
Zookeeper:基于树形目录结构、异步通知机制的注册中心。
Zookeeper

4.3、SpringBoot+SpringCloud

SpringBoot:开发具体微服务,使用“场景启动器(starter)”快速整合第三方中间件。

SpringCloud:提供的微服务架构整体管理的一站式解决方案。

  • Eureka:注册中心
  • Ribbon:客户端负载均衡
  • Feign:远程接口的声明式调用
  • Hystrix:服务的熔断、降级、监控
  • Zuul:网关

5、相关的概念

① 接口

接口:是一个以“ 接口(Interface)”为功能代表的分布式环境下的 服务模块 的简称。
接口的具体含义

② 远程接口的声明式调用

例如:一个Controller 远程调用另一服务模块的 接口 EmpRemoteService 的实现类中得 xxx() 方法

@Controller
public class EmpRemoteController{

    @Autowired
    private EmpRemoteService empRemoteService;

    @RequestMapping("/xxx/xxx")
    public String xxx(){
        
        // 像调用本地方法一样调用远程方法。
        // 因为所有远程方法调用时产生的请求、响应等细节全部被框架屏蔽了
        empRemoteService.xxx();
        
        return "xxx";
    }

}

③ 注册中心

远程接口的声明式调用之所以能够实现,就是因为 Dubbo 或 Feign 这样的框架 把服务模块的具体信息存入了注册中心,当另一个模块需要远程调用该模块时通过注册中心使用即可。
注册中心

6、分布式架构优缺点

优点:

  • 模块化程度更高,有利于分工
  • 有利于提升项目性能

    • 整体提升

    整个项目中每一个模块都可以独占一台服务器,整个项目分配到服务器资源更多

    • 局部提升

    由于对项目进行了拆分,所以可以有针对性的对项目中局部的模块进行专门的优化

    • 纵向:给当前模块所在的服务器增加硬件资源
    • 横向:给当前模块配置自集群

缺点:

  • 结构复杂

    • 调用关系复杂
    • 部署复杂
  • 数据不一致问题

    • Session不一致问题
    • 分布式事务问题

7、分布式和集群

① 相同点

都需要多台服务器

② 不同点

分布式:每台服务器上运行的模块不同——异构
集群:每台服务器上运行模块相同——同构
分布式和集群的区别

8、集群或分布式架构中得Session共享问题

当用户在集群或分布式中的某一个微服务登录时,再去访问另外一个微服务,此时怎样保证还是在登录状态。

解决方案:
1、 将 Cookie 存储到客户端。
缺点:

  • 不安全
  • 网络负担效率低

2、Session 复制
就是将一台服务器中得 session 对象 复制到 另一台服务器中得 session 对象。
缺点:session数据冗余、节点越多越浪费

3、存在文件服务器或者数据库里
缺点:大量的 IO 效率低

4、nosql缓存数据库
即完全存在缓存中,第一次登录,将session信息存在缓存中,第二次登录时,查看缓存中是否有登录信息即session,如果有就是登录状态。
优点:读的速度快、数据结构简单

最后修改:2021 年 09 月 02 日 06 : 46 PM
如果觉得我的文章对你有用,请随意赞赏