微服务架构
微服务架构介绍
微服务架构是一种基于解耦、独立部署和可扩展性的软件开发架构。相比于传统的单体应用架构,微服务架构将应用拆分成一系列小型、独立的服务,每个服务都专注于完成一个特定的业务功能。这些服务通过轻量级的通信机制进行互联,从而形成一个整体的应用。
服务:一组具有相同逻辑的运行实体 。一个服务的所有实例必须运行相同代码
实例:服务中每个运行实体即为一个实例
集群:服务内部的逻辑划分,每个集群包含多个实例
实例与进程的关系:一个实例可以对应一个或多个进程。实例和进程之间没有必然的对应关系
常见的实例承载形式:进程、VM、K8S pod
有状态/无状态服务:服务中是否存储了可持久化数据
核心因素
- 服务治理
- 可观测性
- 安全性
微服务架构原理及特征
微服务架构的原理在于将复杂的单体应用拆分成一系列小而自治的服务,每个服务具有独立的数据库和运行环境。这些服务之间通过轻量级的通信方式进行交互,通常使用HTTP、RESTful API等。微服务架构的特征包括: 独立性:每个微服务都是独立的,可以独立部署、伸缩和维护。
- 解耦性:微服务之间通过明确定义的接口进行通信,彼此解耦,可以独立进行开发和演化。
- 可扩展性:可以根据需求对具体的微服务进行独立的水平扩展,以应对不同的负载。
- 弹性和容错性:由于服务之间是解耦的,一个服务的故障不会影响整个系统的运行,提高了系统的弹性和容错能力。
- 技术多样性:每个微服务可以使用适合自身需求的技术栈,充分利用各种技术的优点。
核心服务治理功能
微服务架构需要进行有效的服务治理,以保证系统的可靠性和稳定性。核心服务治理功能包括:
服务注册与发现:通过服务注册中心,将服务的地址和元数据注册到中心,其他服务可以根据需求发现并调用注册的服务。
负载均衡:根据服务的负载情况,将请求均衡地分发到各个可用的服务实例上,以保证系统的稳定性和性能。
服务熔断与降级:当某个服务出现故障或超出负载能力时,可以自动熔断和降级,防止故障扩散,并提供最基本的功能。
服务监控与追踪:对服务的运行状态进行监控和追踪,收集关键指标,帮助运维人员进行故障排查和性能优化。
服务间的通信
单体服务的不同模块通信是简单的函数调用
微服务的服务间通信是网络传输。服务间通信使用不同的协议。
-
在代码层面,如何指定调用目标服务的地址(ip:port? 一般不会指定固定的地址。如果一个服务多个实例,只能返回一个ip,且服务的地址可能是动态改变的。
如果使用DNS指定目的地址,部分来看是可以的,但是dns缓存会导致延时,且存在负载均衡问题,不支持服务实例的探活检查,域名无法配置端口。
以DNS思想为启发,使用服务注册中心Service Registry,用于存储服务名到服务实例的映射。 -
服务上线和下线的过程?
服务下线前先在服务注册中心删除该服务,再下线服务是安全的。
服务上线时需要先启动添加,health check(发送请求试探),再将服务注册到注册中心,恢复流量。
流量特征
基于流量的微服务。终端进入内网intranet->api gateway->servcie->offline training job.
rpc是二进制协议,内部的服务调用采用rpc。
系统架构的演进历史
微服务架构的出现可以追溯到服务导向架构(SOA),但SOA的实践中存在着较为复杂的集中式服务总线和重量级的中间件。随着互联网的发展,云计算和容器化技术的兴起,微服务架构逐渐成为一种更加灵活和敏捷的架构方式。微服务架构的演进历史包括:
单体应用:传统的软件开发方式,应用以单体的形式运行,不容易进行独立的扩展和部署。
SOA:引入服务导向架构的思想,将应用拆分成一系列服务,但存在复杂的集中式服务总线和高耦合的问题。
微服务架构:通过轻量级的通信方式和自治的服务,解耦应用,实现敏捷开发、独立部署和可扩展性。
微服务架构的三大要素
微服务架构的成功实施离不开三大要素的支持:
服务拆分:将应用拆分成一系列小的、自治的服务,每个服务专注于完成一个特定的业务功能,拆分的原则可以是业务功能、模块化或团队组织等。
服务通信:通过轻量级的通信机制实现服务之间的交互,常见的通信方式包括HTTP、RESTful API、消息队列等。
服务治理:包括服务注册与发现、负载均衡、服务熔断与降级、服务监控与追踪等功能,确保服务可靠性和系统的弹性。
微服务架构是一种基于解耦、独立部署和可扩展性的软件开发架构。它通过将应用拆分成一系列小而自治的服务,实现敏捷开发、独立部署和可扩展性。微服务架构的核心原理是解耦,通过定义明确的接口和轻量级的通信,实现服务之间的互联。同时,微服务架构也需要进行有效的服务治理,包括服务注册与发现、负载均衡、服务熔断与降级、服务监控与追踪等功能,以保证系统的可靠性和稳定性。
核心服务治理能力
服务发布deployment
让一个服务升级运行新的代码的过程。
在线服务的发布可能出现1)服务不可用2)服务抖动3)服务回滚的问题
- 蓝绿部署。将实例分类后,分别部署
- 金丝雀发布 流量控制和回滚问题
流量治理
基于地区、集群、实例、请求等维度,对端到端流量的路由路径进行精确的流量控制。
负载均衡
负载分配请求在每个下游实例上的分布
稳定性治理
线上问题会出问题但与程序的正确性无关。
- 限流 reject 部分qps
- 熔断
- 过载保护 dynamic overload
- 降级