WH

第一阶段面试题

第一阶段面试题
一、JAVA基础

  1. continue和 break有什么区别?
    答案:
    break和continue都是用来控制循环结构的。
  2. break:提前终止循环可以使用break来完成。break完全结束一个循环,跳出循环体执行循环后面的语句。
  3. continue:理解为continue是跳过当次循环中剩下的语句,执行下一次循环。
  4. 区别:continue只终止本次循环,break则完全终止循环
  5. i++和++i的区别?
    答案:
    i++ 理解为:先用i值后加1, 比如int j=i++; 如果i的初值是1,那么表达式i++的整体值就是1,然后,i的值就变成了2,最后执行赋值运算,将i++整体的值1,赋值给j,j为1。
    ++i 理解为:先加1后用i值,比如int j=++i;如果i的初值是1,首先i增加1为2,然后用i的值2最为++i整体表达式的值,最后进行赋值运算,将++i表达式的值2赋值给j,j为2。
    注意:这两个表达式在计算时,=号赋值计算,都是最后发生的,是非常常见的考点。
    二、OOP
  6. 静态变量和实例变量的区别?
    答案:
    在语法定义上的区别:静态变量前要加static 关键字,而实例变量前则不加。
    在程序运行时的区别:
  7. 实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
  8. 静态变量不属于某个实例对象,而是属于类,所以也称为类变量。
  9. 实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
    三、JAVASE
    1.说出ArrayList,LinkedList的储存性能和特性?
    答案:
    区别如下:
  10. ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,优点是索引读取快,从最后插入和删除元素速度快,但是头部插入和删除慢。
  11. LinkedList使用双向循环链表方式存储数据,所以头尾插入或读取插入的速度快,而中部插入和读取慢.
    2.集合;
    3.线程;
    4.String,StringBuffer,StringBuilder;
    String是不可变的,适合少量字符串使用;
    StringBuffer是适合大量字符串,且线程安全。
    StringBuilder是适合大量字符串,且线程不安全。
  12. socket套接字
    Person Student
    Person p = new Student();

第二阶段面试题

1.GET方法与POST方法的区别?
难度中等【中等】
答案:

2.HTML和xml的区别?
难度中等【中等】
答案:

  1. Servlet的调用过程?
    难度中等【中等】
    答案:

4.介绍一下会话技术session和cookie?
难度中等【难】
答案:
Cookie的原理是通过Set-Cookie响应头和Cookie请求头将会话中产生的数据保存在客户端。客户端请求服务器, 服务器将需要保存的数据通过Set-Cookie响应头发给客户端, 客户端收到后会将数据保存在浏览器的内部。当客户端再次请求服务器时, 通过Cookie请求头将上次保存的数据再带给服务器, 服务器通过Cookie头来获取数据, 通过这种方式可以保存会话中产生的数据。Cookie是将需要保存的数据保存在了客户端, 是客户端技术. 每个客户端各自保存各自的数据, 再次访问服务器时会带着自己的数据, 每个客户端持有自己的数据, 因此就不会发生混乱了。
Session是基于一个JSESSIOINID的Cookie工作的。
当需要保存数据时, 服务器会为当前浏览器创建一个session对象, 用于保存和这个浏览器相关的数据, 并且服务器会为每一个session分配一个独一无二的编号(ID), 服务器在响应时会通过Set-Cookie头将session的id以Cookie的形式发送给浏览器并保存在浏览器的内部, 此后浏览器再来访问服务器都会在请求中一个Cookie请求头带着上次保存的sessionid, 服务器可以通过Cookie请求头获取session的id, 通过id找到为当前浏览器服务的session!

5.JSP的九大隐式对象?
难度中等【中等】
答案:
JSP翻译引擎在将JSP翻译成servlet的过程中, 在servlet里预先定义了九个对象, 因此我们可以在JSP页面中直接使用这九个对象
page(this)
request
response
config
application
session
exception
out
pageContext

6.BS和CS的区别?
难度中等【中等】
答案:

7.在JS中和=的区别?
难度中等【中等】
答案:

8.http常见的状态码有哪些?
难度中等【难】
答案:

9.解释一下什么叫连接池?
难度中等【中等】
答案:

10.css有哪些选择器?
难度中等【中等】
答案:
该答案仅供参考,详细自己百度总结。

第三阶段面试题

  1. 何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗?
    答:用于创建bean对象,管理bean对象的那个容器
    Spring IOC 容器本质上指的的就是Spring Bean容器,
    Spring Bean容器中最核心一个机制是IOC机制(
    控制反转),所以有时候又将springbean容器称之为
    Spring IOC 容器.

  2. Spring IOC 如何理解?
    答:IOC 是Spring中提供一种控制反转机制,目的是将我们
    项目中对象的依赖管理交给Spring实现,这样可以更好
    实现对象关系的解耦,提高程序的可扩展性.

  3. Spring DI 如何理解?
    答:DI 是Spring中的依赖注入机制,IOC的实现需要借助
    这种机制.我们通常会这样理解,Spring Bean容器中的
    IOC思想一种目标,DI是实现这种思想目标的手段.

  4. Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制?
    答:@Scope(“singleton”)
    @Scope(“prototype”)
    @Lazy(value=true)

  5. Spring 工厂底层构建Bean对象借助什么机制?当对象不使用了要释放资源,目的是什么?何为内存泄漏?
    答:借助反射机制,防止内存泄漏,对象已经不使用了但占用着内存,这种现 象称之为内存泄漏,内存泄漏不是内存溢出,但是它是内存溢出的一个导火索. 内存溢出直接就导致系统崩溃了.

  6. 描述Spring MVC处理流程及应用优势
    答:
    1、客户端发出一个http请求给web服务器,web服务器对http请求进 行 解析,如果匹配前端控制器(或分发器/DispatcherServlet)的请求映射路径, web容器将请求转交给DispatcherServlet.
    2、DipatcherServlet接收到这个请求之后将根据请求的信息以及处理器映射 器(HandlerMapping)的配置找到处理请求的处理器(Handler)。
    3、由具体的处理器适配器(HandlerAdapter)对Handler进行具体的调用。
    4、Handler对数据处理完成以后将返回一个ModelAndView()对象给 DispatcherServlet。
    5、DispatcherSevlet通过视图解析器(ViewResolver)将ModelAndView()转 化为真正的视图View。
    6、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展 现出完整的view并返回给客户端。

  7. Spring中的事务处理方式及优缺点
    答:优点在于:
    1:能够实现全局事务的控制,通过EJB CMT进行事物的管理。
    2:能够保证项目模块在系统中完成的功能是可可控制的的操作(AOP)
    缺点在于:
    1:Spring中的事物声明有编程式事物和申明是事物

  8. MyBatis应用中#与有什么异同点答:相同点:都是通过get来获取值的,占位符不同点:有什么异同点 答: 相同点:都是通过get来获取值的,占位符 不同点:有什么异同点答:相同点:都是通过get来获取值的,占位符不同点:传进去的字符串不带引号 #号带引号

  9. MyBatis应用动态SQL解决了什么问题
    答:有时候,固定的sql语句不能够满足我们的应用需求。这个时候需要在 标准的基础上建立动态的查询语句。
    Mybatis提供了多种注解,可以提供动态查询语言。
    比如说在开发的时候,遇到这样的场景,界面提供了多种查询,但是都是非 必填写,在选择查询条件时可以选中任意几种组合作为查询条件,如果在使 用jdbc的时候,需要判断参数为空,自己组装sql,
    但是mybatis提供动态sql机制,依靠标签。

  10. Shiro框架权限管理时的认证和授权流程描述.
    答:Shiro权限控制流程的原理:
    应用代码 —- 调用Subject (shiro的Subject 就代表当前登陆用户) 控制权限 —- Subject 在shiro框架内部 调用 Shiro SecurityManager 安全管理器 —– 安全管理器调用 Realm (程序和安全数据连接器 )。
    Subject要进行任何操作,都必须要调用安全管理器(对我们来说是自动的)。
    而安全管理器会调用指定的Realms对象,来连接安全数据。
    Realms用来编写安全代码逻辑和访问安全数据,是连接程序和安全数据的桥梁。

W

基础阶段面试题

