谷粒商城-01-p1-p19
时间:2022-07-05 09:00:00
谷粒商城-01
分布式基础&环境搭建
一、项目简介
1、项目背景
1)、电商模式
市场上有 5 常见的电商模式 B2B、B2C、C2B、C2C、O2O;
1、B2B 模式
B2B (Business to Business),是指商家与商家建立的商业关系。例如:阿里巴巴
2、B2C 模式
B2C (Business to Consumer),我们经常看到的供应商直接向用户销售商品,即商对客
该模式,通常被称为商业零售,直接向消费者销售产品和服务。如:苏宁易购、京东、
天猫,小米商城
3、C2B 模式
C2B (Customer to Business),也就是说,消费者对企业。先有消费者需求,再有企业生产。
消费者提出需求后,生产企业根据需求组织生产
4、C2C 模式
C2C (Customer to Consumer) ,顾客把东西放在网上卖,比如淘宝,闲鱼
5、O2O 模式
`O2O 即 Online To Offline,线下业务的机会也将与互联网相结合,使互联网成为线下业务
下一笔交易的前台。线上快速支付,线下优质服务。比如饿了么,美团,淘票,京东回家`
2)、谷粒商城
谷粒商城是一个 B2C 电商平台模式,向客户销售自营商品。
2、项目架构图*
1、项目微服务架构图
2、微服务划分图
3、项目技术&特色
-
基于 vue 后台管理系统
-
SpringCloud 新的解决方案
-
分布式方案如应用监控、限流、网关、熔断降级等
-
彻底解释分布式事务、分布式锁等分布式系统的难点
-
使用高并发场景、线程池、异步布置等编码方法
-
压力试验和性能优化
-
不同的集群技术和使用
-
CI/CD 使用
-
…
4、项目前置要求
学习项目前置知识
-
熟悉 SpringBoot 以及常见的整合方案
-
了解 SpringCloud
-
熟悉 git,maven
-
熟悉 linux,redis,docker 基本操作
-
了解 html,css,js,vue
-
熟练使用 idea 开发项目
二、分布式基本概念
1、微服务
微服务架构风格就像把一个单独的应用程序开发为一套小服务,每个小服务运行在自
己的进程通常是 HTTP API。围绕业务能力构建这些服务,
并通过完全自动化的部署机制独立部署。这些服务使用不同的编程语言和不同的数据
存储技术,并保持最低集中管理。
简而言之:拒绝大型单体应用,基于业务边界进行服务微化拆分,各服务独立部署运营。
2、集群**&分布式&**节点
集群是一种物理形式,分布式是一种工作方式。
只要是一堆机器,就可以称之为集群。没人知道他们是否一起工作;
《分布式系统原理与范型》定义:
分布式系统是几台独立计算机的集合,对用户来说就像一个单一的相关系统。
分布式系统(distributed system)是基于网络的软件系统。
分布式是指在不同的地方分布不同的业务。
集群是指将几台服务器集中在一起,实现同一业务。
例如:京东是一个分布式系统,许多业务在不同的机器上运行,所有业务都构成了大规模的业务业
务集群。每一个小业务,比如用户系统,在很大的访问压力下都不够。
在多个服务器中部署用户系统,即每个业务系统也可以集群化;
集群可以作为分布式节点。集群不一定是分布式的。
节点:集群中的服务器
3、远程调用
在分布式系统中,每个服务可能处于不同的主机中,但服务之间不可避免地需要相互呼叫。
它们被称为远程调用。
SpringCloud 中使用 HTTP JSON 完成远程调用
4、负载均衡
在分布式系统中,A 服务需要调用 B 服务,B 服务存在于多台机器中,A 调用任何 服务器都可以完成功能。
为了使每个服务器不太忙或太闲置,我们可以平衡地调用每个服务器,以提高 网站的强度。
常用的负载均衡算法:
**轮询:**选择健康池中的第一个后端服务器作为第一个请求,然后按顺序选择,直到 最后一个,然后循环。
**最小连接:**优先考虑连接数最少的后端服务器,即压力最小的后端服务器,这种方法可以在会话较长时考虑。
**散列:** 根据要求源IP 的散列(hash)选择要转发的服务器。这样,特定用户可以在一定程度上连接到相同的服务器。如果您的应用程序需要处理状态并要求用户连接到 和以前相同的服务器,请考虑这样做。
5、服务注册/发现&注册中心
A 服务调用 B 服务,A 服务不知道 B 目前哪些服务器有服务器,哪些正常,哪些服务 已经下线。解决这个问题可以引入注册中心;
如果某些服务离线,我们其他人可以实时感知其他服务的状态,以避免调用不可用的 服务
6、配置中心
每个服务最终都有大量的配置,每个服务可能部署在多台机器上。我们经常需要改变 配置,我们可以让每个服务在配置中心获得自己的配置。
配置中心用于集中管理微服务的配置信息
7、服务熔断&服务降级
在微服务架构中,微服务通过网络通信,相互依赖。当其中一项服务不可用时, 可能会导致雪崩效应。为了防止这种情况,我们必须有一个容错机制来保护服务。
1)、服务熔断
a. 设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开 启断路保护机制,后来的请求不再去调用这个服务。本地直接返回默认 的数据
2)、服务降级
a. 在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业 务降级运行。降级:某些服务不处理,或者简单处理【抛异常、返回 NULL、 调用 Mock 数据、调用 Fallback 处理逻辑】。
8、API 网关
在微服务架构中,API Gateway 作为整体架构的重要组件,它抽象了微服务中都需要的公共 功能,同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日 志统计等丰富的功能,帮助我们解决很多 API 管理难题。
三、环境搭建
1、安装 linux 虚拟机
- 下载&安装 VirtualBox https://www.virtualbox.org/,要开启 CPU 虚拟化
-
下载&安装 Vagrant
- https://app.vagrantup.com/boxes/search Vagrant 官方镜像仓库
- https://www.vagrantup.com/downloads.html Vagrant 下载
-
开 window cmd 窗口,运行 Vagrant init centos/7,即可初始化一个 centos7 系统
-
运行 vagrant up 即可启动虚拟机。系统 root 用户的密码是 vagrant
-
vagrant 其他常用命令
-
vagrant ssh:自动使用 vagrant 用户连接虚拟机
- vagrant upload source [destination] [name|id]:上传文件
-
https://www.vagrantup.com/docs/cli/init.html Vagrant 命令行
-
-
默认虚拟机的 ip 地址不是固定 ip,开发不方便
- 修改 Vagrantfile
config.vm.network "private_network", ip: "119.3.105.108" 这里的 ip 需要在物理机下使用 ipconfig 命令找到 然后改为指定的网址
-
重新使用 vagrant up 启动机器即可。然后再 vagrant ssh 连接机器
默认只允许 ssh 登录方式,为了后来操作方便,文件上传等,我们可以配置允许账 号密码登录
Vagrant ssh 进去系统之后vi /etc/ssh/sshd_config 修改 PasswordAuthentication yes/no 重启服务 service sshd restart
- 以后可以使用提供的 ssh 连接工具直接连接
注意:VirtualBox 会与包括但不限于如下软件冲突,需要卸载这些软件,然后重启电脑;
冲突的软件:红蜘蛛,360,净网大师(有可能)等
修改 linux 的 yum 源 1)、备份原 yum 源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2)、使用新 yum 源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo 3)、生成缓存 yum makecache
2、安装 docker
Docker 安装文档:https://docs.docker.com/install/linux/docker-ce/centos/
1、卸载系统之前的 docker
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
2、安装 Docker-CE
# 安装必须的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 设置 docker repo 的 yum 位置 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安装 docker,以及 docker-cli sudo yum install docker-ce docker-ce-cli containerd.io
3、启动 docker
sudo systemctl start docker
4、设置 docker 开机自启
sudo systemctl enable docker
5、测试 docker 常用命令,注意切换到 root 用户下
https://docs.docker.com/engine/reference/commandline/docker/
6、配置 docker 镜像加速
# 阿里云,容器镜像服务 # 针对 Docker 客户端版本大于 1.10.0 的用户 # 您可以通过修改 daemon 配置文件/etc/docker/daemon.json 来使用加速器sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
7、**docker **安装 mysql
1、下载镜像文件
docker pull mysql:5.7
2、创建实例并启动
docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ -v /mydata/mysql/data:/var/lib/mysql \ -v /mydata/mysql/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7 # 参数说明 -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口 -v /mydata/mysql/conf:/etc/mysql:将配置文件夹挂载到主机 -v /mydata/mysql/log:/var/log/mysql:将日志文件夹挂载到主机 -v /mydata/mysql/data:/var/lib/mysql/:将配置文件夹挂载到主机 -e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码 # MySQL 配置 vi /mydata/mysql/conf/my.cnf [client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake skip-name-resolve
注意:解决 MySQL 连接慢的问题
在配置文件中加入如下,并重启 mysql
[mysqld] skip-name-resolve 解释: skip-name-resolve:跳过域名解析
3、通过容器的 mysql 命令行工具连接
docker exec -it mysql mysql -uroot -proot
4、设置 root 远程访问
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option; flush privileges;
5、进入容器文件系统
docker exec -it mysql /bin/bash
8、**docker **安装 redis
1、下载镜像文件
docker pull redis
2、创建实例并启动
mkdir -p /mydata/redis/conf touch /mydata/redis/conf/redis.conf docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \ -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \ -d redis redis-server /etc/redis/redis.conf # redis 自描述文件:https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf
3、使用 redis 镜像执行 redis-cli 命令连接
docker exec -it redis redis-cli
9、开发环境统一
1、Maven
配置阿里云镜像 <mirrors> <mirror> <id>nexus-aliyunid> <mirrorOf>centralmirrorOf> <name>Nexus aliyunname> <url>http://maven.aliyun.com/nexus/content/groups/publicurl> mirror> mirrors>
配置 jdk1.8 编译项目 <profiles> <profile> <id>jdk-1.8id> <activation> <activeByDefault>trueactiveByDefault> <jdk>1.8jdk> activation> <properties> <maven.compiler.source>1.8maven.compiler.source> <maven.compiler.target>1.8maven.compiler.target> <maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion> properties> profile> profiles>
2、Idea&VsCode
# idea 安装 lombok、mybatisx 插件Vscode 安装开发必备插件 Vetur —— 语法高亮、智能感知、Emmet 等 包含格式化功能, Alt+Shift+F (格式化全文),Ctrl+K Ctrl+F(格式化选中代码,两个 Ctrl需要同时按着) EsLint —— 语法纠错 Auto Close Tag —— 自动闭合 HTML/XML
标签 Auto Rename Tag —— 自动完成另一侧标签的同步修改 JavaScript(ES6) code snippets — — ES6 语 法 智 能 提 示 以 及 快 速 输 入 , 除 js 外 还 支 持.ts,.jsx,.tsx,.html,.vue,省去了配置其支持各种包含 js 代码文件的时间 HTML CSS Support —— 让 html 标签上写 class 智能提示当前项目所支持的样式 HTML Snippets —— html 快速自动补全 Open in browser —— 浏览器快速打开 Live Server —— 以内嵌服务器方式打开 Chinese (Simplified) Language Pack for Visual Studio Code —— 中文语言包
3、安装配置 git
1、下载 git;https://git-scm.com
2、配置 git,进入 git bash
# 配置用户名 git config --global user.name "username" //(名字) # 配置邮箱 git config --global user.email "username@email.com" //(注册账号时用的邮箱)
3、配置 ssh 免密登录
https://gitee.com/help/articles/4181#article-header0
进入 git bash;使用:ssh-keygen -t rsa -C "xxxxx@xxxxx.com"命令。 连续三次回车(xxxxx@xxxxx.com 是自己的邮箱)。 一般用户目录下会有 如下的 id_rsa 和 id_rsa.pub或者 cat ~/.ssh/id_rsa.pub 登录进入 gitee,在设置里面找到 SSH KEY 将.pub 文件的内容粘贴进去 使用 ssh -T git@gitee.com 测试是否成功即可
Git+码云教程 https://gitee.com/help/articles/4104
4、逆向工程使用
1、导入项目逆向工程
2、下载人人开源后台管理系统脚手架工程
(1) 导入工程,创建数据库
(2) 修改工程 shiro 依赖为 SpringSecurity
(3) 删除部分暂时不需要的业务
3、下载人人开源后台管理系统 vue 端脚手架工程
(1) vscode 导入前端项目
(2) 前后端联调测试基本功能
6、创建项目微服务
商品服务、仓储服务、订单服务、优惠券服务、用户服务 共同:
1)、web、openfeign
2)、每一个服务,包名 com.atguigu.gulimall.xxx(product/order/ware/coupon/member)
3)、模块名:gulimall-coupon
1)、从 gitee 初始化一个项目
2)、创建各个微服务项目
1)、了解人人开源项目,快速搭建后台脚手架
2)、修改代码调整为我们的业务逻辑
3)、创建各个微服务以及数据库
初始化项目
1、在码云上初始化完成仓库后 复制clone连接用idea打开
2、创建各个模块
商品服务、仓储服务、订单服务、优惠券服务、用户服务
3、创建父工程的pom
复制任意一个子模块的pom文件到父工程中,然后修改如下
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>com.atguigu.gulimallgroupId> <artifactId>gulimallartifactId> <version>0.0.1-SNAPSHOTversion> <name>gulimallname> <description>聚合服务description> <packaging>pompackaging> <modules> <module>gulimall-productmodule> <module>gulimall-ordermodule> <module>gulimall-membermodule> <module>gulimall-couponmodule> <module>gulimall-waremodule> modules>project>
4、设置忽略ignore 文件
编辑父工程的 gitignore 文件这样可以添加父工程及其子工程对应文件进行忽略
HELP.mdtarget/!.mvn/wrapper/maven-wrapper.jar!**/src/main/**!**/src/test/**### STS ###.apt_generated.classpath.factorypath.project.settings.springBeans.sts4-cache### IntelliJ IDEA ###.idea*.iws*.iml*.ipr### NetBeans ###/nbproject/private//nbbuild//dist//nbdist//.nb-gradle/build/### VS Code ###.vscode/**/mvnw**/mvnw.cmd**/.mvn**/target/.mvn.idea**/.gitignore
设置完成后讲代码推送到远程仓库
4、创建各个模块的数据库
我这边用的是阿里云的服务器,所以Navicat连接上mysql,在此前如果用的是虚拟机,也要保证 我们的虚拟机是安装好docker mysql redis 的
分别创建以下数据库
gulimall_oms gulimall_pms gulimall_sms gulimall_ums gulimall_wms
分别执行以下的sql
- gulimall_oms
drop table if exists oms_order;drop table if exists oms_order_item;drop table if exists oms_order_operate_history;drop table if exists oms_order_return_apply;drop table if exists oms_order_return_reason;drop table if exists oms_order_setting;drop table if exists oms_payment_info;drop table if exists oms_refund_info;/*==============================================================*//* Table: oms_order *//*==============================================================*/create table oms_order( id bigint not null auto_increment comment 'id', member_id bigint comment 'member_id', order_sn char(32) comment '订单号', coupon_id bigint comment '使用的优惠券', create_time datetime comment 'create_time', member_username varchar(200) comment '用户名', total_amount decimal(18,4) comment '订单总额', pay_amount decimal(18,4) comment '应付总额', freight_amount decimal(18,4) comment '运费金额', promotion_amount decimal(18,4) comment '促销优化金额(促销价、满减、阶梯价)', integration_amount decimal(18,4) comment '积分抵扣金额', coupon_amount decimal(18,4) comment '优惠券抵扣金额', discount_amount decimal(18,4) comment '后台调整订单使用的折扣金额', pay_type tinyint comment '支付方式【1->支付宝;2->微信;3->银联; 4->货到付款;】', source_type tinyint comment '订单来源[0->PC订单;1->app订单]', status tinyint comment '订单状态【0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单】', delivery_company varchar(64) comment '物流公司(配送方式)', delivery_sn varchar(64) comment '物流单号', auto_confirm_day int comment '自动确认时间(天)', integration int comment '可以获得的积分', growth int comment '可以获得的成长值', bill_type tinyint comment '发票类型[0->不开发票;1->电子发票;2->纸质发票]', bill_header varchar(255) comment '发票抬头', bill_content varchar(255) comment '发票内容', bill_receiver_phone varchar(32) comment '收票人电话', bill_receiver_email varchar(64) comment '收票人邮箱', receiver_name varchar(100) comment '收货人姓名', receiver_phone varchar(32) comment '收货人电话', receiver_post_code varchar(32) comment '收货人邮编', receiver_province varchar(32) comment '省份/直辖市', receiver_city varchar(32) comment '城市', receiver_region varchar(32) comment '区', receiver_detail_address varchar(200) comment '详细地址', note varchar(500) comment '订单备注', confirm_status tinyint comment '确认收货状态[0->未确认;1->已确认]', delete_status tinyint comment '删除状态【0->未删除;1->已删除】', use_integration int comment '下单时使用的积分', payment_time datetime comment '支付时间', delivery_time datetime comment '发货时间', receive_time datetime comment '确认收货时间', comment_time datetime comment '评价时间', modify_time datetime comment '修改时间', primary key (id));alter table oms_order comment '订单';/*==============================================================*//* Table: oms_order_item *//*==============================================================*/create table oms_order_item( id bigint not null auto_increment comment 'id', order_id bigint comment 'order_id', order_sn char(32) comment 'order_sn', spu_id bigint comment 'spu_id', spu_name varchar(255) comment 'spu_name', spu_pic varchar(500) comment 'spu_pic', spu_brand varchar(200) comment '品牌', category_id bigint comment '商品分类id', sku_id bigint comment '商品sku编号', sku_name varchar(255) comment '商品sku名字', sku_pic varchar(500) comment '商品sku图片', sku_price decimal(18,4) comment '商品sku价格', sku_quantity int comment '商品购买的数量', sku_attrs_vals varchar(500) comment '商品销售属性组合(JSON)', promotion_amount decimal(18,4) comment '商品促销分解金额', coupon_amount decimal(18,4) comment '优惠券优惠分解金额', integration_amount decimal(18,4) comment '积分优惠分解金额', real_amount decimal(18,4) comment '该商品经过优惠后的分解金额', gift_integration int comment '赠送积分', gift_growth int comment '赠送成长值', primary key (id));alter table oms_order_item comment '订单项信息';/*==============================================================*//* Table: oms_order_operate_history *//*==============================================================*/create table oms_order_operate_history( id bigint not null auto_increment comment 'id', order_id bigint comment '订单id', operate_man varchar(100) comment '操作人[用户;系统;后台管理员]', create_time datetime comment '操作时间', order_status tinyint comment '订单状态【0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单】', note varchar(500) comment '备注', primary key (id));alter table oms_order_operate_history comment '订单操作历史记录';/*==============================================================