项目
2021-09-11 00:54:28 0 举报
AI智能生成
项目
作者其他创作
大纲/内容
实现了基于Raft算法的K/V数据存储系统
实现了分片的K/V数据存储系统
实现了什么功能
在 Raft 集群自身内部通过票选、心跳等机制投票选出一个大多数节点认可的主节点作为集群的 leader 去处理所有请求。
什么是选主
所有请求的处理者,接收客户端发起的操作请求,写入本地日志后同步至集群其它节点。
Leader
请求的被动更新者,从 leader 接收更新请求,写入本地文件。如果客户端的操作请求发送给了 follower,会首先由 follower 重定向给 leader
Follower
如果 follower 在一定时间内没有收到 leader 的心跳,则判断 leader 可能已经故障,此时启动 leader election 过程,本节点切换为 candidate 直到选主结束。
Candidate
结点有三种角色
所有结点都是follower
初始状态
任意follower 在一段时间内没有收到任何心跳,选举超时,那么它就会主观认为 leader下线了,并发起新的选举
少部分的Candidate数量保证了一个结点得到更多选票的可能性
触发选主的条件
保证了一次选举出的主节点的唯一性
如果 term 不同 term 更大的日志更新,否则 index 大的日志更新。
一定可以快速选举出来的原因
选举成功的条件
选出的leader结点就开始接收请求
选主过程
选主
leader 会周期性的向所有follower结点发送心跳包来维持自己的权威
心跳机制
什么是日志复制
这样的检查保证了所有日志的信息最终达到一致状态
follower收到日志复制请求
日志复制流程
日志复制
Raft
K/V Server提供Get/Append/Put操作
K/V Server + Raft
replica group 询问master找到自己应该服务哪些shards
服务器
Client询问Master来找到key对应的replicate group
客户端
处理分片的配置信息
ShardMaster
Shard K/V Server + Raft
有哪些模块
解决什么问题
客户端请求raft集群就会发起一个日志复制的请求 这个日志必须得到>(N/2+1)结点的成功复制才可以提交这个日志并返回
具体内容
什么是Raft算法
对于调用时间存在重叠(并发)的请求,生效顺序可以任意确定。
对于调用时间存在先后关系的请求,后一个请求不能违背前一个请求确定的结果。
任何一个客户端的读取返回新值后,所有客户端的后续读取也必须返回新值
强一致性的特性
什么是强一致性
可能的问题
场景描述
为了确保 leader 处理读操作时仍拥有领导权,我们可以将读请求同样作为一个提案走一遍 Raft 流程,
解决方法
网络分区故障
结点下线
请求到达的时候服务器正在进行分片转移
考虑的边界条件
处理Raft结点之间的RPC
状态机落后于 committed log 导致脏读
网络分区导致脏读
当这次读请求对应的日志可以被应用到状态机时前一个日志一定已经应用到了状态机了,leader 就可以读状态机得到最新数据并返回给用户了
基于Raft实现强一致性
每个客户端都会生成一个唯一的UUID 和请求号一起构成一个请求的唯一标识
遇到请求会通过这个客户单的UUID找到次的请求序号
什么是幂等性?幂等性:提交一次和多次,结果是一样的。
幂等性
重复请求
遇到的困难
学到了什么
6.824
安装virtualBox
使用vagrant 虚拟linux
Docker安装 MySQL (5.7)
Docker安装redis
安装Docker
1. 配置文件中配置Nacos server的地址2. 配置微服务的应用名称3. 在主应用程序上加上 @EnableDiscoveryClient注解4. 启动NacosServer服务器5. 启动微服务6. 登录 127.0.0.1:8848/nacos
微服务注册到Nacos注册中心
1. 引入Nacos Config starter 依赖2. 添加bootstrap.properties配置文件 1. 配置当前服务的名称 2. 配置nacos配置中心的地址3. 在配置中心添加一个数据集(Data Id) gulimall-coupon.properties 1. 默认命名方式为 <应用名.properties> 2. 在配置文件中可以随时修改信息发布4. 在需要获取到配置中心配置文件内容(@Value(\"${properties的key}$\
微服务从Nacos配置中心获取配置
客户端发送请求到服务器路途中,设置一个网关,请求都先到达网关,网关对请求进行统一认证(合法非法)和处理等操作。他是安检。
配置Nacos的地址 (application.properties)
配置中心的配置文件 bootstrap.properties
uri: predicate满足的情况下跳转的地址
编写网关服务的配置
API网关
微服务环境搭建
环境搭建
katcha 谷歌验证码
根据用户名获取用户信息
用户名不存在返回
验证用户登录信息
UserId
一个UUID随机数
当前时间
过期时间
token认证机制token与session的不同主要在①认证成功后,会对当前用户数据进行加密,生成一个加密字符串token,返还给客户端(服务器端并不进行保存)②浏览器会将接收到的token值存储在Local Storage中,(通过js代码写入Local Storage,通过js获取,并不会像cookie一样自动携带)③再次访问时服务器端对token值的处理:服务器对浏览器传来的token值进行解密,解密完成后进行用户数据的查询,如果查询成功,则通过认证,实现状态保持,所以,即时有了多台服务器,服务器也只是做了token的解密和用户数据的查询,它不需要在服务端去保留用户的认证信息或者会话信息,这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利,解决了session扩展性的弊端。原文链接:https://blog.csdn.net/mydistance/article/details/84545768
将新生成的Token保存到数据库
登录功能
问题描述
什么是跨域
- 方法1:设置nginx包含admin和gateway。都先请求nginx,这样端口就统一了- 方法2:让服务器告诉预检请求能跨域
解决方法(采用方法2)
Access-Control-Allow-Origin : 支持哪些来源的请求跨域Access-Control-Allow-Method : 支持那些方法跨域Access-Control-Allow-Credentials :跨域请求默认不包含cookie,设置为true可以包含cookieAccess-Control-Expose-Headers : 跨域请求暴露的字段
配置当次请求允许跨域
获取基于url跨域配置源类 UrlBasedCorsConfigurationSource source
生成Cors跨域配置信息类 CorsConfiguration corsConfiguration
//1.配置跨域 //允许所有的请求头类型跨域 corsConfiguration.addAllowedHeader(\"*\"); //允许任意请求方式跨域 corsConfiguration.addAllowedMethod(\"*\"); //允许任意请求来源跨域 corsConfiguration.addAllowedOrigin(\"*\"); //允许携带cookies跨域 corsConfiguration.setAllowCredentials(true); //任意路径允许跨域 source.registerCorsConfiguration(\"/**\
对任意路径拦截后设置允许跨域就不存在跨域问题了
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作
XSS Cross Site Script(跨站脚本)
1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
CSRF(跨站请求伪造)
解决跨域问题
member模块添加feign包
接口添加注解@FeignClient(\"需要调用的模块在注册中心的名称\")
调用方法上加@RequestMapping(\"被调用方法的完整URL\")
主启动类添加主机@EnableFeignClients(\
调用流程
实现微服务间的RPC调用
商品的增删改查
商品服务
微服务功能
商城后台管理系统
CovidParser是干什么的
根据输入文件名类型调用不同的parser实现对不同类型文件的解析
负责创建管理不同文件parse得到的结果缓存
key 文件名
value 文件名对应的cache对象
底层实现concurrentHashMap
CacheManager
对应一个文件parse后得到的结果
基础类型缓存 ConcurrentHashMap
LRU类型 LinkedHashMap
底层实现两种
get put remove clear
提供
ICache
缓存组件
日志库
有哪些功能
CIT594 CovidParser
项目
0 条评论
回复 删除
下一页