一、目前进展
1 基础环境搭建成功(与架构图相比并不完整)
2 分布式服务、多源数据配置demo已经跑通
二、阐述思想
这种大项目更有意义的是技术的选型和管理。我觉得面试官一定会问为什么选择这种技术,这种技术相对于其他技术有什么优缺点,系统的稳定性、可承受的并发量等等问题。在这篇文章将着重讲述技术选型和最终设计架构。
本来应该在第一节讲述技术选型的,但是第一节的基础环境无论将来如何选型一定要使用的,所以就放在了第二节,那么开始吧:
设计目标就是前文所阐述的目的,虽然性能指标不好预估,但是我会尽可能考虑这些问题,
三、选型准则
对于技术选型,每个人有很多标准,其中下面三项是最重要的(参考网站):
- 生产级
我们选择的技术栈是要解决实际业务问题和上生产抗流量的(选择不慎可能造成生产级事故),而不是简单做个 POC 或者 Demo 展示,所以生产级(Production Ready),可运维(Ops Ready),可治理,成熟稳定的技术才是我们的首选; - 一线互联网公司落地产品
我们会尽量采用在一线互联网公司落地并且开源的,且在社区内形成良好口碑的产品,它们已经在这些公司经过流量冲击,坑已经基本被填平,且被社区接受形成一个良好的社区生态(本文附录部分会给出所有推荐使用或参考的开源项目的 GitHub 链接)。 - 开源社区活跃度
GitHub 上的 stars 的数量是一个重要指标,同时会参考其代码和文档更新频率(尤其是近年),这些指标直接反应开源产品的社区活跃度或者说生命力。
另外,对于不同业务体量和团队规模的公司,技术选型标准往往是不同的,创业公司的技术选型和 BAT 级别公司的技术选型标准可能完全不同。本文主要针对日流量千万以上,研发团队规模不少于 50 人的公司,如果小于这个规模我建议认真评估是否真的需要采用微服务架构。考虑到 Java 语言在国内的流行度和我个人的背景经验,本文主要针对采用 Java 技术栈的企业。本文也假定自建微服务基础架构,有些产品其实有对应的云服务可以直接使用,自建和采用云服务各有利弊,架构师需要根据场景上下文综合权衡。
我的阐述
除了这些还有一些关键问题,包括但不限于以下:
- 服务注册中心可选择:ZooKeeper、Nacos、Consul和Eureka等
摘自官网:What is ZooKeeper?:ZooKeeper是用于维护配置信息,命名,提供分布式同步以及提供组服务的集中式服务。
推荐篇文章讲述各种注册中心框架对比:主流微服务注册中心浅析和对比
什么是 Nacos:Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Spring Cloud Consul 通过自动配置并绑定到Spring Environment和其他Spring编程模型习惯用法,为Spring Boot应用程序提供Consul集成。通过一些简单的注释,您可以快速启用和配置应用程序内部的通用模式,并使用Hashicorp的Consul构建大型分布式系统。提供的模式包括服务发现,分布式配置和控制总线。
最终我使用Nacos,相信阿里的框架也为了配置中心、服务总线的统一。 - 服务配置可选择:Nacos、Spring Cloud Config、Apollo
我参考这篇文章:架构设计之微服务配置中心选型,最终选择了Nacos。 - 分布式服务一致性框架选择:Seata
Seata 是什么?Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 - 服务调用选择:Ribbon、openfeign
- 服务降级选择:sentinel
- 服务网关选择:gateway
整体架构设计:
四、开始编写demo
1.1 分布式服务
使用Seata框架保证分布式服务一致性问题,首先要去了解seata框架处理过程(摘自官网):
一个分布式的全局事务,整体是 两阶段提交 的模型。全局事务是由若干分支事务组成的,分支事务要满足 两阶段提交 的模型要求,即需要每个分支事务都具备自己的:
一阶段 prepare 行为;
二阶段 commit 或 rollback 行为。
1)建立数据库以及undo_log表
建立数据库用来模拟事务过程,因为在seata执行过程中需要使用undo_log表记录可能回滚的数据(节点之间还没达成事务完成共识),所以需要创建该表,该表sql:点击下载
2)引入依赖
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
3)配置seata文件、配置注册进nacos
这里一定注意tx-service的值,我这里是:my_test_tx_group
,与下面的对应:
seata:
enabled: true
application-id: client
tx-service-group: my_test_tx_group
config:
type: nacos
nacos:
namespace:
serverAddr: 192.168.100.201:8848
group: SEATA_GROUP
username: "nacos"
password: "nacos"
registry:
type: nacos
nacos:
application: seata-server
serverAddr: 192.168.100.201:8848
group: SEATA_GROUP
namespace:
username: "nacos"
password: "nacos"
4)微服务之间的调用使用Feign来实现,不重点讲述调用过程,详细推荐看demo代码
1.2 多源数据配置
可参考:[Mybatis]MybatisPlus的使用以及多源数据配置dynamic-datasourc
五、demo功能
1. 数据库表说明
1.1 account表存储每个用户拥有的商品数
1.2 product表存储每个商品剩余库存
1.3 orders表为订单表,存储所有订单
2. 购买商品流程
① 查询商品余额
② 减少商品库存
③ 增加账户拥有商品数
④ 向订单表写入该订单
六、测试代码
1. 模拟正常处理事务
2. 模拟步骤③错误
3. 模拟步骤④错误
预期结果和实际结果相同。
代码:点击进入
七、下阶段目标
- 采用使用分布式数据库
- 结合RabbitMQ实现派单引擎、消息引擎
- 完成集群启动整个流程步骤文档