写点什么

面试:第六章:面试题收集

  • 2021 年 11 月 12 日
  • 本文字数:10911 字

    阅读完需:约 36 分钟

1)throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。


2)throw 是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行 throw 一定是抛出了某种异常。


throws:


1)throws 语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。


2)throws 主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。


3)throws 表示出现异常的一种可能性,并不一定会发生这种异常。


final、finally、finalize 的区别?


1)final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。


2)finally:异常处理语句结构的一部分,表示总是执行。


3)finalize:Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法


提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法


被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对


象“死亡”,这是一个被动的方法(其实就是回调方法),不需要我们调用。


String 、StringBuilder 、StringBuffer 的区别?


Java 平台提供了两种类型的字符串:String 和 StringBuffer/StringBuilder,它们都可以储存和操作字符串,区别


如下。


1)String 是只读字符串,也就意味着 String 引用的字符串内容是不能被改变的。初学者可能会有这样的误解: 如上,字符串 str 明明是可以改变的呀!其实不然,str 仅仅是一个引用对象,它指向一个字符串对象“abc”。第


二行代码的含义是让 str 重新指向了一个新的字符串“bcd”对象,而“abc”对象并没有任何改变,只不过该对象已


经成为一个不可及对象罢了。


2)StringBuffer/StringBuilder 表示的字符串对象可以直接进行修改。


3)StringBuilder 是 Java5 中引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,


因为它的所有方法都没有被 synchronized 修饰,因此它的效率理论上也比 StringBuffer 要高。


Java 中有几种类型的流


按照流的方向:输入流(inputStream)和输出流(outputStream)。


按照实现功能分:节点流(可以从或向一个特定的地方(节点)读写数据。如 FileReader)和处理流(是对一个


已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如 BufferedReader。处理流的构造方法总是要


带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。)


按照处理数据的单位:字节流和字符流。字节流继承于 InputStream 和 OutputStream,字符流继承于


InputStreamReader 和 OutputStreamWriter。


字节流和字符流的区别


字节流可以处理所有类型数


据,如:图片,MP3,AVI 视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符


流,除此之外都用字节流。字节流主要是操作 byte 类型数据,以 byte 数组为准,主要操作类就是 OutputStream、


InputStream


什么是 java 序列化,如何实现 java 序列化?实现 Serializable 接口


序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读


写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。


java 集合类:集合类型主要有 3 种:set(集)、list(列表)和 map(映射)。


List 总结,所有的 List 中只能容纳单个不同类型的对象组成的表,可以有相同的元素,基于 Array 的 List(Vector,ArrayList)适合查询,而 LinkedList(链表)适合添加,删除操作。


Set 总结,Set 实现的基础是 Map(HashMap);Set 中的元素是不能重复的,


多线程基础:


1 继承 Thread 类创建线程,写 run 方法,然后 new Thread,.start();


2 实现 Runnable 接口创建线程,重写 run 方法,new Thread,.start();


3 通过 Callable 和 FutureTask 创建线程


4 通过线程池创建线程


同步的实现方面有两种,分别是 synchronized,wait 与 notify


wait():使一个线程处于等待状态,并且释放所持有的对象的 lock


sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法


notify():唤醒一个处于等待状态的线程


最大的不同是在等待时 wait 会释放锁,而 sleep 一直持有锁。wait 通常被用于线程间交互,sleep 通常被用于暂


停执行。


线程池就是事先将多个线程对象放到一个容器中,当使用的时候就不用 new 线程而是直接去池中拿线程即可,节


省了开辟子线程的时间,提高的代码执行效率。


在有些情况下死锁是可以避免的。两种用于避免死锁的技术: 加锁顺序/加锁时限


进程就是一段程序的执行过程,线程时进程的一个执行单位。


启动一个线程是调用 start()方法


说说你对 Java 中反射的理解


反射机制指的是程序在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。


动态代理(以下称代理),利用 Java 的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对象)


代理的是接口(Interfaces),不是类(Class),更不是抽象类。