基础阶段面试题
一、JAVA基础

  1. continue和 break有什么区别?
    答案:
    break和continue都是用来控制循环结构的。
  2. break:提前终止循环可以使用break来完成。break完全结束一个循环,跳出循环体执行循环后面的语句。
  3. continue:理解为continue是跳过当次循环中剩下的语句,执行下一次循环。
  4. 区别:continue只终止本次循环,break则完全终止循环
  5. i++和++i的区别?
    答案:
    i++ 理解为:先用i值后加1, 比如int j=i++; 如果i的初值是1,那么表达式i++的整体值就是1,然后,i的值就变成了2,最后执行赋值运算,将i++整体的值1,赋值给j,j为1。
    ++i 理解为:先加1后用i值,比如int j=++i;如果i的初值是1,首先i增加1为2,然后用i的值2最为++i整体表达式的值,最后进行赋值运算,将++i表达式的值2赋值给j,j为2。
    注意:这两个表达式在计算时,=号赋值计算,都是最后发生的,是非常常见的考点。
    二、OOP
  6. 静态变量和实例变量的区别?
    答案:
    在语法定义上的区别:静态变量前要加static 关键字,而实例变量前则不加。
    在程序运行时的区别:
  7. 实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
  8. 静态变量不属于某个实例对象,而是属于类,所以也称为类变量。
  9. 实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
    三、JAVASE
    1.说出ArrayList,LinkedList的储存性能和特性?
    答案:
    区别如下:
  10. ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,优点是索引读取快,从最后插入和删除元素速度快,但是头部插入和删除慢。
  11. LinkedList使用双向循环链表方式存储数据,所以头尾插入或读取插入的速度快,而中部插入和读取慢.

WEB

1.GET方法与POST方法的区别?
难度中等【中等】
答案:

2.HTML和xml的区别?
难度中等【中等】
答案:

  1. Servlet的调用过程?
    难度中等【中等】
    答案:

4.介绍一下会话技术session和cookie?
难度中等【难】
答案:
Cookie的原理是通过Set-Cookie响应头和Cookie请求头将会话中产生的数据保存在客户端。客户端请求服务器, 服务器将需要保存的数据通过Set-Cookie响应头发给客户端, 客户端收到后会将数据保存在浏览器的内部。当客户端再次请求服务器时, 通过Cookie请求头将上次保存的数据再带给服务器, 服务器通过Cookie头来获取数据, 通过这种方式可以保存会话中产生的数据。Cookie是将需要保存的数据保存在了客户端, 是客户端技术. 每个客户端各自保存各自的数据, 再次访问服务器时会带着自己的数据, 每个客户端持有自己的数据, 因此就不会发生混乱了。
Session是基于一个JSESSIOINID的Cookie工作的。
当需要保存数据时, 服务器会为当前浏览器创建一个session对象, 用于保存和这个浏览器相关的数据, 并且服务器会为每一个session分配一个独一无二的编号(ID), 服务器在响应时会通过Set-Cookie头将session的id以Cookie的形式发送给浏览器并保存在浏览器的内部, 此后浏览器再来访问服务器都会在请求中一个Cookie请求头带着上次保存的sessionid, 服务器可以通过Cookie请求头获取session的id, 通过id找到为当前浏览器服务的session!

5.JSP的九大隐式对象?
难度中等【中等】
答案:
JSP翻译引擎在将JSP翻译成servlet的过程中, 在servlet里预先定义了九个对象, 因此我们可以在JSP页面中直接使用这九个对象
page(this)
request
response
config
application
session
exception
out
pageContext

6.BS和CS的区别?
难度中等【中等】
答案:

7.在JS中和=的区别?
难度中等【中等】
答案:

8.http常见的状态码有哪些?
难度中等【难】
答案:

9.解释一下什么叫连接池?
难度中等【中等】
答案:

10.css有哪些选择器?
难度中等【中等】
答案:
该答案仅供参考,详细自己百度总结。

ssm初级面试题

1.ssm初级面试题
1.1 何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗?
答:用于创建bean对象,管理bean对象的那个容器
Spring IOC 容器本质上指的的就是Spring Bean容器,
Spring Bean容器中最核心一个机制是IOC机制(
控制反转),所以有时候又将springbean容器称之为
Spring IOC 容器.

1.2 Spring IOC 如何理解?
答:IOC 是Spring中提供一种控制反转机制,目的是将我们
项目中对象的依赖管理交给Spring实现,这样可以更好
实现对象关系的解耦,提高程序的可扩展性.

1.3 Spring DI 如何理解?
答:DI 是Spring中的依赖注入机制,IOC的实现需要借助
这种机制.我们通常会这样理解,Spring Bean容器中的
IOC思想一种目标,DI是实现这种思想的目标的手段.

1.4 Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制?
答:@Scope(“singleton”)
@Scope(“prototype”)
@Lazy(value=true)

1.5 Spring 工厂底层构建Bean对象借助什么机制?当对象不使用了要释放资源,目的是什么?何为内存泄漏?
答:借助反射机制,防止内存泄漏,对象已经不使用了但占用着内存,这种现 象称之为内存泄漏,内存泄漏不是内存溢出,但是它是内存溢出的一个导火索. 内存溢出直接就导致系统崩溃了.

1.6 描述Spring MVC处理流程及应用优势
答:
1、客户端发出一个http请求给web服务器,web服务器对http请求进 行 解析,如果匹配前端控制器(或分发器/DispatcherServlet)的请求映射路径, web容器将请求转交给DispatcherServlet.
2、DipatcherServlet接收到这个请求之后将根据请求的信息以及处理器映射 器(HandlerMapping)的配置找到处理请求的处理器(Handler)。
3、由具体的处理器适配器(HandlerAdapter)对Handler进行具体的调用。
4、Handler对数据处理完成以后将返回一个ModelAndView()对象给 DispatcherServlet。
5、DispatcherSevlet通过视图解析器(ViewResolver)将ModelAndView()转 化为真正的视图View。
6、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展 现出完整的view并返回给客户端。

1.7 Spring中的事务处理方式及优缺点
答:优点在于:
1:能够实现全局事务的控制,通过EJB CMT进行事物的管理。
2:能够保证项目模块在系统中完成的功能是可可控制的的操作(AOP)
缺点在于:
1:Spring中的事物声明有编程式事物和申明是事物

1.8 MyBatis应用中#与有什么异同点答:相同点:都是通过get来获取值的不同点:有什么异同点 答: 相同点:都是通过get来获取值的 不同点:有什么异同点答:相同点:都是通过get来获取值的不同点:传进去的字符串不带引号 #号带引号

1.9 MyBatis应用动态SQL解决了什么问题
答:有时候,固定的sql语句不能够满足我们的应用需求。这个时候需要在 标准的基础上建立动态的查询语句。
Mybatis提供了多种注解,可以提供动态查询语言。
比如说在开发的时候,遇到这样的场景,界面提供了多种查询,但是都是非 必填写,在选择查询条件时可以选中任意几种组合作为查询条件,如果在使 用jdbc的时候,需要判断参数为空,自己组装sql,
但是mybatis提供动态sql机制,依靠标签。

1.10 Shiro框架权限管理时的认证和授权流程描述.
答:Shiro权限控制流程的原理:
应用代码 —- 调用Subject (shiro的Subject 就代表当前登陆用户) 控制权限 —- Subject 在shiro框架内部 调用 Shiro SecurityManager 安全管理器 —– 安全管理器调用 Realm (程序和安全数据连接器 )。
Subject要进行任何操作,都必须要调用安全管理器(对我们来说是自动的)。
而安全管理器会调用指定的Realms对象,来连接安全数据。
Realms用来编写安全代码逻辑和访问安全数据,是连接程序和安全数据的桥梁。
1.11 BeanFactory和ApplicationContext有什么区别?
BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。
BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。
从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但application context在此基础上还提供了其他的功能。
1.12 请解释Spring Bean的生命周期?
Spring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。
Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。
初始化之后调用的回调方法。
销毁之前调用的回调方法。
Spring框架提供了以下四种方式来管理bean的生命周期事件:
InitializingBean和DisposableBean回调接口
针对特殊行为的其他Aware接口
Bean配置文件中的Custom init()方法和destroy()方法
@PostConstruct和@PreDestroy注解方式
使用customInit()和 customDestroy()方法管理bean生命周期的代码样例如下:

