这是我参与【第五届青训营】伴学笔记活动的第九天
关于微服务
微服务架构是目前大多数互联网公司的标准架构
系统架构的演变历史
微服务架构的特点
微服务原理
基本概念
- 服务:
一组具有相同逻辑的运行实体
- 实例
一个服务中的每个运行实体
- 实例与进程的关系
没有必然对应关系,一般1对1,或者1对多
-
集群 -通常指服务内部的逻辑划分,包含多个实例
-
常见的实例承载形式
进程、VM、k8s pod
- 有/无状态服务 服务的实例是否存储了可持久化的数据
服务间通信
通信方式:
- 一对一: 每个客户端请求由一个服务实例处理;
- 一对多: 每个客户端请求由多个服务实例处理;
- 同步模式: 客户端请求需要服务端实时响应,客户端等待响应时间可能会阻塞;
- 异步模式: 客户端请求不会阻塞进程,服务端的响应可以是非实时的;
- 微服务之间通过网络进行通信
- 常见的通信协议包括 HTTP、RPC
服务注册及服务发现
-
基本问题
- 服务间调用中,如何指定下游服务实例的地址?
-
简单方案
-
直接指定 ip:port?
- 没有任何动态能力
- 有多个实例下游实例怎么办?
-
使用 DNS?
- 本地 DNS 存在缓存,导致延迟
- DNS 没有负载均衡
- 不支持服务探活检查
- DNS 不能指定端口
-
-
服务注册发现
- 新增一个统一的服务注册中心,用于存储服务名到服务实例之间的映射关系
- 旧服务实例下线前,从服务注册中心删除该实例,下线流量
- 新服务实例上线后,在服务注册中心注册该实例,上线流量
-
微服务流量特征
-
统一网关入口
-
外网通信多数采用 HTTP,内网通信多数采用 RPC(Thrift, gRPC)
-
字节跳动微服务实践——重试
远程函数调用相比于本地调用,存在着许多挑战,如网络抖动、下游熔断等
重试的好处
重试的难点
幂等性
什么是幂等性?
f(f(x))=f(x)
若服务难以保证幂等性,则会出现每次调用得到的结果不同的现象
重试风暴
随着调用深度的增加,重试次数会指数级上涨(稍后分析)
超时设置
假设一个调用正常是1s的超时时间,如果允许一次重试,那么第一次请求经过多少时间时,才开始重试呢?
参考资料