微服务框架 - 不变的基建 | 青训营笔记

73 阅读2分钟

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

微服务架构

介绍

演变历史

单体->垂直->分布式->SOA->微服务

微服务架构除了服务本身,有网关处理外部流量,还有服务配置和治理、链路追踪和监控两大组件

微服务架构最核心的三点要素是服务治理、可观测性、安全

彻底的服务化

优势:

  1. 开发效率
  2. 业务独立设计
  3. 自下而上
  4. 故障隔离

劣势:

  1. 治理、运维难度
  2. 观测挑战
  3. 安全性
  4. 分布式系统

原理及特征

  • 基本概念

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

    服务间通信

    对于单体服务,不同模块通信只是简单的函数调用

    对于微服务,服务间通信意味着网络传输

  • 服务注册与发现

    在代码层面,如何指定调用一个目标服务的地址(ip:port)?

    hardcode?

    //I want to call service B.

    net.Dial("10.23.45.67:8080")

    • 不太可能指定一个固定的IP地址
    • 一个服务里面有多个实例

    DNS?

    //I want to call service B.

    net.Dial("b.service.org:8080")

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

    解决思路:新增一个统一的服务注册中心,用于存储服务名到服务实例的映射

    //I want to call service B.

    addrs = svc_reg.find("service.b")

    net.Dial(addrs[random(n)])

  • 流量特征

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

核心服务治理功能

  • 服务发布

    让一个服务升级运行新的代码的过程

    难点:

    • 服务不可用
    • 服务抖动
    • 服务回滚

    服务发布有两种,蓝绿部署,灰度发布(金丝雀发布),蓝绿部署简单、稳定,但需要两倍资源

  • 流量治理

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

  • 负载均衡

    负载均衡(Load Balance)负责分配请求在每个下游实例上的分布

  • 稳定性治理

    线上服务总是会出问题的,这与程序的正确性无关

    微服务架构中典型的稳定性治理功能有限流、熔断、过载保护、降级