1.13 Spring Bean的作用域之间有什么区别? Spring容器中的bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下: singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。 prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。 request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。 Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。 global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。 全局作用域与Servlet中的session作用域效果相同。 1.14 在Spring AOP 中,关注点和横切关注的区别是什么? 关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。 横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。 1.15 使用Spring框架的好处是什么? • 轻量:Spring 是轻量的,基本的版本大约2MB。 • 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。 • 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。 • 容器:Spring 包含并管理应用中对象的生命周期和配置。 • MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。 • 事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。 • 异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。、 1.16 Spring 中用到了那些设计模式? • Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: • 代理模式—在AOP和remoting中被用的比较多。 • 单例模式—在spring配置文件中定义的bean默认为单例模式。 • 模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。 • 工厂模式—BeanFactory用来创建对象的实例。 • 适配器–spring aop • 装饰器–spring data hashmapper • 观察者– spring 时间驱动模型 • 回调–Spring ResourceLoaderAware回调接口

1.17 Spring 如何保证 Controller 并发的安全?
Spring 多线程请求过来调用的Controller对象都是一个,而不是一个请求过来就创建一个Controller对象。
并发的安全? 原因就在于Controller对象是单例的,那么如果不小心在类中定义了类变量,那么这个类变量是被所有请求共享的,这可能会造成多个请求修改该变量的值,出现与预期结果不符合的异常
那有没有办法让Controller不以单例而以每次请求都重新创建的形式存在呢?
答案是当然可以,只需要在类上添加注解@Scope(“prototype”)即可,这样每次请求调用的类都是重新生成的(每次生成会影响效率)
虽然这样可以解决问题,但增加了时间成本,总让人不爽,还有其他方法么?答案是肯定的!
使用ThreadLocal来保存类变量,将类变量保存在线程的变量域中,让不同的请求隔离开来。
1.18 使用Spring框架的好处是什么?
轻量:Spring 是轻量的,基本的版本大约2MB。
控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器:Spring 包含并管理应用中对象的生命周期和配置。
MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。
1.19 在 Spring中如何注入一个java集合?
Spring提供以下几种集合的配置元素:
• 类型用于注入一列值,允许有相同的值。
• 类型用于注入一组值,不允许有相同的值。
• 类型用于注入一组键值对,键和值都可以为任意类型。
• 类型用于注入一组键值对,键和值都只能为String类型
1.20 Spring支持的事务管理类型
Spring支持如下两种方式的事务管理:
编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。
1.21 Spring框架的事务管理有哪些优点?
它为不同的事务API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了统一的编程模型。
它为编程式事务管理提供了一个简单的API而非一系列复杂的事务API(如JTA).
它支持声明式事务管理。
它可以和Spring 的多种数据访问技术很好的融合。
1.22 Spring MVC的主要组件?

(1)前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
(2)处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的URL来查找Handler
(3)处理器适配器HandlerAdapter
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
(4)处理器Handler(需要程序员开发)
(5)视图解析器 ViewResolver(不需要程序员开发)
作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)
(6)视图View(需要程序员开发jsp)
View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)
1.23 SpringMvc怎么和AJAX相互调用的?
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
(1)加入Jackson.jar
(2)在配置文件中配置json的映射
(3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上
1.24 Mybatis 中#和KaTeX parse error: Expected 'EOF', got '#' at position 14: 的区别? 1. #̲{}是预编译处理,{}是字符串替换。
2. Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
3. Mybatis在处理时,就是把{}时,就是把时,就是把{}替换成变量的值,相当于字符串拼接
4. 使用#{}可以有效的防止SQL注入,提高系统安全性。
1.25 mybatis的缓存机制,一级,二级介绍一下
一级缓存
默认开启
SqlSession级别的缓存,实现在同一个会话中数据的共享
一级缓存的生命周期和SqlSession一致
当有多个SqlSession或者分布式环境下,数据库写操作会引起脏数据。
二级缓存
默认不开启,需手动开启
SqlSessionFactory级别的缓存,实现不同会话中数据的共享,是一个全局变量
可自定义存储源,如Ehcache
当开启缓存后,数据查询的执行的流程是:二级缓存>一级缓存>数据库
不同于一级缓存,二级缓存可设置是否允许刷新和刷新频率实现
实体类实现序列化,在mapper文件中开启
在配置文件中设置cacheEnabled为true
1.26 pringMVC与Struts2的区别
pringmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
pringmvc是基于方法开发,传递参数是通过方法形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
1.27 mybatis的基本工作流程
1.读取配置文件,配置文件包含数据库连接信息和Mapper映射文件或者Mapper包路径。
2.有了这些信息就能创建SqlSessionFactory,SqlSessionFactory的生命周期是程序级,程序运行的时候建立起来,程序结束的时候消亡
3.SqlSessionFactory建立SqlSession,目的执行sql语句,SqlSession是过程级,一个方法中建立,方法结束应该关闭
4.当用户使用mapper.xml文件中配置的的方法时,mybatis首先会解析sql动态标签为对应数据库sql语句的形式,并将其封装进MapperStatement对象,然后通过executor将sql注入数据库执行,并返回结果。
5.将返回的结果通过映射,包装成java对象。
1.28 什么是MyBatis的接口绑定,有什么好处
接口映射就是在IBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们通过直接调用接口方法 例如:
UserMapper userMapper=sqlSession.getMapper (UserMapper.class) 就可以,这样比起原来了SqlSession提供的方法,例如List countryList = sqlSession.selectList(“selectAll”);我们可以有更加灵活的选择和设置.。

注意:(1)Mapper .xml文件的namespace属性必须配置为接口的全限定名称,接口方法名与Mapper.xml中的id值必须相同,且接口方法的返回值类型必须与Mapper.xml配置的resultType一致,这里后者起到决定作用。
(2)select查询通过在Mapper.xml中配置ResultMap标签,将查询结果的列名与字段名对应。
insert语句通过#{属性名}从接口参数获取值放到sql语句中。
(3)Mapper.xml接口绑定本质是动态代理。
1.29 MyBatis的编程步骤
创建SqlSessionFactory
通过SqlSessionFactory创建SqlSession
通过SqlSession执行数据库操作
调用session.commit()提交事务
调用session.close()关闭事务
1.30 JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
JDBC编程的不足之处
数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
MyBatis的解决方案
在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
Mybatis自动将java对象映射至sql语句。
Mybatis自动将sql执行结果映射至java对象。
1.31 MyBatis的优缺点
优点
易于上手和掌握
Sql写在xml里面,便于统一管理和优化
减少Sql与程序代码的耦合
提供xml标签,支持动态Sql编写
缺点
Sql工作量大,尤其是字段多,关联表多时,更是如此
Sql依赖于数据库,导致数据库移植性差
由于xml里面标签id必须唯一,导致DAO中方法不支持方法重载。所以dao层必须是接口
1.32 使用MyBatis的mapper接口调用时有哪些要求?
Mapper接口方法名和mapper.xml中定义的每个sql的id相同
Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
Mapper.xml文件中的namespace即是mapper接口的类路径
1.33 谈谈你对SpringMVC的理解

  1. 是一个基于MVC的web框架

  2. SpringMVC是Spring的一个模块,是Spring的子容器,子容器可以拿父容器的东西,但是父容器不能拿子容器的东西

  3. SpringMVC的前端控制器DispatcherServlet,用于分发请求,使开发变得简单

  4. SpringMVC流程(重点). SpringMVC三大组件

    1)HandlerMapping:处理器映射器
    用户请求路径到Controller方法的映射
    2)HandlerAdapter:处理器适配器
    根据handler(controlelr类)的开发方式(注解开发/其他开发) 方式的不同去寻找不同的处理器适配器
    3)ViewResolver:视图解析器
    可以解析JSP/freemarkerr/pdf等
    1.34 简述Mybatis的插件运行原理,以及如何编写一个插件?
    答:1)Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis通过动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。
    2)实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。
    1.35 Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
    答:1)Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。2)Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。
    3)其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。
    1.36 Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
    答:1)Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

2)它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

