黑马头条
技术栈:springcloudgateway微服务之前架构的网关服务,实现微服务注册的api请求路由,控制流速和熔断处理
Springbootalibaba Nacos作为项目中注册中心和配置中心
Mybatis-plus作为持久层提升开发效率
Kafka完成内部系统消息通知,与客服端系统消息通知,以及实时数据计算
Redis实现热数据的计算,提升系统性能指标
Mysql存储用户数据,保证上层数据查询的效率
Mongo存储用户热数据,保证用户热数据高扩展和高性能指标
Minio作为静态资源存储器,在其上实现热静资源缓存等功能
Es搜索技术,对冷数据,文章数据建立索引,保证冷数据,文章查询性能
运用ai技术,完成系统自动化,提升效率和节约成本
常用的加密方式
可逆加密:
对称加密:密钥相同,算法公开,计算量小,效率高 算法:AES,DES,HS256 一般用于保存用户手机号,身份证等敏感信息
非对称加密:两个密匙,公钥私钥。安全性好,只适合对少量数据加密。一般用户签名和认证 RSA,DSA,RS256
不可逆加密:一旦加密就不能反向解密得到密码原文,一般用于校验文件正确性 MD5,BCrypt
Base64编码:网上常用的编码方式,传输8bit字节的编码方式,用于在http环境下传输较长的标识信息(编码方式,不算加密方法)
Token
基于token的用户认证是一种服务端无状态的认证方式(服务无状态就是token本身包含登录用户所有的相关数据)
Jwt是一个开发的行业标准,定义了协议格式,用于通信双方传递json对象,传递的信息经过数字签名可以被校验和信任
Jwt令牌结构由头部,负载,签名三部分构成,每部分中间使用点(.)分割 头部:令牌类型和使用的哈希算法 负载:是一个json对象存放有效信息 签名:防止jwt内容被篡改。前两部分用base64url将前两部分编码,使用点连接组成字符串
Freemarker 模板引擎,基于模板和要改变的数据,生成输出文本
模板编写为FTL语言,模板中专注如何展现数据,模板外专注展现什么数据 freemarker是springmvc的一种视图模式,默认支持
MINIO 对象存储服务,作为云存储的解决方案保存图片视频文档,使用Golang实现。兼容S3云存储服务接口—bucket Objet keys
特点:数据保护,高性能,可扩容,sdk支持,有操作页面
分布式id 雪花算法实现,与时间有关,mybatis-plus集成了雪花算法,在实体类的id上加入@TableId(value=”id”,type=IdType.Assign_ID)
Feign的实现1.在feign_api中新增接口,定义文章的接口@FeignClient(value=”模块名”)
- 在用户模块中实现该方法 3.在service中实现
用set保存图片地址去审核,去重图片地址
异步线程池:
@EnableAsync //开启异步调用
敏感词过滤 DFA算法(确定又穷自动机)
一次性把所有敏感词存储到多个map中
图片文字识别OCR 光学字符识别 Tess4j
延时任务 (定时任务的一种,在未来某一时刻执行,没有重复执行周期)
- JDK自带的DelayQueue支持延时获取元素的阻塞队列
- 数据库+redis实现
存储数据库是一种安全的考虑(备份机制)
Redis的key值匹配
- keys的模糊查询,慎用,redis是单线程的,会被阻塞
- Scan命令是一个基于游标的迭代器,scan命令每次调用都向用户返回一个新游标
分布式锁:控制分布式系统有序的对共享资源进行操作,通过互斥保证数据的一致性
数据库:基于表的唯一索引
Zookeeper:根据zookeeper中的临时有序节点排序
Redis:使用setnx命令(如果 key 不存在则为 key 设置 value,如果 key 已存在则 SETNX 命令不做任何操作)
Long类型转换精度丢失 jackson进行序列化和反序列化(在实体类上加@IdEncrypt
Mongodb 开源的,高性能,无模式的文档型数据库
Es搜索引擎 ik分词器ik_max_word细粒度分词器 ik_smart粗粒度分词器
判断是否是热点文章标准:点赞数,评论数,阅读数,收藏数
定时计算
定时任务框架
- spring的传统定时任务@Scheduled 任务失败无法重试和统计,集群的重复执行问题
- Xxl-job轻量级的分布式任务调度平台 易于监控运维,高可用
流式计算 输入是持续的,计算结果是持续输出的。对实时性要求较高,尽量采用增量计算代替全量计算 技术选型Kafka stream
持续集成 (CI) 频繁的将代码集成到主干 Jenkins流行的开源持续集成工具,广泛用于项目开发,具有自动化构建,测试和部署的功能
负载均衡服务器nginx:将请求转发给后端的java微服务端
一个微服务可以部署多份
Nacos注册中心,每个微服务启动之后都可以把自己注册到注册中心中,注册成功就可以拉取注册表(ip和端口)
微服务之间相互调用feign
分布式基础服务:
Kafka:分布式消息系统,实时处理大量数据
Es:分布式搜索数据分析引擎
Minio;分布式的对象存储系统
Mongodb:分布式文件存储的数据库,C++编写的 为web应用提供可扩展的高性能数据存储方案
所有请求响应数据都是json数据,请求参数用dto或pageRequestDto(分页的)接收
响应用Responseesult或PageResponseResult(分页的)
垂直分库:数据库拆分为多个数据库,按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理念是专库专用
技术架构:ssm+spingCloud+mysql+mongdb(分布式关系型数据库)
开发接口:1.需求分析 2.表结构 3.api接口文档 4.三层结构开发:controller,service,mapper
加密算法:bcrypt(不可逆加密)
开发中用的都是伪随机数(代码生成),真随机数(硬件生成)
Jwt生成token。解决分布式环境下session同步的问题,生成jwt令牌,解析jwt令牌
Jwt:主要使用对称的加密算法,hs256
Header:签名的加密算法 payload(载荷)数据 signature:签名
网关统一认证token
网关:统一处理请求,请求转发,过滤。场景:限流,日志,认证,跨域
过滤用过滤器(全局过滤器),转发用路由(动态路由)
动态路由使用了负载均衡,提高了性能
网关如何认证token:1.请求路径放行 2.获取请求头token 3.token非法401 4.token解析失败 5.token合法放行
自定义mapper写动态sql实现:固定条件:状态正常,固定条数limit,排序方式(order by)
动态条件: ?用#{}代替 < 小于 > 大于
文章内容不会经常变,查询效率高且要求响应快用生成静态页面的方式
freeMarker 静态模板引擎(后缀ftl的模板)
两种方式:数据+模板 动态渲染+静态渲染
Minio:bucket桶 keys object
有上传需求的加minio的依赖,谁用谁加
如何判断用户是否登录:1.getewayFilter+interceptor+ThreadLocal业务代码里通过ThreadLocalUtil.getUserId()
- getewayFilter+interceptor拦截器发现请求头userId无值,统一响应未登录错误
创建唯一文件名 UUID+后缀
分页生效添加分页拦截器。分页查询逻辑:设置分页参数,动态拼接查询条件,page执行分页查询,封装PageResponseResult
多对多的关系一般用中间表
业务严谨性代码,一般在业务处理入口。参数是否为空,参数值是否合法,数据是否存在,数据状态是否正确
审核:高效审核
审核内容全面:文本,图片,图片中的文本(用tess4j识别)
三轮审核:dfa审核(自定义的敏感词) 阿里云文本审核 阿里云图片审核
Dfa使用步骤;1.初始化词库 2.检测文本 3.得到map响应结果
阿里云审核得到suggestion的处理结果,block审核失败,review不确定人工审核
线程池异步审核:1.待审核数据(全部文本,全部图片地址) 2.三轮审核 3.决定如何发布文章
Feign的使用 规范:1.在feign-api模块中定义feign接口类 2.在提供方模块中定义controller实现feign接口类 3.在调用方启动类开启feign扫描并注入feign接口类
Kafka理论:单机有序,集群无序
kafka体系:
Partition分区的好处:实现三高高吞吐,高性能,高可用
Offset偏移量
秒分时日月周
MongoDB高性能开源的无模式的文档型数据库,是非关系型数据库
ACID原子性一致性隔离性持久性
使用场景:海量数据存储,读写性能要求高,事务要求不严格,数据结构不定