网站开发环境实验报告,做网站需要数据库吗,深圳展厅装修公司企业展厅设计公司,wordpress公众号登录Spring篇
什么是Spring
Spring是个轻量级的框架#xff0c;他有两大内核分别是IOC、AOPIOC是什么 *
依赖注入和控制反转#xff0c;它是一种思想#xff0c;创建对象不是直接new出来#xff0c;而是交给IOC容器#xff0c;由容器去创建进行管理#xff0c;这就是控制反…Spring篇
什么是Spring
Spring是个轻量级的框架他有两大内核分别是IOC、AOPIOC是什么 *
依赖注入和控制反转它是一种思想创建对象不是直接new出来而是交给IOC容器由容器去创建进行管理这就是控制反转管理者统一由容器去管理不是由使用者去管理。比如我们的service和dao层我们不是直接new出来而是交给Spring容器然后通过Authired注解进行注入这就是依赖注入。Authired和Resource的区别
都是依赖注入Autowired是Spring定义的注解而Resource是Java定义的注解
Autowired是先根据类型byType查找如果存在多个 Bean 再根据名称byName进行查找
Resource是先根据类型byName查找如果存在多个 Bean 再根据名称byType进行查找AOP是什么 *
AOP是面向切面编程它这个思想就是代理模式SpringAOP是基于动态代理实现的默认是jdk动态代理典型案例就是:记录日志、事务的注解AOP常用注解
前置通知 Before
后置通知 After
返回通知 如果有异常不执行
异常通知 出现异常才执行
环绕通知如何使用aop自定义日志
1.定义切面哪些方法哪些类下方法需要进行拦截
2.然后写通知前逻辑获取请求参数
3.然后写通知后的逻辑获取执行结果的状态继续记录日志
4.如果出现异常如何处理具体的记录错误日志循环依赖是什么怎么解决的
循环依赖就是多个Bean互相依赖创建a依赖b创建b依赖c创建c依赖a导致所有对象创建不出来。
解决Spring默认是单例模式不会报错Spring是通过三级缓存来解决循环依赖三级缓存是用3个Map对象一级缓存就是单例池Spring 事务原理
我们一般在某个方法上增加Transactional注解底层使用AOP如果没有异常SQL执行完自动提交事务如果有异常会回滚Spring 事务失效场景
1 该类没有被IOC容器进行管理加载到容器里
2 该方法不是public类型
3 业务代码有try catch捕获异常Spring 用了哪些设计模式
BeanFactory用了工厂模式、AOP用了动态代理模式、SpringMVC中handlerAdaper用来适配器模式、Spring里的监听器用了观察者模式、RestTemplate用来模板方法模式SpringBoot自动配置原理 *
Spring Boot通过EnableAutoConfiguration注解开启自动配置对jar包下的spring.factories文件进行扫描这个文件中存放了这些配置类的全类名
之前我们写ssm项目会配置大量的xml配置然后现在我们SpringBoot项目在启动类有SpringbootApplication注解
该注解下有3个重要注解
1 SpringbootConfiguration:表示启动类是一个自动配置类
2 CompontScan:自动扫描组件默认扫描该类所在包及其子包下所有带有指定注解的类将它们自动装配到bean容器中如Controller、Service等注解
3 EnableAutoConfiguration该注解开启自动配置
该注解下有Import就是导入这里有一个方法将spring.factories文件里需要自动装配的类全部加载到ioc容器中这些自动配置类还会通过xxxProperties文件里配置来进行属性设值属性进行绑定就是进行条件装配。最终把这些类全部创建好存入到IOC容器里。Spring 中的事务传播行为有哪些
有7种传播行为
1 PROPAGATION_REQUIRED 如果当前存在事务则加入该事务如果不存在事务则创建一个新的事务默认的
2 PROPAGATION_SUPPORTS 如果当前存在事务则加入该事务如果不存在事务那就没有事务
3 PROPAGATION_MANDATORY如果当前存在事务则加入该事务如果不存在事务则抛出异常
4 PROPAGATION_REQUIRES_NEW 创建一个新的事务如果当前存在事务创建新的事务
5 PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作如果当前存在事务创建新的事务
6 PROPAGATION_NEVER 以非事务方式执行操作如果当前存在事务则抛出异常
7 PROPAGATION_NESTED 如果当前存在事务则在嵌套事务内执行如果不存在事务则创建一个新的事务。Spring 中的 RestTemplate 是什么
Spring中提供了RestTemplate类可以方便地进行HTTP请求
//创建RestTemplate对象
RestTemplate restTemplate new RestTemplate();
//发送GET请求
String result restTemplate.getForObject(url, String.class);
//发送POST请求
HttpHeaders headers new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntityString requestEntity new HttpEntity(body, headers);
String result restTemplate.postForObject(url, requestEntity, String.class);
//发送PUT请求
HttpHeaders headers new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntityString requestEntity new HttpEntity(body, headers);
restTemplate.put(url, requestEntity);
//发送DELETE请求
restTemplate.delete(url);Spring 中的过滤器和拦截器有什么区别
依赖不同过滤器是依赖于Servlet容器的而拦截器是依赖于SpringMVC框架
过滤器进入Servlet容器前进行处理逻辑拦截器基本容器已经进入了Spring容器中处理SpringBoot常用注解
RestController、RequestMapping(/path) 、Autowired、PathVariable、ControllerServiceCompont、TransactionSpring的bean是线程安全的吗
Spring的默认bean作用域是单例的单例的bean不是线程安全的controller、service、dao他们不需要保证线程安全
想解决线程安全可以使用ThreadLocalSpring 中的 OAuth2 是什么
它是授权协议就是只有经过授权的用户才能访问资源。CSRF 攻击是什么如何防止它
CSRF是Web应用程序安全漏洞它是利用已经登录成功的用户然后操作其他系统页面该页面恶意操作模拟请求目标网站地址恶意操作比如修改用户信息的请求。
一般我们使用授权框架是Spring Security它默认是开启CSRF保护的Spring 中的 JWT 是什么
全称是JSON Web Token就是基于json格式对象实现用户的身份验证单点登录广泛使用JWT
当前端输入账号和密码进行登录后端把token、该用户返回前端之后每次请求前端需要把token值携带传给后端来验证是否有权限访问。
之前我们一般使用session进行认证但session是有缺点的
session的缺点
1.现在我们都是分布式项目不同jar包项目的session是不同的就需要session复制有一个中间件存session值比较麻烦
2.session机制方式基于cookie无法跨域Spring 中的异常处理机制是什么
底层是利用AOP实现的统一的异常处理器接口HandlerExceptionResolver实现这个接口就可以定义全局异常处理器Spring 和 Spring Boot 是什么关系
Spring是一个Java开源框架而Spring Boot是基于Spring框架的一种快速开发框架。Spring、Spring MVC和SpringBoot有什么区别
Spring是一个Java开源框架
Spring MVC是Spring框架的一个模块
Spring Boot是一个基于Spring框架的快速开发应用程序的框架什么是Spring Boot Starter
Starter是模块一个模块需要哪些依赖库它进行引入使用者进行引入该Starter是模块就可以实现某种功能。
如
引入spring-boot-starter-data-jpa 就可以实现与数据库的连接操作数据库
引入spring-boot-starter-data-redis 就可以使用Redis的功能如何自定义Spring Boot Starter
1 创建maven项目
2 将自己的类当项目启动就一些配置类加载到IOC容器中在spring.factories文件中定义
3 开启一些自动加载到注解
4 被父容器引入就可以使用该模块的功能SpringCloud
微服务是什么
有很多模块每一个模块都是一个单独的系统就是微服务。你知道哪些RPC框架
RPC远程过程调用
Dubbo 和 SpringCloud
区别SpringCloud是微服务架构一站式的解决方案架构、Dubbo主要是服务的调用和管理
Dubbo远程调用基于rpc底层nettySpringCloud是基于http
Dubbo支持的语言有java、go、pythonSpringCloud是基于java的SpringCloud由什么组成 *
注册中心Eureka、远程调用Feign 、负载均衡Ribbon、断路器Hystrix 、
网关Zuul、配置中心Config、
消息队列SpringCloud Stream 、链路跟踪SpringCloud SleuthEureka的工作原理
Eureka是注册中心它有一个服务端和客户端客户端连接上服务端并保持心跳每30秒发送1次然后我们可以通过Eureka服务端来监控该服务是否正常。
然后Eureka默认是有自我保护机制的默认是90秒内服务端没有收到客户端的心跳检测就会进入自我保护机制进入自我保护机制Eureka服务端不会马上把该服务删除掉如果我们关闭自我保护机制Eureka服务端会立刻把该服务进行下线。Eureka、Zookeeper、Nacos、Consul的区别 *
Eureka、Zookeeper都是注册中心Nacos、Consul是可以做注册中心又可以做配置中心
在CAP理论Zookeeper和Consul更专注CP、Eureka是APNacos默认是AP但它可以支持CP
Eureka默认有自我保护机制默认客户端的服务挂了服务端不会马上把该服务下线而Nacos会马上把该服务进行下线。Ribbon的原理
Ribbon它是作负载均衡默认是轮询算法
它的算法次数%机器数取余就得出该list的下标从而得到该服务端ip地址。SpringCloud有几种调用接口方式
Feign、RestTemplateHystrix断路器是什么
多个服务相互调用A服务调用B服务如果过程中出现熔断限流如果一致被阻塞会导致整体系统崩溃所以有了Hystrix断路器就是失败的话进入失败的调用方法。什么是服务降级、服务熔断、服务隔离 *
服务降级当出现请求超时、资源不足会触发服务降级执行fallback方法里的逻辑
服务熔断当A服务调用B服务B服务异常如网络波动达到阈值自动触发降级
服务隔离为隔离的服务开启一个独立的线程这样在高并发情况下也不会影响该服务
降级A服务调用B服务发送10个请求即使每个请求都超时也会去请求B。
熔断A服务调用B服务发送10个请求失败率为50%如果5个请求失败此时失败率到了50%那么后面的5个请求就不会走到B服务。Gateway与Zuul的区别
他们都服务网关Zuul最早点版本是不支持长链接也不是异步处理请求基于Servlet的很容易造成API阻塞是BIO同步阻塞
Gateway是阿里巴巴团队开发的它底层是基于Netty是AIO异步非阻塞后期的Zuul版本改成了AIO可Gateway适配SpringCloud每个组件它的使用率就越来越高默认自带负载均衡、限流配置而Zuul是不匹配的。集群高并发情况下如何保证分布式唯一全局id生产 *
1.UUID
缺点不是有序的在mysql官网上有主键不建议设置UUIDUUID是字符串是36位的不是有序递增的数字导致磁盘读写是随机读写不是顺序读写读写速度慢也容易导致索引的页分列。
2.数据库自增主键
通过对该表某个字段设定唯一索引每次新增如果没有该值会进行新增有会更新最新的注解id保证数据库有唯一的该值
replace into 表 (字段) values (a);
得到刚 insert 进去记录的主键值只适用与自增主键
select last_insert_id();
缺点单机的话会增加数据库压力高并发的情况下mysql处理数据能力弱。
3.基于Redis生生成全局id
Redis是单线程可以保证数据的安全性Redis处理数据能力高于mysql
缺点一台Redis会有单机故障如果部署集群为了自增主键部署集群得不偿失。
4.雪花算法
生成唯一id他字符类型是longlong是64位的。第一位是0然后41位是时间戳该时间戳范围可以用69年从1970年开始可以用到2039年然后是5位的机器id和5位的服务id 最后12位是序列号表示同一机器同一毫秒生产的序号
优点每秒可生成百万个不重复 id、不依赖第三方库或者中间件、算法简单在内存中生成效率高。
缺点依赖时间戳如果系统更改系统时间会出现回拨现象出现id重复解决每次生生成的需要对比当前服务器时钟是否被回拨。
5.其他生产分布式id
百度开源的生成分布式id工具UidGenerator
美团开源的生成分布式id工具Leaf
案例
// cn.hutool.core.lang.snowflake;
Component
public class GeneratorSnowflake extends BaseController {private long workerId 0; // 当前机房值是0号机房0-31private long datacenterId 1; // 当前机器1号机器private Snowflake snowflake IdUtil.createSnowflake(workerId, datacenterId);PostConstructpublic void init() {try {workerId NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());log.info(当前机器的workerId:{}, workerId);} catch (Exception e) {workerId NetUtil.getLocalhostStr().hashCode();log.info(当前机器 workId:{}, workerId);}}public synchronized long snowflakeId() {return snowflake.nextId();}public synchronized long snowflakeId(long workerId, long datacenterId) {snowflake IdUtil.createSnowflake(workerId, datacenterId);return snowflake.nextId();}public static void main(String[] args) {System.out.println(new GeneratorSnowflake().snowflakeId());}}SpringCloud主要解决什么问题
解决服务之间的通信、负载平衡方便服务集中管理常用组件有注册中心、配置中心、远程调用。服务熔断、网关CAP理论是什么
C一致性这里指的强一致性也就是数据更新完访问任何节点看到的数据完全一致
A可用性就是没有发生故障在在规定时间内返回合正确结果
P容灾性当网络不稳定时节点之间无法通信造成分区这时要保证系统可以继续正常服务。提高容灾性的办法就是把数据分配到每一个节点当中所以P是分布式系统必须实现的然后需要在C和A中取舍
然后有了BASE理论
BA - 基本可用分布式系统出现故障保障核心可用
S - 软状态在一定时间出现不一致状态
E - 最终一致性无法保证强一致性但在软状态结束后最终达到数据一致性为什么不能同时保证一致性和可用性呢
举个例子请求一组数据A服务提供一部数据B服务提供另一部数据然后再封装返回给客户端。
当A服务挂了如果保证数据一致性必须等A服务启动这时需要时间等待违背了可用性。
当A服务挂了如果保证数据可用性返回默认的旧数据违背了数据一致性问题。熔断限流是什么
SprngCloud中用Hystrix组件来进行降级、熔断、限流
熔断是对于消费者来讲当提供者请求时间过长为了不影响性能对该链接进行熔断
限流是对于提供者来讲为了防止某个消费者流量太大导致其它更重要的消费者请求无法及时处理。限流可用通过拒绝服务、服务降级、消息队列延时处理、限流算法来实现常用限流算法
计数器算法使用redis的过期机制实现
漏桶算法一般使用消息队列来实现请求任务放到队列中当队列满的时候开始拒绝请求
令牌桶算法预先往队列里存放一些token所有请求都必须拿到token才能访问系统当队列里的token都拿完就开始拒绝请求Spring Cloud Alibaba
Spring Cloud Alibaba是什么
它是基于和符合Spring Cloud标准的阿里的微服务解决方案Nacos中的保护阈值的作用是什么 *
客户端会每隔5秒发送一次心跳检测服务端如果没有收到客户端的心跳会把该实例标记不健康的服务如果30秒没有收到就会删除该实例。
如果保护阈值设置10总共有10个服务其中5个服务挂了不设置保护阈值来10个请求进行负载均衡它平均分配到这5台健康的服务如果高并发下需要10个服务去分担压力现在是5台可能会导致整体服务都挂了。如果设置了保护阈值这样就是把全部请求分配给全部的10台服务会出现一部分请求成功和一部分失败不会造成整体失败。Nacos的就近访问是什么意思
Nacos是可以设置集群的就是服务A调用服务B会看A服务属于哪个集群会请求同一集群的服务B就是就近访问。如何理解Nacos中的命名空间
默认是pulibc命名空间之间是独立的还有组的概念我理解的命名空间相当于java的包名组就是类名。
我们通过不同的命名空间和组指定不同环境都配置和注册。例子618时期的服务A、平常时期的服务A、过年时间的服务A是不同的级别访问请求对应适合的配置文件。什么是Sentinel
它是分布式保护服务框架可以实现服务的降级、熔断、流控管理。可配置流控、熔断、热点配置。流控规则有什么*
类型分为QPS和线程数设置阈值达到该值就进行流控处理
流控模式直接关联链路多个请求都请求到同一服务上
流控效果快速失败预热它有预热时长当流量大量来的时候慢慢的把流量放进来慢慢的把阀值增长到设置的阀值排队等待均匀等待有超时时间设置QPS和线程数的区别
QPS每秒钟的请求数量当1秒达到设置的阈值就进行限流。
线程数:服务端的处理请求的线程超过阈值的时候就进行限流。服务降级规则熔断有哪些策略 *
1.RT平均响应时间平均响应时间超出阈值并且时间窗口也满足条件才会触发熔断。秒级
2.异常比例平均响应时间超出阈值异常比例达到多少比例就会触发秒级)
3.异常次数异常数分钟统计超过阈值时分钟)热点规则
热点数据就是经常访问的数据比如某些参数是某个值是热点数据进行限流操作其他参数不进行限流。Sentinel的限流和Gateway的限流有什么差别
Sentinel限流算法
默认限流模式是基于滑动时间窗口算法
排队等待的限流模式则基于漏桶算法
而热点参数限流则是基于令牌桶算法
Gateway的限流算法是令牌桶算法Sentinel与Hystrix线程隔离区别
Sentinel可以有QPS限流基于计数Hystrix是根据线程池根据线程来限流的。Seata的执行流程、生命周期
它分为TC 事务协调者、TM 事务管理器、RM 资源管理器
首先就是TC就是开启事务的它进行开启事务调用TM生成全局事务id全局事务id会在每次传输中携带
然后TC发送SQL语句给RM执行SQL语句产生了分支事务交给TM
TM向TC发送全局事务id、分支事务id此时根据不同的模式判断是否提交该SQL的事务
然后执行其他服务的SQL语句都是分支事务
都执行完TM会进行闭环处理也是根据根据不同的模式
判断处理是否回滚回滚执行回滚的SQL语句如不需要回滚会删除分支事务解锁全局事务。Seata的有哪些几种模式
1 AT弱一致也是默认的它是二阶段提交性能适中。第一阶段执行SQL脚本之前会记录该SQL的前后数据的快照记录SQL执行完就进行提交事务第二阶段如果都执行完不需要回滚就删除快照记录数据如果需要回滚根据快照记录数据进行回滚数据。
2 XA强一致它是二阶段提交是数据强一致性能最差。第一阶段执行SQL脚本之前并不会提交事务第二阶段如果都执行完不需要回滚就提交事务需要回滚会进行回滚完全交给数据库处理。
3 TCC弱一致性能比AT模式强需要手动写代码处理不依赖数据但我看官网在高版本中也依赖数据库了。第一阶段执行SQL脚本进入Try方法里会根据自定义的逻辑对数据进行资源锁定为冻结数据然后提交事务第二阶段如果都执行完不需要回滚就删除冻结数据如果需要回滚会进入Cancel方法手动进行写回滚逻辑。它还需要考虑方法的幂等性空回滚问题
4 Saga弱一致它性能最好但数据容易出脏数据。第一阶段执行SQL脚本提交事务第二阶段如果都执行完不需要回滚不处理需要回滚手动进行写回滚逻辑。