微服务架构及设计模式
缩减成本:MSA 将会降低设计、实现和维护IT服务的总体成本
加快发布速度:MSA 将会加快服务从想法到部署的落地速度
增强弹性:MSA 将会提升我们服务网络的弹性
开启可见性:MSA 支持为服务和网络提供更好的可见性
可扩展性
可用性
韧性
灵活性
独立自主性,自治性
去中心化治理
故障隔离
自动装配
通过 DevOps 持续交付
订单管理负责订单
客户管理则是负责客户
按问题子域进行分解
核心 —— 业务的核心竞争力以及应用程序最有价值的部分
支撑 —— 和业务有关但并不是一个核心竞争力。这些可以在内部实现也可以外包
通用 —— 不特定于业务,而且在理想情况下可以使用现成的软件实现
产品目录服务
库存管理服务
订单管理服务
配送管理服务
准备阶段 —— 在这个阶段,事务的所有参与者都准备提交并通知协调员他们已准备好完成事务
提交或回滚阶段 —— 在这个阶段,事务协调器向所有参与者发出提交或回滚命令
转换(Transform) —— 使用现代方法创建一个并行的全新站点。
共存(Coexist) —— 让现有站点保留一段时间。把针对现有站点的访问重定向到新站点,以便逐步实现所需功能。
消除(Eliminate) —— 从现有站点中删除旧功能。
存在不同渠道对多个微服务的多次调用
需要处理不同类型的协议
不同的消费者可能需要不同的响应格式
API 网关是任何微服务调用的单一入口点
它可以用作将请求路由到相关微服务的代理服务
它可以汇总结果并发送回消费者
该解决方案可以为每种特定类型的客户端创建一个细粒度的 API
它还可以转换协议请求并做出响应
它也可以承担微服务的身份验证/授权的责任
一个组合微服务将调用所有必需的微服务,合并数据,然后在发送回数据之前对其进行转换合成
一个 API 网关还可以将请求划分成多个微服务,然后在将数据发送给使用者之前汇总数据
移动端 API,它实现了 FTGO 移动客户端的 API
浏览器端 API,它实现了在浏览器里运行的 JavaScript 应用程序的 API
公共API,它实现了一些第三方开发人员需要的 API
服务必须是松耦合的。这样它们可以独立开发,部署和扩展
业务事务可能会强制跨越多个服务的不变量
一些业务事务需要查询多个服务的数据
为了可扩展性考虑,数据库有时候必须是可复制和共享的
不同服务存在不同的数据存储要求
命令端处理创建,更新和删除请求
查询端通过使用物化视图来处理查询部分
编舞(Choreography)—— 在没有中央协调的情况下,每个服务都会生成并侦听另一个服务的事件,并决定是否应该采取措施。编舞是一种指定两个或多个参与方的方案。任何一方都无法控制对方的流程,或者对这些流程有任何可见性,无法协调他们的活动和流程以共享信息和值。当需要跨控制/可见性域进行协调时,请使用编舞的方式。参考一个简单场景,你可以把编舞看作和网络协议类似。它规定了各方之间可接受的请求和响应模式。
图3 Saga模式 —— 编舞
编排(Orchestration)—— 一个编排器(对象)会负责 saga 的决策和业务逻辑排序。此时你可以控制流程中的所有参与者。当它们全部处于一个控制域时,你可以控制该活动的流程。当然,这通常是你被指派到一个拥有控制权的组织里制定业务流程。
图4 Saga模式 —— 编排
推送——服务将指标推送到指标服务,例如 NewRelic,AppDynamics
提取——指标服务从服务中提取指标,例如 Prometheus
为每个外部请求分配一个唯一的外部请求ID
将外部请求ID传递给处理该请求链路的所有服务
在所有日志消息中加入该外部请求ID
客户端:例如:Netflix Eureka
服务端:例如:AWS ALB