>**架构演进**
## 1. 单体架构
以前的系统大多是各个业务系统集中在一个单体的代码包中,包括现在也有部分传统公司也使用单体式的架构。比如订单、支付、商品、登录等模块全部写在一个代码包中。很多企业都是打包成war包部署到tomcat中。如下图:
![](https://img.kancloud.cn/6c/4d/6c4d608b3e18b9a515266691a8ffe740_895x663.jpg)
### 1.1单体的优缺点
- 优点:单体系统部署简单,只要达成一个包丢到web服务器即可
- 缺点:代码耦合性较高、任一业务出问题都会导致其他模块不可用
## 2.SOA架构
服务导向式架构(SOA)是集成多个较大组件(一般是应用)的一种机制,它们将整体构成一个彼此协作的套件。一般来说,每个组件会从始至终执行一块完整的业务逻辑,通常包括完成整体大action所需的各种具体任务与功能。组件一般都是松耦合的,SOA尝试将应用集成,一般采用中央管理模式来确保各应用能够交互运作。如下图:
![](https://img.kancloud.cn/a6/72/a672a7a6a99e014181d8c697343272e0_797x611.png)
上图实现的构架是对单体的演进,各个系统拆分开来,每个模块对应自己的数据库(mysql、oracle、MongoDB、redis等不限制)。服务之间的调度依赖总线
### 2.1 SOA的优缺点
- 优点:
1. 易维护
业务服务提供者和业务服务使用者的松散耦合关系及对开放标准的采用确保了该特性的实现。建立在以 SOA基础上的信息系统,当需求发生变化的时候,不需要修改提供业务服务的,只需要调整业务服务流程或者修改操作即可,整个应用系统维护也简单了。
2. 可用性高
服务提供者和服务使用者的松散耦合关系上得以发挥与体现。使用者无须了解提供者的具休实现细节
3. 伸缩性提高
服务提供者可以互相彼此独立地进行调整,以满足新的服务需求
- 缺点:
1. 过于依赖总线控制,存在单点问题
2. 涉及不同系统事务一致性问题(分布式相关后续会专门来说)
3. 系统之间交互需要使用远程通信,接口开发增加工作量
## 3.微服务架构
微服务,关键其实不仅仅是微服务本身,而是系统要提供一套基础的架构,这种架构使得微服务可以独立的部署、运行、升级,不仅如此,这个系统架构还让微服务与微服务之间在结构上“松耦合”,而在功能上则表现为一个统一的整体。
微服务提倡的理念团队间应该是 inter-operate, not integrate 。inter-operate是定义好系统的边界和接口,在一个团队内全栈,让团队自治,原因就是因为如果团队按照这样的方式组建,将沟通的成本维持在系统内部,每个子系统就会更加内聚,彼此的依赖耦合能变弱,跨系统的沟通成本也就能降低。如下图:
![](https://img.kancloud.cn/1d/20/1d20b2089fb75624b1737878350b2b54_1610x1397.jpg)
微服务之前的通信不像SOA架构模式中依赖dubbo、ebs等总线控制,系统之前可以点对点的互相负载均衡调用(平级关系),服务之前只需要了解对应的名称,不需要知道ip,应用支持水平拓展,通过网关控制系统访问和限流。具体如何实现的呢?请看后续的介绍。
## 4.云原生架构
所谓云原生,这里引用CNCF 给出的特增
NCF给出了云原生应用的三大特征:
* 容器化封装:以容器为基础,提高整体开发水平,形成代码和组件重用,简化云原生应用程序的维护。在容器中运行应用程序和进程,并作为应用程序部署的独立单元,实现高水平资源隔离。
* 动态管理:通过集中式的编排调度系统来动态的管理和调度。
* 面向微服务:明确服务间的依赖,互相解耦。
由此可见,云原生是包含微服务的,具体展示的架构图和微服务的类似,主要区别是研发主要关注业务实现,底层的监控、基础设施等云服务厂商均已提供相应的服务,当然也可自己部署,云原生目前还是依赖Kubernetes编排,Kubernetes出身于互联网行业的巨头Google公司,Kubernetes站在平台的角度考虑让问题消失
- 前言
- 导读
- 架构演进
- Spring Cloud介绍
- 准备工作
- 微服务入门
- SpringBoot
- SpringBoot入门
- 多profile
- 国际化
- 注册中心Eureka
- Eureka介绍
- Eureka服务端搭建
- Eureka集群搭建
- Eureka服务端常用配置
- Eureka客户端搭建
- Eureka 密码访问
- Eureka服务健康检查
- Eureka客户端常用配置
- Eureka 小结
- 负载均衡Ribbon
- Ribbon介绍
- Ribbon服务提供者
- Ribbon客户端
- Ribbon自定义操作
- Ribbon 修改请求策略
- Ribbon 自定义请求策略
- Ribbon 不再Eureka环境下运行
- Ribbon小结
- 客户端Feign
- Feign介绍
- Feign 入门
- Feign 自定义操作
- Feign 自定义日志
- Feign Basic认证
- Feign 超时配置
- Feign 配置重试
- Feign 配置压缩
- Feign 客户端组件替换
- Feign 文件上传
- Feign 原生配置
- Feign小结
- 自我保护Hystrix
- HyStrix 介绍
- Hystrix 入门
- Hystrix 简单使用
- Hystrix 回退
- Hystrix 信号量隔离
- Hystrix 线程隔离
- Hystrix 结果缓存
- Hystrix 清除缓存
- Hystrix 断路器开启
- Hystrix 断路器关闭
- Hystrix 合并请求
- Hystrix 小结
- Hystrix Spring Cloud
- Hystrix Ribbon
- Hystrix 缓存注解
- Hystrix 合并请求注解
- Hystrix Feign
- Hystrix Dashboard
- Hystrix Turbine
- Hystrix 小结
- 网关Zuul
- Zuul 介绍
- Zuul 简单应用
- Zuul 路由配置
- Zuul 简单路由
- Zuul 路由前缀
- Zuul 指定路由
- Zuul 路由跳转
- Zuul 过滤器
- Zuul 过滤器拦截顺序
- Zuul 数据传递
- Zuul 禁用过滤器
- Zuul 异常处理
- Zuul 重试机制
- Zuul FallBack
- Zuul 小结
- 配置中心
- config 介绍
- config 服务端
- config GitHub模式
- config 本地模式
- config 客户端
- config 属性覆盖
- config 加密
- config AES 加密
- config RSA 加密
- config 小结
- 微服务进阶
- 消息总线Bus
- 总线介绍
- RabbitMQ介绍
- RabbitMQ安装
- RabbitMQ使用
- Cloud Config改造(RabbitMQ)
- Kafka 介绍
- Kafka 安装
- Kafka 使用
- Cloud Config改造(Kafka)
- 总线总结
- 网关拓展
- Zuul 拓展
- Zuul 限流
- 网关Gateway
- Gateway 介绍
- Gateway 简单使用
- 谓词
- 谓词 After
- 谓词 Before
- 谓词 Between
- 谓词 Cookie
- 谓词 Header
- 谓词 Host
- 谓词 Method
- 谓词 Path
- 谓词 Query
- 谓词 Weight
- 过滤器
- 过滤器 MapRequestHeader
- 过滤器 StripPrefix
- 过滤器 Prefix
- 过滤器 PreserveHostHeader
- 过滤器 RedirectTo
- 过滤器 RemoveRequestHeader
- 过滤器 RemoveResponseHeader
- 过滤器 RemoveRequestParameter
- 过滤器 RewritePath
- 过滤器 RewriteLocationResponseHeader
- 过滤器 SetPath
- 过滤器 SetRequestHeader
- 过滤器 SetStatus
- 过滤器 RequestSize
- 过滤器 Default
- 过滤器 Java Bean
- Gateway 路由配置
- Gateway 禁用过滤器
- Gateway 路由前缀
- Gateway 路由跳转
- Gateway 限流
- Gateway 重试
- Gateway FallBack
- Gateway 异常处理
- Gateway 总结
- 注册中心拓展
- 注册中心 Zookeeper
- Zookeeper 介绍
- Zookeeper 安装(Windows)
- Zookeeper 替换Eureka
- 注册中心 Consul
- Consul 介绍
- Consul 安装(Windows)
- Consul 替换Eureka
- 注册中心 Nacos
- Nacos 介绍
- Nacos 安装(Windows)
- Nacos 集群部署
- Nacos 替换Eureka
- 注册中心总结
- 配置中心拓展
- 配置中心Apollo
- Apollo 介绍
- Apollo Namespace
- Apollo 部署
- Apollo 分布式部署
- Apollo 客户端使用
- Apollo 准备工作
- Apollo Java客户端
- 配置中心Nacos
- Nacos 客户端使用
- 配置中心总结
- 微服务高级
- 应用监控
- SpringBootAdmin
- SpringBootAdmin-Eureka
- ELK
- Elasticsearch 介绍
- Kibana 介绍
- Logstash 介绍
- ELK 接收日志
- ELK 总结
- Prometheus 监控
- Prometheus 简介
- Prometheus 可视化
- Prometheus 使用
- 服务跟踪
- Zipkin
- Zipkin 介绍
- Zipkin 使用
- Skywalking
- Skywalking 介绍
- Skywalking 使用(Windows)
- 缓存
- 缓存介绍
- Guava缓存
- Redis
- Redis 介绍
- Redis 缓存
- 缓存总结
- 分布式锁
- 分布式锁介绍
- 数据库方式
- Redis方式
- Zookeeper方式
- 分库分表
- Sharding-JDBC
- Sharding-JDBC 介绍
- Sharding-JDBC 读写分离
- Sharding-JDBC 分库分表
- Sharding-JDBC 分库分表Config
- Sharding-JDBC 分库分表读写分离
- Sharding-JDBC 同库分表
- Sharding-JDBC 同库分表读写分离
- Sharding-JDBC 数据脱敏
- Sharding-JDBC 多租户实战
- Sharding-JDBC 总结
- 分布式事务
- 传统事务介绍
- 分布式事务介绍
- 分布式事务常用方案
- 分布式事务实战篇
- 公共底层封装
- 基于TX-LCN
- TX-LCN介绍
- LCN模式
- LCN-TCC模式
- LCN-TXC模式
- 基于SEATA
- SEATA介绍
- SEATA Server部署
- SEATA-AT模式
- SEATA-TCC模式
- 基于RocketMQ
- RocketMQ 介绍
- RocketMQ 环境安装
- RocketMQ 分布式事务实践
- 容器化
- docker
- docker介绍
- docker安装
- docker 基本操作
- docker compose安装
- docker打包Springboot
- 错误记录
- docker 使用
- docker部署mysql
- docker部署Redis
- docker部署Nacos
- docker部署consul
- docker部署jenkins
- docker部署镜像仓库Harbor
- docker部署Portainer搭建可视化界面
- docker-compose 使用
- docker-compose搭建Prometheus+Grafana监控系统
- docker-compose搭建ELK
- docker-compose搭建Skywalking
- docker-compose搭建Apollo
- docker-compose搭建Nacos
- Kubernetes
- Kubernetes 介绍
- Kubernetes 环境搭建
- Mac 安装 Kubernetes
- Windows 安装Kubernetes
- Linux
- 基本操作
- Centos7 安装iptables防火墙
- Centos7 安装redis
- Centos7 安装Zookeeper
- Centos7 安装Kafka
- Centos7 安装RocketMQ
- 拓展功能
- 规则引擎Drools
- Drools介绍
- Docker 部署Workbench
- Drools-信用卡额度实例