1.1、什么是软件架构?
软件架构是在软件内部,经过综合各种因素的考量、权衡,选择特定的技术,将系统划分成不同的部分并使这些部分相互分工,彼此协作,为用户提供需要的价值。
1.2、哪些因素?
- 业务需求
- 技术栈
- 成本
- 组织架构
- 可扩展性
- 可维护性
应用是可以独立运行的程序代码,提供相对完善的业务功能。
架构分为:业务架构、应用架构、技术架构。
业务架构决定应用架构,技术架构支撑应用架构。
架构的发展历程:单体架构-->分布式架构-->SOA架构-->微服务架构
1.3、什么是单体架构
定义:功能、业务集中在一个发布包里,部署运行在同一个进程中
优点
- 易于开发
- 易于测试
- 易于部署
- 易于水平伸缩(节点复制)
缺点
- 代码膨胀,难以维护(灵活度不够)
- 构建、部署成本大
- 新人上手困难
- 降低系统性能
- 启动慢
- 扩展性差
1.4、集群:负载均衡
随着访问量的变大,一个Tomcat服务器已经不能满足需要。
需要配置多个Tomcat,做Tomcat集群,通过负载均衡服务器访问不同的Tomcat服务器,每个Tomcat中部署完整项目即可
1.5、分布式架构
每一个Tomcat存放完整项目,会存在部分业务模块长时间用不到,部分业务模块不够用的现象。
按照功能模块拆分项目,每台服务器仅存放一个模块,通过多系统的配合完成整体业务逻辑。
(按照业务垂直切分,每个引用都是单体架构,通过API互相调用)
1.6、面向服务的SOA架构
SAO架构有两个主要角色:服务的提供者(provider)、服务的消费者(consumer)。阿里的Dubbo的SOA的一个典型实现
将工程拆分成表现层和服务层两个工程,
服务层中包含业务逻辑,只需要对外提供服务即可。
服务层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现
优点
- 模块拆分,使用接口通信,降低了模块之间的耦合度
- 把一个大项目拆分成多个子项目,可以并行开发
- 增加功能时只需要增加一个子项目,调用其他系统接口即可
- 可以灵活分布式部署
缺点
- 系统之间需要远程通信,增加了开发的工作量
1.7、微服务架构
微服务架构是一种架构风格,对于大型复杂的业务系统,可以将业务功能拆分成多个相互独立的微服务,各个微服务之间是松耦合的,通过各种远程协议进行同步/异步
通信,各个微服务可单独部署
,扩容/缩容
以及升级/降级
微服务技术选型对比
Spring Cloud | Dubbo | Motan | MSEC | 其他 | |
---|---|---|---|---|---|
功能 | 微服务完整方案 | 服务治理框架 | 服务治理框架 | 服务开发运营框架 | 略 |
通信方式 | REST / http | RPC 协议 | RPC / Hessian2 | Protocol Buffers | gRPC、thrift |
服务发现 / 注册 | Eureka(AP) | ZK、Nacos | ZK / Consul | 只有服务发现 | Etcd |
负载均衡 | Ribbon | 客户端负载 | 客户端负载 | 客户端负载 | Ngnix + Lua |
容错机制 | 6 种 | 6 种 | 2 种 | 自动容错 | keepalived、heartbeat |
熔断机制 | Hystrix | 无 | 无 | 过载保护 | 无 |
配置中心 | Spring Cloud Config | Nacos | 无 | 无 | Apollo、Nacos |
网关 | Zuul、Gateway | 无 | 无 | 无 | Kong、自研 |
服务监控 | Hystrix + Turbine | Dubbo + Monitor | 无 | Monitor | ELK |
链路监控 | Sleuth + Zipkik | 无 | 无 | 无 | Pinpoint |
多语言 | REST 支持多语言 | Java | Java | Java、C++、PHP | Java、PHP、Node.js |
社区活跃度 | 高(Spring) | 高(阿里) | 一般 | 未知 | 略 |
2、什么是微服务?
微服务是一种架构风格,即将单体应用划分为小型的服务单元。
使用一套小服务来开发单个应用的方式,每个服务运行在独立的进程里,一般采用轻量级的通讯机制互联(应用程序之间远程调用进行通信),并且它们可以通过自动化的方式部署。
2.1、微服务的特性
1、完全独立的一个最小个体(可以独立运行)
2、个体与个体之间,通过远程调用进行访问。例如:基于RESTFul风格的
3、通过注册中心,将不同个体可以进行整合。
4、通过网关,可以进行统一的入口访问。
特征:
- 单一职责
- 轻量级通信
- 隔离性
- 业务数据的独立性(有自己的数据)
- 技术多样性
3、Spring Cloud
3.1、这里先讲一下中间件的概念
中间件:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/服务器的操作系统之上,管理计算器资源和网络通讯。是连接两个独立应用程序或独立系统的软件。
常见的中间件:
服务治理(如 RPC)
、配置中心
、全链路监控
、分布式事务
、分布式定时任务
、消息中间件
、API 网关
、分布式缓存
、数据库中间件
等。
3.2、什么是Spring Cloud
SpringCloud就是用于构建微服务开发和治理的框架集合。
Spring Cloud 像是一个中间件,基于 Spring Boot
开发,提供一套完整的微服务解决方案。包括服务注册与发现
、配置中心
、全链路监控
、API网关
、消息总线
、负载均衡
、熔断器
、数据监控
等选型的中立的开源组件,可以随需扩展和替换组装。
3.3、基于Spring Cloud的微服务解决方案
1、公用组件:服务调用:Feign、负载均衡:Ribbon、熔断器:Hystrix
2、网关:Eureka、Consul 使用 zuul(性能低)、SpringCloud Gateway(性能高);etcd、Nacos 使用自研网关
3、配置中心:SpringCloud Config、携程 Apollo、阿里 Nacos
4、Zipkin、Pinpoint、SkyWalking(推荐)
5、分布式事务、Docker、gRPC、领域驱动 Halo
3.4、Spring Cloud项目常见模块
- Eureka:注册中心,用于注册所有服务(项目/应用)
- Ribbon:负载均衡,用于搭建集群的。(同一个功能多个tomcat,ribbon帮着选择一个tomcat)
- Zuul 网关:确定统一入口,方便进行管理。
- Feign:服务与服务之间调用。类似HttpClient
- Hystrix:熔断器,与正主断了联系,使用备胎。
组件名称 | 所属项目 | 组件分类 |
---|---|---|
Eureka | spring-cloud-netflix | 注册中心 |
Zuul | spring-cloud-netflix | 第一代网关 |
Sidecar | spring-cloud-netflix | 多语言支持 |
Ribbon | spring-cloud-netflix | 负载均衡 |
Hystrix | spring-cloud-netflix | 熔断器 |
Turbine | spring-cloud-netflix | 集群监控 |
Feign | spring-cloud-openfeign | 声明式的 HTTP 客户端 |
Consul | spring-cloud-consul | 注册中心 |
Gateway | spring-cloud-gateway | 第二代网关 |
Sleuth | spring-cloud-sleuth | 链路监控 |
Config | spring-cloud-config | 配置中心 |
Bus | spring-cloud-bus | 总线 |
Pipeline | spring-cloud-pipelines | 部署管道 |
Dataflow | spring-cloud-dataflow | 数据处理 |
Stream | spring-cloud-stream | 消息驱动 |
服务治理中间件
服务治理中间件包含:服务注册与发现
、服务路由
、负载均衡
、自我保护
、管理机制
等。 其中,服务路由包含:服务上下线
、在线测试
、机房就近选择
、AB测试
、灰度发布
等。 负载均衡包含:支持根据目标状态和目标权重进行负载均衡。 自我保护包含:服务降级
、优雅降级
、流量控制
借鉴简书上的一位大神
原地址:https://www.jianshu.com/p/0a8f29842a6f
SpringClound:https://www.processon.com/view/link/5c3ec3cce4b0641c83ddee05