1.37 Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
答:能,Mybatis不仅可以执行一对一、一对多的关联查询,还可以执行多对一,多对多的关联查询,多对一查询,其实就是一对一查询,只需要把selectOne()修改为selectList()即可;多对多查询,其实就是一对多查询,只需要把selectOne()修改为selectList()即可。
关联对象查询,有两种实现方式,一种是单独发送一个sql去查询关联对象,赋给主对象,然后返回主对象。另一种是使用嵌套查询,嵌套查询的含义为使用join查询,一部分列是A对象的属性值,另外一部分列是关联对象B的属性值,好处是只发一个sql查询,就可以把主对象和其关联对象查出来。

1.38 Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
答:第一种是使用标签,逐一定义列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。

1.39 Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?
答:虽然Mybatis解析Xml映射文件是按照顺序解析的,但是,被引用的B标签依然可以定义在任何地方,Mybatis都可以正确识别。原理是,Mybatis解析A标签,发现A标签引用了B标签,但是B标签尚未解析到,尚不存在,此时,Mybatis会将A标签标记为未解析状态,然后继续解析余下的标签,包含B标签,待所有标签解析完毕,Mybatis会重新解析那些被标记为未解析的标签,此时再解析A标签时,B标签已经存在,A标签也就可以正常解析完成了。

1.40 MyBatis里面的动态Sql是怎么设定的?用什么语法?
答:MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整,必须配合where、trim节点,where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉 。
1.41 Mybatis都有哪些Executor执行器?它们之间的区别是什么?
答:Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。
BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。
作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。
1.42 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
答:Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
面试题看似都很简单,但是想要能正确回答上来,必定是研究过源码且深入的人,而不是仅会使用的人或者用的很熟的人,以上所有面试题及其答案所涉及的内容,在我的Mybatis系列博客中都有详细讲解和原理分析。
1.43 简单介绍下你对mybatis的理解?

  1. mybatis配置
    
  2. SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
  3. mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
  4. 通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
  5. 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
  6. mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
  7. Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
  8. Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
  9. Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
    1.44 介绍一下Spring的事物管理
    事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。

开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管 理,可以通过Spring的注入来完成此功能。
Spring支持如下两种方式的事务管理:
编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。
一般选择声明式事务管理,因为这种方式和应用程序的关联较少。
1.45 SSM优缺点、使用场景?

  1. Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。

  2. Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

  3. Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。

  4. 总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
    1.46 SpringMVC的工作流程?
    用户发送请求至前端控制器DispatcherServlet
    DispatcherServlet收到请求调用HandlerMapping处理器映射器。
    处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
    DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
    执行处理器(Controller,也叫后端控制器)。
    Controller执行完成返回ModelAndView
    HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
    DispatcherServlet将ModelAndView传给ViewReslover视图解析器
    ViewReslover解析后返回具体View
    DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
    DispatcherServlet响应用户

1.47 如果你也用过struts2.简单介绍下springMVC和struts2的区别有哪些?
springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
1.48 怎么样把数据放入Session里面
可以声明一个request,或者session先拿到session,然后就可以放入数据,或者可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key
1.49 讲下SpringMvc的执行流程
系统启动的时候根据配置文件创建spring的容器, 首先是发送http请求到核心控制器DispatcherServlet,spring容器通过映射器去寻找业务控制器,
使用适配器找到相应的业务类,在进业务类时进行数据封装,在封装前可能会涉及到类型转换,执行完业务类后使用ModelAndView进行视图转发,
数据放在model中,用map传递数据进行页面显示。
1.50 MyBatis(IBatis)的好处是什么
ibatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的
维护带来了很大便利。
ibatis封装了底层JDBC API的调用细节,并能自动将结果集转换成JavaBean对象,大大简化了Java数据库编程的重复工作。
因为Ibatis需要程序员自己去编写sql语句,程序员可以结合数据库自身的特点灵活控制sql语句,
因此能够实现比hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。
1.51 Bean 工厂和 Application contexts 有什么区别?
Application contexts提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜像),它们可以向注册为监听器的bean发布事件。另外,在容器或容器内的对象上执行的那些不得不由bean工厂以程序化方式处理的操作,可以在Application contexts中以声明的方式处理。Application contexts实现了MessageSource接口,该接口的实现以可插拔的方式提供获取本地化消息的方法。
1.52 解释Spring支持的几种bean的作用域
Spring框架支持以下五种bean的作用域:
singleton : bean在每个Spring ioc 容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。
request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
缺省的Spring bean 的作用域是Singleton。
1.53 什么是bean的自动装配?
Spring 容器能够自动装配相互合作的bean,这意味着容器不需要和配置,能通过Bean工厂自动处理bean之间的协作。
1.54 什么是基于Java的Spring注解配置? 给一些注解的例子。
基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件。
以@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。
1.55 使用Spring通过什么方式访问Hibernate?
在Spring中有两种方式访问Hibernate:
控制反转 Hibernate Template和 Callback。
继承 HibernateDAOSupport提供一个AOP 拦截器。
1.56 如何通过HibernateDaoSupport将Spring和Hibernate结合起来?
用Spring的 SessionFactory 调用 LocalSessionFactory。集成过程分三步:
配置the Hibernate SessionFactory。
继承HibernateDaoSupport实现一个DAO。
在AOP支持的事务中装配。
1.57 Spring框架的事务管理有哪些优点?
它为不同的事务API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式。
它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如
它支持声明式事务管理。
它和Spring各种数据访问抽象层很好得集成。
1.58 在Spring AOP 中,关注点和横切关注的区别是什么?
关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。
1.59 AOP作用是什么,底层如何实现在哪些地方会用到,分别简述切面,切入点和通知。
AOP:面向切面编程:将一个系统中共同的业务逻辑提取出来,进行单独的封装成一个组件(切面),然后以配置的方式作用于系统中,实现程序的可插拔性,提高代码的复用性,提升系统的灵活性和性能
底层实现:JDK动态代理,只支持接口注入CGLIB:可以支持普通类的注入
那些地方会用到:事物开启,日志记录,安全验证,权限验证
切面:系统中共通的业务提取出来,在某个时刻或者某个阶段共同调用
切入点:找到目标方法,给它追加共通的业务逻辑,在spring中提供了切入点表达式帮助我们找到目标方法execution
通知:什么时候调用这个共通的业务逻辑,用于指定切面方法作用到系统中的时机.前置通知,后置通知,环绕通知,异常通知,最终通知。
1.60 Spring中AutoWired和,Resource之间区别是什么
AutoWried:按照类型进行匹配—spring框架自带的,查看当前Spring容器中那个bean类型和引用类型一致,就进行注入,如果有多个匹配类型就会报错.
Resource:默认按照名称进行注入,如果找不到对应的名称按照bean类型进行注入

JT阶段面试题

1 JT阶段面试题
1.1 电商行业特点

  1. 分布式
    垂直拆分:根据功能模块进行拆分
    水平拆分:根据业务层级进行拆分
  2. 高并发
    用户单位时间内访问服务器数量,是电商行业中面临的主要问题
  3. 集群
    抗击高兵发的有效手段,同时集群内部实现高可用
  4. 海量数据处理
    随着公司数据的不断积累.自身的数据量很庞大.如果高效的处理数据/分析
    1.2 框架调用流程

1.3 EasyUI后台调用流程

1.4 分布式项目的设计思想
为了实现架构之间的松耦合,将项目根据分布式的思想进行拆分.

  1. 项目的垂直拆分
    根据功能模块的不同将项目进行拆分.
  2. 项目的水平拆分
    在大型项目中,由于开发的人数众多,项目复杂度高.为了保证项目开发的耦合性低.实现项目的水平拆分.
    将一个大型项目根据层级模块进行拆分.Controller项目/Service项目Mapper项目
    项目创建时采用聚合项目的方式进行管理

