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
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
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
For(j=a.length-1;j>I;j–){
If(a[j] 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代码.
谈谈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框架技术
SpringMVC
①拦截器是基于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 件事情。
方式一
一条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拦截器?
京淘项目技术点(大型高并发项目技术点)
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 charset)
设置字符集
获取请求实体
参数处理
发起请求获取结果
判断结果
返回
4)业务端发起请求得到数据转化成对象ObjectMapper
12. 权限控制实现?MVC拦截器+ThreadLocal
规定:如果用户没有登陆.则不能直接访问购物车列表数据/订单数据/物流数据等.跳转登录
实现:使用SpringMVC提供的拦截器+ThreadLocal可以实现在一个线程内实现数据共享
首先判断用户是否登录
判读用户是否有cookie
根据token数据检测redis缓存中是有用户信息
如果用户没有登陆则转化到用户登陆页面.如果用户已经登陆则拦截器放行
配置拦截器:
ThreadLocal介绍:
说明:使用ThreadLocal可以实现在一个线程内实现数据共享.它是JDK元素提供的API.并且内部实现时线程是安全的.
说明:一般使用ThreadLocal传递数据都是公用的数据.ThreadLocal底层实现时.利用JVM底层直接创建的线程.所以gc(垃圾回收器)不能回收该线程.所以一般使用完之后需要手动关闭.否则必然内存泄漏.
Dubbo项目知识点
注册中心业务,CP好呢?还是AP好呢?
注册中心特点,注册到注册中心信息不回频繁发生变化?不频繁
分布式系统设计定理,P分区容错性必须实现,实现方式AP侧重可用性,CP侧重一致性
Zookeeper支持集群,主从结构(leader,follows)zk节点如果有半数节点宕机,此时zk集群不让用。Zk如果在选举过程中,也不能使用。
Eureka也支持集群,点对点,每两个点互为主从。哪怕剩下最后一个节点,仍然能继续访问。最后这个节点宕机,照样用。Server和client,client本地有缓存!Eureka宁可错误,也要试试。
订阅模式:每个消费者得到的消息是一样的,
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校验
数据库查询内外关联查询的区别、筛选条件语句