反射的官方定义是这样的:在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为 java 的反射机制。


设计模式有哪些 :工厂模式/单例模式


单例模式分为懒汉式和饿汉式


饿汉式直接创建对象,私有化构造器。懒汉式声明变量,私有化构造器,提供对外方法。


工厂模式,建立一个工厂类,对实现了同一接口的一些类进行实例的创建。


栈 stack:由系统自动分配,堆 heap:需要程序员自己申请。


通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用 JVM 中的栈空


间;而通过 new 关键字和构造器创建的对象则放在堆空间


是基本类型(primitive types), 共有 8 种,即 int, short, long, byte, float, double, boolean, char


原生 jdbc 操作数据库流程?


第一步:Class.forName()加载数据库连接驱动;


第二步:DriverManager.getConnection()获取数据连接对象;


第三步:根据 SQL 获取 sql 会话对象


第四步:执行 SQL 处理结果集,执行 SQL 前如果有参数值就设置参数值 setXXX();


第五步:关闭结果集、关闭会话、关闭连接。


Http 协议 (超文本传输协议)


HTTP 是一个客户端和服务器端请求和应答的标准(TCP)。


由 HTTP 客户端发起一个请求,建立一个到服务器指定端口(默认是 80 端口)的 TCP 连接。HTTP 服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。


同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;


异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。 区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。


http 常见的状态码


200 OK????? //客户端请求成功


302 found 重定向


400 Bad Request? //客户端请求有语法错误,不能被服务器所理解


401 Unauthorized //请求未经授权


403 Forbidden? //服务器收到请求,但是拒绝提供服务


404 Not Found? //请求资源不存在,eg:输入了错误的 URL


500 Internal Server Error //服务器发生不可预期的错误


503 Server Unavailable? //服务器当前不能处理客户端的请求,一段时间后可能恢复正常


GET 和 POST 的区别?


1. GET 请求的数据会附在 URL 之后(就是把数据放置在 H


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


TTP 协议头中),以?分割 URL 和传输数据,参数之间


以 &相连,如:login.action?name=zhagnsan&password=123456。POST 把提交的数据则放置在是 HTTP 包的包


体中。


2. GET 方式提交的数据最多只能是 1024 字节,理论上 POST 没有限制,可传较大量的数据。


3.POST 的安全性要比 GET 的安全性高。


http 中重定向和请求转发的区别?


本质区别:转发是服务器行为,重定向是客户端行为。


重定向两次请求


Cookie 和 Session 的区别


Cookie 是 web 服务器发送给浏览器的一块信息,浏览器会在本地一个文件中给每个 web 服务器存储 cookie。


Session 是存储在 web 服务器端的一块信息。


1、无论客户端做怎样的设置,session 都能够正常工作。当客户端禁用 cookie 时将无法使用 cookie。


2、在存储的数据量方面:session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象。


分布式如何实现 session 共享


在单点登录中,如果 cookie 被禁用了怎么办?


单点登录的原理是后端生成一个 session ID,然后设置到 cookie,后面的所有请求浏览器都会带上 cookie,


然后服务端从 cookie 里获取 session ID,再查询到用户信息。所以,保持登录的关键不是 cookie,而是通过


cookie 保存和传输的 session ID,其本质是能获取用户信息的数据。除了 cookie,还通常使用 HTTP 请求头来传


输。但是这个请求头浏览器不会像 cookie 一样自动携带,需要手工处理。


什么是 jsp,什么是 Servlet?jsp 和 Servlet 有什么区别?


jsp 本质上就是一个 Servlet,它是 Servlet 的一种特殊形式(由 SUN 公司推出),每个 jsp 页面都是一个 servlet


实例。


Servlet 是由 Java 提供用于开发 web 服务器应用程序的一个组件,运行在服务端,由 servlet 容器管理,用来生


成动态内容。一个 servlet 实例是实现了特殊接口 Servlet 的 Java 类,所有自定义的 servlet 均必须实现 Servlet 接


口。


区别:


