这是我参与「第五届青训营 」伴学笔记创作活动的第10天
前言
我们都知道当今微服务架构的应用很广,大型的电商网站都改用微服务架构了,所以笔者也来学习微服务架构。在前一篇文章简单讨论过架构的演变史,就不在此提出了,本文主要记录微服务原理及特征、核心服务治理功能这两方面的内容。
微服务原理及特征
基本概念
- 服务(service):一组具有相同逻辑的运行实体。
- 实例(instance):一个服务中每个运行实体即为实例。
- 实例与进程关系:;两者之间没有必然关系,一个实例可以对应一个或多个进程(反之不常见)。
- 集群(cluster):通常指服务内部逻辑划分,包含多个实例。
- 常见的实例承载形式:进程、VM、k8s......
- 有状态/无状态服务:服务实例是否存储了可持久化的数据。
核心要素
微服务架构有大三核心要素。
- 服务治理:服务注册、服务发现、负载均衡、扩缩容、流量治理、稳定性治理......
- 可观测性:日志采集、日志分析、监控打点、监控大盘、异常报警、链路追踪......
- 安全:身份验证、认证授权、访问令牌、审计、传输加密、黑产攻击......
服务的注册及发现
对于单体服务,不同模块的通信只是简单的函数调用;对于微服务,服务间通信意味着网络传输。
那么在代码层面如何调用一个目标服务地址呢?
hardcode?
DNS?
本地DNS存在缓存,导致延时,负载均衡问题,不支持服务实例的探活检查(检查服务是否挂掉),域名无法配置端口。
很显然,以上两种方式都不是最合适的,所以新增一个同统一的服务注册中心,用于存储服务名到服务实例的映射。
1.这里所有服务处于就绪状态(服务上线):
2.这里不想要服务B的实例3,移除服务B的实例3:
3.这里发现实例3并没有通信,清除实例3:
4.这里服务B面临压力,应该增加一个实例:
5.这里添加了一个实例4,但是需要一段时间去检查是否健康(准备工作):
6.这里实例4准备完成,开始注册服务:
7.服务注册成功后,所有检查健康的服务都会一直运行:
流量特征
- 统一网关入口。
- 内通信多采用RPC。
- 网状调用链路。
核心服务治理功能
服务发布
蓝绿部署
所谓蓝绿部署就是同时运行两个版本的应用,部署的时候不停掉旧版本直接部署新版本,新版本运行起来后将流量切换到新版本,简单稳定就是需要两倍资源,如下图所示:
灰度发布(金丝雀发布)
金丝雀(canary)对瓦斯极其敏感,17世纪英国矿工下井时会先放入一只金丝雀确保没有瓦斯。
流量治理
在微服务架构下,我们可以基于地区、集群、实例、请求维度等,对端到端流量的路由路径进行精准控制。
负载均衡(Load Balance)
负载均衡负载分配请求在每个下游实例上分布,常见的LB策略有:Roubd R0bin、Random、Ring Hash、Least Request。
稳定性治理
线上服务总会出问题,这与程序的正确性无关(网络攻击、流量突增、机房断电、光纤被挖、机器故障、网络故障)。
微服务中典型的稳定性治理:限流、熔断、过载保护、降级。
小结
这里只是对微服务概念和原理知识的学习,更多的还是要在实际使用个过程中去体会,不过先打好理论基础再进行实践。
参考
- 字节跳动青训营《微服务框架-不变的基建》课程