认证授权auth
什么是认证授权认证授权包含 认证和授权两部分。
什么是用户身份认证?
用户身份认证即当用户访问系统资源时,系统要求验证用户的身份信息,身份合法方可继续访问
常见的用户身份认证表现形式有
用户名密码登录
微信扫码登录等
什么是用户授权?
用户认证通过后去访问系统的资源,系统会判断用户是否拥有访问资源的权限,只允许访问有权限的系统资源,没有权限的资源将无法访问,这个过程叫用户授权。
例如用户去发布课程,系统首先进行用户身份认证,认证通过后继续判断用户是否有发布课程的权限
如果没有权限,则拒绝继续访问系统
如果有权限,则继续发布课程
统一认证
项目包括学生、学习机构的老师、平台运营人员三类用户,三类用户将使用统一的认证入口
用户输入账号密码提交认证,认证通过后继续操作
认证通过由认证服务想用户颁发令牌,相当于访问系统的通行证,用户拿着令牌去访问系统的资源
单点登录
本项目基于微服务架构构建,微服务包括:内容管理服务、媒资管理服务、系统管理服务等。
为了提高用户的体验性,用户只需要依次认证,便可以在多个拥有访问权限的系统中访问,这个功能叫单点登录
单点登录(Single Sig ...
实现不同的数据库之间的同步方式
第一种 实时同步
针对实时性要求比较高的场景可以使用canal中间件实现,我们内部的大数据项目中也有用dataX的。canal 的主要用途是基于mysql数据库增量日志解析,并能提供新增量数据订阅和消费,从而实现数据同步。其主要是基于mysql 的binlog 技术实现的数据同步。主要工作原理如下:1、 canal模拟Mysql slave的交互协议,伪装为Mysql slave 发送dump 协议2、Mysql master接收到dump请求,推送binanry log 给slave3、 canal 解析binartlog 对象
在写入mysql 直接同步 代码耦合度高
第二种对实时性要求不高
MQ向mysql写入数据时同时向mq写入 mq收到消息,同步到其他数据库。但需要处理MQ的最重要的问题,消息的可靠性。
Logstash elk的组成部分,logstash 负责收集、解析、转换数据。
任务调度 开启定时任务扫描到进行同步
熔断降级处理
什么是熔断降级微服务雪崩效应当微服务运行不正常,会导致无法正常调用微服务,此时会出现异常,如果这种异常不去处理,可能会导致雪崩效应
微服务的雪崩效应表现在服务与服务之间调用,当其中一个服务无法提供服务时,可能导致其他服务也挂掉。
例如服务C调用服务B,服务B调用服务A,由于服务A异常导致服务B响应缓慢,最终导致服务A和服务B都不可用,而服务B不可用又导致服务C也不可用。
像这样由一个服务所引起的一连串的服务都无法提供服务,就是微服务的雪崩效应
如何解决由于微服务异常所引起的雪崩效应呢?
可以采用熔断、降级的方法去解决熔断降级的相同点都是为了解决微服务系统崩溃的问题,但它们是两个不同的技术手段,两者又存在联系
熔断:当下游服务异常时,断开与上游服务的交互。它就相当于保险丝,下游服务异常触发了熔断,从而保证上游服务不受影响
降级:当下游服务异常触发熔断后,上游服务就不再去调用异常的服务,而是执行降级处理逻辑,这个降级处理逻辑可以是本地的一个单独的方法而这都是为了保护系统,熔断是当下服务异常时一种保护系统的手段,降级是熔断后上游服务处理熔断的方法。
项目使用Hystrix框架实现熔断、 ...
分布式事务实现技术及考虑点
什么是分布式事务?首先理解什么是本地事务平时我们在程序中通过Spring去控制事务是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠关系数据库来控制事务,而数据库通常和应用在同一个服务器,所以基于关系型数据库的事务又被称为本地事务本地事务具有ACID四大特性
原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。
一致性(Consistency):事务在执行前后必须保持数据的一致性,即满足业务逻辑和约束条件。
隔离性(Isolation):事务之间不应相互干扰,每个事务都应该在独立的环境中执行,不受其他事务的影响。
持久性(Durability):事务一旦提交,其对数据的修改就应该永久保存在数据库中,即使发生系统故障或崩溃也不会丢失。数据库事务在实现时会将一次事务涉及到的所有操作全部纳入到一个不可分割的执行单元,该执行单元中的所有操作要么都成功,要么都失败,只要其中任一操作执行失败,都将导致整个事务的回滚
理解了本地事务,那么什么是分布式事务?现在的需求是:课程发布操作后,将数据写入数据库、Redis、ElasticS ...
xxl-job使用二
在业务中怎么使用分片广播让每个分片并行处理任务对total 求余得到 分片序号 判断处理
如何防止任务重复执行指的是 该任务还没有执行完成,调度中心再次推向执行器,重复执行。可以通过高级配置中调度过期策略中的忽略阻塞处理策略中的 丢弃后续调度来保证 但是并不能完全解决 还需要保证任务的幂等性
如何保证任务的幂等性幂等性就是不管操作多少次保证结果都是一样的解决方案:数据库约束,唯一索引,主键乐观锁 版本号唯一序列号 判断是否与唯一序号相等
分布式锁从理论上讲 前面已经保证了任务不被重复执行,但是如果机器发生故障或者弹性扩容,那么调度中心检测不到该任务已经被分配过了,就会在两个机器之间造成重复执行。此外使用synchronized 无法保证同步,因为synchronized 只能保证同一个虚拟机中多个线程去争抢锁,ReentrantLock 一样。因此要使用分布式锁。
该锁不被虚拟机所有,单独分布式部署,由多个虚拟机所共享,这种锁称为分布式锁。分布式锁的实现方案
基于数据库实现利用主键 唯一索引等,多个线程同时向数据库插入主键相同的数据 谁成功谁获取到所,多个线程同时更新相同的记录,谁更 ...
xxl-job 分布式任务调度 基本使用
xxl-job是一个分布式任务调度平台,使用非常方便。官网:https://gitee.com/xuxueli0323/xxl-job工作原理类似于nacos 执行器注册到调度中心 调度中心分配任务 执行器执行任务
docker-compose 配置1234567891011121314151617version: '3'services: xxl-job: image: xuxueli/xxl-job-admin:2.3.1 container_name: xxl-job environment: PARAMS: '--server.port=8800 --server.servlet.context-path=/xxl-job-admin --spring.datasource.url=jdbc:mysql://192.168.56.200:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&am ...
文件传输 断点续传
什么是断点续传简单来说断点续传指的是文件在上传或下载的过程中,由于网络差断开了,那么下次上传或下载时应该从断点处开始。
怎么实现
前端对文件进行分块
前端使用多线程一块一块上传,上传前给服务端发一个消息检验该分块是否上传,如果已上传则不再上传。
等所有分块上传完毕,服务端合并所有分块,校验文件的完整性。(因为分块全部上传到了服务器,服务器将所有分块按顺序进行合并,就是写每个分块文件内容按顺序依次写入一个文件中。)
前端给服务传一个md5值,服务端合并文件后计算合并后的文件的md5是否一样,一样说明完整,否则不完整,需要重新上传。
此外针对文件上传一半不传了,之前上传到的minio 分块文件需要清理1. 在数据库中记录minio存储的文件信息的文件表2. 文件开始上传时写入文件表,状态为上传中,上传成功更新状态为上传完成3. 当一个文件传了一半不在上传了说明该文件没有上传完成,会有定时任务去查询文件表中的记录,如果文件未上传完成则删除minio 中没有上传成功的文件目录。
需要注意的是 minio 合并 每一分块文件最少是5MB 否则会报错,此外上传分块的文件如 ...
Spring 事务失效
总结点 什么情况下会导致事务失效代理对象调用方法上添加Transcation 注解 采用声明式事务1)方法中捕获异常没有抛出 spring控制事务式基于AOP环绕通知实现的,如果方法抛出了异常就会回滚,如果没有抛出就不会生效2)非事务方法调用事务方法在内部调用由于不是代理对象,因此失效3)事务方法调用事务方法可以被控制 但要选对事务传播行为 只要不是通过代理对象去掉 那么开启一个新事务是不可能的4)transaction 如果标记的不是public 方法也不可以5)抛出的异常类型 默认是RuntimeException6) 数据库本身不支持事务 例如mysql 的myisam存储引擎7)传播行为导致事务失效 比如某些事务传播行为 压根不支持事务
下面给出一个非事务方法调用事务方法时 不是代理对象的解决方案方案一 编程式事务这个就没什么好说的了,网上很多
方案二 声明式事务首先分析原因式因为没有采用代理对象调用,因为该事务方法与非事务方法定义在一个service中,那么就需要想办法将其变为代理对象调用,我们知道注入的对象为代理对象,因此在本service中注入本service。但是 ...
nacos配置文件优先级
结论项目应用名配置文件 ——优先于》扩展配置文件——优先于》共享配置文件——优先于》本地配置文件
例如在nacos 中配置content-api-dev.yaml
1234server: servlet: context-path: /content port: 63040
那么在本地修改端口后启动端口仍然为63040 如果要本地优先 则需要进行以下配置 content-api-dev.yaml 12345 #配置本地优先spring: cloud: config: override-none: true
配置配置中心和注册中心(本地必须配置)12345678910111213141516171819202122232425262728spring: application: name: content-api #服务名 profiles: active: dev #环境名 cloud: nacos: server-addr: 192.168.56.200:58848 #注册中心 pom需要引入nacos d ...
实现多级树形结构查询 比如分类(父分类、子分类)
实现多级树形结构查询 比如分类(父分类、子分类)数据库表结构12345678910CREATE TABLE `course_category` ( `id` varchar(20) NOT NULL COMMENT '主键', `name` varchar(32) NOT NULL COMMENT '分类名称', `label` varchar(32) DEFAULT NULL COMMENT '分类标签默认和名称一样', `parentid` varchar(20) NOT NULL DEFAULT '0' COMMENT '父结点id(第一级的父节点是0,自关联字段id)', `is_show` tinyint DEFAULT NULL COMMENT '是否显示', `orderby` int DEFAULT NULL COMMENT '排序字段', `is_leaf` tinyint DEFAULT NULL COMMENT ...