jsp 是 html 页面中内嵌的 Java 代码,侧重页面显示; ?


Servlet 是 html 代码和 Java 代码分离,侧重逻辑控制


jsp 有哪些域对象和内置对象及他们的作用?


内置对象:page/exception/application/pagecontext/session/config/request/response


四大域对象:


(1)pageContext? page 域-指当前页面,在当前 jsp 页面有效,跳到其它页面失效


(2)request request 域-指一次请求范围内有效,从 http 请求到服务器处理结束,返回响应的整个过程。


在这个过程中使用 forward(请求转发)方式跳转多个 jsp,在这些页面里你都可以使用这个变量


(3)session session 域-指当前会话有效范围,浏览器从打开到关闭过程中,转发、重定向均可以使用


(4)application context 域-指只能在同一个 web 中使用,服务器未关闭或者重启,数据就有效


什么是 xml,使用 xml 的优缺点,xml 的解析器有哪几种,分别有什么区别?


xml 是一种可扩展性标记语言,支持自定义标签


优点:用于配置文件,格式统一,符合标准


缺点:xml 文件格式复杂,数据传输占流量


Xml 常用解析器有 2 种,分别是:DOM 和 SAX;


Ajax 是一种创建交互式网页应用的的网页开发技术;Asynchronous JavaScript and XML”的缩写。


Ajax 的优势:


通过异步模式,提升了用户体验。


优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用。


Ajax 引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。


Ajax 的最大特点:


可以实现局部刷新,在不更新整个页面的前提下维护数据,提升用户体验度。


jsonp 原理


JavaScript 是一种在 Web 开发中经常使用的前端动态脚本技术。在 JavaScript 中,有一个很重要的安全性限制,


被称为“Same-Origin Policy”(同源策略)。这一策略对于 JavaScript 代码能够访问的页面内容做了很重要的


限制,即 JavaScript 只能访问与包含它的文档在同一域下的内容。


jsonp 的最基本的原理是:动态添加一个<script>标签,使用 script 标签的 src 属性没有跨域的限制的特点实现跨域。首先在客户端注册一个 callback, 然后把 callback 的名字传给服务器。此时,服务器先生成 json 数


据。 然后以 javascript 语法的方式,生成一个 function , function 名字就是传递上来的参数 jsonp。最后将


json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。


客户端浏览器,解析 script 标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义


好的 callback 函数里。


常用的 Linux 命令


列出文件列表:ls 【参数 -a -l】


创建目录和移除目录:mkdir? rmdir


用于显示文件后几行内容:tail


打包:tar -xvf


打包并压缩:tar -zcvf


查找字符串:grep


显示当前所在目录:pwd


创建空文件:touch


编辑器:vim? vi


列出文件列表:ls 【参数 -a -l】


创建目录和移除目录:mkdir? rmdir


用于显示文件后几行内容:tail


打包:tar -xvf


打包并压缩:tar -zcvf


查找字符串:grep


显示当前所在目录:pwd


创建空文件:touch


编辑器:vim? vi


Mybatis 框架中的 mapper 方式中的 # 也能很大程度的防止 sql 注入($无法防止 sql 注


入)。


Mysql 性能优化


1、当只要一行数据时使用 limit 1


3. 用 not exists 代替 not in


4. 对操作符的优化,尽量不采用不利于索引的操作符


如:in??? not in??? is null??? is not null??? <>? 等


在千万级的数据库查询中,如何提高效率?


使用 explain sql 来分析 sql 语句


1)数据库设计方面


a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 ?


b. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描


c. 并不是所有索引对查询都有效,SQL 是根据表中数据来进行查询优化的,当索引列有大量数据重复时,查询


可能不会去利用索引


d. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的


效率


e. 应尽可能的避免更新索引数据列


f. 尽量使用数字型字段


Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa 等等。但他们的基础都是 Spring 的 ioc 和 aop,ioc 提供了依赖注入的容器, aop 解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能。


Spring MVC 提供了一种轻度耦合的方式来开发 web 应用。它是 Spring 的一个模块,是一个 web 框架。


