1.@SpringBootApplication
@EnableEurekaClient/@EnableEurekaServer
@MapperScan(basePackages = "com.changgou.user.dao")
启动类常用的三个注解
2.FastDFS体系结构:
.FastDFS是一个开源的轻量级[分布式文件系统],它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,
解决了大容量存储和负载均衡的问题
.FastDFS 架构包括 Tracker server 和 Storage server
.客户端请求 Tracker server 进行文件上传、下载,通过Tracker server 调度最终由 Storage server 完成文件上传和下载
.Tracker server(调度服务器)-->负载均衡和调度
.Storage server(存储服务器)-->文件存储,客户端上传的文件最终存储在 Storage 服务器
3.@Column注解
.用来标识实体类中属性与数据表中字段的对应关系
5.OpenResty
.OpenResty 是一个强大的 Web 应用服务器,OpenResty 简单理解成 就相当于封装了nginx,并且集成了LUA脚本.
6.nginx:
.Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端
.反向代理:
.客户端本来可以直接通过HTTP协议访问某网站应用服务器,如果网站管理员在中间加上一个Nginx,
客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,
此时Nginx就是反向代理服务器
.负载均衡:
.Nginx可以通过反向代理来实现负载均衡。
.nginx的限流:
.一是控制速率
.漏桶算法
.nginx可以配置限流参数(nginx.conf)
例:
limit_req zone=contentRateLimit burst=4
burst=4 表示若请求数大于4,将拒绝处理多余的请求,直接返回503
.二是控制并发连接数
.配置
limit_conn addr 2;表示 同一个地址只允许连接2次
12.SpringData
.Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,Spring Data可以极大的简化JPA的写法,
可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能
15.微服务网关
.网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过网关这一层
.优势:
.安全 ,只有网关系统对外进行暴露,微服务可以隐藏在内网,通过防火墙保护
.易于监控。可以在网关收集监控数据
.易于认证。可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证
.减少了客户端与各个微服务之间的交互次数
.易于统一授权。
.实现微服务网关的技术:
.nginx Nginx (tengine x) 是一个高性能的HTTP和反向代理的服务器
.zuul ,Zuul 是 Netflix 出品的一个基于 JVM 路由和服务端的负载均衡器
.spring-cloud-gateway, 是spring 出品的 基于spring 的网关项目,集成断路器,路径重写,性能比Zuul好
16.令牌桶算法:
.令牌桶算法是比较常见的限流算法之一,大概描述如下:
.所有的请求在处理之前都需要拿到一个可用的令牌才会被处理
.根据限流大小,设置按照一定的速率往桶里添加令牌
.桶设置最大的放置令牌限制,当桶满时、新添加的令牌就被丢弃或者拒绝
.请求达到后首先要获取令牌桶中的令牌,拿着令牌才可以进行其他的业务逻辑,处理完业务逻辑之后,将令牌直接删除
17.JWT(JSON Web Token)鉴权:
.。
.一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。
.头部:
头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法
.载荷:
载荷就是存放有效信息的地方
.签证:
这里存放一个secret字段,secret保存在服务器端,web token的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,
所以,它就是你服务端的私钥,在任何场景都不应该流露出去
服务器生成token-->发送给客户端-->客户端发送请求时携带此token(门票)-->服务端接收token,解析出信息
22.分布式事务:
.分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,且属于不同的应用
.分布式事务就是为了保证不同数据库的数据一致性
保证单一数据库的一致性的事务称为本地事务
25.雪花算法SnowFlake
.分布式系统中生成全局唯一ID--推特出品
.雪花ID生成的是一个64位的二进制正整数
26.gateway网关:
.技术:spring-cloud-gateway
.不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信
会出现以下问题:客户端会多次请求不同的微服务、认证复杂,每个服务都需要独立认证。那么此时就需要网关,网关是介于客户端和服务器端之间的中间层,
所有的外部请求都会先经过 网关这一层。安全、监控都可以交给网关来做。
.实现过程:
.依赖
.启动类
.yml配置:
.在此进行跨域配置、路由、前缀后缀过滤等
.网关限流:
.spring cloud gateway基于令牌桶算法(redis的限流算法)来限流
每秒生成固定数量的令牌存入redis中
.在yml中配置如下参数:
redis-rate-limiter.replenishRate---令牌桶填充的速率
redis-rate-limiter.burstCapacit--允许在一秒钟内完成的最大请求数
.编写全局过滤器,实现对用户令牌的拦截和检验
27.用户登录:
.用common中的BCrypt进行解密验证(数据库中存放用户的密码已经是密文了)
.将用户令牌数据添加至cookie中
.JWT(JSON Web Token)鉴权:
.JWT是一个字符串。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。
.JWT分为三部分:
头部(令牌的类型,令牌的签名算法)、载荷(存放有效信息)和签证(用于身份验证和检验信息有没有被篡改)
.使用方法:
.引入相关依赖,然后利用api对信息可以加密为token
.服务器对信息加工生成token--->服务器将token发送给客户端--->客户端带着token访问服务器--->服务器接收到token并解析内容
.鉴权的过程:
.用户访问网关,同时携带头文件信息(里面包括cookie)-->网关进行拦截,获取用户要访问的路径(路由)-->如果访问路径需要权限,且用户未登陆,则用户进行登录验证
-->验证通过后,用户微服务会颁发一个令牌给用户,存放在cookie中-->用户下次登录,携带令牌即可识别是否登录
response.addcookie();
30.门户网站的首页的广告数据:
.特点:
变更速率低
访问量大
不适合直接从mysql查询
.实现方式
.三级缓存架构:
.nginx-->redis-->mysql
.数据同步用lua脚本语言
.lua:
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
.配置lua的过程:
.安装OpenResty(OpenResty 简单理解成 就相当于封装了nginx,并且集成了LUA脚本,开发人员只需要简单的其提供了模块就可以实现相关的逻辑)
.lua配置:
mysql数据库的配置
sql语句的配置
redis的配置
.nginx限流:
.漏桶算法:
.限流配置:
#限流设置
limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=2r/s;#每秒最多处理2个请求
.canal监控mysql广告数据更新:
.canal:
.canal可以用来监控数据库数据的变化,从而获得新增数据,或者修改的数据
.原理:
1. canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
2. mysql master收到dump请求,开始推送binlog给slave(也就是canal)
3. canal解析binlog对象
.canal起到的作用:
.当用户执行数据库的操作的时候,binlog日志会被canal捕获到,并解析出数据。我们就可以将解析出来的广告数据进行同步到redis中即可。
.canal实现:
.在内部写监听器
31.整个项目的限流情况:
.在最外层启动nginx限流,对大请求流量的防御,对下一层的网关(gateway)进行保护
.在网关(gateway)进行限流,对路由后的微服务进行保护,防止雪崩
31.商品搜索的实现:
.ElasticSearch:
.一个分布式实时分析搜索引擎,每个字段可以被索引与搜索,并支持PB级别的结构化或者非结构化数据
.IK分词器:
.开源的,基于java语言开发的轻量级的中文分词工具包
.SpringData ES
.Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装
.产品搜索实现过程:
.请求search服务,调用数据导入地址
.根据注册中心中的注册的goods服务的地址,使用Feign方式查询所有已经审核的Sku
.使用SpringData Es将查询到的Sku集合导入到ES中
.SkuEsMapper extends ElasticsearchRepository<Sku,Long>
用SkuEsMapper.saveall()即可实现导入数据到es
.产品搜索,价格区间查询使用的api:
.es的boolQueryBuilder().filter()
.ES根据分组名称做一次分组查询
//设置分组条件 商品品牌
nativeSearchQueryBuilder.addAggregation()
32.购物车实现:
.先登录才能操作购物车,登录后将喜欢的商品添加至购物车,存入redis,等用户下单后会存入msql
redis选择hash类型,将用户的用户名作为namespace的一部分,key和value,key是商品ID,value是加入购物车的商品详情
33.项目中遇到的问题:
数据库数据量太多 导致查询太慢,goods表有几万条数据:
之前默认的唯一索引是id,后改为name
通过给name字段添加索引,但name并不是聚集索引,一张表只有一张聚集索引那就是是主键
name索引的查询方式为先查name的索引表(b+树),查到对应的id,再去聚集索引上查真实数据