- 支持试读
内容介绍
本专题将带你实现一个高可用的微服务架构的分布式商城。 - 支持试读
前置知识:etcd及配置中心
本章我们将学习分布式KV存储:etcd的基础知识、单节点部署、集群部署、rust集成以及基于etcd实现的配置中心:写入配置、读取配置、配置的热加载。 - 支持试读
前置知识:分布式ID
本章将以雪花算法(snowflake)为例,讨论分布式ID的生成。 前置知识:etcd鉴权
本章将讨论 etcd 的鉴权:如果没有鉴权,你的 etcd 服务(集群)相当于公共服务器,任何人都可以对数据进行操作。在之前章节中,我们分别用不同方式部署了 etcd。本文针对这些不同的部署方法,来讨论如何开启鉴权。以及如何在 Rust 中访问开启鉴权的 etcd。用户服务
本章我们将开始编写第一个微服务:用户服务 `user-srv`。品牌服务
本章我们将编写品牌微服务。前置知识:MySQL树
继续学习之前,我们来讨论一个话题:MySQL 维护树状态结构。这是一个很常见的需求,最典型的就是分类、评论等等。前置知识:PostgreSQL 树
我们来讨论 PostgreSQL 维护树的数据结构。由于 PostgreSQL 支持递归查询和递归视图,所以很多模式实现起来都非常方便。本章将讨论使用递归视图,实现《邻接表模式》和《路径枚举模式》结合的树模型。前置知识:使用 XID 作为分布式ID
本章讨论使用 xid 来生成分布式ID方案。用户服务【新编】
本章我们将使用 PostgreSQL 重写第一个微服务:用户服务 `user-srv`。品牌服务【新编】
本章我们将继续使用 PostgreSQL 重新编写品牌微服务。商品分类服务
本章我们将实现商品分类服务。整合分类与品牌
本章我们将讨论如何将分类与品牌整合为一个服务。轮播图服务
学习完略显复杂的分类和品牌之后,让我们稍微轻松一下:实现相对简单的轮播图服务。商品服务
本章我们将实现整个项目最核心的服务之一:商品服务。【前置知识】分布式锁(上)
本章我们来讨论一个非常重要的功能:分布式锁。典型场景是:在高并发下,库存的扣减,其中尤为典型的是秒杀场景。【前置知识】分布式锁(下)
我们继续讨论实现分布式锁的第二种方式。SKU和库存服务
本章我们将实现商品的 SKU 和库存、价格等属性。前置知识:Web 3 支付
本章我们将讨论 Web 3支付。购物车服务
本章我们实现购物车服务。地址服务
本章开始,我们将实现最核心的服务:订单服务。它由:订单核心服务、支付服务、地址服务等组成。本章我们实现地址服务。订单服务
本章我们实现订单核心服务。订单商品服务
上一章我们实现了订单核心服务,本章我们实现订单商品服务支付服务
本章我们将实现支付服务,我们将使用 WEB3 支付。服务注册、发现及健康检查
本章我们将实现服务的注册、发现及健康检查。注意,我们现在说的服务,不但包括 gRPC 微服务,还包括基于 axum 的 RESTful API 服务。
前置知识:分布式ID
由于改用 PostgreSQL 数据库,本章内容仅作知识扩展。项目使用的相关知识请阅读《前置知识:使用 XID 作为分布式ID》。
由于改用 PostgreSQL 数据库,本章内容仅作知识扩展。项目使用的相关知识请阅读《前置知识:使用 XID 作为分布式ID》。
为什么需要分布式ID
由于我们的商城系统是分布式的,同时,数据库也将是集群。这就要求对数据库中每条记录的主键提出了要求:如果还是使用简单的、数据库自带的自增值作为主键,那将造成集群内的ID重复(当然,可以通过设置集群内每个 MySQL 的自增起始值和步长规避)。
有哪些分布式ID的实现
UUID
Redis 分配
以及其它
你可以参考这篇文章
你可以参考这篇文章
为什么选用雪花算法
我们的商城专题将选用雪花算法,主要是由 MySQL 特性决定的。其实一开始选定的是 xid:
-
专题构想之初,计划使用的 PostgreSQL 数据库,它已经提供了 xid 数据类型。即使不使用 xid 数据类型而使用 CHAR 类型,PostgreSQL 也不存在 MySQL 的问题
-
MySQL 的 InnoDB 引擎,使用的是 “索引即数据”,并且使用的是B+树索引,它的最大特点是:
- 整数类型的索引效率远高于字符串
- 具有排序的、递增数据的索引最为高效
-
UUID:它是无序的字符串。对于 MySQL 来说,索引效率非常低下
-
xid:它是有序的且递增的,但很遗憾,它也是字符串。对于 MySQL 来说,索引效率中等
-
雪花算法:它是有序递增的长整型,对 MySQL 索引最友好
专题构想之初,计划使用的 PostgreSQL 数据库,它已经提供了 xid 数据类型。即使不使用 xid 数据类型而使用 CHAR 类型,PostgreSQL 也不存在 MySQL 的问题
MySQL 的 InnoDB 引擎,使用的是 “索引即数据”,并且使用的是B+树索引,它的最大特点是:
- 整数类型的索引效率远高于字符串
- 具有排序的、递增数据的索引最为高效
雪花算法:它是有序递增的长整型,对 MySQL 索引最友好
rust 的雪花算法
使用 rs-snowflake
即可方便地在 rust 使用雪花算法来生成分布式ID,它的依赖如下:
[dependencies]
rs-snowflake="0.6"
使用起来也非常方便,只需要传入机器ID和节点ID即可:
use snowflake::SnowflakeIdGenerator;
fn main() {
let mut id_generator_generator = SnowflakeIdGenerator::new(1, 1);
let id = id_generator_generator.real_time_generate();
}
或者