Spring Boot 实现了自动配置,降低了项目搭建的复杂度。它主要是为了解决使用 Spring 框架需要进行大量的配置太麻烦的问题,所以它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。


Spring 是一个“引擎”;


Spring MVC 是基于 Spring 的一个 MVC 框架;


Spring Boot 是基于 Spring4 的条件注册的一套快速开发整合包。


SpringMVC 的工作原理


a. 用户向服务器发送请求,请求被 springMVC 前端控制器 DispatchServlet 捕获; ?


b. DispatcherServle 对请求 URL 进行解析,得到请求资源标识符(URL),然后根据该 URL 调用 HandlerMapping


将请求映射到处理器 HandlerExcutionChain;


c. DispatchServlet 根据获得 Handler 选择一个合适的 HandlerAdapter 适配器处理;


d. Handler 对数据处理完成以后将返回一个 ModelAndView()对象给 DisPatchServlet;


e. Handler 返回的 ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet 通过


ViewResolver 试图解析器将逻辑视图转化为真正的视图 View;


h. DispatcherServle 通过 model 解析出 ModelAndView()中的参数进行解析最终展现出完整的 view 并返回给


客户端;


开启注解处理器和适配器


springmvc.xml 中通过开启 mvc:annotation-driven来实现注解处 ?


理器和适配器的开启。


如何解决 get 和 post 乱码问题?


解决 post 请求乱码:我们可以在 web.xml 里边配置一个 CharacterEncodingFilter 过滤器。 设置为 utf-8. ?


解决 get 请求的乱码:有两种方法。对于 get 请求中文参数出现乱码解决方法有两个: ?


1. 修改 tomcat 配置文件添加编码与工程编码一致。 ?


2. 另 外 一 种 方 法 对 参 数 进 行 重 新 编 码 String userName = New


String(Request.getParameter(“userName”).getBytes(“ISO8859-1”), “utf-8”);


谈谈你对 Spring 的理解


Spring 是一个开源框架,为简化企业级应用开发而生。Spring 是一个 IOC 和 AOP 容器框架。


在 Spring 容器中为一个 bean 配置依赖注入有三种方式:


· 使用属性的 setter 方法注入? 这是最常用的方式;


· 使用构造器注入;


· 使用 Filed 注入(用于注解方式).


Spring 容器的主要核心是:


控制反转(IOC)


依赖注入(DI)面向切面编程(AOP),在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程


中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等


公用操作处理的过程就是面向切面编程的思想。AOP 底层是动态代理


Spring 中的设计模式


1 单例模式 2 模板方式模式 3 前端控制器模式 4 试图帮助 5 依赖注入 6 工厂模式


简单介绍一下 Spring bean 的生命周期


1bean 定义 2bean 初始化 3bean 调用 4bean 销毁


spring 结构


(1)核心容器:包括 Core、Beans、Context、EL 模块。


(2)AOP、Aspects 模块:


Spring 能帮我们做什么?


Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系


Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制


Spring 能非常简单的帮我们管理数据库事务


Spring 还能与第三方数据库访问框架(如 Hibernate、JPA)无缝集成


Spring 还能与第三方 Web(如 Struts、JSF)框架无缝集成


Spring 配置文件有什么作用?


Spring 配置文件是个 XML 文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。


什么是 Spring IOC 容器


IOC 控制反转:Spring IOC 负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这


些对象的整个生命周期。


IOC 的优点是什么?


IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试


什么是 Spring 的依赖注入?


,spring 提出了依赖注入的思想,即依赖类不由程序员实例化,而


是通过 spring 容器帮我们 new 指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反


转”


Mybatis 中 #和 $的区别?


#相当于对数据 加上 双引号,$相当于直接显示数据


#方式能够很大程度防止 sql 注入。


.$方式无法防止 Sql 注入


$方式一般用于传入数据库对象


一般能用 #的就别用 $.


Mybatis 的编程步骤是什么样的?


1、创建 SqlSessionFactory