1.5 分布式项目的jar包如何管理
将项目中用到公共的jar包使用服务支撑项目jt-parent进行添加,其他的项目只需要继承jt-parent后获取对应的jar包全部依赖.从而实现了jar包的统一管理
1.6 介绍一下通用Mapper

  1. 早期使用JDBC操作数据库.该操作特别的繁琐,并且所有的数据需要自己手动的封装.
  2. JPA:是java持久化的API(用面向对象的方式操作数据库)思想
    User user = new User(); setXXXX
    User.setId(1);
    User.setName(tom);
    工具API.insert(user); JPA内部将对象自动转化为sql语句
    Insert into …….
  3. Haibernate框架.号称是自动化的(ORM)
    程序员只需要操作对象,从而完成了对数据库的操作.
    缺点:
  4. 做新增/删除/修改会产生一些冗余的sql(出于安全性性考虑)
  5. 如果做多表关联操作(CRUD) ,需要装备配置文件,通过配置文件进行数据关联设定.同时需要学习Hql(语句)
  6. 早期数据库容量是有限,超过500万后查询效率开始变低.
    4.Mybatis
    优点:继承ORM,摈弃了冗余的sql(自己手写),
    5.通用Mapper插件基于mybaits的
    效果:可以实现单表CRUD使用对象操作.(反射机制)
    1.7 Nginx是什么,有什么作用
    Nginx (engine x) 是一个轻量级的是一个高性能的HTTP和反向代理服务器,其特点是占有内存少,并发能力强
    主要是用来反向代理和实现负载均衡.
    1.8 谈一下反向代理和负载均衡

说明:

  1. Nginx首先需要监听特定的域名.
  2. 当用户根据域名进行资源访问时.首先会访问nginx
  3. 之后nginx代替请求者根据内部的配置文件,实现反向代理.将请求转化为特定的请求路径进行资源访问.
  4. 当Nginx获取资源后将数据返回给用户.完成请求的正确的响应.

负载均衡:访问量高时,可以让服务器尽量分摊压力,

实现策略:轮询,权重,IP_HASH(一般不用)
1.9 Nginx的健康监测机制
当后台的服务器出现宕机的现象,当时nginx中的配置文件并没有改变时,请求依然会发往故障的机器.需要人为的维护配置文件,这样的操作不智能.那么采用健康检测机制.可以实现故障的自动的迁移.
属性介绍:
1.max_fails=1 当检测服务器是否正常时,如果检测失败的次数达到规定的次数时,则断定该服务器故障,在规定的时间周期内,不会将请求发往该机器.
2.fail_timeout=60s定义时钟周期

1.10 Nginx如何保证请求参数不丢
在nginx中添加请求头的参数,表示每次请求时,携带请求者的请求头信息,访问服务器.
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
1.11 数据库数据如何备份(数据备份策略)

  1. 冷备份:定期将数据库中的文件进行转储,定期进行数据备份.
  2. 热备份:搭建数据库主从结构,当主库数据发生改变时,从库根据主库的二进制日志文件进行备份.
  3. 双机热备:数据库互为主从,数据库代理服务器对主库进行心跳检测,实现数据的高可用,为了防止主库宕机后发生雪崩现象
    1.12 数据库压力大时,怎么实现高可用
    1.用数据库代理服务器搭建数据库的读写分离进行分流.读取从库数据,写数据在主库
    可用的数据库代理服务器有Amoeba和Mycat
    由于大量的用户的数据库操作都需要通过数据库来完成.造成数据库负载过高.因为数据库操作中查询的操作占很大的比重.
    2.数据库实现双机热备.
    1.13 数据库的优化策略
  4. 优化sql语句(多表操作) where 左连接 右连接 内连接
    原则:尽可能根据主键查询,尽可能少用关联查询.
  5. 创建索引(对经常查询的数据创建索引)
  6. 添加缓存(Redis/MemCache)
  7. 定期进行数据转储(将一些查询较少的数据保存到历史表,让当前表维护可控的数据量)
  8. 分库分表(需要大量的数据库服务器)
    1.14 什么是Mycat
    是一个数据库中间件,实现读写分离,分库分表和数据库故障迁移.
    1.15 什么是Redis,运行在哪里
    开源的内存中的数据结构存储系统,可以用做数据库,缓存和消息中间件
    基于C语言开发,运行时在内存中,运行速度很快

https://mp.weixin.qq.com/s/0Fqp2aGq7c_x_bEK9pOeeg

1.16 Redis中的数据持久化策略
如果使用时允许丢失部分数据(少量的)则使用RDB模式,它的效率高,也是redis默认的策略,如果不允许丢失数据则采用AOF模式,它的安全性高,但是效率较低.

1.17 Redis中的内存维护策略
问题:如果数据都存储到redis中,如果内存占满了,redis如何维护?
解决方案:

  1. 动态的扩容redis节点(不科学)
  2. 为数据设定超时时间
  3. 动态的将不用的数据删除.(LRU算法)
    算法介绍:
    内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。

1.18 redis为什么要分片
特点:实现动态内存扩容
数据存储机制:

1.19 Hash一致性

  1. 均衡性
    尽可能均匀分片节点中的数据
  2. 单调性
    实现数据的动态迁移
  3. 分散性
    由于分布式原因,导致不能获取全部节点信息,使得一个key有多个位置
  4. 负载
    是分散性另一种表现形式.表现为一个位置有多个key
    1.20 知道哨兵机制吗,怎么实现的,实现了什么功能
    功能:实现redis高可用
    机制:心跳检测

1.21 哨兵和分片的优缺点
优点:

  1. 分片可以使redis动态内存扩容.
  2. 分片可以将数据均匀的分配到不同的节点中,使数据分散保存.
  3. 哨兵可以实现redis高可用.
    缺点:
  4. 分片如果有一个节点出现宕机则整个分片都不能正常使用.
  5. 哨兵如果发生宕机现象,则影响整个redis服务.
    升级:
  6. 使用多台redis实现内存空间的动态扩容.
  7. 实现在redis内存实现高可用(不再使用哨兵机制)使用组件(ruby)
    搭建集群,实现分片和高可用的全部功能.

1.22 Redis集群
使用ruby工具创建集群.集群中全部的节点相互之间互相通讯.在redis内部实现高可用.redis集群是分片和哨兵的集合体.
1.23 伪静态技术
动态页面不能被搜索引擎收录.为了保证搜索引擎的友好性.则以.html的静态页面形式展现动态页面数据

1.24 跨域问题
说明:在www.jt.com中调用manage.jt.com时访问不成功.原因该操作是一个跨域请求.

浏览器不允许进行跨域请求.会将成功返回的数据进行拦截.不予显示.一切出于安全性的考虑.

1.25 同源策略
规则:
请求协议/域名/端口号是否相同,如果三者都一致,那么是同域访问.(即同源策略)浏览器可以正常执行.除此之外的全部的请求都是跨域请求.
1.26 怎么解决跨域问题?
利用javascript中src属性实现跨域.
客户端定义回调函数 callback=hello
服务端程序封装特定的JSON格式 callback(JSON) 执行回调函数

JSONP就是基于这个原理实现的.
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的

1.27 JQuery中怎么使用JSONP
跨域的缺点:回调的函数需要提前定义.程序员自己定义.
解决方案: 采用jQuery中的JSONP实现跨域的请求.
语法:
$.ajax({
url:“http://manage.jt.com/web/testJSONP”,
type:“get”,
dataType:“jsonp”, //返回值的类型 JSONP必须添加否则不能回调 函数
jsonp: “callback”, //指定参数名称
jsonpCallback: “hello”, //指定回调函数名称
success:function (data){
alert(data.id);
alert(data.name);
//转化为字符串使用
//var obj = eval("("+data+")");
//alert(obj.name);
}
});

1.28 HttpClient
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。现在HttpClient最新版本为 HttpClient 4.5 (GA) (2015-09-11)
总结:HttpClient是java为了远程请求开发的http请求工具包.

1.29 HttpClient和JSONP的区别

  1. JSONP是基于浏览器的,解决跨域问题的.而httpClient是基于代码.模拟http请求.获取服务端的参数的,功能上类似,但是经过的环节不同.
  2. 安全性不同
    JSONP的全部信息都可以通过浏览器进行监控.但是HttpClient浏览器不能监控.
  3. 代码调用层级不同
    Jsonp需要调用服务端业务逻辑,最多3层
    HttpClient需要调用5层
    适用场景:
    如果从服务端获取数据,js可以直接解析.使用JSONP,如果服务端的程序的返回值,需要进一步处理.这时使用HttpClient

1.30 你的单点登录是怎么调用的
流程图:

