SpringCloud
1.分布式系统和集群的概念
分布式:不同业务部署到不同服务器上,每个模块独立运行、单独部署 各司其职
集群:相同业务部署到不同服务器上,实现容错性、高可用、负载均衡 (滥竽充数)
分布式框架:
Dubbo+zookeeper
SpringBoot+SpringCloud
SpringBoot+SpringCloudAlibaba
2.HTTP和RPC的区别
HTTP:请求头臃肿,灵活,跨语言、跨平台
RPC:速度快,抽象
3.Eureka组件以及各自基本配置流程
Eureka Client:客户端
Eureka Server:服务端
4.服务查询工具对象和基于LoadBalance服务调用的对象
服务调用者使用
DiscoveryClient.getInstance----->集合
LoadBalancerClient.choose---->选择,轮巡
5.Ribbon远程调用的配置流程
引入依赖-->主启动类上添加注解@LoadBanlanced
6.Feign远程调用的配置流程
引入依赖---添加注解@EnableFeignClients--->编写接口
7.熔断器原理,以及Ribbon和Feign中配置熔断器的流程
引入依赖
降级方法:与原方法参数一致(Feign编写接口实现类)
主启动类上添加注解@EnableCircuitBreaker
修改配置文件(Feign手动开启熔断)
8.Docker,Docker镜像以及容器常用命令
docker images
docker ps -a
docker run -di --name
-p 端口号
-v 挂载
-e 数据库名称和密码
cp 拷贝
9.电商的模式
B2B:企业对企业
C2C:个人对个人
B2C:企业对个人
C2B:个人对企业
O2O:线上到线下
F2C:工厂对个人
B2B2C:企业-企业-个人
10.电商系统的平台
东易买商城
运营商:管理品牌、广告、收钱
商家:入驻,发布商品
用户:购物车、订单、支付
11.分布式文件服务器FastDFS
FastDFS:
实现负载均衡
空间不足可以自己做空间扩容
冗余备份
trackerServer调度服务器
StorageServer存储服务器
文件上传和下载流程
12.Swagger
swagger:
类似于api文档,添加注释,提供给前端人员
配置步骤:
引入依赖----编写配置类---创建对象的方法和swagger的配置方法-----在controller添加注解
http://localhost:port/swagger-ui.html
13.SPU和SKU
SPU:(款)
标准产品单位
是商品信息聚合的最小单位,是一组易检索,可复用的产品信息的集合,该集合描述了一个产品的特性
SKU:(件)
库存量单位
物理概念上不可拆分最小库存单元
14.事务
在应用程序中一系列严密的操作,一个事务中的一系列的操作要么全部成功,要么一个都不做。
特点:
原子性、一致性、隔离性、持久性
在SpringBoot中使用@Tranctional注解即可
15.广告并发架构设计思路
二级缓存:
一级缓存--redis 从数据库中查出数据放入redis
二级缓存--nginx 将redis中的数据放入nginx
首页发送请求--nginx--redis--mysql
16.读取广告缓存的配置步骤
lua脚本语言
update_content.lua
nginx.cfg content_by_lua_file
read_content.lua
17.Canal的作用以及工作原理
canal监听数据库更新,同步数据
主动同步
canal将自己伪装成从数据库,读取blog文件,进行解析
18.ElasticSearch
是基于Restful标准的高扩展高可用的实时数据分析的全文搜索工具
工作原理------分词处理,反向索引
基本概念: 节点、集群、索引--数据库、类型--表、文档--数据、列--字段、分片、复制
在7.x版本后,将type去除了。
核心技术原理:
分词--创建倒排索引
19.将数据导入ES的流程
使用到的注解:
@FeignClient(name="远程调用的服务名称")
@Repository //es包下的注解
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class}) //排除数据库资源的加载
@EnableEurekaClient //开启Eureka客户端
@EnableFeignClients(basePackages = "远程调用的服务的包") //开启远程调用
@EnableElasticsearchRepositories(basePackages = "@Repository注解所在的包") //开启ES
在Kibana可视化页面执行GET /skuinfo/_search 查看导入的数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9igYz0Td-1637740588743)(images\image-20211102152525869.png)]
20.网页静态化
由于用户请求过大,减轻数据库的访问压力
商品详情页,模板相同,数据不同
系统管理员(商家运维人员)修改或者审核商品的时候,会触发canal监控数据
canal微服务获取修改数据后,调用静态页微服务的方法进行生成静态页
静态页微服务只负责使用thymeleaf的模板技术生成静态页
例如:做月饼
21.消息队列(MQ)
消息中间件的执行流程及角色对应如图所示
生产者、消费者模型,异步执行
消息生产者---中间件----消息消费者
作用:
1.异步处理
2.应用解耦
3.流量削峰
4.日志搬运
实现MQ的主流方式:
AMQP:开语言,跨平台,协议规则严谨
JMS(只针对Java)
常用MQ产品:
ActiveMQ:基于JMS
RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好
RocketMQ:基于JMS,阿里巴巴产品,目前交由Apache基金会
Kafka:分布式消息系统,高吞吐量
RabbitMQ五种消息模型:
简单队列模式:
工作队列模式(竞争消费者)
发布/订阅模式(使用交换机)
路由队列模式(使用交换机)
主题队列模式(使用交换机)
实现步骤:
引入依赖--->修改配置文件--->配置消息队列的连接--->自定义配置类声明队列对象-->通过生产者发送消息--->创建消费者通过监听接收消息并处理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GcCm09CO-1637740588749)(images\image-20211104092936248.png)]
22.短信服务和用户注册验证码校验流程
随机生成验证码:
Math.random()---纯数字
UUID---字母+数字
23.微服务网关
作用(功能):
1.集中了前端的访问入口,减少了后端微服务的受攻击的面积
2.统一了跨域的配置
3.统一了日志的记录,方便监控
4.统一了鉴权的处理(权限验证)
5.统一了限流的处理,防止微服务被拖垮,产生雪崩效应
5.集中了应用,是系统变成一个完整的应用
网关技术:
nginx:高性能的HTTP和反向代理的web服务器
zuul:过时
spring-cloud-gateway:学习
跨域:
当协议、域名和端口有一个不同时,就是跨域访问
常用的过滤配置:
路由,predicate工厂,过滤器
24.JWT
鉴权,登陆一次就可以使用所有的业务
JSON Web Token,是微服务之间用来传递用户信息的加密的JSON字符串,主要作用就是可以让微服务可以以通过JWT查询用户信息,JWT包含用户信息。
组成:
1.头部信息:
令牌类型+验签的加密算法
2.载荷信息:
公共信息:
ID:唯一标识
创建者
生成时间
过期时间
自定义的用户信息
3.签名:将头部+载荷信息+密码 Base64转换
例子:景点买门票
25.用户登录
1.由网关判断请求是否需要登录,不需要登陆的请求直接通过
2.需要登陆的请求,先到用户服务进行登陆判断,如果登录成功,则由用户服务发送一个随机的令牌
3.用户再次发出需要验证的请求时,则携带令牌,由网关进行校验令牌,校验成功,则通过请求
26.Spring Security2.0
身份认证,权限管理
第三方登录:
方便、快捷,
降低用户的注册和登陆成本,减少由于本地注册的繁琐行而带来的隐形用户流失,提高注册转换率
通过在第三方平台上宣传自己,增加产品知名度
27.Oauth2认证
第三方认证
流程:(时序图)
客户端、认证服务、资源服务器
授权模式:
授权码模式
客户端模式
隐式授权模式(用户参与、单页应用、客户端密码、前端、客户端后端、资源所属方)
密码认证模式
参数:
client_id:客户端id,和授权配置类中设置的客户端id一致。
response_type:授权码模式固定为code
scop:客户端范围,和授权配置类中设置的scop一致。
redirect_uri:跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)
grant_type:授权类型,
authorization_code,表示授权码模式
password------密码模式
client_credentials----客户端模式
refresh_token----刷新令牌
access_token:访问令牌,携带此令牌访问资源
token_type:有MAC Token与Bearer Token两种类型,两种的校验算法不同,RFC 6750建议Oauth2采用 Bearer Token(http://www.rfcreader.com/#rfc6750)。
refresh_token:刷新令牌,使用此令牌可以延长访问令牌的过期时间。
expires_in:过期时间,单位为秒。
jti:当前token的唯一标识
认证方式:
采用非对称加密算法,使用私钥生成令牌,公钥校验令牌的合法性
认证服务使用私钥进行加密--(代理模式)发送请求生成令牌---公钥解密
keytool -genkeypair(生成密钥)
-alias dongyimai (别名)
-keyalg RSA (加密算法)
-keypass dongyiami(密钥密码)
-keystore dongyimai.jks(密钥库)
-storepass dongyimai(密钥库的密码)
#查看证书信息
keytool -list -keystore dongyimai.jks
#导出工具
keytool -list -rfc --keystore dongyimai.jks | openssl x509 -inform pem -pubkey
28.认证用户登录
流程:
1、用户登录,请求认证服务
2、认证服务认证通过,生成jwt令牌,将jwt令牌及相关信息写入cookie
3、用户访问资源页面,带着cookie到网关
4、网关从cookie获取token,如果存在token,则校验token合法性,如果不合法则拒绝访问,否则放行
5、用户退出,请求认证服务,删除cookie中的token
29.单点登录(面试题)
Single Sign On
简称SSO,在多个服务中,登录一次就可以访问相互信任的多个系统/服务
CAS:主流的单点登录解决方案
优点:
认证系统为独立的系统
各子系统通过Http或其他协议域认证系统通信,完成用户认证
用户身份信息存储在Redis集群
通常将认证系统抽取出来,并且将用户身份存储在单独的存储介质(MySQL/Redis)
原理:登录----认证系统---返回令牌---携带令牌访问
30.资源服务校验令牌
1.拷贝公钥到资源服务下
2.引入认证的依赖(oauth2)
3.编写资源认证的配置类
31.动态加载
1.创建认证服务的库和表,dongyimai_user 修改数据(密码),修改认证服务的数据库连接配置
2.在认证配置类中修改读取数据方式:从内存中读取数据----》从数据库中读取
3.在自定义认证类中,修改静态方式---》动态方式
4.在用户微服务中,新增根据用户名查询用户的接口
5.在资源认证配置类中,将该请求设置放行
6.编写该请求的feign接口
7.在自定义认证类中,修改获取密码的方式:远程调用feign接口
8.在认证服务主启动类中,添加注解开启远程服务调用
32.购物车
加载方式:
1.点击加入购物车,需要提示登陆(京东、天猫),购物车暂存在redis
2.点击加入购物车,在未登录时,将购物车存入cookie中,登陆后在将购物车存入到redis
存储结构:
购物车集合=购物车对象(商家ID+商家名称+订单集合)
33.下单
主键ID:
非空、唯一性、不可重复、自增长、长整型数值、有序、方便创建索引
分布式环境下,容易出现重复数据(缺点)
UUID:
机器ID、36位 数字字母组合、不可重复、无序、不能建立索引
时间戳:
13位毫秒值 可能会重复
分布式ID生成器(生成订单id):Twitter的雪花算法
第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间,
然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识),
然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。
这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分),
并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。
64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加))
34.秒杀
秒杀的双限:时间限制、库存限制
在有限时间内,通过促销活动吸引顾客购买商品,引流。
定时任务
添加定时任务
秒杀商品超卖:库存《 订单
同步代码块、同步加锁、将库存放入队列中,计数器-1(在缓存中-1)
35.Redis
缓存命中
缓存穿透:访问时key=-1,穿过redis直接访问数据库--设置null,并设置过期时间
缓存雪崩:大量秒杀商品集中上架-----添加熔断,过期时间错峰
缓存击穿:爆款商品----将超时时间设置长一点,数据库搭建集群
分布式锁:加锁、解锁、锁超时
36.分布式事务
分布式事务:一个服务一个数据库
事务的四大特性:原子性(A事务是一个整体)、一致性C、持久性D、隔离性I
隔离级别:低 --- 高
1. 读未提交 read uncommitted
引发问题:脏读、不可重复读、幻读
解决:提升隔离级别
2. 读已提交 read committed oracle默认隔离级别 sqlServer默认隔离级别
引发问题:不能读重复数据、幻读
解决:提升隔离级别
3. 可重复读 repeatable read mysql默认隔离级别
引发问题:幻读
解决:提升隔离级别
4. 串行化 serializable
脏读:同一事务下,读取的数据是另一个SQL未提交的数据
不可重复读:同一事务下,相同的SQL的数据结果不同================行加锁
幻读:同一事务下,相同的时间点,对表读取的数据记录数不同===========表加锁
//在重复读级别下我们不允许对表进行更新操作、但是允许对表insert操作、一个事务插入数据第二个事务无论如何也无法查询、第二个事务此时再进入插入发现违法主键约束仿佛出现了幻觉一样
本地事务:
undo日志:先备份原始数据到内存中,在内存中修改,再同步到数据库(实现原子性和持久性)
redo日志:顺序写,提高效率
37.CAP定理
布鲁尔定理
不允许三者同时满足,只能两两满足
针对分布式系统--P CP(zookeeper选举机制) AP(Eureka)
C一致性
A可用性:发出请求则必须有响应回来
P分区容错性
38.分布式事务解决方案
1.基于XA协议的两阶段提交2PC
事务协调者(一个) 事务参与者(多个)
投票阶段、提交阶段
优点:尽量保证了数据的强一致
缺点:效率低,对所有的参与者都要确认,如果有一个参与者锁死,则其他事务参与者都要等待
2.补偿事务TCC三阶段提交 3PC
try(预留资源)---confirm--cancel
转账案例
缺点:代码侵入高
3..本地消息表(MQ+Table)---异步确保
缺点:消息表会耦合到业务中
4.事务消息(RocketMQ[alibaba])MQ
5.Seata(alibaba) 2PC->改进
对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入
高性能:减少分布式事务解决方案所带来的性能消耗
TCC模式:主要关注业务拆分
AT模式:基于XA事务演变,MySql是5.6以上版本,流程图
seata代码实现流程