2、通过 SqlSessionFactory 创建 SqlSession


3、通过 sqlsession 执行数据库操作


4、调用 session.commit()提交事务


5、调用 session.close()关闭会话


使用 MyBatis 的 mapper 接口调用时有哪些要求?


1. Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的 id 相同


2. Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同


3. Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同


4. Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径。


MyBatis 的动态 SQL 是基于 OGNL 表达式的,它可以帮助我们方便的在 SQL 语句中实现某些逻辑。


MyBatis 中用于实现动态 SQL 的元素标签主要有:


if


where


set


choose(when,otherwise)


trim


foreach


Redis 的特点?


内存高速缓存数据库


该软件使用 C 语言编写,典型的 NoSQL 数据库服务器,Redis 是一


个 key-value 存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。


Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 redis 具有快速和


数据持久化的特征。


Redis 常见的性能问题都有哪些?


(1)、Master 写内存快照,save 命令调度 rdbSave 函数,会阻塞主线程的工作,当快照比较大时对性能影响是


非常大的,会间断性暂停服务,所以 Master 最好不要写内存快照。


(2)、Master AOF 持久化,如果不重写 AOF 文件,这个持久化方式对性能的影响是最小的,但是 AOF 文件会


不断增大,AOF 文件过大会影响 Master 重启的恢复速度。Master 最好不要做任何持久化工作,包括内存快照和 AOF


日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个 Slave 开启 AOF 备份数据,策略为每秒同步一


次。


(3)、Master 调用 BGREWRITEAOF 重写 AOF 文件,AOF 在重写的时候会占大量的 CPU 和内存资源,导致服


务 load 过高,出现短暂服务暂停现象。


(4)、Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave 和 Master 最好在同一个局域


网内


Redis 最适合的场景有哪些?


(1)、会话缓存(Session Cache)


(2)、全页缓存(FPC)


(3)、队列


(4)、排行榜/计数器


(5)、发布/订阅


Redis 的数据结构有五种


String——字符串


String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字(当数字类型用 Long 可


以表示的时候 encoding 就是整型,其他都存储在 sdshdr 当做字符串)。


Hash——字典


在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值


(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。


List——列表


List 说白了就是链表(redis 使用双端链表实现的 List),相信学过数据结构知识的人都应该能理解其结构。


Set——集合


Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Set 数据结构,可以存储一些集


合性的数据。


Sorted Set——有序集合


和 Sets 相比,Sorted Sets 是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进


行有序排列


Redis 的优缺点


a) 性能极高 – Redis 能支持超过 100K+ 每秒的读写频率。


b) 丰富的数据类型 – Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。


c) 原子 – Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作全并后的原子性执行。


Redis 的持久化


RDB 持久化:该机制可以在指定的时间间隔内生成数据集的时间点快照


AOF 持久化:记录服务器执行的所有写操作命令


消息队列 ActiveMQ 如何使用 ActiveMQ 解决分布式事务?


在互联网应用中,基本都会有用户注册的功能。在注册的同时,我们会做出如下操作:


1. 收集用户录入信息,保存到数据库


2. 向用户的手机或邮箱发送验证码


等等…


但是在分布式架构中,用户和发送验证码是两个独立的服务,它们都有各自的数据库,那么就不能通过本地事物


保证操作的原子性。这时我们就需要用到 ActiveMQ(消息队列)来为我们实现这个需求。


在用户进行注册操作的时候,我们为该操作创建一条消息,当用户信息保存成功时,把这条消息发送到消息队列。


验证码系统会监听消息,一旦接受到消息,就会给该用户发送验证码。


1.如何防止消息重复发送?


解决方法很简单:增加消息状态表。通俗来说就是一个账本,用来记录消息的处理状态,每次处理消息之前,都去


状态表中查询一次,如果已经有相同的消息存在,那么不处理,可以防止重复发送。


Dubbo


dubbo reference 注解问题


@Reference 只能在 springbean 实例对应的当前类中使用


dubbo 的启动流程


