[SpringCloud]从零搭建基于SpringCloud的网约车后端项目(二)

一、目前进展

1 基础环境搭建成功(与架构图相比并不完整)

2 分布式服务、多源数据配置demo已经跑通

二、阐述思想

这种大项目更有意义的是技术的选型和管理。我觉得面试官一定会问为什么选择这种技术,这种技术相对于其他技术有什么优缺点,系统的稳定性、可承受的并发量等等问题。在这篇文章将着重讲述技术选型和最终设计架构。
本来应该在第一节讲述技术选型的,但是第一节的基础环境无论将来如何选型一定要使用的,所以就放在了第二节,那么开始吧:
设计目标就是前文所阐述的目的,虽然性能指标不好预估,但是我会尽可能考虑这些问题,

三、选型准则

对于技术选型,每个人有很多标准,其中下面三项是最重要的(参考网站):

  1. 生产级
    我们选择的技术栈是要解决实际业务问题和上生产抗流量的(选择不慎可能造成生产级事故),而不是简单做个 POC 或者 Demo 展示,所以生产级(Production Ready),可运维(Ops Ready),可治理,成熟稳定的技术才是我们的首选;
  2. 一线互联网公司落地产品
    我们会尽量采用在一线互联网公司落地并且开源的,且在社区内形成良好口碑的产品,它们已经在这些公司经过流量冲击,坑已经基本被填平,且被社区接受形成一个良好的社区生态(本文附录部分会给出所有推荐使用或参考的开源项目的 GitHub 链接)。
  3. 开源社区活跃度
    GitHub 上的 stars 的数量是一个重要指标,同时会参考其代码和文档更新频率(尤其是近年),这些指标直接反应开源产品的社区活跃度或者说生命力。
    另外,对于不同业务体量和团队规模的公司,技术选型标准往往是不同的,创业公司的技术选型和 BAT 级别公司的技术选型标准可能完全不同。本文主要针对日流量千万以上,研发团队规模不少于 50 人的公司,如果小于这个规模我建议认真评估是否真的需要采用微服务架构。考虑到 Java 语言在国内的流行度和我个人的背景经验,本文主要针对采用 Java 技术栈的企业。本文也假定自建微服务基础架构,有些产品其实有对应的云服务可以直接使用,自建和采用云服务各有利弊,架构师需要根据场景上下文综合权衡。

我的阐述

除了这些还有一些关键问题,包括但不限于以下:

  1. 服务注册中心可选择:ZooKeeperNacosConsul和Eureka等
    摘自官网:What is ZooKeeper?:ZooKeeper是用于维护配置信息,命名,提供分布式同步以及提供组服务的集中式服务。
    推荐篇文章讲述各种注册中心框架对比:主流微服务注册中心浅析和对比
    什么是 Nacos:Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
    Spring Cloud Consul 通过自动配置并绑定到Spring Environment和其他Spring编程模型习惯用法,为Spring Boot应用程序提供Consul集成。通过一些简单的注释,您可以快速启用和配置应用程序内部的通用模式,并使用Hashicorp的Consul构建大型分布式系统。提供的模式包括服务发现,分布式配置和控制总线。
    最终我使用Nacos,相信阿里的框架也为了配置中心、服务总线的统一。
  2. 服务配置可选择:Nacos、Spring Cloud Config、Apollo
    我参考这篇文章:架构设计之微服务配置中心选型,最终选择了Nacos。
  3. 分布式服务一致性框架选择:Seata
    Seata 是什么?Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
  4. 服务调用选择:Ribbonopenfeign
  5. 服务降级选择:sentinel
  6. 服务网关选择: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. 模拟步骤④错误

预期结果和实际结果相同。

代码:点击进入

七、下阶段目标

  1. 采用使用分布式数据库
  2. 结合RabbitMQ实现派单引擎、消息引擎
  3. 完成集群启动整个流程步骤文档
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯糖不加咖啡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值