单体架构
将所有的功能都集中在一个模块中(WAR包)开发、部署、迭代,牵一发而动全身,局部低效率拖垮整个服务。
SOA
按服务对项目拆分,通过对外提供接口的方式提供服务,缓解了单体的单服务低效率拖垮整个服务的问题,但往往通过数据库进行数据共享,服务之间会基于数据库耦合。
微服务
独立开发、部署,技术栈独立,数据库独立。服务之间通过统一的HTTP接口调用,或采用Kafka、RabbitMQ等消息队列的方式进行通信,耦合性大大降低。
SpringCloud微服务组件
组件 | 功能 |
Spring Cloud Config | 分布式配置中心,负责把配置放到远程服务器上,集中化管理集群配置。 |
Eureka | 服务注册发现中心,基于 REST 服务的分布式中间件,主要用于服务管理。 |
Hystrix | 熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点 , 从而对延迟和故障提供更强大的容错能力。 |
Ribbon | 云端负载均衡器。支持多种负载均衡策略,可配合服务发现和熔断器使用,在客户端实现负载均衡。 |
Feign | 一个 REST 客户端,基于 Ribbon 和 Hystrix 的声明式服务调用组件。 |
Zuul | 服务网关,为微服务架构集群提供代理、过滤、路由等功能。 |
Spring Cloud Bus | 事件、消息总线,用于在集群(例如配置变化事件)中传播状态变化,可与 Spring Cloud Config 联合实现热部署。 |
Spring Cloud Stream | 数据流操作开发包,可与 Redis、RabbitMQ、Kafka 等架构进行消息发送与接收。 |
Spring Cloud Sleuth | 服务追踪框架,可以与 Zipkin、Apache Htrace 和 ELK 等数据分析、服务跟踪系统进行整合,为跟踪服务、解决问题提供了便利。 |
SpringCloud架构
SpringCloud与SpringBoot版本兼容
SpringCloud | SpringBoot |
Greenwich | 兼容 Spring Boot 2.1.x |
Finchley | 兼容 Spring Boot 2.0.x |
Dalston 和 Edgware | 兼容 Spring Boot 1.5.x |
Camden | 兼容 Spring Boot 1.4.x |
Brixton | 兼容 Spring Boot 1.3.x |
Angel | 兼容 Spring Boot 1.2.x |
IaaS && PaaS && SaaS && FaaS && CaaS
IaaS(Infrastructure as a Service)基础设施即服务——只卖服务器
PaaS(Platform as a Service) 平台即服务——服务器+基础操作系统+简单运维
Saas(Software as a Service)软件即服务——包装好服务,提供OA、CRM、MIS、ERP、HRM、CM、Office 365、iCloud、G Suite等现成的解决方案
FaaS(Function as a Service)函数即服务——提供函数定义的自由度,依赖指定的API定制化功能实现,如云函数
CaaS(Container as a Service)容器即服务——提供容器化部署环境(Docker,K8S)
服务发现与服务路由
服务发现:新接入的服务为其他服务提供服务前,自动注册到集群中。 消费方通过服务发现,获取服务方的ip和端口。同时及时移除不可用的节点。
服务路由:提供统一的入口,不再需要关注服务调用的路由问题
服务熔断与客户端负载均衡
客户端负载均衡:客户端自己实现轮训服务的不同节点,解决负载均衡中心化问题。
服务熔断:服务可用性下降时,快速响应,避免连锁反应,不影响整体服务的可用性。
身份认证与鉴权
身份验证:对用户的身份验证,基于用户名+密码完成基础验证。
鉴权:用户是否有权执行当前操作,增删改查细粒度管理。
日志追踪与聚合
日志关联:通过分布式Id,将不同服务的日志关联起来。
日志聚合:从服务实例中收集所有日志。
事务追踪:通过分布式追踪日志,查询调用链等信息。
微服务运维的四个原则
1. 独立部署原则。同一份产出,可以到任意服务器上进行部署。
2. 配置自动化统一管理。通过配置中心或环境变量进行配置,无需人为干预。
3. 服务对客户端透明。客户端无需关注服务真实部署地址,通过服务注册与服务发现中间层代理实现解耦,无需关注服务部署的相关信息。
4. 健康报告。健康监控是微服务运维的重要一点,实时监测服务可用性,剥离不健康节点。
微服务构建最佳实践
1. 代码库。每个微服务都有自己独立的代码库进行版本控制
2. 依赖管理。使用标准的版本管理工具Maven完成依赖管理,保证每次依赖的使用是明确的,一致的。
3. 配置。配置与代码分离管理,特别是不同环境(开发、测试、生产)分别管理。
4. 后端服务。确保基于数据库、网络、消息的服务调用关系能够随时平滑切换。
5. 构建、发布、运行的分离。统一的流水线化完成构建、发布、运行操作,不可逆地执行上述步骤。
6. 进程。微服务始终是无状态的,某个实例的新增和移除不影响数据。
7. 端口绑定。不再需要web容器进一步完成服务的部署,例如内置Tomcat
8. 并发。通过横向扩展实现服务扩容而不是依赖单体的线程数。
9. 可任意处置。微服务实例应当随时可以启动和停止,在可见时间范围内完成服务的重启,在收到kill信号时,及时得以停止。
10. 各部署环境的无差性。开发、测试、生产环境代码部署的无差性。
11. 日志。日志是一个事件流,通过相关工具实现日志的收集和统一化展示,开发人员不应花费过多时间关注此类问题。
12. 进程管理。通用的脚本管理实现服务的统一部署、重启、终止等操作。