原理:
实现步骤:
当用户登陆时,通过nginx访问jt-web中任意的服务器之后输入用户名和密码访问JT-SSO单点登录服务器.
获取用户的登陆信息查询数据库,校验用户名和密码是否正确.如果用户名和密码是正确的,将用户信息转化为JSON串.之后生成加密的秘钥TOKEN(MD5(盐值+随机数)).将token:userJSON保存redis中.并且将token信息返回给客户端(jt-web).
Jt-web接收到服务端数据时首先校验数据是否有效.如果数据准确无误,将token信息写入到浏览器的Cookie(4K)中
当用户再次访问jt-web时,首先应该获取用户的Token信息,之后查询redis缓存服务器获取userJSON数据,之后将userJSON转化为User对象进行使用.实现免密登录.如果token数据为null,那么则让用户访问登陆页面.
1.31 同一线程内的数据怎么实现共享(ThreadLocal)
名称:本地线程变量
作用:在同一线程内实现数据共享.
原理:

说明:ThreadLocal是线程安全的,在同一个线程内实现数据的共享.
注意:使用完成后,切记销毁threadLocal对象,否则gc不能回收.导致JVM内存泄漏.
public class UserThreadLocal {

//如果保存数据有多个,则使用Map集合
private static ThreadLocal<User> userThread = new ThreadLocal<User>();public static void set(User user){userThread.set(user);
}public static User get(){return userThread.get();
}//线程销毁方法
public static void remove(){userThread.remove();
}

}

1.32 如何实现的单点登录SSO
问题:因为后台的服务器采用的是集群的部署方式,肯定有多台服务器.如果将用户的登陆信息保存到服务器端,因为多个服务器之间不能共享session.所以相互之间不同实现Session共享.导致用户频繁登陆.
初级:使用Nginx提供的IP_Hash
高级:

  1. 当用户登陆操作时,首选访问时单点登录服务器.进行登录操作.
  2. 如果登录正确.则生成用户的秘钥token.将用户信息转化为JSON串和token一起保存到redis缓存中.
    3.将token信息返回给客户端.将数据保存到客户端浏览器中的cookie中.
    4.当用户进行其他操作需要用到用户信息时,首先检测Cookie中是否有token,第二步检测redis中的数据是否为null.如果一切正确,则允许跳转到指定页面中.如果其中有一项有误,则表示用户登陆异常.让用户重新登陆.

1.33 当zk如果宕机后,消费者能否正确消费???
说明:
答案:可以
因为zk会动态的向客户端更新服务列表信息.当zk宕机后,由于之前已经同步了zk的服务列表信息,所以客户端可以按照自己已经缓存的清单进行访问.如果在这个期间服务端程序发现宕机现象,那么则访问故障机时由于不能通信,则等待超时时间,则访问下一台服务器.
如果这时,所有的服务端程序都宕机,则整个服务陷入瘫痪.
1.34 微服务治理方案(ZooKeeper)
说明:增加服务器或者减少服务器都是自动完成

业务逻辑说明:

  1. 当服务的提供者启动时,会将服务的名称:IP:端口会写入注册中心.
  2. 注册中心内部会维护服务列表
  3. 当消费者需要访问服务时,需要先访问注册中心获取服务列表信息.之后将服务列表保存到本地缓存中.方便后续的访问.在客户端内部有负载均衡的算法,筛选出一台服务器,之后进行访问.
  4. 如果后台服务器出现宕机现象.这时注册中心通过心跳检测的方式判断服务器是否宕机.如果服务器宕机则会将该服务器信息从服务列表中删除.之后将新的服务列表发送消费者(客户端)进行更新.

1.35 你怎么理解SOA(面向服务)
面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。

1.36 知道RPC协议吗
总结:RPC调用的规则可以传输java对象.底层实现时将数据转化流,并且该流经过加密处理.并且rpc内部使用UTF-8编码格式
要求:传输的java对象必须序列化

1.37 什么是Dubbo框架
Dubbo是 [1] 阿里巴巴公司开源的一个高性能优秀的服务框架(SOA),使得应用可通过高性能的RPC实现服务的输出和输入功能可以和Spring框架无缝集成。
1.38 Nginx和ZK的区别
Nginx:

  1. Nginx主要是为了反向代理(Http)
  2. 负载均衡
  3. Nginx主要搭建在公司网关服务器上

Zk:通过RPC进行远程方法调用,是服务端程序
主要作用是实现服务端的高可用.搭建在内网中.
1.39 知道什么是消息队列吗,并说出几种常用的
消息队列可以缓解服务器的访问压力,请求在在访问服务器时,先写入消息队列中,可以实现请求的异步操作,起到平峰削骨的作用
但是缺点是消耗了用户的实际等待时间.
常见的消息队列产品有activeMQ(apache的),RabbitMQ(爱立信的)
1.40 消息队列有几种工作模式
1.简单模式2.工作模式3.发布订阅模式4.路由模式
5.主题模式 6.RPC模式
1.41 倒排索引
倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。

1.42 Solr介绍/ES
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果.
基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
特点:

  1. solr可以根据数据库表自动生成索引文件.
  2. Solr可以动态的定期自动更新索引(对更新的数据进行索引的修改)
    1.43 Docker介绍

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
DockerClient客户端
Docker Daemon守护进程 客户端和Docker容器交互的媒介
Docker Image镜像 应用程序的模板
DockerContainer容器 启动后的应用程序
1.44 Docker调用原理

模块描述:
1.docker
Docker客户端程序
2.daemon
一般在宿主主机的后台运行,作为服务端接收客户端的请求,并且处理这些请求(创建/运行/分发容器).
客户端和服务器既可以运行在一个主机中,也可以通过socket/RESTful来实现通信
3.image:
Docker中的镜像文件, 为应用程序的模板,一般都是只读的不允许修改
Docker的镜像文件来源有两种:
1.Docker官网中的镜像文件
2.本地的镜像文件

4.Container:
Docker容器,通过image镜像创建容器后,在容器中运行应用程序(类似于new一个对象)

5.Repository:
管理镜像的仓库,类似于Maven仓库管理jar包文件

调用原理:
1.Docker客户端通过Daemon请求创建Docker容器
2.Daemon接收请求后,从Repository中查找需要的Image镜像文件
3.找到对应的镜像文件后,创建Docker容器
4.调用容器完成具体任务(redis/nginx/tomcat/mysql等)
1.45 Docker镜像拉取过程

1.当客户端获取镜像文件时,会向服务器发起请求.
2.Docker引擎首先会检查本地是否含有镜像文件,如果没有则会联网下载镜像文件
3.从共有云中获取Image镜像文件后,保存到本地
4.当用户需要使用该应用是,通过镜像文件创建容器,为用户提供服务
Dockerfile难
1.46 京淘项目人员分配
开发周期:开发4个月但是不停的更新迭代
购物车商品展现页面 商品规格
评价系统
订单物流系统 京东物流/调用菜鸟裹裹 调用第三方接口获取数据进行展现(http)
支付系统:银行接口/第三方支付 http
推荐系统:….
产品经理:3人,确定需求以及给出产品原型图
项目经理:1人,项目管理。
前端团队:5人,根据产品经理给出的原型制作静态页面。
后端团队:20人,实现产品功能。
测试团队:5人,测试所有的功能。2人 3人 脚本 shell
运维团队:3人,项目的发布以及维护。
1.47 日活量/并发量
日活量:200万
并发量:1500-2300左右
单点并发压力 18台tomcat服务器
服务器划分
Mysql 2
Mycat服务器 1
Solr 3
Redis 3
图片服务器 2
Nginx 2
注册中心 3
RabbitMQ 2
18台服务器

Jt-manage 5
Jt-web 10
Jt-sso 3
Jt-cart 5
Jt-order 5
Jt-search 5
33台tomcat
1.48 SpringBoot全新开发方式特点
 创建独立的Spring应用程序
 嵌入的Tomcat,无需部署WAR文件
 简化Maven配置
 自动配置Spring
 提供生产就绪型功能,如指标,健康检查和外部配置

