**背知识要点**
我们是前后台分离 ,使用nginx 做请求转发和负载均衡 -、
()是怎么配置)
RabbitMQ: 是个消息队列 ,
FastDFS :执行流程
1.消息队列:
线程和进程的区别?
一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下也可以有多个线程来增加程序的执行速度。
实现跨域有以下几种方案:
服务器端运行跨域 设置 CORS 等于 *;
在单个接口使用注解 @CrossOrigin 运行跨域;
使用 jsonp 跨域;
2.分布式事务:
分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。
本质上来说,分布式事务就是为了保证不同数据库的数据一致性。
3.怎么实现redis与数据库同步:读取数据的时候先从redis里面查,若没有,再去数据库查,同时写到redis里面,并且设置失效时间。2.存数据的时候要具体分析,可以选择同时插到数据库和redis中,也可以选择直接插到数据库里面,少考虑问题。
ssm常用注解:
@Service:业务层组件注解。
@Controller:控制层组件注解。
@Repository
@Autowired
@Value
@RequestMapping
@RequstParam
@ModelAttribute
@RequestMapping
@Before
@Transactional
springmvc的工作原理
- 客户端请求提交到DispatcherServlet
- 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
- DispatcherServlet将请求提交到Controller
- Controller调用业务逻辑处理后,返回ModelAndView
- DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
- 视图负责将结果显示到客户端
spring mvc 和 struts 的区别是什么?
拦截级别:struts2 是类级别的拦截;spring mvc 是方法级别的拦截。
数据独立性:spring mvc 的方法之间基本上独立的,独享 request 和 response 数据,请求数据通过参数获取,处理结果通过 ModelMap 交回给框架,方法之间不共享变量;而 struts2 虽然方法之间也是独立的,但其所有 action 变量是共享的,这不会影响程序运行,却给我们编码和读程序时带来了一定的麻烦。
拦截机制:struts2 有以自己的 interceptor 机制,spring mvc 用的是独立的 aop 方式,这样导致struts2 的配置文件量比 spring mvc 大。
对 ajax 的支持:spring mvc 集成了ajax,所有 ajax 使用很方便,只需要一个注解 @ResponseBody 就可以实现了;而 struts2 一般需要安装插件或者自己写代码才行。
hashmap和hashtable的区别
1.hasmap是线程不安全的,效率高,键和值都允许空。而hashatable则不是
mybatis和hibernate的区别:
Mybatis他 不完全是ORM框架,他更侧重与程序员自己编写sql语句。mybatis通过注解和xml配置来灵活的运用sql语句。而hibernate则是全自动的orm框架。
sql优化方面,由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多,而hibernate的sql很多都是自动生产的无法直接维护sql。
shiro:用户表 角色表 用户和角色的中间表。权限表 。角色和权限的中间表。
授权,认证,会话管理,加密
shiro执行流程:
集合:
9.说一下list,set,map的区别。
List:1.可以允许重复的对象。
?2.可以插入多个null元素。
? ? ? ? 3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
? ? ? ? 4.常用的实现类有?ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
?Set:1.不允许重复对象
? 2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator ?或者 Comparable 维护了一个排序顺序。
? ? ? ? 3.?只允许一个 null 元素
? ? ? ? 4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。
Map:1.Map不是collection的子接口或者实现类。Map是一个接口。
? ? ? ? ? ?2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
? ? ? ? ? ?3.?TreeMap 也通过 Comparator ?或者 Comparable 维护了一个排序顺序。
? ? ? ? ? ?4.?Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
? ? ? ? 5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
线程:
线程的实现方式:继承Thread类,实现Runnable接口和Callable接口
创建线程池的四种方法:newCachedThreadPool创建非固定数量,可缓存的线程池,若线程池超过处理需要,可灵活回收空线程,若没有线程可回收,则创建新线程。
newFixedThreadPool:newScheduledThreadPool定时执行线程池,支持定时及周期性任务执行。
线程池的好处:限定创建线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃。线程不需要每次去创建和销毁,节约了资源。大大提高了效率。
避免死锁的方法:
1,尽量减少同步范围,即synchronized如果能只包围一个对象,就不要包围这个对象所在方法
2,申请锁的减少交叉,按顺序申请
3,死锁一般是会有一个死锁环,添加睡眠可以减少死锁环的概率
成员变量和局部变量有什么不同;
1,成员变量在类中方法外,局部变量在方法声明上。
2.成员变量在堆内存中,局部变量在栈内存中。
3.成员变量随着对象的创建而存在,随着对象消失而消失。局部变量随着方法的调用而存在,随着方法的调用完毕而消失。
4.初始值不同,成员变量有默认值初始化。局部变量,没有默认值初始化,必须定义,赋值。
抽象类可以有抽象方法和非抽象方法,而接口只能有抽象的方法。且接口不能有方法体。抽象类可以。接口只能通过间接的实例化。而抽象类则不是。
spring的机制
1.?IOC和AOP分别指的什么?请叙述你对他们的理解。
IoC:(Inversion of Control)控制反转,是指将创建对象和对象之间的依赖关系的权利交给spring容器,而不是传统的在对象内部直接控制。
依赖注入(Dependency Injection):组件之间依赖关系由容器在运行期决定,即由容器动态的将某个依赖关系注入到组件之中。
优点:实现组件之间的解耦,提高程序的灵活性和可维护性。 ??
AOP(Aspect Oriented Programming),即面向切面编程。它利用一种称为"横切"的技术,剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面,比如日志功能,权限功能。切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。
Spring 事物机制总结
1)Spring的声明式事务管理在底层是建立在AOP的基础之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过等价的基于标注的方式),便可以将事务规则应用到业务逻辑中。因为事务管理本身就是一个典型的横切逻辑,正是AOP的用武之地
1.所有Bean共享一个代理基类。2.:使用拦截器.3.全注解
1、JSP在本质上就是SERVLET,但是两者的创建方式不一样.
2、Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观.
J3、SP由HTML代码和JSP标签构成,可以方便地编写动态网页.
Java对象转换为JSON
JSONArray jsonArr = JSONArray.fromObject(emps);
? ?String jsonStr = jsonArr.toString();
3.3 JSON和XML的优缺点
3.3.1 XML的优缺点
优点:
(1)格式统一,符合标准;
(2)容易与其他系统进行远程交互,数据传输比较方便。
缺点:
(1)XML文件庞大,文件格式复杂,传输占带宽;
(2)服务器端和客户端都需要花费大量时间来解析
dubbo
springcloud
nginx
负载均衡算法
哈希法:根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
随机法:通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。
加权轮询法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
加权随机法:与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
最小连接数法:由于后端服务器的配置不尽相同,对于请求的处理有快有慢,最小连接数法根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
springboot
@SpringBootApplication 被 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解所修饰,换言之 Springboot 提供了统一的注解来替代以上三个注解,简化程序的配置。
redis缓存
数据库缓存:
sql语句时key值,查询结果resultSet是value,当同一个查询语句访问时(select * from t_product),只要曾经查询过,调用缓存直接返回resultSet,节省了数据库读取磁盘数据的时间。
持久层缓存:
减少了连接数据库的时间;减少了resultSet封装成对象的过程。
业务层和控制层的缓存:
减少调用层次。
描述缓存在业务层的逻辑:
查询商品信息
判断当前查询在缓存是否有数据,如果有数据,直接返回,当前请求结束;如果没有数据,查询持久层数据库数据,获取数据存储再缓存一份,供后续访问使用;
缓存雪崩/缓存击穿
海量请求访问服务器,服务器的性能由缓存支撑,一旦一定范围的缓存数据未命中,请求的数据访问涌入数据库;承受不了压力造成宕机–重启–海量请求并未消失–宕机–重启,系统长时间不可用;这种情况就是缓存的雪崩。
shiro
登录认证流程
认证执行流程1、通过ini配置文件创建securityManager
2、调用subject.login方法主体提交认证,提交的token
3、securityManager进行认证,securityManager最终由ModularRealmAuthenticator进行认证。
4、ModularRealmAuthenticator调用IniRealm(给realm传入token) 去ini配置文件中查询用户信息
5、IniRealm根据输入的token(UsernamePasswordToken)从 shiro.ini查询用户信息,根据账号查询用户信息(账号和密码)
如果查询到用户信息,就给ModularRealmAuthenticator返回用户信息(账号和密码)
如果查询不到,就给ModularRealmAuthenticator返回null
6、ModularRealmAuthenticator接收IniRealm返回Authentication认证信息
如果返回的认证信息是null,ModularRealmAuthenticator抛出异常(org.apache.shiro.authc.UnknownAccountException)
如果返回的认证信息不是null(说明inirealm找到了用户),对IniRealm返回用户密码 (在ini文件中存在)
和 token中的密码 进行对比,如果不一致抛出异常(org.apache.shiro.authc.IncorrectCredentialsException)
授权流程
1、对subject进行授权,调用方法isPermitted(“permission串”)
2、SecurityManager执行授权,通过ModularRealmAuthorizer执行授权
3、ModularRealmAuthorizer执行realm(自定义的Realm)从数据库查询权限数据
调用realm的授权方法:doGetAuthorizationInfo
4、realm从数据库查询权限数据,返回ModularRealmAuthorizer
5、ModularRealmAuthorizer调用PermissionResolver进行权限串比对
6、如果比对后,isPermitted中"permission串"在realm查询到权限数据中,说明用户访问permission串有权限,否则
没有权限,抛出异常。
Struts2和SpringMVC
一、拦截机制的不同
Struts2是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype,然后通过setter,getter吧request数据注入到属性。Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了,只能设计为多例。
SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。
Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式,这样导致Struts2的配置文件量还是比SpringMVC大。
二、底层框架的不同
Struts2采用Filter(StrutsPrepareAndExecuteFilter)实现,SpringMVC(DispatcherServlet)则采用Servlet实现。Filter在容器启动之后即初始化;服务停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用,服务停止后销毁。
三、性能方面
Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。所以,SpringMVC开发效率和性能高于Struts2。
四、配置方面
spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高。
附注:拦截器与过滤器的区别 :
- 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
- 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
- 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
- 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
- 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
spring和hibernate有什么区别
概括的来说spring提供了许多服务 经常用到的比如AOP可以管理事物 核心是IOC控制反转 它可以与许多开源的框架集成在一起 spring主要用于业务逻辑层 能让表示层和持久层更好的协作
MyBatis 持久性框架
hibernate是ORM框架 是对象关系模型,可以把对象模型转化为关系模型,以前设计数据库时是面向关系的,通过hibernate 你可以用面向对象的思想来设计数据库,这样你可以更方便的来操作数据库,我认为hibernate是个很伟大的ORM框架
spring可以和hibernate集成,把session可以交给spring来管理 可以由spring的AOP来管理事物
背就完事