文章目录
微服务
微服务架构特点
微服务是一种架构模式,将应用拆分成多个小型、自治的服务单元,每个服务单元可以独立部署、扩展和维护。
微服务与单体应用的区别:
单体应用 | 微服务 |
---|---|
整体部署 | 拆分部署 |
紧耦合 | 松耦合 |
基于整个系统伸缩 | 基于服务伸缩 |
集中式管理 | 分布式管理 |
应用无依赖关系管理 | 微服务间较强的依赖关系管理 |
局部修改,整体更新 | 局部修改,局部更新 |
故障全局性 | 故障隔离、非全局 |
代码不易理解难维护 | 代码易于理解维护 |
开发效率低 | 开发效率高 |
资源利用率低 | 资源利用率高 |
重、慢 | 轻、快 |
部署简单 | 部署复杂 |
基本问题
分布式问题
微服务系统属于分布式系统,天然存在分布式问题。
CAP 定律:
- Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性)
- CAP 三种特性无法兼得,只能取其二。
- 要保证一致性和可用性,则不能保证分区容错性,即必须保证网络的可靠性不允许出现分区。
- 事实是网络是不可靠的,分区容错性是必须的。
- 所以只能在一致性和可用性之间做选择。
组织架构问题
康威定律:组织架构天然地决定了系统架构,即组织的划分和沟通关系决定了系统的划分和接口设计。
这种异质同态的潜在关系决定了,不能单方面地对系统进行微服务拆分,而应该有匹配的研发团队拆分和人员规模。
服务拆分
拆分的原则
- 单一职责原则,多个独立且相关性不大的功能之间意味着可以拆分。
- 高内聚低耦合原则,相关性大的功能最好放在一个服务内,避免服务间交互过于复杂。
- 演进式拆分,粒度从粗到细,随着业务的深化和规模的扩张演进式拆分。
- 避免循环依赖和双向依赖,服务关系过于复杂,理解困难、容易产生死锁。
拆分的方法
- 按业务领域拆分,良好的业务领域划分往往具备单一职责和高内聚原则。
- 业务对象的交互是强一致性的最好不拆分,支持最终一致性的才拆分。
- 按性能拆分,将流量大的服务拆分出来便于扩容,避免对其他服务产生影响。
- 按业务重要度拆分,重要程度高的业务确保更高可用性。
- 按组织架构和团队规模拆分,避免粒度过细。
通信方式
通信模式
- 同步
- 请求方需等待响应方返回结果后才继续。
- 优点:可靠性较高,容易保证顺序性。
- 缺点:请求排队,线程阻塞,影响并发性能。
- 异步
- 请求方发送请求后继续执行,不等待响应方返回结果。
- 优点:提高并发吞吐,耦合度低,故障隔离。
- 缺点:调用流程复杂。
- 发布-订阅
- 一对多的通信模式,发布方发出消息后,可能被一个或多个订阅方处理。
- 优点:耦合度极低,高可扩展性和灵活性。
- 缺点:只适用于特定场景,发布方不关心有多少订阅方,不关心消息的处理结果。
接口协议
- RESTful
- 是一种基于 HTTP 协议的接口风格。
- 将接口抽象为对资源的CURD。
- 区别于普通的 HTTP 接口,在 URL 和 HTTP Method 上有特定的风格。
- 常用于前后端之间的接口。
- 比普通 HTTP 接口可读性更高。
- RPC
- RPC 是远程过程调用,目的是将网络通信简化为本地函数调用。
- 常用的 RPC 框架如 gRPC,Thrift。
- 基于 TCP 或 HTTP 协议。
- 分为请求响应式 RPC 和流式 RPC。
- 消息队列
- 用于实现异步通信的中间件。
- 常用的消息队列如 Kafka,RabbitMQ。
- 基于 TCP 协议。
- 分为点对点式队列和发布-订阅式队列。
按应用场景选择:
- 低延迟:RPC
- 强一致性:RPC实现TCC模式接口
- 最终一致性:高可靠性的消息队列如 Rabbitmq
- 大规模数据流处理:高吞吐消息队列如 kafka
- 一对多通信:发布订阅式消息队列
- 对接外部:标准协议,RESTful 或 gRPC
- 前后端接口:RESTful
服务编排
Orchestration(编制)
- 采用中心化控制方式,有一个流程控制服务(或编排引擎)负责协调各服务的执行流程。
- 类比于管弦乐,有一个中心指挥手。
- 优点:流程清晰,易于理解和监控。
- 缺点:中心化容易变得臃肿复杂,难以维护。
Choreography(编排)
- 采用去中心化的方式,每个服务自主控制,通过消息与其他服务协作形成业务流程。
- 类比于编舞/爵士乐,没有中心化指挥家,每个舞手/乐手各司其职。
- 优点:耦合度低,不存在复杂度高的中心化服务。
- 缺点:流程不清晰,难以理解和监控。
服务治理
服务发现
- 定义:自动注册和发现服务的技术。
- 作用:
- 使服务在运行时能动态发现依赖的其他服务并建立通信。
- 由于服务实例的IP是动态变化的,故服务发现是必备的技术。
- 实现:
- 通过分布式键值对存储系统实现,如ETCD、ZK。
- 服务启动时向注册中心注册,服务停止时从注册中心注销,客户端通过订阅服务列表获取服务实例信息。
统一配置管理
- 定义:将配置信息集中存储和管理的技术。
- 作用:解决服务发现,数据库、缓存、消息队列等配置信息管理问题。
- 实现:
- 通过分布式键值对存储系统实现,如ETCD、ZK。
- 需支持不同环境的配置信息切换。
可观测性
- 定义:通过日志、监控指标、链路追踪、告警等手段,对系统运行状态进行观测的技术。
- 作用:加速故障的排查和修复,发现并优化性能瓶颈,辅助容量规划等。
- 实现:
- 监控工具:如Prometheus、Grafana等,可以用来收集和可视化微服务的性能指标。
- 分布式追踪:如OpenTracing、Jaeger等,可以用来追踪微服务间的请求流转路径。
- 日志记录:如ELK,可以用来收集和检索微服务的日志。
- 云原生:CNCF标准化项目 OpenTelemetry。