昨日回顾 Seata 中AT模式 1、TM先TC注册一个全局事务ID,把这个XID在服务链路中传递
2、RM被调用后先向TC做一个本地事务的分支注册,和XID存在关系
3、记录undo_log表的数据,然后执行本地事务,向TC反馈本地事务的执行结果
4、最终由TC发送最终的提交
Seata中TCC模式 1、远程调用预处理的方法的时候先给冻结100
2、然后继续处理业务
3、如果全部处理成功,调用远程的commit方法,取消解冻,然后扣减
4、如果由一个失败,调用远程的rollback方法,取消解冻
锁类型 悲观锁:在修改数据之前会加锁
乐观锁:在修改时间的时候不会加锁,在提交的时候回做一个判断。ABA的问题通过一个版本号来解决(CAS)
Java中锁 同步锁:Java关键字,自动加锁,自动释放锁,没有锁中断,重量级(需要操作系统支持)。
LOCK:JDK提供的一个接口,手动加锁,手动释放,有锁中断机制,轻量级。
加锁锁的是对象,不是代码。
线程可见性 1、什么是线程可见性?
多个线程操作同一个资源同事,一个线程修改了资源,另一个线程拿不到最新的数据,所以两个线程之间是不可见的。
2、什么原因的导致的?
JMM,主内存,work内存。
3、如何解决
voliate关键字,加锁
今日内容 画图 https://www.processon.com/view/link/655ea22493553315d1117a11 抢购 总过有10件商品,卖出一件商品应该创建一个订单,卖完的数量库存为0,订单为10。
package com.ts.day23lock01native.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.PostConstruct; @RestController @RequestMapping("/native") public class NativeSynController { @Autowired private StringRedisTemplate redisTemplate; private String stockKey = "seckill:%s:stock"; private String orderKey = "seckill:%s:order"; @PostConstruct // method-init public void init() { redisTemplate....
昨日回顾 nginx作用 nginx也可以作为服务器,它擅长处理静态资源,非常稳定。
1、正向代理
2、反向代理
3、负载均衡
4、动静分离
日志 SL4j+Logback。
1、项目中的调试日志全部要用log的API输出,不能在用soumt。
2、开发阶段需要关注他的日志信息,所以需要设置它的级别为debug。
3、上线就必须要关注调试信息了,需要设置它的级别为error。
4、在logback.xml中配置了logback的配置信息
nginx配置文件 全局属性块
事件快
HTTP快
server快:配置端口号
locaiton快:完成路由的
nginx匹配流程 1、浏览器发送HTTP请求,http://192.168.147.135:80/index.html
2、先根据IP去找主机
3、再根据端口号定位,应用,80就找到了nginx。
4、nginx根据当前请求地址和locaiton快匹配、
nginx实现正向代理 location / { proxy_pass http://www.baidu.com } nginx实现反向代理 upstream name { server ip:port; server ip:port; server ip:port; } location / { proxy_pass http://name; } nginx负载均衡 upstream name { ip_hash; server ip:port weight=10; server ip:port; server ip:port; } location / { proxy_pass http://name; } 今日内容 画图 https://www....
昨日回顾 Base64 1、它是干什么的?
它可以进行编码和解码
2、能解决项目中的啥问题?
往网络上传递一个二进制文件怎么办?(图片,视频)
把一个二进制文件编码一个特殊的字符串,然后进行传递。
传输二进制—》传输字符串。
服务收到特殊字符串进行解码就能得到一个二进制。
3、他不是一个加密工具,它是一个编码解密工具
加密算法 hash,MD5,Bcrpty。
自带盐值,防止暴力破解。
四个框架都干了什么事情 ThreadLocale 1、客户端携带token发送请求
2、被拦截器拦截后开始校验token,如果token有误直接抛出异常。
3、token校验成功,从token字符串中解析出userToken对象,然后保存到THreadLocale中.
4、拦截器做放行
5、到了controller或service后,可以直接从THreadLocal中获取userToken。
6、解决安全问题还需要再controller执行之后把THreadLocal中的数据删除。
ThreadLocale是保存在当前线程里面,
一个请求发送过去,对于服务端而言就是一个线程。每个线程都有一个THreadLocal,所以他们是线程安全的。
ResponseBodyAdves 对controller返回的内容实现统一的包装(R)
RBAC权限管理系统 基于角色来控制权限的。
用户,角色,权限。
1、先找到用户的角色
2、再找到角色对应的权限,从而也就得到了用户的权限
3、权限判断的时候干的事情是
a、当前用户拥有哪些权限。 –》手里有几把药匙
b、访问这个接口需要那个权限。—》开门需要那把药匙
今日内容 画图 权限的认证 之前做的是token的认证,只要token是正确的就可以正常访问接口。
现在还要做权限,用户有了该接口的权限才能访问接口。
要做权限的认证,必须要在接口之前来完成了。在接口之前干点的事情的技术有那些?
拦截器,AOP。
使用AOP+自定义注解来实现权限的校验。
自定义注解 package com.qf.application.core.aop.annotation; import java.lang.annotation.*; // 这三个注解就是原注解,任何一个注解上面都会有这三个注解 @Target({ElementType.METHOD}) // 表示该注解只能加载方法上面 // *.java --->*.class --->运行 @Retention(RetentionPolicy.RUNTIME) // 该注解的作用域 @Documented // 生成JavaDoc public @interface Permission { } @GetMapping("/map") @Permission() public Map<String, Object> testMap() { Map<String, Object> map = new HashMap<>(); map....
昨日回顾 拦截器 只需要记住,在SpringBoot中如何配置一个拦截器。
1、拦截器的作用(项目中有没有用到过拦截器,用它来解决什么问题)?
在调用接口之前被触发。在调用接口之后被触发。
tokne校验,权限校验,登录拦截
全局异常管理器 只需要记住,在SpringBoot中如何配置一个全局异常管理器。
它的作用什么?项目中用它来解决什么问题?
把项目中遇到的异常可以全部的抛出,到全局异常管理器来统一的处理。
资源相关的资源需要就地解决,不能抛出。
全局异常管理器是如何处理异常的?
先做异常的判断,判断它是系统异常还是业务异常,如果是系统异常记录错误的日志,然后给用户响应系统正在维护,请稍后再试。
如果是业务异常就直接把异常信息抛给用户就可以了。
restful风格 资源定位(url),资源的操作(method)。
查询:get
添加:post
修改:Put
删除:DLETEE
接受和响应的数据都是JSON格式。
优势在于风格非常的简洁,可读性更高。
Session登录的原理 1、为什么会有Cookie和Session的处理?
因为HTTP是无状态的。
2、Session的底层是通过Cookie来实现的。
3、在集群的情况下Seesion等会出现无法共享的问题。
JWT JSON Web Token
它可以帮助我们生成一个Token,而且这个token可以有过期时间,可以揉入一些数据进去,最终生成一个字符串。
JWT石油三部分组成,头,载荷,签名。
之前的Session是如何校验的?
登录成功后再服务端创建一个Session,每个Session会有一个JSESSIONID,session是保存在服务端的,然后把JSESSIONid给客户端,下次访问的时候在Cookie中携带,在服务端就可以获取到JESSIONid然后和服务端自己保存的做一个比对。如果是正确就说明合法的,如果不正确就说明这个被改过没有登录。
JWT可以自校验,它是怎么做到的?
认证成功后使用JWT生成一个token,给token中揉入了一些用户的数据,直接把tokne返回给客户端了,服务端没有保存。客户端下次请求的时候在氢气头中携带token,服务端获取到token后,因为服务端没有保存token,此时它是如何校验的token合法性的?
JWT生成token的过程?
1、先把头通过base64编码,得到一个字符串
2、再把载荷通过base64编码,得到一个字符串
3、使用用户签名把把头和载荷(base64后的字符串)进行一个签名,得到一个字符串。
header.payload.签名
如何自校验的?
校验的时候需要传递token字符串。
1、解析出头部
2、解析出载荷
3、使用用户签名把把头和载荷(base64后的字符串)进行一个签名,得到一个字符串。
header.payload.签名
今日内容 画图 https://www.processon.com/view/link/6538d35ffc67b11c9006d1e8 base64编码 package com.qf.application; import org.junit.jupiter.api.Test; import org.springframework.util.Base64Utils; import org.springframework.util.FileCopyUtils; import java.io.File; import java.io.FileOutputStream; import java.util.Base64; public class Base64Test { // 解码 private static Base64....
昨日回顾 Git客户端 小乌龟可以通过鼠标的方式操作git。
SpringBoot Spring:Bean的创建
SpringMVC:它是对Servlet的一个封装,对Web的支持。
SpringBoot:Spring提供用来快速构建Spring应用程序的。
1、概念
快速构建Spring应用程序的,解决SSM配置文件过多的问题,
简化配置,提高开发效率,自动装配
2、怎么简化配置了?怎么提高开发效率?
从导入依赖来讲只需要导入一个spring-boot-straetr-xxxx或者xxxx-boot-starter依赖,其他的依赖都会传递过来。
从配置信息上来讲,所有的配置你不配,多会有一套默认的配置。
自动装配:项目启动会去扫描依赖,就会做这个依赖相关的注入。
内置的tomcat,可以直接使用。
3、SPringBoot工程结构
它也是基于maven俩构建的
Boot常用注解 1、@Value:读取配置文件的信息
2、@Configuration:专门用来修饰配置类
3、@SpringBootApplication:表示主启动类
4、@ConfigurationProperties:批量的读取配置文件,赋值到具体的对象中
5、@Bean:把方法的返回值放到IOC容器里面
6、@ComponentScan:配置包扫描
7、@MappScanner:扫描Mapper接口的
Boot配置文件 applicaiton.properties,键值对的
applicaiton.yml,它有严格的格式要求,属性和属性之间使用冒号,属性名和属性值之间要有空格。
MP MP是MyBatis的一个插件,它只是在MyBatis之上做了增强,不做改变。
MP的好处就可以自动的完成一些操作,全部靠ORM来完成,通过注解的方式来完成ORM。
1、通用的CRUD接口
2、查询条件
3、分页插件
4、主键生成策略
今日内容 拦截器 拦截器是SpringMVC中的组件,它是用来拦截所有的请求。
1、定义拦截器
package com.qf.application.interceptor; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class UserInterceptor implements HandlerInterceptor { // controller调用之前执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System....
自我介绍 达老师,我负责后面阶段的内容。
我的素材全部是放在gitee上面。
视频是放在阿里云网盘的。
git客户端 之前我们操作git都是使用命令来完成的。
现在图形化界面的工具,它也可以操作git,它可以通过鼠标点击的方式来操作git,这是它的优点,可以提高效率。
这个工具叫做小乌龟。
1、先把这个两个包安装包保存到本地
2、然后先安装小乌龟
3、小乌龟安装成功了以后再去安装汉化包
如果已经配置了中午还是显示的是英文,尝试把电脑重启下。
本地的仓库初始化 随便加点内容
资料地址 gitee:https://gitee.com/dashixin.com/java2305
视频地址 https://www.aliyundrive.com/s/zMEdz7p7TVe
今日内容 画图 https://www.processon.com/view/link/6535d0f8d657a234397f8ea6 SpringBoot概念 1、提高了开发的效率
2、简化了配置
3、约定大于配置。
编码《配置《约定俗成
共享我的本地仓库 1、下载到本地
2、解压
3、把里面的所有的文件全部复制到你自己的本地仓库
4、在maven的配置文件中设置一下本地仓库刚才下载的那个就可以了。
标准的springboot工程 1、包名和类名中都包含了项目的名称
*.cmd;*.git;*.hprof;*.iml;*.md;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store;.hg;.idea;.mvn;.svn;CVS;__pycache__;_svn;mvnw;vssver.scc;vssver2.scc; 优化POM.xml 我把不需要的东西全部删了
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 集成了SpringBoot的父工程 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!-- 当前项目的信息--> <groupId>com.qf</groupId> <artifactId>day01-boot-01-hello</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 设置JDK的版本--> <properties> <java.version>1.8</java.version> </properties> <!...