Spring响应式微服务: Spring Boot 2 + Spring 5+Spring Cloud 实战
郑天民 著
2019.6出版
云原生基础理论
云原生所需要的能力和特征
The Twelve Factors
12-Factors经常被直译为12要素,也被称为12原则,描述如何利用云平台提供的便利来开发更具可靠性和扩展性、更加易于维护的云原生应用。
另外还有补充的三点:
- API声明管理
- 认证和授权
- 监控与告警
云原生应用的三大特征:
- 容器化封装:
以容器为基础,提高整体开发水平,形成代码和组件重用,简化云原生应用程序的维护。在容器中运行应用程序和进程,并作为应用程序部署的独立单元,实现高水平资源隔离。 - 动态管理:
通过集中式的编排调度系统来动态的管理和调度。 - 面向微服务:
明确服务间的依赖,互相解耦。
云原生架构的原则
云原生架构的重点是通过横向扩展、分布式处理,以及自动更换故障组件来实现弹性和扩展。
云原生架构的高层次元素
- 系统的功能需求(它应该做什么,例如“以这种格式处理订单…”);
- 非功能性要求(如“每分钟至少处理 200 个订单”);
- 约束(超出变更范围的内容,例如“订单必须在我们现有的大型机系统上更新”)。
谷歌云原生架构的 5 条原则
- 原则 1:自动化设计
- 原则 2:善用状态
- 原则 3:支持托管服务
- 原则 4:深入实践防御
- 原则 5:架构不止
自动化云原生系统的一些常见领域:
- 基础设施:
使用 Google Cloud Deployment Manager 或 Terraform 之类的工具,自动创建基础设施并对其进行更新; - 持续集成 / 持续交付(CI/CD):
使用 Google Cloud Build 、 Jenkins 和 Spinnaker 等工具自动构建、测试和部署构成系统的软件包。不仅应该自动部署,还应该努力实现金丝雀测试和回滚等过程的自动化; - 伸缩性(Scale Up/Down):
除非系统负载几乎从未发生变化,否则应该根据负载的增加自动扩展系统,并根据负载的持续下降进行收缩。通过扩展,可以确保服务仍然可用,并通过按比例收缩来降低成本。这对于大型应用程序(如公共网站)以及具有不规则负载的较小应用程序(例如在某些时段非常繁忙但在其他时间几乎不使用的内部应用程序)来说是很有意义的。对于有时几乎没有流量并且可以容忍一些初始延迟的应用程序,甚至应该考虑将其收缩为零(删除所有正在运行的实例,并在下次需要时重新启动应用程序); - 监控和自动恢复:
应该从一开始就在云原生系统中纳入监控和日志记录。日志记录和监视的数据流可以很自然地用于监视系统的运行状况,除此之外还可以有许多用途。例如,它们可以对系统的使用和用户的行为(有多少人在使用系统,他们在使用什么部分,他们的平均延迟时间是多少等)提供有价值的见解。其次,它们可以通过汇总来衡量整个系统的健康状况(例如,磁盘又快满了,它的填写速度比平时快吗?磁盘使用量和服务占用之间的关系是什么?等等)。最后,它们是添加自动化理想的地方,当磁盘要填满时,可以自动调整磁盘大小以保持系统正常运行,而不仅仅只记录错误。
领域驱动设计
基本概念
- 通用语言 ubiquitous language
- 限界上下文 boundary context:语义和语境上的边界
- 子域 sub-domain
- 上下文映射 context maping
子域类型
- 核心域
- 支撑子域
- 通用子域
上下文映射的种类
- 合作关系
- 共享内核
- 客户供应商
- 跟随者
- 防腐层
- 开放主机服务
- 已发布语言
- 各行其道
战术设计
- 聚合根
- 领域事件
- 事件风暴
设计的技术维度
- 聚合 aggregate
- 领域事件 domain event
领域划分原则
- 服务关联度原则
- 业务能力职责单一原则
- 领域名字代表的自然语言上下文保持互相独立
- 读写分离原则
- 组织关系原则
微服务划分原则
- 垂直划分优先原则
- 持续演进原则
- 服务自治,接口隔离原则
- 自动化驱动原则
服务拆分策略
- 前后端拆分
- 把经常变更的部分拆分
- 把公共的部分进行拆分
- 根据业务拆分
- 根据领域模型拆分
服务设计核心标准
- 服务无状态 service statelessness
- 服务可重用 service reusability
- 服务可发现 service discoverability
- 服务自治 service autonomy
- 服务松耦合 service loose coupling
服务集成模式
- 接口集成
- RPC
- REST
- Message
- ESB
- 数据集成
- 共享数据库 shared database
- 数据复制 Data replication
- 客户端集成
- 外部集成
微服务核心组件
- 服务通讯
- 事件驱动
- 负载均衡
- 服务路由
- API网关
- 配置管理
服务注册与发现
组件名 | 语言 | CAP | 一致性算法 | 服务健康检查 | 对外暴露接口 |
---|---|---|---|---|---|
Eureka | Java | AP | 无 | 可配支持 | HTTP |
Consul | Go | CP | Raft | 支持 | HTTP/DNS |
Zookeeper | Java | CP | Paxos | 支持 | 客户端 |
etcd | Go | CP | Raft |