初识go语言-微服务架构原理 | 青训营笔记

113 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第10天

前言

我们都知道当今微服务架构的应用很广,大型的电商网站都改用微服务架构了,所以笔者也来学习微服务架构。在前一篇文章简单讨论过架构的演变史,就不在此提出了,本文主要记录微服务原理及特征核心服务治理功能这两方面的内容。

微服务原理及特征

基本概念

  • 服务(service):一组具有相同逻辑的运行实体。
  • 实例(instance):一个服务中每个运行实体即为实例。
  • 实例与进程关系:;两者之间没有必然关系,一个实例可以对应一个或多个进程(反之不常见)。
  • 集群(cluster):通常指服务内部逻辑划分,包含多个实例。
  • 常见的实例承载形式:进程、VM、k8s......
  • 有状态/无状态服务:服务实例是否存储了可持久化的数据。

QQ截图20230204192225.png

核心要素

微服务架构有大三核心要素。

  • 服务治理:服务注册、服务发现、负载均衡、扩缩容、流量治理、稳定性治理......
  • 可观测性:日志采集、日志分析、监控打点、监控大盘、异常报警、链路追踪......
  • 安全:身份验证、认证授权、访问令牌、审计、传输加密、黑产攻击......

服务的注册及发现

对于单体服务,不同模块的通信只是简单的函数调用;对于微服务,服务间通信意味着网络传输。

那么在代码层面如何调用一个目标服务地址呢?

hardcode?

QQ截图20230204191628.png

DNS?

QQ截图20230204192359.png

本地DNS存在缓存,导致延时,负载均衡问题,不支持服务实例的探活检查(检查服务是否挂掉),域名无法配置端口。

很显然,以上两种方式都不是最合适的,所以新增一个同统一的服务注册中心,用于存储服务名到服务实例的映射。

1.这里所有服务处于就绪状态(服务上线):

QQ截图20230204193051.png

2.这里不想要服务B的实例3,移除服务B的实例3:

QQ截图20230204193113.png

3.这里发现实例3并没有通信,清除实例3:

QQ截图20230204193137.png

4.这里服务B面临压力,应该增加一个实例:

QQ截图20230204193746.png

5.这里添加了一个实例4,但是需要一段时间去检查是否健康(准备工作):

QQ截图20230204193815.png

6.这里实例4准备完成,开始注册服务:

QQ截图20230204194323.png

7.服务注册成功后,所有检查健康的服务都会一直运行:

QQ截图20230204194357.png

流量特征

  • 统一网关入口。
  • 内通信多采用RPC。
  • 网状调用链路。

QQ截图20230204194837.png

核心服务治理功能

服务发布

蓝绿部署

所谓蓝绿部署就是同时运行两个版本的应用,部署的时候不停掉旧版本直接部署新版本,新版本运行起来后将流量切换到新版本,简单稳定就是需要两倍资源,如下图所示:

QQ截图20230204195858.png

灰度发布(金丝雀发布)

金丝雀(canary)对瓦斯极其敏感,17世纪英国矿工下井时会先放入一只金丝雀确保没有瓦斯。

QQ截图20230204200228.png

流量治理

在微服务架构下,我们可以基于地区、集群、实例、请求维度等,对端到端流量的路由路径进行精准控制。

QQ截图20230204200802.png

负载均衡(Load Balance)

负载均衡负载分配请求在每个下游实例上分布,常见的LB策略有:Roubd R0binRandomRing HashLeast Request

QQ截图20230204200646.png

稳定性治理

线上服务总会出问题,这与程序的正确性无关(网络攻击、流量突增、机房断电、光纤被挖、机器故障、网络故障)。

微服务中典型的稳定性治理:限流、熔断、过载保护、降级

QQ截图20230204201808.png

小结

这里只是对微服务概念和原理知识的学习,更多的还是要在实际使用个过程中去体会,不过先打好理论基础再进行实践。

参考

  • 字节跳动青训营《微服务框架-不变的基建》课程