1 服务端开始启动,向注册中心(zookeeper)进行注册


2 消费者向注册中心订阅服务端自己所需要的服务


3 注册中心接收到会以(notify)通知方式通知消费者


4 消费者开始向服务端消费自己所需要的服务


5 同时,异步的向监控中心记录下有多少服务端在启动,多少消费者在消费。


Dubbo 的客户端和服务端有三种连接方式,分别是:广播,直连和使用 zookeeper 注册中心


Dubbo 注册中心和广播注册中心配置类似,不过需要指定注册中心类型和注册中心地址,这个时候就不是把服务


信息进行广播了,而是告诉给注册中心进行管理,这个时候我们就需要有一个注册中心。


官方推荐使用 zookeeper 作为注册中心。


调用关系说明:


1)服务容器负责启动,加载,运行服务提供者。


2)服务提供者在启动时,向注册中心注册自己提供的服务。


3)服务消费者在启动时,向注册中心订阅自己所需的服务。


4)注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。


5)服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台


调用。


6)服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。


Nginx 反向代理为什么能够提升服务器性能?


对于后端是动态服务来说,Nginx 有个好处是它会把 Request 在读取完整之前 buffer 住,这样交给后端的就是一个完整的 HTTP ?


请求,从而提高后端的效率,而不是断断续续的传递(互联网上连接速度一般比较慢)。 同样,Nginx 也可以把


response 给 buffer 住,同样也是减轻后端的压力。


负载均衡策略


1、轮询:这种是默认的策略,把每个请求按顺序逐一分配到不同的 server,如果 server 挂掉,能自动剔除。


2、最少连接:把请求分配到连接数最少的 server


3、权重:使用 weight 来指定 server 访问比率


4、ip_hash:每个请求会按照访问 ip 的 hash 值分配,这样同一客户端连续的 Web 请求都会被分发到同一 server 进行处理,可以解决 session 的问题。


Zookeeper


简单介绍一下 zookeeper 以及 zookeeper 的原理


ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务


ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、 功能稳定的系统提供给用户


znode 节点每个代表一个属性,包含当前版本,数据版本,建立时间和修改时间等


Activity 工作流


工作流是将一组任务组织起来以完成某个经营过程:定义了任务的触


发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人


与软件系统协作完。


tomcat 集群


单一服务器终究无法满足需要处理的负荷量


修改 tomcat1, tomcat2 的 server.xml 文件添加集群内容


在 web 开发中,如果对象被保存在了 Session 中,tomcat 在重启时要把 Session 对 象序列化到硬盘,这个对象就必须实现 Serializable 接口。如果对象要经过分布式系统进行 网络传输或通过 rmi 等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现 Serializable 接口。


Java 中的 String,StringBuilder,StringBuffer 三者的区别


速度快慢为:StringBuilder > StringBuffer > String


String 最慢的原因:String 为字符串常量,而 StringBuilder 和 StringBuffer 均为字符串变量,即 String 对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。


在线程安全上,StringBuilder 是线程不安全的,而 StringBuffer 是线程安全的(StringBuffer 中很多方法可以带有 synchronized 关键字)


String:适用于少量的字符串操作的情况


StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况


StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况


elasticSearch


倒排索引是搜索引擎的基石,也是 Elasticsearch 能实现快速全文搜索的根本。归纳起来,主要是对一个文档内容做两步操作:分词、建立“单词-文档”列表


线程安全性概念


线程安全:就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。


相反地,


线程不安全:就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得的数据是脏数据。


Java 基础——6 种常用类讲解


一、System 类


二、Runtime 类


三、Date 类和 SimpleDateFormat


四、Calendar 类


五、Math 类


六、Random 类


Java 常用的八种排序算法与代码实现


1.直接插入排序 2.希尔排序 3.简单选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 8.基数排序


总结:


一、稳定性:


稳定:冒泡排序、插入排序、归并排序和基数排序


不稳定:选择排序、快速排序、希尔排序、堆排序

评论

发布
暂无评论
面试:第六章:面试题收集