微服务架构
暗物质
五种暗能量
- Simple components
- 单体应用内部按模块拆分,或者拆分成多个简单组件
- Design modular components
- Design smaller components
- Team autonomy
- N个团队,彼此交流,就是 $O(N^2)$ 复杂度,A团队需要等 B 团队会议沟通,效率很低
- Design loosely coupled subdomains
- Use a modular monolith to separate subdomains
- Use a microservice architecture to physically separate subdomains
- Fast deployment pipeline
- 尽可能的快速、频繁的部署,这样能快速得到反馈
- Use build acceleration technologies
- Implement a merge queue
- Careful physical design of the component
- Design smaller components by separating subdomains
- Design components so they can be tested locally
- Multiple technology stacks
- 可以用不同的技术栈,将其隔离开来,互不影响
- Subdomains using different technology stacks should be packaged as separate components
- Packaging subdomains as separate services make technology upgrades easier
- Experimentation to discover new technology is useful
- Segregate by characteristics,例提高可伸缩性的资源需求,提高可用性的可用性需求,提高安全性的安全需求,等等
- Resource requirements
- Domain-specific software development regulations
- Business criticality
- Security
- DDD subdomain type
暗物质有五种力量
- Simple interactions,一些简单重要的操作可以放在一起
- Efficient interactions,涉及大量网络往返和大量数据传输的分布式操作可能效率太低
- Prefer ACID over BASE,例如,将操作实现为ACID事务比最终一致的传奇更容易
- Minimize runtime coupling
- Minimize design time coupling
相关的模式
Service collaboration patterns
- Saga 模式
- CQRS 模式
- API composition
Communicate
- Messaging,如 Apache Kafka、RabbitMQ
- Remote Procedure Invocation,如 REST、gRPC、Apache Thrift
一些重要的设计
- Database per Service pattern
- API Gateway pattern
- Circuit Breaker
- Access token
可观测性模式
- Log aggregation
- Application metrics
- Audit logging
- Distributed tracing
- Exception tracking
- Health check API
- Log deployments and changes
Testing patterns
- Service Component Test
- Service Integration Contract Test
UI 模式
- Server-side page fragment composition
- Client-side UI composition
CQRS 模式
- 命令与读取操作的是不同的数据库,
- 命令端通过ORM框架将实体保存到 写库 (Write Db), 并将本地改动推送到 读库 (Read Db)
- 查询端通过数据访问层访问 读库 (Read Db), 使用这种模式可以带来以下好处:
- 查询更简单
- 读操作不需要任何的完整性校验, 也不需要外键约束, 可以减少锁争用
- 我们可以针对查询端单独优化,
- 还可以使用刚好包含每个模板需要的数据的数据库视图,使得查询变得更快更简单
- 提升查询端的使用体验
- 由于这种架构将读写彻底分离,由于一般系统是读操作远远大于写操作,
- 这给我们的系统带来了巨大的性能提升, 极大的提升了客户的使用体验
- 关注点分离
- 读写分离的模型可以使得关注点分离, 使得读模型会变得相对简单
SAGA 模式
- 假设 T 是执行事务, C 是恢复事务
- 向前进行, T1 -> T2 -> T3 -> T4 -> T5
- 恢复模式, T1 -> T2 -> T3 -> C3 -> C2 -> C1
- 编排(Choreography),事务之间通过 消息异步传递
- 控制(Orchestration),提供一个中央控制器,方面控制,避免循环依赖
微服务的模式语言
领域驱动设计
- 首先应建立领域模型,确定领域限界上下文,然后才进行微服务拆分,
- 如果是 数据驱动原则/界面驱动原则 ,那么,是一上来就定义数据库表结构,就去调整领域逻辑代码。
- 领域模型和领域服务应具有高度通用性、稳定性,通过接口层和应用层屏蔽外部变化对业务逻辑的影响
- 保证核心业务功能的稳定性。
- 基于领域模型进行拆分,围绕业务领域按职责单一性、功能完整性拆分。
DDD 设计
1、用模型表达业务实体
- 使用模型来表达业务概念和知识,并指导数据库、API 等软件的进一步设计。模型思维是软件工程中重要的思维之一,它可以简化复杂问题,并从某一个视角出发让人们更加容易理解问题。
- 模型是对现实世界的简化,例如地图就是一种有效的模型,帮助人们理解道路和街道
- 领域模型就是对业务领域简化的模型。
2、识别模型的边界
- 领域模型集合之间由于业务的相关性可能形成松散的边界,这些边界就是我们分解复杂、大型问题为局部、消息问题的契机
- 通过辨析模型的相关性,找到边界就能为软件模块的划分(单体架构)、服务的划分(微服务架构)提供指导
- 在领域驱动中,识别出来的边界被称为界限上下文。
3、识别聚合
- 在数据库的关系模型中,模型为一张网络结构。这样对于代码实现存在困扰,因为难以处理业务的一致性问题
- 例如,订单、订单项目、商品之间,订单和订单项目的关系更加密切,具有相同的业务生命周期
- 在领域驱动设计理念中,我们使用聚合代表一组模型的从属关系,其中起到关键带头作用的模型被叫做聚合根,除此之外被叫做实体和值对象
- 如果一个聚合只有一个实体,那么聚合根就是这个实体
4、区分实体和值对象
- 除了聚合根和实体之外,有一些模型看起来就像一次性的,他们没有自己的 ID 来标明身份,更多的是作为某个实体的一部分,表达几个字段的集合
- 例如,在电商系统中,用户设定的常用地址,就是典型的实体,它有自己的 ID 作为身份。但当用户为订单选择地址时,这时的地址只是订单上的若干字段,我们就会把它处理为值对象
5、操作模型
- 在领域驱动设计中,为了操作这些模型,又衍生了一些作为“操作者”的对象。
- 工厂:处理领域模型创建过程的对象,但有时候不是必须的。
- 服务:用来处理某些业务逻辑的对象。例如,为订单计算总价,或者校验一些业务规则。
- 仓储:负责将领域模型持久化到数据库中或从数据库中重建的对象,它的目的是为了隔离领域模型和技术实现之间的差异
6、操作模型
- 为了更好的组织项目中各种各样的对象,我们需要像计算机网络一样分层,来简化复杂项目的复杂性
- 在领域驱动设计中,推荐使用四层架构
- (1)用户接入层:处理用户接入的数据结构,例如 RESTful API,或者事件
- (2)应用层:处理用户的业务操作逻辑,也就是用例,它和用户的使用场景相关
- (3)领域层:处理通用的领域逻辑,也就是较为专业的业务逻辑,例如订单价格计算
- (4)基础设施层:用来和基础设施适配,例如连接数据库,操作 Redis等
7、建立领域模型
- 为了从业务知识中提取出领域模型,人们发明了很多种方法
- 事件风暴是一种流行的软件建模方法。它的形式是通过工作坊引导业务人员和技术人员共同创作领域模型,以业务事件为线索,探索系统中可能的领域模型
- 除了事件风暴之外,彩色建模也是一种常用的建模方法。它通过颜色区分不同领域模型的特点,来澄清领域模型的职责。彩色建模在过去的很多年里曾非常流行
Spring系列
SpringBoot
- starter 方式自动整合了一堆外部依赖,还免去了版本不匹配问题
- 内置 web容器,观察指标,Spring WebFlux 响应式编程
- 各种注解,约定配置省去大量配置参数
- 配置文件方式注入,Value,Config 等相关注解
- 数据库层面,使用JdbcTemplate,以及JPA注解,一对多,一对一那种,各种持久化注解
- RestTemplate,类似的回调机制,各种Mapping 注解,body,param,GET/POST 等
- security模块,用户名/密码认证,访问ULR地址控制等
- spring-boot admin,提供个多的观测指标,JVM和GC信息等
- 基于消息和流的整合,整合各种单元测试,数据库Mock,RestMock等
包分层结构
- config,通过配置参数注入到配置类中
- entity,实体层,数据库层结构映射为对象结构
- mapper,数据访问 Data Access Object (DAO),一般只有mybatis生成的接口,自动创建实现类
- controller,跟 REST 交互的 HTTP 请求/响应类
- service,具体的业务逻辑类
- mq,跟消息队列交互的类
- client,跟外部服务交互的 REST 类
- init,实现类 ApplicationRunner 类的初始化类
在线接口文档管理
- APIDOC
- Spring REST Docs
- Swagger
服务注册中心的产品可供选择
- Consul
- Zookeeper
- Etcd
- Eureka
- Nacos
Spring Cloud 体系下常用的调用方案
- RestTemplate
- Ribbon,Netflix出品,LB策略:随机、轮询、重试、响应时间权重和最空闲连接
- Feign,内部也使用了 Ribbon 来做负载均衡功能
容错
- Hystrix,1.5.18后进入维护模式
- Hystrix Dashboard
- fallback模式:@FeignClient(value = “card-service”, fallback = MemberCardServiceFallback.class)
- resilience4j
配置中心
- Spring Cloud Config,需要借助 Git
- 携程的 Apollo(阿波罗)
- 淘宝的 Diamond
- 百度的 Disconf
- 360 的 QConf
- 阿里的 Nacos
- 也可以基于 Zookeeper
缓存
- Spring Data Redis,依赖于 Jedis 或 lettuce 客户端
- 在项目启动时就加载缓存,待数据变更后再回刷缓存
- @Order(value = 1)//order 是加载顺序,越小加载越早,若有依赖关于,建议按顺序排列即可
定时任务选型
- XXL-JOB
- Elastic-Job
- Quartz
- TBSchedule
- Timer 和 TimerTask 是Java组件
- ScheduledExecutorService、ExecutorService
- @EnableScheduling
- ShedLock 可以使我们的定时任务在同一时刻,最多执行一次
Backend For Frontend,意为服务于前端的后端
- 可以采用 Java、Node.js、PHP 或者 Go 等其它语言来实现 BFF 层
- 倾向于由前端代码构建,因为 BFF 层与前端贴合更紧密
消息中间件
- Apache ActiveMQ
- RabbitMQ
- ZeroMQ
- Kafka
- Apache RocketMQ
- @StreamListener(Sink.INPUT)
- @EnableBinding({Source.class})
RPC
- Dubbo,现跟 Spring cloud 整合已经很好了
- 有一整套的生态系统
网关
- Spring Cloud Gateway,替代了 Zuul,其已经进入维护期了
- 在 Gateway 模块中引入 Hystrix 可以做熔断降级处理
- Gateway 组件内部默认实现了 Redis + Lua 进行限流
- 默认提供的 RedisRateLimter 的核心逻辑为判断是否取到令牌的实现
- 跨域支持,前后端分离部署后,需要支持跨域请求
- JWT,轻量级的网关鉴权方案
- 通过 swagger,将所有微服务 API 做聚合展示
分布式事务,Seata
- TC——事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚,独立于各应用之外。
- TM——事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务,也就是事务的发起方。
- RM——资源管理器:管理分支事务处理的资源,与 TC 交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚,RM 自当是维护在各个微服务中
- @Transactional(rollbackFor = Exception.class)
- @GlobalTransactional
分布式锁
- 基于 redis 集群的 Redission
系统应用监控
- Actuator 插件
- Spring Boot Admin
服务链路跟踪
- Application Performance Management APM
- Pinpoint
- Zipkin
- CAT
- SkyWalking