Java软件开发面试知识整理
围绕以下几点回答问题:是什么、为什么、什么时候用、项目实现、解决什么问题、遇到的困难
-
谈谈你对Java和C的理解?
Java:
面向对象、Unicode:可以跨平台(JVM运行),可以分布式,相对C速度会慢
C语言:
面向过程、ASCII、更底层:移植性、安全性不如Java、没有GC
特点:速度快(Linux、Nginx)、注重算法
变量可以不进行初始化 -
super与this区别
this指当前类的对象
super父类对象,受继承的约束规则
(例:子类构造函数中默认存在super,当父类没有无参构造函数或者被私有化,则变异报错,必须手动添加父类无参构造(默认缺省)) -
public:全局
protected:子类,同包,类内
默认什么都不:写同一包、类内
Privat:类内 -
java事件委托机制:一个源产生一个事件并把它发送到一个或多个监听器哪里,事件被监听器接受后进行处理
-
垃圾回收机制:将分配给对象但不在使用的内存回收或释放的过程。(比如当一个对象没有指向它的引用或者为null值)
-
什么是java序列化:将一个对象保存到一个文件,并且可以通过流的方式进行传输。实现Serializable接口
-
一个.java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以、但是只允许有一个public类,并且类名必须和文件名一致。 -
Override和Overload的区别
Override是重写,子类覆盖父类方法
Overload是重载,一个类多个方法,方法名相同,参数不同 -
Final类特点
属性常量
方法不可被重写
类不可以被继承 -
一般的排序方式
选择排序思路:外层从数组i(0)位开始,内层从j=i开始,i++j++遍历整个数组,找到最小值位j,ij通过中间值m换位 i++
For(int i=0;i<a.length;i++){ int m = I;
For(int j=I;j<a.length;j++){
If(a[j]<a[m]){m=j}
}
Int c=a[i];
a[i]=a[m];
a[m]=c;
}
插入排序思路:认为i[0]是有序的,外层从i[1]开始,内层从j=i-1开始,i++j–遍历,相邻的两个元素小大排,每遍历完一个次,i++
For(int i=1;i<a.length;i++){
for(int j=i-1;j>=0;j–){
If(a[j]>a[j+1]){
Int c=a[j]
a[j]=a[j+1]
a[j+1]=c
}else{break}
}
}
冒泡排序思路:外层从i(0)开始 内层j从末尾开始,i++j-遍历整个数组,相邻的两个元素小大排,每遍历完一个次,i++,可以加一个boolean判断,减少运算
For(int i=1;i<a.length;i++){
boolean flag = false;
For(j=a.length-1;j>I;j–){
If(a[j]<a[j-1])
Int c=a[j]
a[j]=a[j-1]
a[j-1]=c
flag=true;
}
If(!flag){break;}
} -
抽象类和接口的区别
接口可以被多实现,抽象类只能被单一继承
接口只有方法定义,抽象类可以有方法定义和实现
接口的字段定义是public static final的,抽象类是本包可见 -
什么是类的反射机制
通过类(Class 对象),可以得出当前类的:fields、method、construtor、annotation等,并且进一步的可以实现:实例化类、设置属性、唤醒方法。
典型应用在Spring框架中。
如何唤醒一个类的方法:1得到类对象2得到该方法+参数3method.invoke(实例,参数)唤醒 -
Java获得年月日
Calendar c=Calendar.getInstance();
c.set(Calendar.YEAR,2004);
c.set(Calendar.MONTH,0);
c.set(Calendar.DAY_OF_MONTH,31);
System.out.println(c.get(Calendar.YEAR)+""+(c.get(Calendar.MONTH)+1)+""+c.get(Calendar.DAY_OF_MONTH));
Java获取毫秒数
Date d = new Date();
Long l = d.getTime(); -
Java简单实现编码转换
String a = new String(“都是靠技术”.getBytes(“charset”),”charset”); -
简单介绍一下Java内存溢出、内存泄漏
内存溢出 out of memory 内存满了。死循环输出或大量数据库读取或JVM内存过小 死循环append字符串
内存泄漏 memory leak 无用对象持续占内存。.close()方法丢失 -
Java多态实现
静态实现:OverLoad
动态实现:继承+实现 -
简述Java垃圾回收机制
动态内存:类实例
静态内存:类本身
垃圾收集主要针对的是动态内存,一般当内存不够用时会进行垃圾收集。
可以通过System.gc()手动回收,但是不一定执行。 -
谈谈Java的JVM内存机制?/谈谈Java 堆、栈、方法区都是干什么的?
堆: 只存放对象本身
栈: 只存放基本类型和对象的引用 Stack.push Stack.pop
方法区:又叫静态区,包含所有的class类、static变量、常量池(类常量和字符串常量1.7以后字符串常量池放到了堆中数字常量池(-128-127))。特点唯一 -
简述类加载过程?描述一下JVM加载Class文件的原理机制?
JVM中类的加载是由ClassLoader和他的子类来实现的,类加载器在JVM虚拟机中
加载(.class二进制文件加载到内存)-连接(验证编译合法、分配内存赋给默认值、方法的符号引用变为直接引用)-初始化(赋值) -
谈谈JVM的优化?
-
Java如何处理异常?
Try-catch-finally
Throws 方法或类抛出异常
Throw 代码块抛出异常 throw new ServiceException(“”); -
谈谈对tring StringBuffer StringBuilder的理解?
String 长度不可变 +号拼接慢
StringBuffer 拼接字符串 特点:快、线程安全
StringBuilder 拼接字符串 特点:非常快、线程不安全 -
集合的作用是什么?谈谈List、Set、Map。(注意Map跟List,Set不同隶属于Collection)
集合的一大特点是泛型、存放不同类型
List 有序的可重复 ArraysList数组储存,任意位置访问效率高, LinkedList链表储存,两端效率高
Set 无序的不重复 区分重复的方法:先比较hashcode 在equals 都相等则相等
Map 键值对存储 一个哈希桶key对应一个或者多个值value key相同 value相同覆盖;key相同 value不同链表(jdk1.8 长度>8红黑树 6转回成链表)
HashMap 线程不安全、支持null值、初始16*0.75
HashTable 线程安全、不支持null值、被淘汰了 -
List遍历的方法
For/foer/list.iterator()+while迭代 -
Collection Collections 的区别。
Collection 是集合的根接口,其下有set及list
Collections 是集合的算法。就像工具类 -
Int和Integer有什么区别?谈谈基本类型和其包装类?
基本类型
封装类:多方法和属性,支持null值:数据库POJO对象有封装类 -
Try-return-catch-return-finall执行顺序
正常 try - finally - return
异常 try - catch - finally - return -
用最快的速度算出2*8=?
用移位 2<<3
JAVA基础类库(IO、线程、Socket) -
Java的几种流
字节流In/OutputStream、字符流Writer/Reader
桥梁InputStreamReader/OutputStreamWriter
高级流Buffer批量读取快 -
谈一谈线程:
新建一个线程的方法:
继承Thread重写run方法. 多个线程分别完成自己的任务
实现Runnable接口重写run方法 多个线程共同完成一个任务
启动线程用start()方法
线程在进程(进程就是应用程序:迅雷、QQ)中运行。
生名周期:开始,执行,挂起(sleep指定休息时间,wait等待唤醒,yield,join),消亡 -
同步跟异步的区别
同步:排队买票 hashTable、StringBuffer、数据库写入锁库、锁表
异步:不排队抢票 -
什么是TCP/IP、UDP
TCP/IP即传输控制协议网间协议 协议簇 -
谈谈Socket和ServerSocket
两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
实现不同的计算机之间的通信。主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
进程间如何通信:消息传递、同步、共享数据、远程调用
识别进程:网络层IP地址识别主机,根据协议+端口号识别进程 -
当前主流的解析器有哪些?他们有什么不同?解析Xml的工具?
Dom:文档对象模型 特点:可以访问任意节点,慢,可修改
Sax: 特点:顺序读取,快,只读
JDBC数据访问技术 -
Jdbc如何做事务处理
设置事务自动/手动提交 commit
事务的回滚,批量提交事务,有一个错误,返回,不对数据库做任何操作 -
预编译功能PrepareStatement
正对sql语句,防止sql注入攻击,原理:sql先经过编译再填充参数。 -
Class.forName(“加载驱动”) 加载到JVM
获得连接Connection
获得预编译对象PrepareStatement 执行sql
获得ResultSet -
数据库事务/JDBC事务的四大特性:ACID 一系列操作组成的操作单元,
原子性:要么全都执行,要么全都不执行
一致性:存取一致
隔离性:并发的事务加锁
持久性:持久保存 -
数据库的五大约束
主键约束:唯一非空 在所有列定义完之后加逗号, primary key(列名)
唯一约束:唯一,可多空 在所有列定义完之后加逗号, unique(列名)
检查约束:自定义约束 在所有列定义好了之后加逗号, check(1个或者多个检查条件)
外键约束: 在所有列定义完之后加逗号, foreign key(子表外键列名) references 父表名(父表主键列名) -
MySQL 中如何设置事务隔离级别?
set session transaction isolation level ‘reapable read’ -
开启数据库访问权限的sql?
grant 权限 on 数据库名.表名 to ‘用户名’@‘web服务器的ip地址’ identified by ‘密码’;
开启数据库权限sql:grant all on . to ‘username’ @ ‘IP地址’ identified by ‘password’; -
数据库优化策略?
a. 优化sql语句
原则:尽量使用主键查询/减少关联查询(表设计)
b. 创建数据库索引
c. 使用缓存策略(内存),mamerchche/Redis0
d. 定期数据转储,将旧数据保存到历史表
Tb_order tb_history_order
e. 分库分表(2-4服务器) -
数据库内外连接的区别?
内连接交集
外连接交集+左右
Http协议 -
谈谈你对http协议的理解?
定义:超文本传输协议,网络传输协议:基于TCP/IP通信协议来传递数据
TCP/IP是一个协议簇,是由许多协议组成的。一般理解到应用层,传输层,网络层,数据链路层这几层即可。
请求:
请求行:method url Protocol
请求头:多个K : V(Accept-Charset:浏览器可接受的字符集。Cookie:缓存 这个是重要的请求头)
空行:
请求数据
响应:
响应行:Protocol 状态码 状态(200成功 404找不到 500 服务器错误 403请求方式拒绝 406数据类型错误)
响应头:多个K : V (Content-Encoding:编码方法 Content-Length:长度 Content-Type 类型 Date:GMT时间 Allow:服务器支持的请求方法)
空行:
响应数据: -
Cookie的生命周期?
Cookie.setMaxAge()>0存活时间秒、=0立即删除、-1会话删除
Web/Jsp/Servlet技术 -
谈谈Tomcat的配置
JAVA_HOME 配置JDK环境
CATALINA_HOME 配置tomcat的根目录
server.xml 配置Tomcat的配置端口号
wabapp下的ROOT文件对应项目发布 Maven打war包放这里启动Tomcat -
谈一谈Tomcat的性能优化?
什么是Tomcat:免费开源的Web轻量级(组件对环境的依赖程度)应用服务器,Servlet容器,用来开发Servlet和JSP。处理请求、响应请求。
性能优化:
内存优化:多分配JVM内存 Windows下的catalina.bat Linux下的catalina.sh
JAVA_OPTS=’-Xms256m -Xmx512m’(-初始大小 –最大值)
线程优化:在servlet.xml中
maxThreads=“X” 表示最多同时处理X个连接
minSpareThreads=“X” 初始化X个连接
maxSpareThreads=“X” 表示如果最多可以有X个线程,一旦超过X个,则会关闭不在需要的线程
acceptCount=“X” 当同时连接的人数达到maxThreads时,还可以排队,队列大小为X.超过X就不处理
IO优化:
BIO 比较传统的,适合连接少且固定的架构,JDK1.4以前的唯一选择
NIO 多路复用(线程复用,不释放,长链接ping/1s;流,响应式,事件:保证持续:邮箱机制),适合连接多且较短的架构,比如:聊天室,JDK1.4以后开始支持
AIO 适合连接数多且长的架构,比如相册,JDK1.7开始支持
凶器APR:
APR是从操作系统级别来解决异步的IO问题,,socket调度 -
谈谈JavaWeb三大组件
Servlet 处理请求 init Service destory
Filter 拦截放行 init doFilter destroy 登录验证
Listener -
说一说过滤器Filter?
可以实现用户请求之前或响应之后,对请求request和响应response进行拦截,做一些相关处理。一个拦截器可以拦截多个资源,一个资源可以配置多个拦截器
比如最典型的:全站乱码解决、登录控制
实现过滤器:
a. 实现Filter接口
接口里面有哪些方法:
init(); 初始化,web应用创建时立即创建Filter立即初始化
doFilter(Request , Response , FilterChain);
FilterChain.doFilter(Request,Response);向下传递
destroy(); 销毁,web应用关闭或移除时销毁
b. web.xml配置过滤,拦截/放行那些资源
例:您是第xxx个访问本网站的人 -
说一说监听器Listener
监听java对象(ServletContext、HttpSession、ServletRequest)的变化(数量、创建与销毁),需要将监听器注册到事件源,事件源触发监听器,执行监听器中的方法。例:统计在线人数,统计访问量 -
POST提交和GET提交的区别
POST: 参数不出现在地址栏,数据量理论没有上限
GET: 参数出现在地址栏,数据量最大在1-4kb -
谈谈Servlet生命周期
Init方法 只会执行一次,(第一次访问初始化或者设置服务器启动后立刻加载)
Service方法 核心周期实际的处理工作都在这里实现
Destroy方法 只会被调用一次,在Servlet对象被销毁时调用 -
谈谈转发(forward)、重定向(sendRedirect)的区别
转发:一次请求一次响应,地址栏不发生变化,只能在同一个web应用内部跳转
重定向:两次请求两次响应,地址栏发生变化,可以在不同的web应用间跳转 -
Servlet会话技术
多次请求多次响应 Cookie客户端技术+Session服务端技术
客户端向服务器发送请求,服务器获取需要保存的数据,并将需要保存的数据通过Set-Cookie响应头发送给浏览器,浏览器会以Cookie的形式保存在浏览器的内部.
一次会话对应一个session,持续保存数据
当浏览器再去访问服务器时,服务器可以从session中获取到之前为当前浏览器保存的数据 -
谈谈四大作用域,共同作用:在作用域内共享数据
Page 域: 网页,只能作用于本网页
生命周期:jsp请求开始,结束销毁
作用范围:整个jsp页面,四大作用域最小的一个
Request 域: 只要不重定向,请求就会一直带到下一个页面。
生命周期:用户发一个请求开始,请求结束销毁。
作用范围:整个请求链(包括转发),注:Request域:在一次请求中,而重定向是两次请求,会销毁再创建。
HttpSession域: 只要网页不关闭,session就不会丢失
生命周期:在第一次调用调用request.getSession()方法时。销毁:非正常销毁,手动销毁,定时销毁。
作用范围:一次会话。
application ServletContext 只要服务器不关闭,application就不会丢失
生命周期: 服务器启动,应用加载时开始,应用移除,服务器关闭时销毁。
作用范围:整个WEB应用。 -
谈谈JSP的理解。Java Servlet Page
动态的web资源技术,本质上就是一个Servlet
JSP为了解决Servlet响应时不适合向外输出页面的问题。 -
常见JSP表达式
JSP表达式
格式: <%= 表达式 %> (就是EL表达式${}) 其中可以书写常量、变量、表达式。
JSP脚本片段
格式:<% 若干java语句 %>
JSP注释
格式: <%-- JSP注释 --%>
JSP指令
格式:<%@ 指令名称 若干属性声明… %> 比如language、字符集、异常页面、import导包
JSP Include指令 实现页面包含
格式:<%@ include file="" %> -
JSP九大隐士
page this 相当于实例化的Servlet类this
request ServletRequest 代表请求
response ServletResponse 代表响应
session HttpSession 一次会话的session
application ServletContext 服务器域对象
config ServletConfig 取得服务器的配置信息
exception 异常对象
out 等价于response.getWriter()
pageContext 通过这个对象可以获获得其他八大对象 -
Jstl标签库:JavaWeb开发的一套标准通用的标签库
JSTL标签库和EL配合使用取代JSP中大部分的Java代码.
<c:if><c:forEach> -
谈谈CS跟BS的联系与区别?
CS是Client/Server:客户端软件+服务器
专网、适应性弱、对操作系统有要求
重视流程、安全机密性高、运行速度一般
集中、重用性差
升级维护麻烦、成本高
BS是Brower/Server:网页+服务器
公网、适应性强、任意操作系统
兼顾流程和速度、安全机密性差、运行速度快
分开、重用性好
升级维护容易、成本低
AJAX -
谈谈你对AJAX的理解?
Asynchronous Javascript And XML
XMLHttpRequest 是浏览器内置的AJAX引擎 open(method,url,async) send(String)POST请求才有String
它使用客户端脚本与web 服务器进行交互数据、解决的是全剧页面异步加载的问题。
一般结合JQuery来使用AJAX
基础语法:$.ajax({k:v,…})
AJAXGET 请求: $.getJSON(“url”,[data], [callback])
AJAXPOST请求: $.post(url,[data],[callback]) -
Ajax——三种数据传输格式:HTML、XML、JSON
若应用程序不需要与其他应用程序共享数据的时候,使用HTML片段
如果数据需要重用,需要共享数据,JSON文件是个不错的选择,
当远程应用程序未知时,XML文档是首选
Spring框架技术
- 为什么要使用Spring框架?Spring的核心价值在哪?谈谈对Spring的理解?
Why?:解决软件中的共性问题,整合优秀资源,对外提供统一的服务。
核心特征(两大特征IOC对象管理+AOP功能扩展)
IOC :控制反转,把new对象的工作交给Spring来做、有Spring来创建、协调、管理这些对象,使开发更关注业务逻辑本身。
DI :IOC后依赖被注入到对象中的过程,构造注入、set注入、注解/xml注入
AOP :不改变源代码的情况下给程序动态的添加功能:
例:事务控制、日志、性能监控、安全控制、异常处理
核心组件:
BeanFactory :Bean工厂:Bean的定义、创建、解析
Core 组件 :定义了资源的访问方式
:提供get和set方法
ApplicationContext :提供框架运行时的环境、保存对象关系、利用BeanFactory创建Bean对象
ApplicationContext 是Spring在 BeanFactory 基础容器之上,提供的另一个IoC容器实现。它拥 有许多 BeanFactory 所没有的特性,包括统一的资源加载策略、国际化信息支持、容器内事件发布。
优势: 统一管理jar包、不用new对象、减少代码量、更关注业务逻辑的实现。
节省内存,默认单例创建对象。
耦合性降低。
缺点: 复杂,底层用反射,难以理解。
对象结构的可读性低,对新学者不友好。 - ApplicationContext如何实现事件处理
观察者模式:事件ApplicationEvent 发生改变-通知-ApplicationListener得到事件源ApplicationContextAware调用事件源的方法,通知监听器。 - 说几个Spring常用的配置标签
- 谈谈单例模式和多例模式?谈谈SpringBean对象有哪些重要的作用域?其含义是什么?
单例模式:整个系统中对象只有一份,解决内存占用问题。
多例模式:整个系统中对象只有多份,对象含有可改变的状态时,解决高并发问题 - Spring Bean 对象的构建有哪些方式?(直接构建,静态方法,实例方法)
- Spring两种事务管理方式
spring事务的本质就是对数据库事务的支持,例如A-B 200转账,保证A-200和B+200在同一个事务当中。
编程式事务管理:
通过编码方式实现事务,缺点:入侵式。
声明式事务管理:
基于AOP实现的,将具体业务逻辑与事务处理解耦。非入侵式,不会影响业务的实现。
两种实现方式:
a. XML
org.springframework.jdbc.datasource.DataSourceTransactionManager
b. 注解 @Transactional实现事务管理实现
启用事务注解、注册驱动
org.springframework.jdbc.datasource.DataSourceTransactionManager
<tx:annotation-driven transaction-manager=“txManager”/>
在类或方法中使用@Transaction注解应用事务。
事物的隔离级别:针对事物的隔离性来说的
SERIALIZABLE最高级别
REPEATABLE_READ(此级别可能会出现幻读)
READ_COMMITTED(此级别可能会出现不可重复读)
READ_UNCOMMITTED (此级别可能会出现脏读) - 谈一谈Spring中的动态代理
JDK代理:代理类必须实现接口,Spring默认
CGlib代理:代理类不需要实现接口,生成的代理类是目标子类 - Spring常用注解有哪些?
@Component 元注解
@Controller 控制层
@Service 业务层
@Reponsitory 数据访问层
@Autowired 自动注入
@Configuration 配置类
@ComponentScan 扫描指定包下的所有C S D
@Aspect 声明切面
@After 前置通知
@Before 后置通知
@Around 环绕通知
@PointCut 声明切点
@Transactional 声明事务
@EnableAspectJAutoProxy 开启事务支持
@Value Spring EL取值
@ContextConfiguration 配置加载ApplicationContext
@EnableWebMvc 开启MVC的一些默认配置:
@RequestMapping 路径
@ResponseBody 指定返回数据 处理对象一般不乱码,处理String可能乱码。
@RequestBody 允许request的参数在request体中
@PathVariable 接受路径参数
@RestController 组合@Controller和@ResponseBody
@ControllerAdvice 全局异常配置
@ExceptionHandler全局异常拦截
@WebAppConfiguration 指定web资源位置 - Shiro安全框架
认证管理对象,授权管理对象,会话管理对象,缓存管理对象,加密管理对象
- Subject:与软件交互的一个特定的实体(用户、第三方服务等)。
- SecurityManager :Shiro 的核心,用来协调管理组件工作。
- Authenticator:负责执行认证操作
- Authorizer:负责授权检测
- SessionManager:负责创建并管理用户 Session 生命周期,提供一个强有力的 Session 体验。
- SessionDAO:代表 SessionManager 执行 Session 持久(CRUD)动作,它允许任何存储的数据挂接到 session 管理基础上。
- CacheManager:提供创建缓存实例和管理缓存生命周期的功能
- Cryptography:提供了加密方式的设计及管理。
- Realms:是shiro和你的应用程序安全数据之间的桥梁。
具体流程:
1)系统调用subject的login方法将用户信息提交给SecurityManager
2)SecurityManager将认证操作委托给认证器对象Authenticator
3)Authenticator将身份信息传递给Realm。
4)Realm访问数据库获取用户信息然后对信息进行封装并返回。
5)Authenticator 对realm返回的信息进行身份认证。
SpringMVC
- 谈一谈你对SpringMVC的了解?
首先什么是Spring?答案在上面。
什么是MVC?/什么是MVC设计模式?
MVC的全名是Model(模型)、View(视图)、Controller(控制器),是用C把M和V分离开的方式组织代码。
数据库数据M获取C处理V显示
优点:前后端分离(MV分离)
缺点:复杂、不适合中小应用程序、数据访问性能低(mycat读写分离+数据库集群+redis)
最典型的MVC就是javabean + JSP + servlet的模式。也就是SpringMVC与用户进行数据交互,页面跳转。 - 谈一谈SpringMVC的5大核心组件
DispatcherServlet 前端控制器 处理请求的入口
org.springframework.web.servlet.DispatcherServlet一般在服务器启动时就初始化
继承AbstractAnnotationConfigDispatcherServletInitializer
HandlerMapping 映射器 管理url和Controller的映射关系
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
@RequestMapping("/")
Interceptors 拦截器 实现请求响应的共性处理
mvc:interceptor
实现HandlerInterceptor接口
Controller 后端控制器 请求控制逻辑
实现 Controller接口 org.springframework.web.servlet.mvc.Controller;+XMLbean配置
@Controller
ViewResolver 视图解析器 解析对应的视图关系:前缀+view+后缀
org.springframework.web.servlet.view.InternalResourceViewResolver
继承 WebMvcConfigurerAdapter - REST风格的url映射
REST即表述性状态传递(英文:Representational State Transfer,简称REST)
提高程序的可伸缩性(“/msg/{xxx}”) - 谈一谈你接触的几种数据传输格式?
二进制传输
txt文件 需要约定处理字符串
xml文件 标签灵活dom sax WebService ApacheCXF。废弃传输性能低
Json串 无序的键值对集合,可以在串和对象之间相互转化,httpclient+json,
Jackson,fastjson。 - 说一说SpringMVC里的拦截器?
可以实现实现请求响应的共性处理:身份认证、系统监控、日志记录…
实现方法:
a. 实现HandlerInterceptor接口或者继承实现类HandlerInterceptorAdapter
业务业务处理时间
preHandle()数据处理时间postHandle()视图渲染时间afterCompletion()
b. 在Spring配置文件中配置mvc:interceptors
拦截器链的实现:继承HandlerInterceptorAdapter加@Component注解 - SpringMVC拦截器和Servlet的过滤器有什么区别?
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
7. SpringMVC异常处理?
提高系统容错、用户体验、
定义一个全局异常配置
类加@ControllerAdvice
方法加@ExceptionHandler (value=Exception.class)注解
8. Spring中的单例模式是什么?你知道几种单例模式?
系统中一个类,只有一个实例对象。
实现思路:私有化构造、私有化静态对象、对外提供获取这个对象的方法
a. 懒汉式:调用才初始化,线程安全
public class Singleton {
private volatile static Singleton instance;
//私有化静态对象,instance = new Singleton()并非一个原子操作需要volatile 禁止指令重排序优化
private Singleton (){}//私有化构造
public static synchronized Singleton getInstance() {//提供对外方法,加锁防止多线程并行调用此方法
if (instance == null) {
synchronized (Singleton.class) {instance = new Singleton();}//加锁防止多线程并行调用
}
return instance;
}
}
关于instance = new Singleton()并非一个原子操作需要volatile 禁止指令重排序优化的解释:
instance = new Singleton()这句,这并非是一个原子操作,事实上在 JVM 中这句话大概做了下面 3 件事情。
- 给 instance 分配内存
- 调用 Singleton 的构造函数来初始化成员变量
- 将instance对象指向分配的内存空间(执行完这步 instance 就为非 null 了)
但是在 JVM 的即时编译器中存在指令重排序的优化。也就是说上面的第二步和第三步的顺序是不能保证的,最终的执行顺序可能是 1-2-3 也可能是 1-3-2。如果是后者,则在 3 执行完毕、2 未执行之前,被线程二抢占了,这时 instance 已经是非 null 了(但却没有初始化),所以线程二会直接返回 instance,然后使用,然后顺理成章地报错。
b. 饿汉式:加载就初始化,线程安全,不是懒加载
public class Singleton{
private static final Singleton instance = new Singleton();
private Singleton(){};
public static Singleton getInstance(){
return instance;
}
}
c. 静态内部类:把饿汉式包了起来且实现了懒加载
public class Singleton{
private static class SingletonHolder{
private static final Singleton INSTANCE = new Singleton();
}
private Singleton(){};
public static final Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
d. 枚举Enum:通过EasySingleton.INSTANCE来访问实例、线程安全、防止反序列化导致重新创建新的对象
public enum EasySingleton{
INSTANCE;
}
SpringAOP - 谈一谈SpringAOP?Spring是什么?AOP可以做那些事那些事?简单说一下AOP的实现原理?
面向切面编程:声明式事务处理基于AOP实现
在OCP(开闭原则)基础上,在对象运行时动态织入一些功能。
OCP是:完成的代码需要增加新功能时,扩展>修改代码
AOP实际应用场景:日志、事务处理、权限处理、缓存处理(没有Redis)
AOP底层实现:基于代理机制实现功能扩展
目标实现接口:底层JDK动态代理,目标类和代理类会实现共同接口
目标未实现接口:底层采用CGLIB实现代理,代理类会继承目标对象类型
AOP术语:
切面(@Aspect),横切面对象 封装扩展业务的一个类的对象。
连接点(@joinpoint) 程序执行过程中某个特定的点,一般指被拦截到的的方法
切入点(pointcut):对连接点拦截内容的一种定义,一般理解为多个连接点的结合.
通知(@Advice) 切面的某个特定连接点上执行的动作(扩展功能)
AOP基于XML实现
方式一
一条sql语句:使用嵌套结果映射来处理重复的联合结果的子集
select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id}
方式二
两条sql语句:通过执行另外一个SQL映射语句来返回预期的复杂类型
select * from class where c_id=#{id}
SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
一对多:
方式一
一条sql语句:使用嵌套结果映射来处理重复的联合结果的子集
select * from class c, teacher t,student s where c.teacher_id=t.t_id and c.C_id=s.class_id and c.c_id=#{id}
方式二
两条sql语句:通过执行另外一个SQL映射语句来返回预期的复杂类型
select * from class where c_id=#{id}
SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
SELECT s_id id, s_name name FROM student WHERE class_id=#{id}
3. 通用Mapper与MybatisMapper?
通用Mapper:
ORM思想Object Relational Mapping 对象关系映射 POJO和数据库字段映射
JDBC-JPA思想:持久化API
实现OOP操作数据库 公共泛型
4. mybatis拦截器?
京淘项目技术点(大型高并发项目技术点)
- 电子商务网站项目特点?
a. 分布式:把任务分发下去,然后将结果回收,得到最终结果。这样一种算法。
把一个非常巨大的问题分成许多小的部分,然后把这些部分分配给许多计算机处理,最后把这些计算结果综合起来,得到最终结果。
项目结构: 将按功能模块拆分为不同的项目,便于开发管理,降低耦合!
特点: 分布性、通信性、稳健性
拆分方式:
垂直拆分:按功能拆分:parent+common+SSO+web+cart+order
水平拆分:按层级拆分:以接口为准 RPC调用
b. 高并发:同一时间内大量用户访问服务器。铁路12306、双11、大学选课;2000/s
tomcat能处理150/s的访问量 部署15台tomcat服务器
c. 集群:搭建集群是抗击高并发的有效策略
多个服务器集中起来一起进行服务处理,在客户端看起来只有一台服务器。
并行计算、高速计算
负载均衡(HA)+高可用(故障迁移)
d. 海量数据:
检索、快速处理
策略:数据转储/分库分表/升级硬件 - 京淘Mini开发工具:
EasyUI用户网页开发工具
PowerDesigner主流数据库建模、关系对象可视化工具。可以生成动态SQL - Restful风格实现动态传参:{}+@PathValiable
- 富文本编辑器实现图片上传:
实现步骤:
a. 开启多媒体标签:
b. 文件上传视图解析器:org.springframework.web.multipart.commons.CommonsMultipartResolver
c. 控制层 参数MultipartFile image(必须和页面提交的一致) 方法
d. 业务层 操作上传
a) 判断图片类型:转小写、正则匹配后缀、获取长宽。
b) 分储:Date获取SDF格式yyyy/MM/dd的路径
c) 动态生成文件名尽量不重复:UUID+三位随机数
d) 实现文件上传:image.transferTo(new File(路径/文件名)),到这里基本完成了上传
e) 进一步封装长宽属性,便于返回以及页面调用
f) 设置虚拟路径 测试是Nginx代理服务器,为的是页面回显 - Nginx反向代理服务器?
a. 什么是Nginx?什么是反向代理?轻量级的web服务器:处理请求返回响应
反向代理通俗的将就是:代理拿到请求后,代替我用户去访问,拿到数据后返回给我用户。
Nginx干的就是这个事:特点,内存小,并发能力强。支持最高5w/s,实际3w/s的访问,
nginx为什么比apache快?
Nginx 采用 epoll 模型,异步非阻塞。多路复用。一个任务多个进程接受处理
Apache 采用select模型,同步阻塞IO。单路单用。一个任务一个进程接受处理
Nginx相对的缺点:不能处理动态请求、只适合静态和反向代理
使用Nginx的网站:百度、京东、新浪、网易。
b. Nginx中的进程?
主进程:提供代理访问。守护进程:防止主进程意外关闭。
c. Nginx中的针对tomcat的负载均衡策略:
轮询、权重、IP_hash(IPhash后绑定到某一台tomcat上,生效级别高于轮询权重,Session黏着/共享,依然可能负载不均:改进方式单点登录)
健康检测机制类似心跳检测 - 如何实现数据库高可用?3306
grant 权限 on 数据库名.表名 to ‘用户名’@‘web服务器的ip地址’ identified by ‘密码’;
开启数据库权限sql:grant all on . to ‘username’ @ ‘IP地址’ identified by ‘password’;
高可用:
Amoeba/Mycat
数据库的冷备份:定期备份,拷贝
数据库的热备份:实时备份,同步
修改配置文件my.cnf:mysql数据的保存路径、编辑访问项的mysql日志文件+重启sql服务
Sql命令实现主从挂载
a. Show master status
b. #实现主从挂载 IP/端口/用户名/密码/二进制文件/位置
change MASTER to
MASTER_HOST=“192.168.126.162”,
MASTER_PORT=3306,
MASTER_USER=“root”,
MASTER_PASSWORD=“root”,
MASTER_LOG_FILE=“mysql-bin.000001”,
MASTER_LOG_POS=120
c. 启动命令
Start salve启动
Stop slave检测
Show slave status查看
d. 双机热备
负载均衡:
读写分离:
Amoeba:高可用、读写分离,繁琐要改一堆配置文件
Mycat:高可用、读写分离,分库分表,操作简单、心跳检测机制
分库分表针对海量数据提出:根据业务垂直拆分、根据表水平拆分 - Redis缓存服务是什么?谈谈你对Redis的理解?6379
Redis一个开源免费的Key-Value的存储系统,标准称数据结构服务器。
解决了什么问题?
“数据库备份”有效地降低数据库的访问压力,保存在内存中读取非常快!读11w/s写8w/s
特性:持久性、支持多种数据模型、支持master-slave模式
底层实现:
哈希槽存储数据16384个槽
a. Redis支持的类型?
String类型、Hash类型、List类型、
b. 项目实现思路:操作API:jedis、objectMapper
以查询为例,
第一次点击查询,先查询缓存,返回null。
查询数据库,得到对象,返回给用户,并且把对象转化成JSON串存到redis中。
接下来查询,访问redis,得到JSON串,转化成java对象就可以return了
c. Redis分片(分片1+1+1=3跟集群111=1的区别)
多个redis动态扩容,对外看起来仍只有一个redis,如果一台宕机只损失1/n的缓存数据,一般不允许出现节点宕机丢失数据
需要在配置文件里写大量bean配置redis.clients.jedis.JedisShardInfo
分片时采用哈希一致性算法
均衡性:要求数据尽量平均分布在各个节点,虚拟节点进行数据平衡
单调性:当节点的个数增加,原有的节点的挂载会自动的发生变化.将满足条件的数据自动的挂载到新的节点中.
分散性:由于分布式的项目部署,导致项目不能全部获取node节点,一个key对应多个value
负载:负载是从另一个角度谈论分散性,一个位置对应多个key,在分布式应用时,应该使用全部的node节点,避免出现这样的现象.
d. Redis的主从配置?数据备份
命令:在redis客户端中执行127.0.0.1:6381> SLAVEOF 192.168.126.166 6379
e. Redis的哨兵配置?高可用
在中从配置基础上,推选机制
f. Redis中的持久化策略?内存断电会丢失数据、数据持久化
RDB默认定期持久化、效率高、可能丢失数据:内存数据的快照,允许数据丢失情况 推荐
AOF 手动开启、每秒持久化效率低:记录用户的全部执行过程、文件越来越大效率低、尽可能不丢失数据
g. Redis中的内存策略?永久可写的问题
LRU算法:设置超时时间,使用较少的数据进行删除。
h. Redis集群搭建?解决综上问题
整合分片和哨兵机制
redis集群中每个节点多可以与其他节点进行通讯.同时集群内部有心跳检测.如果节点发生宕机的现象.由所在集群的全部服务器负责推选.保证服务的正常运行.
使用ruby工具管理redis集群.
在redis根目录执行
./src/redis-trib.rb create --replicas 2 192.168.126.166:7000 192.168.126.166:7001 192.168.126.166:7002 192.168.126.166:7003 192.168.126.166:7004 192.168.126.166:7005 192.168.126.166:7006 192.168.126.166:7007 192.168.126.166:7008
Redis集群:简单记,三主(主节点)六从(节点),
集群中如果主机宕机,那么从机可以继续提供服务,当主机中没有从机时,则向其他主机借用多余的从机.继续提供服务.如果主机宕机时没有从机可用,则集群崩溃.
i. 关于缓存你了解多少?
缓存穿透:访问不存在的数据 拦截
缓存击穿:缓存Key失效时高并发访问该key
缓存雪崩:大量的缓存击穿
脑裂:推选机制推选出多台主机 :解决技术台+多量/强制杀死一台,再复活,成为小弟
j. Spring整合Redis?
属性文件properties:
配置文件xml:bean对象
注入配置文件
注入配置前缀
注入redis配置文件
8. 伪静态介绍?
以html静态页面展现形式的动态页面技术
开通双向通道:
springmvc-web
.html
springmvc-web
/service/
.html 该操作拦截所有以.html结尾的请求
/service/ 该配置拦截所有以/Service开头的请求
9. js跨域问题/js同源策略
安全策略
如果请求的协议://域名:端口都相同则是同源访问,可以访问数据。除此之外都是禁止直接通信。
跨域实现:
使用Jsonp实现 JSONP是json的一种是用模式,解决主流浏览器跨域数据访问的问题
利用script标签的src属性可以实现跨域。关键字callback
实现步骤:
页面$.ajax{dataType:”jsonp”}设置返回类型是jsonp
Controller端 使用 MappingJacksonValue API
10. SSO单点登录的实现? JS跨域访问技术+Cookie+httpClient+Redis+md5加密
是什么?
Single Sign On 一次登录可以访问所有的的应用系统
解决什么问题?
传统的方式url重写、IP_hash是将登录信息保存到一台服务器上,无法实现信息共享。
具体实现:
1) Web服务器拿到用户名+发起密码httpClient请求到SSO
2) SSO 先DigestUtils.md5Hex(密码),根据用户名+MD5密码查询数据库。合法用户。
3) SSO 根据用户名(加点东西)md5加密运算生成token+合法用户对象转化成userJSON串
4) SSO Jedis.set(token,3600247,userJSON),并将token返回到web服务器
5) Web服务器把token存到Cookie中cookie(“ticket”,token),并反馈给用户登录成功。
6) 当用户点击到别的系统,AJAX从cookie拿着token发起请求到SSO
7)SSO查询redis比对该token是否存在,反馈用户已登陆
8)用户登出操作:只需要把redis和cookie中的token杀死即可cookie.setMaxAge(0) jedis.del(token)
cookie+Redis实现用户名密码共享
11. httpClient的实现?
是什么?
支持http协议,支持用java发起http请求协议的工具包。
干什么的
请求的二次处理根据请求在应用内再发起一次请求返回数据
在哪里用到了?
一般处理数据访问不会在多个项目存在同样的处理。都要用httpClient发起二次请求,统一交给一个项目处理。比如,前端系统在购物车、订单的查询入库操作都要可交给对应的cart系统或者order系统。
具体实现
1)属性文件:
2)Xml配置bean
3)Common工具包内注入bean对象,定义有关psot、get请求的方法及其重载方法
@Autowired(required=false)
private CloseableHttpClient httpClient;//在xml中配置注入的属性
@Autowired(required=false)
private RequestConfig requestConfig; //在xml中配置注入的属性
public String doPost/Get(String url,Map<String,String> params,
String charset)
设置字符集
获取请求实体
参数处理
发起请求获取结果
判断结果
返回
4)业务端发起请求得到数据转化成对象ObjectMapper
12. 权限控制实现?MVC拦截器+ThreadLocal
规定:如果用户没有登陆.则不能直接访问购物车列表数据/订单数据/物流数据等.跳转登录
实现:使用SpringMVC提供的拦截器+ThreadLocal可以实现在一个线程内实现数据共享
首先判断用户是否登录
判读用户是否有cookie
根据token数据检测redis缓存中是有用户信息
如果用户没有登陆则转化到用户登陆页面.如果用户已经登陆则拦截器放行
配置拦截器:
ThreadLocal介绍:
说明:使用ThreadLocal可以实现在一个线程内实现数据共享.它是JDK元素提供的API.并且内部实现时线程是安全的.
说明:一般使用ThreadLocal传递数据都是公用的数据.ThreadLocal底层实现时.利用JVM底层直接创建的线程.所以gc(垃圾回收器)不能回收该线程.所以一般使用完之后需要手动关闭.否则必然内存泄漏.
Dubbo项目知识点
- Dubbo微服务有哪些好处?谈谈你对Dubbo的理解?Dubbo是什么?
是什么?
Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架(SOA),应用通过RPC实现服务通信,可以和Spring框架无缝集成。
干了啥?
分布式解决单体架构笨重的问题:功能模块耦合问题
维护麻烦:bug定位到底是哪个模块出了问题
扩展僵硬:整体扩展VS单个模块扩展
上线笨拙:一起上线VS单个模块上线
最重要的两件事情:服务动态发现、序列化,反序列化。
Dubbo的缺点:
a、性能,分布式系统是跨进程,跨网络的,性能很受网络延迟和带宽的影响。
b、可靠性:由于高度依赖网络状况,任何一次远程调用都可能失败。
c、运维成本:一个系统拆成了多个服务,每个服务都得配置,部署,监控,日志处理 - RPC是什么?谈谈你对RPC的理解?
RPC在分布式的项目中实现系统内部的通信,是一种跨进程调用。客户机(请求程序)+服务器模式(服务程序)对比HttpClient?
从ControllerService转变为ControllerInterfaceService的模式 - Zookeeper是什么?谈谈你对Zookpeer的理解?Zookpeer和eurake有什么不同?
ZooKeeper是一个分布式应用程序协调服务,为分布式的程序应用提供一致性服务:配置维护、域名
说明:当zk如果宕机后,消费者能否正确消息???
答案:可以
因为zk会动态的向客户端更新服务列表信息.当zk宕机后,由于之前已经同步了zk的服务列表信息,所以客户端可以按照自己已经缓存的清单进行访问.如果在这个期间服务端程序发现宕机现象,那么则访问故障机时由于不能通信,则等待超时时间,则访问下一台服务器. 如果这时,所有的服务端程序都宕机,则整个服务陷入瘫痪.
CAP定理
注册中心业务,CP好呢?还是AP好呢?
注册中心特点,注册到注册中心信息不回频繁发生变化?不频繁
分布式系统设计定理,P分区容错性必须实现,实现方式AP侧重可用性,CP侧重一致性
Zookeeper支持集群,主从结构(leader,follows)zk节点如果有半数节点宕机,此时zk集群不让用。Zk如果在选举过程中,也不能使用。
Eureka也支持集群,点对点,每两个点互为主从。哪怕剩下最后一个节点,仍然能继续访问。最后这个节点宕机,照样用。Server和client,client本地有缓存!Eureka宁可错误,也要试试。
- SOA面向服务的架构(Service-oriented architecture)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。
消息队列RabbitMQ - 什么是RabbitMQ?谈谈你对RabbitMQ的理解?使用Rabbit有什么好处?
是什么?
本身是应用程序之间的一种通信方法,一头不断读取数据,一头不断提供数据,经常配合RPC一起使用。Erlang语言编写
干什么?
缓解后台服务器的压力,解决通信流量暴增的问题: 削锋填谷
应用场景?
商品秒杀业务
解决方式?
异步处理 - Rabbit工作的几种模式?
a. 简单模式:一吞一吐
问题:消费处理者太少,容易拥堵
b. 工作模式:一吞多吐
c. 发布订阅模式:如果生产者发送消息,那么订阅的全部消费者都会执行消息. 一个消息被多个订阅者处理
工作模式:每个消费者得到消息是不一样的。
订阅模式:每个消费者得到的消息是一样的,
d. 路由模式:路由模式是发布订阅模式的升级,通过定义不同的路由key使得程序将消息发送到不同的队列中.
订阅模式:每个消费者收到的消息都一样
路由模式:每个消费者收到的消息不一样
e. 主题模式:可以通过路由key将消息发送到一类相同的key中 使用通配符实现
#号:表示任意字符(任意个.)
*号:任意单个字符或者词组(单个.)
全文检索
3. 谈一谈你对全文检索概念的理解?全文检索是什么?使用全文检索有什么好处?
是什么?
全文检索是一种信息检索技术,把非结构化的数据转化为结构化的数据,形成目录提供搜索的技术。
干什么?那些产品?
数据库快速定位。
我用过的Lucene、solr两个核心技术点:
分词:IK分词器,对字、词进行深加工 key值+value
索引:把K-V整理生成目录
a. Lucene和solr对比?
Lucnen缺点:查询效率低、不能同步、生成索引慢
b. solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果. 基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
特点:性能快、同步
Docker
4. 什么是Docker?谈谈你对Docker的理解?
是什么?
开源的应用容器引擎
干什么?
相同大量应用部署快速秒级实现
5. Docker五大要素
-
沙箱:隔离,将应用之间的必要资源隔离开,防止互相影响,应用之间互相独立。
-
镜像:模板,centos+tomcat+mysql+redis,镜像可以拆分,传输用dockerfile
-
容器:镜像的实例,镜像只读,容器可写,容器中可以保存应用产生的零时文件
-
数据卷:挂载到容器上,用于保存必要数据。比如容器中数据库的数据,但是不建议用,因为重启容器需要挂载同步数据,效率较慢,解决方式:数据库拆分
-
仓库:与maven仓库概念一致,应用都会保存在仓库中,创建容器是根据镜像的规定进行拉取,可以共享。
SpringCloud+SpringBoot -
谈谈你对SpringBoot的理解?
是什么?
全新框架简化新Spring应用的初始搭建以及开发过程。帮我们整合了三大框架SSM 注解+约定大于配置
自带parent父工程,统一管理jar
嵌入式tomcat
简化Maven配置,新的yml(树型结构)配置文件
Main函数启动 -
SpringCloud全家桶
微服务有两个解决方案:
Servlet茅草房,SSM三大框架 一间房,dubbo一套高级套房三室两厅,springcloud别墅
Dubbo阿里,3.0支持stream。将来我只是springcloud一个子集,只专注于RPC解决方案
1) Dubbo 基于RPC,hession序列化算法,压缩,二进制,长链接
2) springCloud 基于REST+json,httpclient
性能:dubbo远远超过springCloud
异构开发语言支持:springcloud使用json -
SpringCloud全家桶
a) Eureka注册中心
CAP定理:构建分布式系统,必须实现P,有两种选择CP,AP
C一致性,mysql、oracle、sqlserver DRMS。数据要有唯一出处。外键。
A可用性,哪怕信息已经旧的。
P 分区容错性。
Eureka适合注册中心,还是ZooKeeper?
针对注册中心特点,注册信息会频繁发生变化,不会。
Eureka设计目标AP,ZooKeeper设计目标CP。这时针对注册中心业务,Eureka更加合适。
b) Ribbon前端负载均衡器
Ribbon和Nginx比较?
Nginx反向代理,Ribbon可以在访问消费者本地增加缓存,客户端发起请求前,它的路径已经决定。
Nginx没有故障处理,也就是说,它代理某个服务宕机,或者无法访问。它不能告诉程序,程序调用才出错,等一会(超时时间),抛出异常。Ribbon依赖Eureka动态列表。Eureka客户端有向服务端定时发心跳,如果客户端阀值(几次机会)之后,宣布服务死亡,Eureka会把其服务从列表中移除。Eureka客户端它的心跳处理时,顺便判断列表有无更新。如果判断有更新,从新获取一个新的数据。
c) Feign声明式 RESTFul形式支持,RestTemplate,接口更加方便。Jdk动态代理($ProxyN) cglib动态代理(CGLIB)。
以接口形式体现,接口和业务挂钩,业务程序员必须自己做。做接口同时对业务更加了解。屏蔽复杂API学习成本。 -
SpringCloud
a) Hystrix断路器、熔断器,写一个fallback方法,当程序失败时,不像传统程序,try/catch。提示极其不友好(失败)。它实现程序异常时,回调这个开发者自己写的方法。方法内返回默认值(预案)。防止分布式微服务结构出现雪崩。
b) 微服务雪崩:很多服务组成一起完成一个业务,其中可能某一个服务出现异常,依赖它的这些服务都被阻塞。服务池溢出,所有服务都无法正常完成,就发生雪崩。Hystrix很好来解决雪崩问题。发现异常,快速尝试如果失败立即返回去调用fallback方法。给默认值返回用户。这些调用微服务,调用完成。清理现场,释放资源。
c) Zuul API网关,授权、缓存、统一入口管理。配置映射。在application.yml Zuul路由,设置一个路径,路径作用就是分成不同模块。配置不同权限。
d) NodeJS 基于chrome v8,号称目前为止解析js最快引擎。成为一个js解析引擎。类似tomcat。
e) Sidecar本质,类似nginx配置一个连接而已。屏蔽技术壁垒。Web开发,url HTTP -
Git版本控制
-
STS eclipse-spring,创建一个真正springboot项目
-
springCloud-config配置中心:动态读取配置信息
问题: 字符串排序/比大小
SSO:Token攻击如何解决:ip校验
数据库查询内外关联查询的区别、筛选条件语句