微服务开发规范

微服务设计原则

  • 原则一:服务独立、自治
    • 服务独立交付
    • 服务并行启动、停止
    • 通过配置方式定制服务能力
  • 原则二:服务无状态
    • 数据不写入本地jvm、文件系统
    • 支持多实例集群部署
    • 支持至少一种负载均衡模式
    • 定时任务外置到Cron服务或者分布式任务调度平台
  • 原则三:服务前后向兼容
    • 接口是对外服务的唯一方式
    • 以restful风格定义服务接口
    • 接口语言无关
  • 原则四:分层依赖
    • 高可用服务不能依赖于低可用服务
    • 不同服务之间只能通过对外接口通讯,禁止跨服务包引用

微服务SLA规范

SLA:服务等级协议(简称:SLA,全称:service level agreement)

  • 请求成功率
    1. 含义: 测量周期内服务成功应答的请求占总请求数的百分比
    2. 测量方法: (成功应答请求数/总请求数据)*100
    3. 示例: >99%
  • 可用性
    1. 含义: 测量周期内,服务可用时间所占百分比,可用性分为三个等级
    • Lv1:可用性要求最高的核心服务,这类公共服务会被其他大部分服务调用,不可用会影响到用户的使用,例如用户账号、会话登录相关的服务,可用性范围为100%,年不可用时间为0秒
    • Lv2:出现不可用会导致部分业务的用户服务突然中断,是面向业务用户的服务,例如用户产品列表、用户新闻列表服务等,可用性范围为99.999% ~ 99.9999,年不可用时间为5.256分钟 ~ 31.536秒
    • Lv3:出现不可用不会导致用户的服务突然中断,一般是辅助性的服务,例如数据统计、线路校验服务等,可用性范围为99.99% ~ 99.999,年不可用时间为52.56分钟 ~ 5.256分钟
    1. (服务在线时间/统计周期总时间)*100
    2. Lv1
  • 吞吐量
    1. 含义: 每秒钟处理的请求数(接口),对于服务集群建议给出吞吐量的计算公式,例如集群吞吐量=吞吐量*服务实例数
    2. 统计服务每秒钟处理的请求数据
    3. 200
  • TP75请求时延
    1. 含义: 指服务运行周期内75%的请求时延低于定义的值
    2. 使用百分位数方式计算
    3. 200ms
  • TP95请求时延
    1. 含义: 指服务运行周期内75%的请求时延低于定义的值
    2. 使用百分位数方式计算
    3. 180ms
  • TP99请求时延
    1. 含义: 指服务运行周期内75%的请求时延低于定义的值
    2. 使用百分位数方式计算
    3. 100ms

SLA示例:以SessionSvr为例,服务的SLA定义如下

SLA项 定义
请求成功率 99%
可用性 Lv1
吞吐量 单实例:1000qps<br>双实例:1800qps
TP75请求时延 420ms
TP95请求时延 300ms
TP99请求时延 200ms

微服务架构原则

类别 检查项目 级别
服务自治 有独立的代码仓库,根目录与服务名称相同 强制
服务自治 能被单独部署,部署过程中不依赖于其他服务必须运行 强制
服务自治 禁止与其他服务共用数据库 强制
服务自治 服务业务功能完善,粒度适中,不耦合太多业务功能 强制
服务无状态 支持多实例部署,实例可部署到不同节点 强制
服务无状态 服务集群在线伸缩,不影响业务运行 建议
服务无状态 外网调用接口采用异步调用,请求超时不会影响服务吞吐量 强制
服务无状态 业务处理能力线性扩展,增加集群实例可同比增加业务处理能力 强制
服务无状态 具备容灾能力,随机杀死集群某个实例,服务业务功能不受影响 强制
服务无状态 具备故障自动切换能力,无需人工介入 建议
服务前后向兼容 服务接口向后兼容,接口只增、不删,废弃接口按计划灰度回收 强制
服务前后向兼容 从新版本回滚到老版本后(数据存储不回滚),老版本的业务功能正常 强制
分层依赖 禁止服务间的循环调用 强制
分层依赖 禁止依赖低于自身可靠性等级要求的服务 强制

微服务接口设计规范

  1. 标准操作
  • REST风格规定针对资源而执行的操作通过HTTP规范定义
  • 核心操作为GET、PUT、POST、DELETE,对资源的操作可归为增删改查(CRUD)
    • 获取资源:GET
    • 创建一个新资源:向一个URL发送POST
    • 替换已有资源:PUT
    • 删除已有资源:DELET
  • 【规则】所请求的URL不支持该请求操作,返回状态码405(Method Not Allowed)

GET

  • 【规则】GET操作用于获取资源的场景
  • 【规则】GET操作必须具备安全性和幂等性<br> 说明:安全指经过操作后不改变服务器状态,幂等性指不允许对资源状态做相对改动
  • 【规则】GET操作成功返回状态码200(OK)
  • 【示例】获取用户信息:GET /acct/854,获取id为854的用户信息

POST

  • 【规则】POST操作用于用于新建资源的场景
  • 【规则】POST操作成功返回状态码200(OK)
  • 【示例】添加用户信息:POST /acct

PUT

  • 【规则】用于场景资源的更新,若资源不存在则创建
  • 【规则】PUT操作必须具备安全性和幂等性
  • 【规则】PUT操作成功返回状态码200(OK)
  • 【示例】更新用户信息:PUT /acct/854,更新id为854的用户信息

DELETE

  • 【规则】DELETE操作用于用于删除资源的场景
  • 【规则】DELETE操作必须具备安全性和幂等性
  • 【规则】DELETE操作成功返回状态码200(OK)
  • 【示例】删除用户信息:DELETE /acct/854,删除id为854的用户信息
  1. 消息体设计原则
  • 【规则】服务接口至少支持JSON格式作为HTTP消息体
  • 【规则】JSON格式消息体中,KEY值采用JSON通用的小驼峰风格
  • 【规则】消息体返回JSON格式如下:
{
  "code": 200,
  "message": "",
  "timestamp": 9880213099,
  "result": {...}
}