项目介绍
简介
电商项目了解一下
- 访问量大
- 数据量大
- 并发高
- 业务复杂,技术点多
电商分类
分布式
分布式了解一下
单一架构
—>小型网站,小型管理系统,功能简单
垂直应用架构
–>切分业务
分布式
–>把各个应用通过分层独立出来,利用RPC实现web与service,service与service之间的相互调用,提高了代码的复用性
面向服务的分布式架构
用一个统一的应用中心来调度、路由、管理所有的服务。基于这个中心构建的星型架构又叫做 SOA分布式架构
如何实现SOA架构
以前的controller,service,serviceImpl都在一个工程里面,通过Spring的IOC完成相互调用
IDEA 在项目里面建立module
- maven项目parent作为项目的主基石,确定项目的SpringBoot版本以及所有的版本控制,在其他所有项目通过
标签引入 - maven项目api作为(interface)接口、bean存在的项目,所有项目通过
引入 - maven项目common-util作为公共工具类,在其中引用通用的工具类依赖
- maven项目web-util作为前段依赖引入项目
- amven项目service-util作为后端服务依赖引入项目
dubbo
- 服务提供者(provider)
- 服务消费者(consumer)
- 注册中心(registry)
- 监控中心(monitor)
调用关系???
SOA工作原理???
Dubbo与SpringCloud区别??
虚拟机安装
软件
- jdk1.8
- redis
- dubbo-javaweb
- tomcat 跑 javaweb
- zookeeper
分布式架构的服务提供者中Service由dubbo提供,故@Service注解需要换成dubbo的
服务消费者中Controller的@Autowired注解也只能注入同一容器的服务,无法导入Service,需要使用dubbo的@Reference
添加dubbo、zookeeper的maven依赖以后运行该项目在zookeeper上面注册服务
商品管理系统
sku 与 spu:
sku:stock keeping util 库存存储单元
一般具体一个产品 如:amd rx5700xt(拥有具体属性)
spu:standard product util 标准产品单元
概念性产品 如:amd rx5700系列显卡
修改配置,运行前端项目
跨域问题
使用@CrossOrigin
加在控制层里面
access-control-allow-origin
主键返回策略????
增删改查(CURD)
平台属性的增删改查
销售属性的增删改查
图片列表的增删改查
分布式文件存储(FastDFS)
解决高并发问题
- 集群????
- 多服务器
- 限流
前端页面
介绍
- | - | - | - |
---|---|---|---|
前端 | 并发大 | 负载均衡 | 数据一致 |
后端 | 并发小 | 直连数据库 | 数据一致 |
业务
- 首页(静态化)
- 检索页(搜索引擎)
- 详情页(缓存、切换、推荐)
- 购物车页(cookie、redis)
- 订单页(结算页)(一致性校验、安全)
- 支付页(安全、对接支付平台)
thymeleaf
user?.name
?用来判空,user对象的那么属性为null不报错
详情页
根据销售属性确定sku,跳转页面
页面高并发
- 负载均衡,集群(增加服务器数量,增加负载均衡)
- 使用缓存
- 其他–限流,静态化,分布式
redis
查询步骤
- 连接缓存
- 查询缓存
- 缓存没有结果,查询sql
- sql返回结果给用户并且将结果写入缓存
整合步骤
将redis整合到项目中(redis+spring)
1. 将redis框架封装成一个工厂类(将redis的池初始化到spring容器中) 2. 用spring的整合类将工厂类整合
设计一个数据存储策略(核心:设计key)
企业中数据存储策略:
数据对象名:数据对象ID:对象属性
user:123:username
user:123:password
redis常见问题
- can not get a connection from the pool
- redis不能外网访问 bind 127.0.0.1
- 保护模式 protected mode
- 缓存在高并发以及安全压力下的一些问题
- 缓存击穿(某一热点key在高并发访问情况下突然失效,过期时间到了,导致大量的并发打进sql的情况)—使用redis的分布式锁解决mysql的访问压力问题
- 缓存穿透(利用redis和mysql的机制,redis缓存中不存在就访问mysql,直接绕过缓存访问mysql,制造db访问压力)—通过代码防治问题产生,给该一定不存在的key的value设置””或者null
- 缓存雪崩(大量缓存设置了相同的过期时间,在某一时刻同时失效,请求全部发到mysql,DB瞬间压力造成雪崩)—-在原定过期时间后加上一个随机时间
分布式锁
redis自带的分布式锁 set px nx
上锁—-jedis.set(“xxxlock”,”value_token”,”NX”,”PX”,”10 * 1000”)
开锁—-jedis.del(“xxxlock”)
reidsson 框架 redis jucdelock锁功能 实现(既有jedis的功能,又有juc的功能)jedis没有同步锁
声明锁—-RLock lock = redissonClient.getLock(“xxxLock”);
上锁—-lock.lock();
开锁—-lock.unlock();
nginx负载均衡
apache压力测试
elasticsearch 搜索
- ElasticSearch6(与5的区别在于6需要以普通用户登录,6里面一个库只能建立一个表)
- 搜索引擎
- 文本搜索(以空间换时间)
- 搜索引擎(百度,谷歌)—-爬虫、分析、查询
- elasticsearch的算法—-倒排索引(在内容上建立索引,以内容匹配索引)
- mysql使用Btree –balance tree
- elasticsearch使用B+tree
查询
- query 查询条件
- from 开始
- size 大小–条数
- highlight 高亮
- aggs 聚合函数
加入中文分词器
ik 放在elasticsearch的plugins目录下
GET _analyze
{
“analyzer”: “ik_max_word”,
“text”: [“我是中国人”]
}
- ik_smart
- ik_max_word
集群配置
“:”后面一定要加空格” “,“=”一定不要加空格
- cluster.name
- node.master
- node.data
- path.data
- path.logs
- network.host
- http.port
- transport.tcp.port
- discovery.zen.minimum.master.nodes 最少为node半数+1 —>脑裂???
node.master可以大于1,主节点只能有一个???—>脑裂?
节点、分片、索引
- 节点
- 分片
- 索引
- 主分片
- 复制片
- 分片路由
- Sync
- Async