Seata分布式

昨日回顾 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....

Nov 23, 2023 · 2 min · 橘子树谅

Nginx的集群

昨日回顾 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....

Nov 7, 2023 · 2 min · 橘子树谅

SpringBoot&Vue

昨日回顾 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....

Oct 26, 2023 · 2 min · 橘子树谅

SpringBoot(3)

昨日回顾 拦截器 只需要记住,在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....

Oct 25, 2023 · 3 min · 橘子树谅

SpringBoot(2)

昨日回顾 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....

Oct 24, 2023 · 2 min · 橘子树谅

SpringBoot(1)

自我介绍 达老师,我负责后面阶段的内容。 我的素材全部是放在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> <!...

Oct 23, 2023 · 4 min · 橘子树谅