目录
一、电商项目介绍
二、Linux 软件环境部署
三、项目环境搭建
1、Maven 回顾
2、ElasticSearch
四、关于表设计
首页分类表
我们为什么要讲电商?
1. 高并发,如何解决并发问题!
2. 技术范围广:SpringBoot、SpringCloud、Nacos、Sentinel、zipkin (Sleuth链路追踪)
3. 数据量比较大,可以跟大数据整合 ----> Java 程序员!
4. 支付:考虑安全性、幂等性 (唯一商户订单号,无论执行多少次结果都是一样的)
为什么不能用select * :避免全盘扫描,尽量充分利用覆盖索引,select * 幂等性
5. 电商的业务复杂性:订单-》支付》库存-》物流,分布式事务订单成功,支付成功,库存失败!退款吗?取消订单吗?
分布式事物解决方案: XA(2PC)、TCC、seata、MQ本地消息表(√)。
不取消不退款,所以我们使用MQ,保证最终一致性
电商模式 -- 了解 Business、Customer
B2B:企业-企业 - 阿里巴巴、慧聪网
B2C:(我们的选择)
C2C:消费者个人间的电子商务行为 - 咸鱼、瓜子二手车
C2B:商对客 垂直电商 - 唯品会、乐蜂网
O2O:在线离线/线上到线下 - 美团、饿了么
B2B2C:B2B and B2C - 京东
电商的技术栈 -- 电商的技术选型
两套方案:
1、springBoot + springCloud : spring 家族;有版本对照 ,相对组件比较全;
2、springBoot + dubbo == dubbo(rpc 远程调用); 本质jar 包; 版本需要对应
3、未来:Mesh Service 网格式微服务?
基础架构:springBoot + springCloud + mysql/oracle + vue/Thymeleaf;
优化:Redis(缓存 查询优化)、ES(检索效率)、MQ(异步解耦,响应速度)、mongoDB(文档存储)、mycat/sharding-jdbc 分库分表(单表超过500w或容量超过2G)
部署:linux、docker、jenkins(流水线)
提交:Git、GitHub、Gitee 分布式版本控制工具
分布式锁:Redis( 缓存雪崩)
其他:Swagger2//Yapi、MyBatis-Plus
需要掌握的解决方案
分布式架构:seata(强一致性)、MQ(最终一致性)
缓存管理:redis ---》 mysql
mysql 与 redis 如何保持数据一致性?延迟双删策略
分布式事务
单点登录:一处登陆处处使用
商品后台管理:增删改查
文件管理系统:存储商品图片 -- Minio -- 分布式文件存储系统,能够在丢失1/2 数据时,能够恢复;底层纠删码 {数学算法 -- 通过高度冗余保证} (冗余:Mysql主从复制、集群硬件冗余)
项目管理工具:禅道{创建项目,添加项目开发人员,测试人员 ... }
项目版本控制工具:git
项目开发工具:idea
项目构建工具:maven
项目架构图
我们的主线很简单:先去搭建基本的业务,高可用:用到哪些中间件,通过什么去治理,最后是如何部署的。
电商的架构
首页 |
静态页面,包含了商品分类,搜索栏,商品广告位。 |
检索 |
全文搜索:通过搜索栏填入的关键字进行搜索,并列表展示 分类查询:根据首页的商品类目进行查询 |
商品详情 |
商品的详细信息展示 |
单点登录 |
用户统一登录的管理 一处登陆,处处使用 |
购物车 |
将有购买意向的商品临时存放的地方 |
结算 |
将购物车中勾选的商品初始化成要填写的订单 |
下单 |
填好的订单提交 |
订单 |
负责确认订单是否付款成功,并对接仓储物流系统。 |
支付 |
下单后,用户点击支付,负责对接第三方支付系统。 |
秒杀 |
秒杀抢购完整方案 |
----------- 以下功能不实现 ----------- | |
仓储物流 |
独立的管理系统,负责商品的库存。 |
后台管理 |
主要维护类目、商品、库存单元、广告位等信息。 |
----------- 以下功能不实现 ----------- | |
物流管理系统: | |
评价系统: | |
手机社区: | |
售后系统: | |
客服系统: | |
直播带货: |
docker 的常用命令:
docker search
docker pull
docker images
docker run
docker exec -it CID /bin/bash
docker stop/start/restart/ CID
docker rm CID
docker rmi IID
docker ps -a
docker logs CID
docker cp
1.安装JAVA 运行环境
第一步:上传或下载安装包
cd /usr/local
jdk-8u152-linux-x64.tar.gz
第二步:解压安装包
tar -zxvf jdk-8u152-linux-x64.tar.gz
第三步:建立软连接
ln -s /usr/local/jdk1.8.0_152/ /usr/local/jdk
第四步:修改环境变量
vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
通过命令source /etc/profile让profile文件立即生效
source /etc/profile
第五步、测试是否安装成功
使用java -version,出现版本为java version "1.8.0_152"
2.安装maven
第一步:上传或下载安装包
cd /usr/local
apache-maven-3.6.1-bin.tar.gz
第二步:解压安装包
tar -zxvf apache-maven-3.6.1-bin.tar.gz
第三步:建立软连接
ln -s /usr/local/apache-maven-3.6.1/ /usr/local/maven
第四步:修改环境变量
vim /etc/profile
export MAVEN_HOME=/usr/local/maven
export PATH=$PATH:$MAVEN_HOME/bin
通过命令source /etc/profile让profile文件立即生效
source /etc/profile
第五步、测试是否安装成功
3.安装docker
环境安装:
yum -y install gcc-c++
第一步:安装必要的一些系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2
第二步:添加软件源信息
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
第三步:更新并安装Docker-CE
yum makecache fast
yum -y install docker-ce
第四步:开启Docker服务
service docker start
systemctl enable docker
第五步:测试是否安装成功
docker -v
第六步:配置镜像加速器
可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ldu6wrsf.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
4.安装mysql
第一步:拉取镜像
docker pull mysql:5.7
第二步:启动
docker run --name mysql --restart=always -v /home/ljaer/mysql:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
第三步:测试mysql
进入容器:
docker exec -it sun_mysql /bin/bash
登录mysql:
mysql -u root -p
root
如果顺利进入,安装成功;创建库,在资料中导入sql
5.安装rabbitmq
第一步:拉取镜像
docker pull rabbitmq:management
第二步:启动
docker run -d -p 5672:5672 -p 15672:15672 --restart=always --name rabbitmq rabbitmq:management
第三步:安装延迟队列插件
1. 首先下载rabbitmq_delayed_message_exchange-3.9.0.ez文件上传到RabbitMQ所在服务器,下载地址:https://www.rabbitmq.com/community-plugins.html
2. 切换到插件所在目录,执行 docker cp rabbitmq_delayed_message_exchange-3.9.0.ez rabbitmq:/plugins 命令,将刚插件拷贝到容器内plugins目录下
3. 执行 docker exec -it rabbitmq /bin/bash 命令进入到容器内部,并 cd plugins 进入plugins目录
4. 执行 ls -l|grep delay 命令查看插件是否copy成功
5. 在容器内plugins目录下,执行 rabbitmq-plugins enable rabbitmq_delayed_message_exchange 命令启用插件
6. exit命令退出RabbitMQ容器内部,然后执行 docker restart rabbitmq 命令重启RabbitMQ容器
6.安装redis
已安装或能访问忽略
第一步:拉取镜像
docker pull redis:latest
第二步:启动
docker run -d -p 6379:6379 --restart=always redis:latest redis-server
进入容器,插入条数据试试
7.安装nacos
已安装或能访问忽略
第一步:拉取镜像
docker pull nacos/nacos-server:1.4.1
第二步:启动
docker run --env MODE=standalone --name nacos --restart=always -d -p 8848:8848 -e JVM_XMS=512m -e JVM_XMX=512m nacos/nacos-server:1.4.1
8.安装sentinel
已安装或能访问忽略
第一步:拉取镜像
docker pull bladex/sentinel-dashboard
第二步:启动
docker run --name sentinel-dashboard --restart=always -p 8858:8858 -d bladex/sentinel-dashboard:latest
9.安装elasticsearch
第一步:拉取镜像
docker pull elasticsearch:7.8.0
第二步:启动
需要在宿主机建立:两个文件夹
mkdir -p /mydata/elasticsearch/plugins
mkdir -p /mydata/elasticsearch/data
授予权限chmod 777 /mydata/elasticsearch/data
docker run -p 9200:9200 -p 9300:9300 --name elasticsearch --restart=always \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-d elasticsearch:7.8.0
第三步:安装中文分词器
下载elasticsearch-analysis-ik-7.8.0.zip
上传解压:unzip elasticsearch-analysis-ik-7.8.0.zip -d ik-analyzer
上传到es容器:docker cp ./ik-analyzer a24eb9941759:/usr/share/elasticsearch/plugins
重启es:docker restart a24eb9941759
10.安装kibana
第一步:拉取镜像
docker pull kibana:7.8.0
第二步:启动
docker run --name kibana --restart=always -e ELASTICSEARCH_URL=http://192.168.86.90:9200 -p 5601:5601 -d kibana:7.8.0
进入容器修改:docker exec -it 1e12f8dd3efd /bin/bash
cd config
vi kibana.yml
elasticsearch.hosts: [ "http://192.168.86.90:9200" ]
docker restart 1dc0f78d78ad 重启kibana !
测试:安装分词词库是否可以使用!
GET /.kibana/_analyze
GET /.kibana/_analyze { "text": "小米手机", "analyzer": "ik_max_word" }
11.安装zipkin (Sleuth链路追踪) 负责数据展示
第一步:拉取镜像
docker pull openzipkin/zipkin
第二步:启动
docker run --name zipkin --restart=always -d -p 9411:9411 openzipkin/zipkin
12.安装minio 分布式文件存储系统
文件管理系统:Minio -- 分布式文件存储系统,能够在丢失1/2数据时,恢复;纠删码{数学算法 -- 高度冗余的基础之上恢复数据;
第一步:拉取镜像
docker pull minio/minio
第二步:启动
docker run \
-p 9000:9000 \
-p 9001:9001 \
--name minio \
-d --restart=always \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=admin123456" \
-v /home/data:/data \
-v /home/config:/root/.minio \
13.安装logstash (暂时不装)
第一步:拉取镜像
docker pull logstash:7.8.0
第二步:启动
#--net root_default \
# 需要提前在linux服务器上环境 /mydata/logstash/logstash.conf
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 5044
codec => json_lines
}
}
filter{
}
output {
elasticsearch {
hosts => "192.168.86.90:9200"
index => "gmall-%{+YYYY.MM.dd}"
}
}
docker run --name logstash -p 5044:5044 \
--restart=always \
--link elasticsearch:es \
-v /mydata/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
-d logstash:7.8.0
14.安装MongoDB 不用安装
#拉取镜像
docker pull mongo:latest
#创建容器
docker create --name mongodb --restart=always -p 27017:27017 -v mongodb:/data/db mongo:latest
#启动容器
docker start mongodb
#进入容器
docker exec -it mongodb /bin/bash
#使用MongoDB客户端进行操作
mongo
> show dbs #查询所有的数据库
admin 0.000GB
config 0.000GB
local 0.000GB
15.安装在线Yapi 服务器 (阿里云服务器已经配置好,登录就行,不用安装)
# 拉取镜像
docker pull mongo
# 启动mongo
docker run -d –name --restart=always mongo-yapi mongo
# 获取Yapi 镜像
docker pull registry.cn-hangzhou.aliyuncs.com/anoy/yapi
# 初始化Yapi 数据库索引以及管理员账号
docker run -it --rm --link mongo-yapi:mongo --entrypoint npm --workdir /api/vendors registry.cn-hangzhou.aliyuncs.com/anoy/yapi run install-server
# 启动Yapi 服务
docker run -d --name yapi --restart=always --link mongo-yapi:mongo --workdir /api/vendors -p 3000:3000 registry.cn-hangzhou.aliyuncs.com/anoy/yapi server/app.js
# 使用Yapi
http://localhost:3000 登录账号 [email protected],密码 ymfe.org
注意:
停止所有的容器
docker stop $(docker ps -aq)
删除所有的容器
docker rm $(docker ps -aq)
#删除所有的镜像
docker rmi $(docker images -q)
问题:
Docker容器做端口映射报错
docker: Error response from daemon: driver failed programming external connectivity on endpoint lamp3 (46b7917c940f7358948e55ec2df69a4dec2c6c7071b002bd374e8dbf0d40022c): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 86 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
解决方法
docker服务启动时定义的自定义链DOCKER被清除
重启即可systemctl restart docker
配置hosts环境
作用: 能够直接修改C:\Windows\System32\drivers\etc\hosts 文件!
修改系统hosts文件
127.0.0.1 file.service.com www.gmall.com item.gmall.com
127.0.0.1 activity.gmall.com passport.gmall.com cart.gmall.com list.gmall.com
127.0.0.1 order.gmall.com payment.gmall.com api.gmall.com comment.gmall.com
分布式项目:
功能:依赖,继承,聚合 {packaging - pom,jar,war}
仓库:依赖jar ---> 本地仓库 ---> [私服{自己搭建的服务器}] ---> 远程中央仓库下载!
无需勾选Override,修改 settings.xml 进行配置即可
D:\repository-spring maven 相关问题:
gmall-parent: pom
common: 公共的工具 pom
common-util: 公共的工具类
service-util: 服务层工具类
model: 实体类 pojo,domain,entity; 自己构建的vo; dto;
service: 所有的微服务
实体类加入注解,会自动创建索引库
@Document(indexName = "product",shards = 1, replicas = 1) 指定索引名、主分片、副分片,声明在映射对象上
@Id 声明主键ID
@Field(type = FieldType.Text, analyzer = "ik_max_word") 指定类型,分词词库,声明在成员变量上
type:字段类型,取值是枚举:FieldType
index:是否索引,布尔类型,默认是true
store:是否存储,布尔类型,默认是false
analyzer:分词器名称:ik_max_word (Text才会分词 keyWord不分词)
1.三大范式:
a. 将字段拆分到不可拆分为止! name firstName; lastName;
b. 每张表都必须有个主键! primary key;
c. 保证表中的数据要与主键有关系!
2.分析表字段:
a. 能够看到的数据;
b. 数据是如何展示;检索条件!
c. 根据业务需要添加一些冗余字段! 新增字段3.数据类型:
id:bigint -》Long
name:varchar(50) -》String
price:decimal -》BigDecimal
sex:int-》0 1double,float会有精度损失!
Java: 做金钱比较的时候:BigDecimal构建方法使用long double,还会有精度问题;需要用字符串或int类型
skuInfo.getPrice().compareTo(new BigDecimal("1999.99"));
第一种:只用一张表,通过parentId关联
分析表中的字段 and 数据类型
第二种:级联查询,用三张表,主外键关系;
baseCategory1; 一级分类表
id,name;
baseCategory2; 二级分类表
id,name,category1Id;
baseCategory3; 三级分类表
id,name,category2Id;
平台属性表;表设计必须的字段:主键 id, createTime, updateTime, isDelete
用于商品检索必须要有的字段:categoryId:分类id,categorylevel:分类等级baseAttrInfo(平台属性)
id, attrName,categoryId,categorylevel,createTime, updateTime, isDelete
1 运行内存 61 3
2 机身内存 61 3baseAttrValue(平台属性值)
id, attrValueName, attrId createTime, updateTime, isDelete
1 18GB 1
2 16GB 1
商品基本知识
商品详情页面:销售属性,讲解spu时会说,作用:给用户提供自己喜欢的商品
SKU:每种商品均对应有唯一的SKU编号。(具体到唯一商品)
SPU:一组可复用,易检索的标准化信息集合。 (手机)