1.49 什么是微服务架构?
“微服务”源于Martin Fowler的博文 Microservices。
Martin说:微服务是系统架构上的一种设计风格,它的主旨是将一个原本独立的系统拆成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP的RESTful API进行通信协作。被拆分成的每一个小型服务都围绕着系统中的某一项或者某些耦合度较高的业务功能进行构建,并且每个服务都维护着自身的数据存储、业务开发、自动化测试案例以及独立部署机制。由于有了轻量级的通信协作基础,所以这些微服务可以使用不同的语言来编写。
1.50 核心功能
 configuration management 配置中心
 service discovery 服务发现
 circuit breakers 断路器
 intelligent routing 智能路由
 micro-proxy 微代理
 control bus 控制总线
 one-time tokens 一次性令牌
 global locks 全局锁
 leadership election 选举算法
 distributed sessions 分布式会话
 cluster state 集群状态
1.51 核心组件架构图

1.52 拓展:CAP定理

CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。它是分布式系统中最核心最重要的理论。
分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳:
 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
 分区容错性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
CAP理论就是说在分布式系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡,要么选择CP要么选择AP,没有分布式系统能同时保证这三点。
1.53 ZooKeeper和Eureka对比
Eureka本身是Netflix开源的一款提供服务注册和发现的产品,并且提供了相应的Java封装。在它的实现中,节点之间相互平等,部分注册中心的节点挂掉也不会对集群造成影响,即使集群只剩一个节点存活,也可以正常提供发现服务。哪怕是所有的服务注册节点都挂了,Eureka Clients(客户端)上也会缓存服务调用的信息。这就保证了我们微服务之间的互相调用足够健壮。
Zookeeper主要为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。曾经是Hadoop项目中的一个子项目,用来控制集群中的数据,目前已升级为独立的顶级项目。很多场景下也用它作为Service发现服务解决方案。
对比
根据著名的CAP定理(C-数据一致性;A-服务可用性;P-服务对网络分区故障的容错性CAP这三个特性在任何分布式系统中不能同时满足,最多同时满足两个CP或者AP)。

ZooKeeper
Zookeeper是基于CP来设计的,即任何时刻对Zookeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性,但是它不能保证每次服务请求的可用性。从实际情况来分析,在使用Zookeeper获取服务列表时,如果zookeeper正在选主,或者Zookeeper集群中半数以上机器不可用,那么将无法获得数据。所以说,Zookeeper不能保证服务可用性。
诚然,在大多数分布式环境中,尤其是涉及到数据存储的场景,数据一致性应该是首先被保证的,这也是zookeeper设计成CP的原因。但是对于服务发现场景来说,情况就不太一样了:针对同一个服务,即使注册中心的不同节点保存的服务提供者信息不尽相同,也并不会造成灾难性的后果。因为对于服务消费者来说,能消费才是最重要的——拿到可能不正确的服务实例信息后尝试消费一下,也好过因为无法获取实例信息而不去消费。(尝试一下可以快速失败,之后可以更新配置并重试)所以,对于服务发现而言,可用性比数据一致性更加重要——AP胜过CP。
Eureka
而Spring Cloud Netflix在设计Eureka时遵守的就是AP原则。Eureka Server也可以运行多个实例来构建集群,解决单点问题,但不同于ZooKeeper的选举leader的过程,Eureka Server采用的是Peer to Peer对等通信。这是一种去中心化的架构,无master/slave区分,每一个Peer都是对等的。在这种架构中,节点通过彼此互相注册来提高可用性,每个节点需要添加一个或多个有效的serviceUrl指向其他节点。每个节点都可被视为其他节点的副本。

如果某台Eureka Server宕机,Eureka Client的请求会自动切换到新的Eureka Server节点,当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中。当节点开始接受客户端请求时,所有的操作都会进行replicateToPeer(节点间复制)操作,将请求复制到其他Eureka Server当前所知的所有节点中。

一个新的Eureka Server节点启动后,会首先尝试从邻近节点获取所有实例注册表信息,完成初始化。Eureka Server通过getEurekaServiceUrls()方法获取所有的节点,并且会通过心跳续约的方式定期更新。默认配置下,如果Eureka Server在一定时间内没有接收到某个服务实例的心跳,Eureka Server将会注销该实例(默认为90秒,通过eureka.instance.lease-expiration-duration-in-seconds配置)。当Eureka Server节点在短时间内丢失过多的心跳时(比如发生了网络分区故障),那么这个节点就会进入自我保护模式。

总结
ZooKeeper基于CP,不保证高可用,如果zookeeper正在选主,或者Zookeeper集群中半数以上机器不可用,那么将无法获得数据。Eureka基于AP,能保证高可用,即使所有机器都挂了,也能拿到本地缓存的数据。作为注册中心,其实配置是不经常变动的,只有发版(发布新的版本)和机器出故障时会变。对于不经常变动的配置来说,CP是不合适的,而AP在遇到问题时可以用牺牲一致性来保证可用性,既返回旧数据,缓存数据。
所以理论上Eureka是更适合作注册中心。而现实环境中大部分项目可能会使用ZooKeeper,那是因为集群不够大,并且基本不会遇到用做注册中心的机器一半以上都挂了的情况。所以实际上也没什么大问题。
1.54 拓展:分布式对关系型数据库的冲击
对于web网站来说,关系数据库的很多主要特性却往往无用武之地
 数据库事务一致性需求
很多web实时系统并不要求严格的数据库事务,对读一致性的要求很低,有些场合对写一致性要求并不高。允许实现最终一致性。
 数据库的写实时性和读实时性需求
对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出来这条数据的,但是对于很多web应用来说,并不要求这么高的实时性,比方说发一条消息之后,过几秒乃至十几秒之后,我的订阅者才看到这条动态是完全可以接受的。如:MQ消息队列机制,意义,可以解决瞬时的高并发,消峰填谷作用。
 对复杂的SQL查询,特别是多表关联查询的需求
任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的报表查询,特别是SNS类型的网站,从需求以及产品设计角度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。
SNS:全称Social Networking Services,专指社交网络服务,包括了社交软件和社交网站。例如:脸谱facebook、腾讯QQ、微信等。
1.55 自我保护模式

什么是自我保护模式?默认配置下,如果Eureka Server每分钟收到心跳续约的数量低于一个阈值(instance的数量(60/每个instance的心跳间隔秒数)自我保护系数),并且持续15分钟,就会触发自我保护。在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。当它收到的心跳数重新恢复到阈值以上时,该Eureka Server节点就会自动退出自我保护模式。它的设计哲学前面提到过,那就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。该模式可以通过eureka.server.enable-self-preservation = false来禁用,同时eureka.instance.lease-renewal-interval-in-seconds可以用来更改心跳间隔。
1.56 Ribbon
Feign是netflix开发的声明式、模板化的http客户端,在使用时就像调用本地(服务消费者自己)的方法一般,帮助我们更加优雅的调用服务提供者的API。Feign自身支持springMVC,还整合了Eureka、Ribbon,极大的简化了Feign的使用。就整合Euraka而言,只需和普通的服务配置Eureka server的信息即可。整合Ribbon,就意味着不再需要通过标注@LoadBalanced的实例化后的RestTemplate去调用服务提供者方法了。Feign只需通过简单的定义一个接口即可实现负载均衡。
和nginx不同,它是客户端侧负载均衡。

1.57 负载均衡策略
常见提供的负载均衡算法有三种:
 第一种也是默认为轮询
 第二种为random随机
 第三种为WeightedResponseTimeRule,响应时间
1.58 Feigh概念

Feigh是一个声明式web服务客户端。它能让开发web服务变得容易。使用Feign需要创建一个接口并注解它。它拥有包括Feign注解和JAX-RS注解的可插拔支持。它还支持可插拔的编码器和解码器。Spring Cloud拥有Spring MVC支持,并使用Spring Web中默认同样的HttpMessageConverters。在使用Feign时,Spring Cloud集成了Ribbon和Eureka来提供负载均衡的HTTP客户端。
总结:Feign简化HttpClient开发,封装了JAX-RS和SprinMVC的注解,学习成本很低。
1.59 微服务设计引发新的问题

