微服务
- 内聚、专注、独立、足够小
- 自治性、互相隔离
- 服务间通过网络通信
- 弹性、可扩展(集群、分布式)
- 部署简化、定位精准
- 互相组合、单个优化简单
建模
- 松耦合
- 高内聚
- 限界上下文(由显式边界限定特定责任)
- 细胞之所以存在,是因为细胞壁定义了什么在细胞内,什么在细胞外,并确定什么物质可以通过细胞壁。
- 先从单块系统理解服务边界,再划分微服务(不宜过早划分)。
- 识别出粗粒度的限界上下文,再划分嵌套的上下文。
集成
- 微服务间通信方式
- SOAP
- XML-RPC
- Thrift
- REST
- Protocol Buffers
- 避免破坏性修改
- 保证 API 技术无关性(对任何第三方对接都没有技术限制)
- 消费方容易接入
- 隐藏内部实现细节
- 同步与异步的选择
- 编排与协同
- RPC
- 低延迟通信场景(TCP、UDP)
- 避免过度抽象以至于网络因素被隐藏
- 确保可独立升级服务而不用强迫客户端升级
- 网络质量监控、远程调用链路监控(日志)
- REST
- 大流量通讯场景
- HTTP 协议与错误码
- 动词
- Json
- 响应式扩展(把多个调用的接口组装并执行)
- DRY(Don`t repeat yourself),代码重用需谨慎
- 版本管理
- 不同接口共存
- 旧接口请求转换,V1 转去 V2
分解单块系统
- 数据表分离
- 数据库分离
- 应用程序分离
- 事务边界
- 最终一致性,主流程启用事务,其他操作异步触发(例如捕获下单成功后,仓库处理可以走异步订阅模式)
- 补偿事务抵消之前操作
- 分布式事务,由“事务管理器”统一协调所有底层系统运行的事务(常见:两阶提交)
- 报表
- 单独的中央报表数据库( 数据汇总、DMP)
持续集成(CI)
- 每个微服务都有一个源代码库和 CI 的构建
- 持续交付(CD)
- 对代码从提交到上线部署的过程中所需要的经历的流程建模
- 将镜像作为构建物(Docker images)
- 自动化处理
测试
测试金字塔,越往上,测试覆盖范围更大,对系统测试更有信心(时间消耗更长,错误模块定位难),越往下,模块越小,测试更快,隔离更好。
- 单元测试(测试函数和方法调用)
- 服务测试、消费者驱动测试
- UI 测试
- 性能测试
- 安全测试
监控
- 日志(如:Logstash 、Kibana)
- 服务指标跟踪(如:Graphite、Coolectd,返回响应时间等)
- 系统综合监控(如:Nagios)
- 语义监控(我的理解是:是用真实流量测试)
- 服务关联标识(服务链路 GUID,方便查询日志,如:Zipkin)
安全
- 身份验证与授权
- SSO 单点登录
- Oauth 授权
- 细粒度授权
- Https
- API 密钥
- 数据加密
- 深度防御
- 防火墙
- 敏感操作日记
- 入侵检测(IDS)
- 入侵预防(IPS)
- 网络隔离(VPN)
- 内建安全(CI 构建时漏洞扫描)
- 外部验证(外部信息安全团队实施渗透测试)
网友评论