微服务的设计,服务分散在多个服务器上,服务之间互相调用,要调用的服务由于跨网络跨服务器调用,响应速度明显比传统项目单机调用慢很多,甚至由于网络涌动的不稳定的现象发生导致调用超时;还有类似级联失败、雪崩效应(依赖的基础服务宕机,关联的服务导致失败甚至宕机,就像滚雪球一样层层失败。)
如何解决这类新的问题呢?传统的机制就是超时机制。
1.60 熔断机制
家里电表都有个断路器(俗称电闸),当使用的电器很多,用电巨大(例如功率过大、短路等),当电流过载时,电路就会升温,甚至烧断电路,引起火灾。有了这个断路器,我们及时拉闸,就不会造成严重后果了。
断路器可以实现快速失败,如果它在一段时间内检测到许多失败,如超时,就会强迫其以后的多个调用快速失败,不再请求所依赖的服务,从而防止应用程序不断地尝试执行可能会失败的操作,这样应用程序可以继续执行而不用等待修正错误,或者浪费CPU时间去等待长时间的超时。断路器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。
断路器模式像是那些容易导致错误的操作的一种代理。这种代理能够记录最近调用发生错误的次数,然后决定使用允许操作继续,或者立即返回错误。

jt2阶段面试题

1 什么是Redis?
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
可以充当缓存、队列等作用。
2 Redis两种持久化的方式的比较。
答:Redis的持久化方式有两种,AOF和RDB。
RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.
AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。
两种区别就是,一个是持续的用日志记录写操作,crash(崩溃)后利用日志恢复;一个是平时写操作的时候不触发写,只有手动提交save命令,或者是shutdown关闭命令时,才触发备份操作。
选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 最终一致性(eventually consistent)的意思了。
3、说说Redis哈希槽的概念?
Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。
4、Redis集群最大节点个数是多少?
16384个
5、Redis中的管道有什么用?
一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。
这就是管道(pipelining),是一种几十年来广泛使用的技术。例如许多POP3协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。
6、怎么理解Redis事务?
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
7、Redis事务相关的命令有哪几个?
MULTI、EXEC、DISCARD、WATCH
8、Redis如何做内存优化?
尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面.
9 什么是RPC?
答案:RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
10 HttpClient与JSONP区别?
1发送请求的位置不同.
JSONP:浏览器解析js发出的请求
HttpClient:是业务层java模拟发出Http请求
2返回值的格式不同
JSONP:返回数据时必须要有回调函数.
HttpClient:直接返回JSON数据即可.
3代码的层级不同
JSONP:代码层级一般3层
HttpClient:一般5层.

11 什么是nginx?
答:Nginx (engine x) 是一个高性能的HTTP和反向代理服务。
反向代理方式是指以代理服务器来接收Interrnet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务,当做服务器的替身,这样,代理服务器就在安全数据库和可能的恶意攻击之间提供了又一道屏障。
防火墙通路只允许代理服务器有权进行访问。
可以使用多个代理服务器来处理对一个高用量内容服务器的请求,这样做的好处是内容服务器可以处理更高的负载,并且比其独自工作时更有效率。
配置文件主要由四部分组成:main(全区设置),server(主机配置),upstream(负载均衡服务器设置),和location(URL匹配特定位置设置)。
有1全局变量2事件配置3 http参数4虚拟主机基本设置5 Nignx状态监控6反向代理7负载均衡8 URL重写9 IP限制
主要了解虚拟主机配置,反向代理,负载均衡,url重新

java_面试题WH_W相关推荐

  1. 下面选项能正确表示JAVA_模拟试题2

    Java语言程序设计模拟试题二 一.选择题:共20小题,每小题1分,满分20分:请将答案填入题后括号中. 1.以下的选项中能正确表示Java语言中的一个整型常量的是 ( ) A) 12. B) -20 ...

  2. activemq原理 java_面试题activemq的原理详解

    在面试中经常会碰到activemq的问题,相信小伙伴们都挺烦恼的吧,这里小编精心整理了一些关于activemq的面试题,下面快一起来看看吧. 一.activemq是什么? activeMQ是一种开源的 ...

  3. 武汉桥科院 java_笔试题-武汉光迅科技Java

    1.Java中的override和overload的区别? override(重写):指子类继承父类,重写父类中的方法. overload(重载):指用一个类中,方法名相同,传参个数不同.参数类型不同 ...

  4. 圆通招java_圆通java程序员面试经验|面试题 - 职朋职业圈

    面试过程: 你所写的经历项目涉及到的东西,你在项目中的职责开发了哪部分:结构体对齐相关问题,怎样避免死锁,怎样在数据库添加成员 序列化 守护进程 JAVA的垃圾回收机制然后深入探讨了下这个 I+1其他 ...

  5. 贵港java_贵港人才网:经典java笔试题及答案分享

    经典java笔试题及谜底,共享与参考: 1.Anonymous Inner Class (匿名里面类) 是否能够extends(秉承)别的类,是否能够implements(完成)interface(接 ...

  6. 2012年1月java_全国2012年1月自考Java语言程序设计(一)试题及答案.doc

    全国2012年1月自考Java语言程序设计(一)试题及答案 全国2012年10月自考Java语言程序设计(一)试题 课程代码:04747 选择题部分 一.单项选择题 本大题共10小题,每小题1分,共1 ...

  7. 恒安嘉新面试题java_面了三个大厂,终于拿到offer,数年Java最经典的面试题总结...

    文章最后有面试题福利!记得看一下哦~* 前言 写这篇文章的目的是因为前两天同学想应聘Java工程师,从网上找了Java面试题和答案让我帮忙看看.我扫了一眼,倒吸了一口冷气,仔细一看,气的发抖.整篇题目 ...

  8. stringbuilder寻找字符串位置可能存在多个 java_【面试题系列】——Java基础

    本文主要包括Java基础及面向对象相关面试题. 1,Java科普1.1 为什么安装包要分JDK和JRE?1.2 为什么Java语言是跨平台的?1.3 为什么安装完JDK后要设置环境变量?1.4 Jav ...

  9. leetcode机器人运动范围Java_【LeetCode】面试题13. 机器人的运动范围

    题目: 思路: 矩阵搜索,因为可以上下左右移动,判断机器人是否能够走到位置x,只需要判断机器人能否走到它的上下左右的位置,并且x点满足条件.但是判断x点时,它的上下左右如果还没有判断过呢?这时陷入了瓶 ...

  10. 小数第n位java_蓝桥杯【历届试题 小数第n位】 java版 数论

    历届试题 小数第n位 时间限制:1.0s   内存限制:256.0MB 问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统 ...

最新文章

  1. linux fsck exited with status code 4,linux – 在硬盘崩溃后启动PostgreSQL服务器导致FAILED STATE...
  2. Backnbone的入门基础——Backbone的model
  3. 百度搜索,你画了好大一张饼,你还打算欺骗多少人呢?有图为证
  4. php 时间操作归类
  5. My Account dependency /UI5/CL_UI5_APP_INDEX_LREP~UI5_INFO_FETCH_FROM_DB strange manifest.json
  6. c语言如何实现不定参数,C语言中不定参数的实现
  7. javascript学习(11)——[设计模式]工厂模式
  8. MySQL/MariaDB的response time插件
  9. 漫谈CGI FastCGI WSGI
  10. oracle对象类型_如何创建Oracle类型对象
  11. 暑期集训 Day2 简单博弈论
  12. atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty  HttpListener
  13. 报童问题求解最大利润_矩问题和分布式鲁棒优化:由阿里数学竞赛题说开...
  14. 抱歉,我又可以了。。。
  15. 科技业10大错误决定
  16. 那些陪伴了我大学青春的网易博客也要停运啦
  17. tensorflow 2.0 Layer定义的源码分析
  18. Python基础:函数的返回值return
  19. jQuery小游戏——小鸟飞行闪躲
  20. 快捷支付各种绑卡鉴权方式

热门文章

  1. Docker离线安装
  2. vue json对象转数组_分享:vue使用技巧和项目中遇到的问题
  3. OpenCV配置教程
  4. ul阻燃标准有几个等级_UL阻燃等级说明
  5. 个人开源码支付收款系统源码+支持免备免签约
  6. Qt 语言切换 QTranslator cmake qmake
  7. 威纶和s7200通讯线_S7-200PLC和威纶通触摸屏MODBUS RTU协议通讯实例
  8. Nginx网站使用CDN之后禁止用户真实IP访问的方法
  9. pythonmt4通讯swot矩阵_基于SWOT与安索夫矩阵的市场战略分析.doc
  10. 思维模型 SWOT分析