16.知识面、Linux、网络

知识面、Linux、网络


1.解释什么是 MESI 协议(缓存一致性)
2.谈谈 reactor 模型
3.Java 9 带来了怎样的新功能
4.Java 与 C++ 对比,C++ 或 Java 中的异常处理机制的简单原理和应用
5.简单讲讲 Tomcat 结构,以及其类加载器流程
6.虚拟内存是什么
7.阐述下 SOLID 原则
8.请简要讲一下你对测试驱动开发(TDD)的认识
9.CDN实现原理
10.Maven 和 ANT 有什么区别
11.UML中有哪些经常使用的图
12.Linux 下 IO 模型有几种,各自的含义是什么。
13.Linux 系统下你关注过哪些内核参数,说说你知道的
14.Linux 下用一行命令查看文件的最后五行
15.平时用到哪些 Linux 命令
16.用一行命令输出正在运行的 Java 进程
17.使用什么命令来肯定是否有 Tomcat 实例运行在机器上
18.什么是 N+1 难题
19.什么是 paxos 算法
20.什么是 restful,讲讲你理解的 restful
21.什么是 zab 协议
22.什么是领域模型(domain model)?贫血模型(anaemic domain model) 和充血模型(rich domain model)有什么区别
23.什么是领域驱动开发(Domain Driven Development)
24.介绍一下了解的 Java 领域的 Web Service 框架
25.Web Server、Web Container 与 Application Server 的区别是什么
26.微服务(MicroServices)与巨石型应用(Monolithic Applications)之间的区别在哪里
27.描述 Cookie 和 Session 的做用,区别和各自的应用范围,Session工做原理
28.你经常使用的持续集成(Continuous Integration)、静态代码分析(Static Code Analysis)工具备哪些
29.简述下数据库正则化(Normalizations)
30.KISS,DRY,YAGNI 等原则是什么含义
31.分布式事务的原理,优缺点,如何使用分布式事务?
32.布式集群下如何作到惟一序列号
33.Http请求头都有哪些,分别是什么意思
34.http请求结构,分别是什么
35.HTTPS 的加密方式是什么,讲讲整个加密解密流程
36.HTTPS和HTTP的区别
37.HTTP链接池实现原理
38.HTTP集群方案
39.Nginx、lighttpd、Apache三大主流 Web服务器的区别
40.是否看过框架的一些代码
41.持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些
42.数值提高是什么
43.你能解释一下里氏替换原则吗
44.你是如何测试一个应用的?知道哪些测试框架
45.传输层常见编程协议有哪些?并说出各自的特色


1.解释什么是 MESI 协议(缓存一致性)    参考连接        参考连接

当CPU写数据时,若是发现操做的变量是共享变量,即在其余CPU中也存在该变量的副本,会发出信号通知其余CPU将该变量的缓存行置为无效状态,所以当其余CPU须要读取这个变量时,发现本身缓存中缓存该变量的缓存行是无效的,那么它就会从内存从新读取。
MESI协议中的状态
CPU中每一个缓存行(caceh line)使用4种状态进行标记(使用额外的两位(bit)表示):
M: 被修改(Modified)
该缓存行只被缓存在该CPU的缓存中,而且是被修改过的(dirty),即与主存中的数据不一致,该缓存行中的内存须要在将来的某个时间点(容许其它CPU读取请主存中相应内存以前)写回(write back)主存。当被写回主存以后,该缓存行的状态会变成独享(exclusive)状态。
E: 独享的(Exclusive)
该缓存行只被缓存在该CPU的缓存中,它是未被修改过的(clean),与主存中数据一致。该状态能够在任什么时候刻当有其它CPU读取该内存时变成共享状态(shared)。一样地,当CPU修改该缓存行中内容时,该状态能够变成Modified状态。
S: 共享的(Shared)
该状态意味着该缓存行可能被多个CPU缓存,而且各个缓存中的数据与主存数据一致(clean),当有一个CPU修改该缓存行中,其它CPU中该缓存行能够被做废(变成无效状态(Invalid))。
I: 无效的(Invalid)
该缓存是无效的(可能有其它CPU修改了该缓存行)。

html

2.谈谈 reactor 模型        参考连接        参考连接

  反应器设计模式(Reactor pattern)是一种为处理并发服务请求,并将请求提交到一个或者多个服务处理程序的事件设计模式。当客户端请求抵达后,服务处理程序使用多路分配策略,由一个非阻塞的线程来接收全部的请求,而后派发这些请求至相关的工做线程进行处理。 Reactor模式主要包含下面几部份内容。
          初始事件分发器(Initialization Dispatcher):用于管理Event Handler,定义注册、移除EventHandler等。它还做为Reactor模式的入口调用Synchronous Event Demultiplexer的select方法以阻塞等待事件返回,当阻塞等待返回时,根据事件发生的Handle将其分发给对应的Event Handler处理,即回调EventHandler中的handle_event()方法
          同步(多路)事件分离器(Synchronous Event Demultiplexer):无限循环等待新事件的到来,一旦发现有新的事件到来,就会通知初始事件分发器去调取特定的事件处理器。
          系统处理程序(Handles):操做系统中的句柄,是对资源在操做系统层面上的一种抽象,它能够是打开的文件、一个链接(Socket)、Timer等。因为Reactor模式通常使用在网络编程中,于是这里通常指Socket Handle,即一个网络链接(Connection,在Java NIO中的Channel)。这个Channel注册到Synchronous Event Demultiplexer中,以监听Handle中发生的事件,对ServerSocketChannnel能够是CONNECT事件,对SocketChannel能够是READ、WRITE、CLOSE事件等。
          事件处理器(Event Handler): 定义事件处理方法,以供Initialization Dispatcher回调使用。
          对于Reactor模式,能够将其看作由两部分组成,一部分是由Boss组成,另外一部分是由worker组成。Boss就像老板同样,主要是拉活儿、谈项目,一旦Boss接到活儿了,就下发给下面的work去处理。也能够看作是项目经理和程序员之间的关系。
一、概念
      reactor设计模式,是一种基于事件驱动的设计模式。Reactor框架是ACE各个框架中最基础的一个框架,其余框架都或多或少地用到了Reactor框架。
      在事件驱动的应用中,将一个或多个客户的服务请求分离(demultiplex)和调度(dispatch)给应用程序。在事件驱动的应用中,同步地、有序地处理同时接收的多个服务请求。
      reactor模式与外观模式有点像。不过,观察者模式与单个事件源关联,而反应器模式则与多个事件源关联 。当一个主体发生改变时,全部依属体都获得通知。
二、优势
       1)响应快,没必要为单个同步时间所阻塞,虽然Reactor自己依然是同步的;
       2)编程相对简单,能够最大程度的避免复杂的多线程及同步问题,而且避免了多线程/进程的切换开销;
       3)可扩展性,能够方便的经过增长Reactor实例个数来充分利用CPU资源;
       4)可复用性,reactor框架自己与具体事件处理逻辑无关,具备很高的复用性;
三、缺点
      1)相比传统的简单模型,Reactor增长了必定的复杂性,于是有必定的门槛,而且不易于调试。
      2)Reactor模式须要底层的Synchronous Event Demultiplexer支持,好比Java中的Selector支持,操做系统的select系统调用支持,若是要本身实现Synchronous Event Demultiplexer可能不会有那么高效。
      3) Reactor模式在IO读写数据时仍是在同一个线程中实现的,即便使用多个Reactor机制的状况下,那些共享一个Reactor的Channel若是出现一个长时间的数据读写,会影响这个Reactor中其余Channel的相应时间,好比在大文件传输时,IO操做就会影响其余Client的相应时间,于是对这种操做,使用传统的Thread-Per-Connection或许是一个更好的选择,或则此时使用Proactor模式。
java

3.Java 9 带来了怎样的新功能        参考连接            参考连接

1. Java 平台级模块系统
2. Linking:
    能够建立针对应用程序进行优化的最小运行时映像而不须要使用彻底加载 JDK 安装版本。
3. JShell :
    交互式 Java编程环境
4. 改进的 Javadoc
5. 集合工厂方法:
    如:Set<Integer> ints = Set.of(1, 2, 3);List<String> strings = List.of("first", "second");
6. 改进的 Stream API:
    Stream 接口中添加了 4 个新的方法:iterate,dropWhile,takeWhile,ofNullable。
    DropWhile丢弃Stream的第一个项目,直到知足条件。
    TakeWhile处理项目直到知足条件。
    Iterate容许使用Stream为for循环写入适当的替换。它须要Stream的初始值,定义什么时候中止迭代的条件和生成下一个元素的步骤函数。
    OfNullable做为名称建议让你从对象建立Stream,而不须要检查null。它返回一个包含单个元素的顺序Stream,若是非空,则返回一个空的Stream。
7. 私有接口方法
    私有接口方法将不会成为你API的一部分
8. HTTP/2
    Java 9将彻底支持HTTP 2.0,并为Java提供了一个新的HTTP客户端,它将替代仅适用于blocking模式的HttpURLConnection – 每对请求/响应有一个线程,这增长了延迟和加载时间的网页。HTTP客户端还提供API来处理HTTP和服务器推送等HTTP功能。
9. 多版本兼容 JAR
    当一个新版本的 Java 出现的时候,你的库用户要花费数年时间才会切换到这个新的版本。这就意味着库得去向后兼容你想要支持的最老的 Java 版本 (许多状况下就是 Java 6 或者 7)。这实际上意味着将来的很长一段时间,你都不能在库中运用 Java 9 所提供的新特性。幸运的是,多版本兼容 JAR 功能能让你建立仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本:
10.加强处理API
    新版本将扩展与操做系统进行交互的能力。将添加新的方法来处理PID管理,进程名称和状态,子进程管理等等。
react

4.Java 与 C++ 对比,C++ 或 Java 中的异常处理机制的简单原理和应用

C++:
在C的时候,错误处理要 setjmp() / longjmp() 经过。而C++里, setjmp() / longjmp() 已经不能用了。C++的异常能够是类,也能够是基本类型(如int)。在标准库中,也存在exception类。可是,C++并无要求咱们自定义的异常要继承某个类。
JAVA:
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。
违反语义规则包括2种状况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引起IndexOutOfBoundsException;访问null的对象时会引起NullPointerException。另外一种状况就是JAVA容许程序员扩展这种语义检查,程序员能够建立本身的异常,并自由选择在什么时候用throw关键字引起异常。
全部的异常都是java.lang.Thowable的子类。

linux

5.简单讲讲 Tomcat 结构,以及其类加载器流程            参考连接    参考连接        

1.tomcat结构图 
这里写图片描述
程序员

2.结构描述 
2.1 Server:一个catalina服务器 
2.2 Service:服务,负责处理全部Connector所得到的客户请求。由多个Connector和一个Engine组成。 
2.3 Connector:链接器,负责在指定端口上监听请求,并将得到的请求交给Engine来处理,从Engine处得到回应并返回客户。Tomcat默认有两个链接器:1.监听http请求的链接器;2.监听ajp请求的链接器。 
2.4 Engine:顶层容器。Engine下能够配置多个虚拟主机Virtual Host,每一个虚拟主机都有一个域名。 
当Engine得到一个请求时,它把该请求匹配到某个Host上,而后把该请求交给该Host来处理。 
Engine有一个默认虚拟主机,当请求没法匹配到任何一个Host上的时候,将交给该默认Host来处理。 
2.5 Host:它是Engine的子容器,表明一个Virtual Host,虚拟主机,每一个虚拟主机和某个网络域名Domain Name相匹配。web

每一个虚拟主机下均可以部署(deploy)一个或者多个Web App,每一个Web App对应于一个Context,有一个Context path。

当Host得到一个请求时,将把该请求匹配到某个Context上,而后把该请求交给该Context来处理。

匹配的方法是“最长匹配”,因此一个path==""的Context将成为该Host的默认Context。

全部没法和其它Context的路径名匹配的请求都将最终和该默认Context匹配。

2.6 Context:它是Host的子容器,一个Context对应于一个Web Application,一个Web Application由一个或者多个Servlet组成。算法

Context在建立的时候将根据配置文件$CATALINA_HOME$/conf/web.xml和$WEBAPP_HOME$/WEB-INF/web.xml载入Servlet类。

当Context得到请求时,将在本身的映射表(mapping table)中寻找相匹配的Servlet类。

若是找到,则执行该类,得到请求的回应,并返回。

2.7 Wrapper:它是针对每一个Servlet的Container,是Context的子容器。每一个Servlet都有相应的Wrapper来管理。 
综上,能够看出Server、Service、Connector、Container、Engine、Host、Context和Wrapper这些核心组件的做用范围是逐层递减,并逐层包含。数据库

3.启动过程 
3.1 设置Catalina (Tomcat Servlet 容器的代号)的路径:CATALINA_HOME 和CATALINA_BASE 
3.2 初始化Tomcat 的类加载器体系 
3.3 建立org.apache.catalina.startup.Catalina 对象(启动阶段剩余的工做由Catalina类 完成) 
3.4 初始化Container和Connector。其实就是解析server.xml并将其中对象都实例化起来。 
3.5 启动Container和Connector。 
跟初始化的顺序同样,先启动全部的Container,而后启动Connector。 Tomcat默认Connector有两个:Http11Protocol和AjpProtocol。 
这两种默认Connector都使用JIoEndpoint处理传入的TCP链接,是代码里写死的。 
因此若是想使用NioEndpoint,就要在server.xml配置时使用Http11NioProtocol或AjpNioProtocol.(Connector属性protocol=”类全名”便可) 
不管使用哪一种Endpoint,其启动时都主要是启动这三个线程:Acceptor、Executor和AsyncTimeout线程。 
3.5.1 Connector的start方法的最后,会根据已经加载完毕的容器的结构关系,构造出Mapper。供之后请求来临时的定位使用。 
(因为先启动了Acceptor,后构造的Mapper,因此在构造出Mapper以前,Acceptor启动了也没意义,由于请求来了也找不到对应的context,不过这倒也不要紧,等启动全完了再发请求就好了) 
3.6 至此,启动完毕,处于等待请求的状态。apache

4.请求过程 
4.1 浏览器发起请求 
4.2 Acceptor接收到请求。 
4.3 若是是jioEndpoint处理: 
4.3.1 放到线程池执行。getExecutor().execute(new SocketProcessor(wrapper)); 
4.3.2 执行内容根据当前Connector协议的不一样而不一样。若是是http11则执行Http11Processor,Ajp则执行AjpProcessor。 
4.3.3 若是是Http11Processor处理: 
4.3.3.1 首先,获取请求方法,请求的URI和协议名称及版本。 
4.3.3.2 调用adapter.service。这里的adapter是Connector初始化时set进来的。默认的也是代码写死的CoyoteAdapter。若是使用本身定义的链接器,就能够重写初始化方法,从而使用另外的adapter了。 
4.3.3.3 CoyoteAdapter的service方法中,先构造并填充request对象,而后根据mapper的内容,对request所指向的请求context和wrapper进行定位。 
4.3.3.4 定位以后,调用容器的invoke方法,这个容器就是StandardEngine,把request传给容器,交给容器处理了。 
4.3.3.5 request传给容器,因为容器是个层次结构,因此应该先由最顶层容器开始,这样才可以准确找到并按正确顺序执行处理。 
4.3.3.6 设置响应头信息并把response输出给客户端的方法是: AbstractHttp11Processor.endRequest()。编程

5.部署流程

5.1 首先,热加载线程ContainerBackgroundProcessor一直在运行着,监控着 
5.1.1 StandardHost会一直发出一个代号为periodic的事件,该事件处理中调用HostConfig.check方法。因此这里就是周期性的check 
5.2 HostConfig.check方法内容: 
5.2.1 check全部已部署的应用。当check出一个context不存在了时,就调用host.removeChild(context)。 
5.2.1.1 逐层的stop:context.stop,wrapper.stop。调用context.stop时,会触发删除其全部的wrapper.stop。 
5.2.1.2 mapperlistener会接收到removeChild事件。从而与context(及其wrapper)解除绑定。 
5.2.2 热加载未部署的应用。当检查出有一个新的context.xml须要deploy时,会new一个DeployDescriptor放到线程池执行。 
该线程会调用HostConfig.deployDescriptor: 
5.2.2.1 利用digester对context.xml进行解析,获得context实例。 
5.2.2.2 把xml和最后修改时间标记到deployedApp.redeployResources 
5.2.2.3 host.addChild(context);——方法中会调用该context的start,从而启动其全部的wrapper。 
5.2.2.4 mapperlistener也会接收到addChild事件。从而与context(及其wrapper)绑定。

Tomcat类加载

当tomcat启动时,会建立几种类加载器:

1 Bootstrap 引导类加载器 + Extension类加载器

    先尝试在Bootstrap(位于jre/lib/rt.jar下)和Extension(位于jre/lib/ext下)中进行类型加载。

2 System 系统类加载器(仅仅tomcat使用)

    加载tomcat启动的类,好比CATALINA_HOME/bin/bootstrap.jar,一般在catalina.sh中指定。位于CATALINA_HOME/bin下。

3 Common 通用类加载器(tomcat,web程序均可以使用)

    加载tomcat使用以及应用通用的一些类,位于CATALINA_HOME/lib下,好比servlet-api.jar

4 webapp 应用类加载器(仅仅web程序均可以使用)

    每一个应用在部署后,都会建立一个惟一的类加载器。该类加载器会加载位于WEB-INF/lib下的jar文件中的class和WEB-INF/classes下的class文件。

Tomcat 类加载顺序

    1 使用bootstrap引导类加载器加载(e.g. JRE中的Java基础包)

    2 使用system系统类加载器加载 (e.g. CATALINA_HOME/bin/bootstrap.jar)

    3 使用应用类加载器在WEB-INF/classes中加载

    4 使用应用类加载器在WEB-INF/lib中加载 

    5 使用common类加载器在CATALINA_HOME/lib中加载

    (e.g. CATALINA_HOME/lib/下的)

6.虚拟内存是什么

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它一般是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在须要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。
注意:虚拟内存不仅是“用磁盘空间来扩展物理内存”的意思——这只是扩充内存级别以使其包含硬盘驱动器而已。把内存扩展到磁盘只是使用虚拟内存技术的一个结果,它的做用也能够经过覆盖或者把处于不活动状态的程序以及它们的数据所有交换到磁盘上等方式来实现。对虚拟内存的定义是基于对地址空间的重定义的,即把地址空间定义为“连续的虚拟内存地址”,以借此“欺骗”程序,使它们觉得本身正在使用一大块的“连续”地址。

7.阐述下 SOLID 原则

在 程序设计领域, SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期[1] 引入的记忆术首字母缩略字[2][3],指代了面向对象编程和面向对象设计的五个基本原则。当这些原则被一块儿应用时,它们使得一个程序员开发一个容易进行软件维护和扩展的系统变得更加可能。[1] SOLID所包含的原则是经过引起编程者进行软件源代码的代码重构进行软件的代码异味清扫,从而使得软件清晰可读以及可扩展时能够应用的指南。SOLID被典型的应用在测试驱动开发上,而且是敏捷开发以及自适应软件开发的基本原则的重要组成部分。[1][4]
首字母 指代 概念
S 单一功能原则 认为对象应该仅具备一种单一功能的概念。
O 开闭原则 认为“软件体应该是对于扩展开放的,可是对于修改封闭的”的概念。
L 里氏替换原则 认为“程序中的对象应该是能够在不改变程序正确性的前提下被它的子类所替换的”的概念。

参考契约式设计

I 接口隔离原则 认为“多个特定客户端接口要好于一个宽泛用途的接口”[5] 的概念。
D 依赖反转原则 认为一个方法应该听从“依赖于抽象而不是一个实例”[5] 的概念。
依赖注入是该原则的一种实现方式。

8.请简要讲一下你对测试驱动开发(TDD)的认识

测试驱动开发(英语:Test-driven development,缩写为TDD)是一种软件开发过程当中的应用方法,由极限编程中倡导,以其倡导先写测试程序,而后编码实现其功能得名。测试驱动开发始于20世纪90年代。测试驱动开发的目的是取得快速反馈并使用“illustrate the main line”方法来构建程序。
测试驱动开发是戴两顶帽子思考的开发方式:先戴上实现功能的帽子,在测试的辅助下,快速实现其功能;再戴上重构的帽子,在测试的保护下,经过去除冗余的代码,提升代码质量。测试驱动着整个开发过程:首先,驱动代码的设计和功能的实现;其后,驱动代码的再设计和重构。
正面评价
能够有效的避免过分设计带来的浪费。可是也有人强调在开发前须要有完整的设计再实施能够有效的避免重构带来的浪费。
可让开发者在开发中拥有更全面的视角。
负面评价
开发者可能只完成知足了测试的代码,而忽略了对实际需求的实现。有实践者认为用结对编程的方式能够有效的避免这个问题。
会放慢开发实际代码的速度,特别对于要求开发速度的原型开发形成不利。这里须要考虑开发速度须要包含功能和品质两个方面,单纯的代码速度可能不能彻底表明开发速度。
对于GUI,资料库和Web应用而言。构造单元测试比较困难,若是强行构造单元测试,反而给维护带来额外的工做量。有开发者认为这个是因为设计方法,而不是开发方法形成的困难。
使得开发更为关注用例和测试案例,而不是设计自己。目前,对于这个观点有较多的争议。
测试驱动开发会致使单元测试的覆盖度不够,好比可能缺少边界测试。在实际的操做中,和非测试驱动开发同样,当代码完成之后仍是须要补充单元测试,提升测试的覆盖度。

9.CDN实现原理

在描述CDN的实现原理,让咱们先看传统的未加缓存服务的访问过程,以便了解CDN缓存访问方式与未加缓存访问方式的差异:
用户提交域名→浏览器对域名进行解释→获得目的主机的IP地址→根据IP地址访问发出请求→获得请求数据并回复
由上可见, 用户访问未使用CDN缓存网站的过程为:
1)、用户向浏览器提供要访问的域名;
2)、浏览器调用域名解析函数库对域名进行解析,以获得此域名对应的IP地址;
3)、浏览器使用所获得的IP地址,向域名的服务主机发出数据访问请求;
4)、浏览器根据域名主机返回的数据显示网页的内容。
经过以上四个步骤,浏览器完成从用户处接收用户要访问的域名到从域名服务主机处获取数据的整个过程。CDN网络是在用户和服务器之间增长Cache层,如何将用户的请求引导到Cache上得到源服务器的数据,主要是经过接管DNS实现,下面让咱们看看访问使用CDN缓存后的网站的过程:

经过上图,咱们能够了解到, 使用了CDN缓存后的网站的访问过程变为
1)、用户向浏览器提供要访问的域名;
2)、浏览器调用域名解析库对域名进行解析,因为CDN对域名解析过程进行了调整,因此解析函数库通常获得的是该域名对应的CNAME记录,为了获得实际IP地址,浏览器须要再次对得到的CNAME域名进行解析以获得实际的IP地址;在此过程当中,使用的全局负载均衡DNS解析,如根据地理位置信息解析对应的IP地址,使得用户能就近访问。
3)、这次解析获得CDN缓存服务器的IP地址,浏览器在获得实际的IP地址之后,向缓存服务器发出访问请求;
4)、缓存服务器根据浏览器提供的要访问的域名,经过Cache内部专用DNS解析获得此域名的实际IP地址,再由缓存服务器向此实际IP地址提交访问请求;
5)、缓存服务器从实际IP地址得获得内容之后,一方面在本地进行保存,以备之后使用,另外一方面把获取的数据返回给客户端,完成数据服务过程;
6)、客户端获得由缓存服务器返回的数据之后显示出来并完成整个浏览的数据请求过程。
经过以上的分析咱们能够获得,为了实现既要对普通用户透明(即加入缓存之后用户客户端无需进行任何设置,直接使用被加速网站原有的域名便可访问,又要在为指定的网站提供加速服务的同时下降对ICP的影响,只要修改整个访问过程当中的域名解析部分,以实现透明的加速服务,下面是 CDN网络实现的具体操做过程。
1)、做为ICP,只须要把域名解释权交给CDN运营商,其余方面不须要进行任何的修改;操做时,ICP修改本身域名的解析记录,通常用cname方式指向CDN网络Cache服务器的地址。
2)、做为CDN运营商,首先须要为ICP的域名提供公开的解析,为了实现sortlist,通常是把ICP的域名解释结果指向一个CNAME记录;
3)、当须要进行sortlist时,CDN运营商能够利用DNS对CNAME指向的域名解析过程进行特殊处理,使DNS服务器在接收到客户端请求时能够根据客户端的IP地址,返回相同域名的不一样IP地址;
4)、因为从cname得到的IP地址,而且带有hostname信息,请求到达Cache以后,Cache必须知道源服务器的IP地址,因此在CDN运营商内部维护一个内部DNS服务器,用于解释用户所访问的域名的真实IP地址;
5)、在维护内部DNS服务器时,还须要维护一台受权服务器,控制哪些域名能够进行缓存,而哪些又不进行缓存,以避免发生开放代理的状况。

10.Maven 和 ANT 有什么区别        参考连接

略,看参考连接吧

11.UML中有哪些经常使用的图

用例图(use case diagram)、类图(class diagram)、时序图(sequence diagram)、协做图(collaboration diagram)、状态图(statechart diagram)、活动图(activity diagram)、构件图(component diagram)、部署图(deployment diagram)等。
三种图最为重要,分别是:
    用例图(用来捕获需求,描述系统的功能,经过该图能够迅速的了解系统的功能模块及其关系)、
    类图(描述类以及类与类之间的关系,经过该图能够快速了解系统)、
    时序图(描述执行特定任务时对象之间的交互关系以及执行顺序,经过该图能够了解对象能接收的消息也就是说对象可以向外界提供的服务)。

12.Linux 下 IO 模型有几种,各自的含义是什么。    参考连接        参考连接

    阻塞IO(blocking IO)    
    非阻塞IO (nonblocking IO)
    IO复用(select 和poll) (IO multiplexing)
    信号驱动IO (signal driven IO (SIGIO))
    异步IO (asynchronous IO (the POSIX aio_functions))
前四种都是同步,只有最后一种才是异步IO。

13.Linux 系统下你关注过哪些内核参数,说说你知道的        参考连接

更多可查看参考连接
下列文件所在目录:
/proc/sys/net/ipv4/

名称

默认值

建议值

描述

tcp_syn_retries

5

1

对于一个新建链接,内核要发送多少个 SYN 链接请求才决定放弃。不该该大于255,默认值是5,对应于180秒左右时间。。(对于大负载而物理通讯良好的网络而言,这个值偏高,可修改成2.这个值仅仅是针对对外的链接,对进来的链接,是由tcp_retries1决定的)

tcp_synack_retries

5

1

对于远端的链接请求SYN,内核会发送SYN ACK数据报,以确认收到上一个 SYN链接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃链接以前所送出的 SYN+ACK 数目。不该该大于255,默认值是5,对应于180秒左右时间。

tcp_keepalive_time

7200

600

TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP链接是否有效。

防止两边创建链接但不发送数据的攻击。

tcp_keepalive_probes

9

3

TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP链接是否有效。

tcp_keepalive_intvl

75

15

探测消息未得到响应时,重发该消息的间隔时间(秒)。默认值为75秒。 (对于普通应用来讲,这个值有一些偏大,能够根据须要改小.特别是web类服务器须要改小该值,15是个比较合适的值)

tcp_retries1

3

3

放弃回应一个TCP链接请求前﹐须要进行多少次重试。RFC 规定最低的数值是3

tcp_retries2

15

5

在丢弃激活(已创建通信情况)TCP链接以前﹐须要进行多少次重试。默认值为15,根据RTO的值来决定,至关于13-30分钟(RFC1122规定,必须大于100).(这个值根据目前的网络设置,能够适当地改小,个人网络内修改成了5)

tcp_orphan_retries

7

3

在近端丢弃TCP链接以前﹐要进行多少次重试。默认值是7个﹐至关于 50 - 16分钟﹐视RTO 而定。若是您的系统是负载很大的web服务器﹐那么也许须要下降该值﹐这类 sockets 可能会耗费大量的资源。另外参的考tcp_max_orphans(事实上作NAT的时候,下降该值也是好处显著的,我本人的网络环境中下降该值为3)

tcp_fin_timeout

60

2

对于本端断开的socket链接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开链接或一直不结束链接或不可预料的进程死亡。默认值为 60 秒。

tcp_max_tw_buckets

180000

36000

系统在同时所处理的最大 timewait sockets 数目。若是超过此数的话﹐time-wait socket 会被当即砍除而且显示警告信息。之因此要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐不过﹐若是网络条件须要比默认值更多﹐则能够提升它(或许还要增长内存)(事实上作NAT的时候最好能够适当地增长该值)


14.Linux 下用一行命令查看文件的最后五行

tail -n 5 filename

15.平时用到哪些 Linux 命令

ls,grep,tail,cat,ps,find,curl,top,ztop,iotop,vim,mv,mkdir,sh

16.用一行命令输出正在运行的 Java 进程

ps aux | grep java

17.使用什么命令来肯定是否有 Tomcat 实例运行在机器上

ps aux | grep tomcat    或使用tomcat stauts命令

18.什么是 N+1 难题    参考连接

执行一条select语句查询当前表,执行N条语句查询与当前表关联的表,N是不一样的关联数。效率不好
可使用join解决

19.什么是 paxos 算法    参考连接

看参考连接吧,太复杂了

20.什么是 restful,讲讲你理解的 restful        参考连接

restful:

一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件能够更简洁,更有层次,更易于实现缓存等机制。

如何理解restful:
REST 这个词实际上是 Representational State Transfer 的缩写 翻译过来就是表现性状态转换
其实 REST 是指的 资源的表示性状态转换。而后简单的对这几个词作一个解释
资源(Resources)网络上能够访问的资源,典型的就是一段URI
表现性(Representational):资源的表现形式,好比html json xml 等等
状态转换(State Transfer):本来Http是一个无状态协议,可是访问一个网站是一个互动的过程,经过某种手段使服务端发生状态的转换,同时这种转换时创建在表现性之上的。因此是 Representational State Transfer

客户端用到的手段,只能是HTTP协议。具体来讲,就是HTTP协议里面,四个表示操做方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操做:GET用来获取资源,POST用来新建资源(也能够用于更新资源),PUT用来更新资源,DELETE用来删除资源。

restful的总结
每个URI表明一种资源;
客户端和服务器之间,传递这种资源的某种表现层(Representation);
客户端经过四个HTTP动词,对服务器端资源进行操做,实现”表现层状态转化”。

21.什么是 zab 协议        参考连接更详细

  ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息广播协议) 是zookeeper数据一致性的核心算法
  ZAB 协议并不像 Paxos 算法那样,是一种通用的分布式一致性算法,它是一种特别 为 ZooKeeper 设计的崩溃可恢复的原子消息广播算法
    ZAB协议主要实现了:
  1.使用一个单一的主进程来接收并处理客户端的全部事务请求,并采用 ZAB 的原子广播协议,将服务器数据的状态变动以事务 Proposal 的形式广播到全部的副本进程上去。
  2.保证一个全局的变动序列被顺序应用。
  ZooKeeper是一个树形结构,不少操做都要先检查才能肯定能不能执行,好比P1的事务t1多是建立节点“/a”,t2多是建立节点“/a/aa”,只有先建立了父节点“/a”,才能建立子节点“/a/aa”。为了保证这一点,ZAB要保证同一个leader的发起的事务要按顺序被apply,同时还要保证只有先前的leader的全部事务都被apply以后,新选的leader才能在发起事务。
  3.当前主进程出现异常状况的时候,依旧可以正常工做。
   ZAB 协议的核心:定义了事务请求的处理方式。
  全部事务请求必须由一个全局惟一的服务器来协调处理,这样的服务器被称为 Leader服务器,而余下的其余服务器则成为 Follower 服务器。 Leader 服务器负责将一个客户端事务请求转换成一个事务proposal(提议),并将该 Proposal分发给集群中全部的Follower服务器。以后 Leader 服务器须要等待全部Follower 服务器的反馈,一旦超过半数的Follower服务器进行了正确的反馈后,那么 Leader 就会再次向全部的 Follower服务器分发Commit消息,要求其将前一个proposal进行提交。
  这种事务处理方式与2PC(两阶段提交协议)区别在于,两阶段提交协议的第二阶段中,须要等到全部参与者的"YES"回复才会提交事务,只要有一个参与者反馈为"NO"或者超时无反馈,都须要中断和回滚事务。
   ZAB协议介绍:
  ZAB 协议包括两种基本的模式,分别是崩溃恢复和消息广播。
  当整个服务框架在启动过程当中,或是当 Leader 服务器出现网络中断、崩溃退出与重启等异常状况时, ZAB 协议就会进入恢复模式并选举产生新的 Leader 服务器。当选举产生了新的Leader 服务器同时集群中已经有过半的机器与该 Leader 服务器完成了状态同步以后,ZAB 协议就会退出恢复模式。
  当集群中已经有过半的 Follower 服务器完成了和 Leader 服务器的状态同步,那么整个服务框架就能够进入消息广播模式了。当一台一样遵照 ZAB 协议的服务器启动后加入到集群中时,若是此时集群中已经存在一个 Leader 服务器在负责进行消息广播 , 那么新加人的服务器就会自觉地进人数据恢复模式:找到 Leader 所在的服务器,并与其进行数据同步,而后一块儿参与到消息广播流程中去。

22.什么是领域模型(domain model)?贫血模型(anaemic domain model) 和充血模型(rich domain model)有什么区别    参考连接

领域模型是领域内的概念类或现实世界中对象的可视化表示,又称为概念模型或分析对象模型,它专一于分析问题领域自己,发掘重要的业务领域概念,并创建业务领域概念之间的关系。

贫血模型是指使用的领域对象中只有setter和getter方法(POJO),全部的业务逻辑都不包含在领域对象中而是放在业务逻辑层。有人将咱们这里说的贫血模型进一步划分红失血模型(领域对象彻底没有业务逻辑)和贫血模型(领域对象有少许的业务逻辑),咱们这里就不对此加以区分了。

充血模型将大多数业务逻辑和持久化放在领域对象中,业务逻辑(业务门面)只是完成对业务逻辑的封装、事务和权限等的处理。下面两张图分别展现了贫血模型和充血模型的分层架构。

贫血模型

这里写图片描述

充血模型

这里写图片描述

贫血模型下组织领域逻辑一般使用事务脚本模式,让每一个过程对应用户可能要作的一个动做,每一个动做由一个过程来驱动。也就是说在设计业务逻辑接口的时候,每一个方法对应着用户的一个操做,这种模式有如下几个有点:

- 它是一个大多数开发者都可以理解的简单过程模型(适合国内的绝大多数开发者)。

- 它可以与一个使用行数据入口或表数据入口的简单数据访问层很好的协做。

- 事务边界的显而易见,一个事务开始于脚本的开始,终止于脚本的结束,很容易经过代理(或切面)实现声明式事务。

然而,事务脚本模式的缺点也是不少的,随着领域逻辑复杂性的增长,系统的复杂性将迅速增长,程序结构将变得极度混乱。开源中国社区上有一篇很好的译文《贫血领域模型是如何致使糟糕的软件产生》对这个问题作了比较细致的阐述。


23.什么是领域驱动开发(Domain Driven Development)


什么是领域驱动开发

将问题抽象为一个领域解决方案。并针对此领域(即抽象)进行开发的方式。

领域驱动开发解决了什么问题

解决两个问题1,变化。2,复杂度。

原则上适用于任何软件,特别适用于一些特别复杂,变化特别频繁的系统——尤为是迭代很快又很复杂的稳定要求又很高的互联网金融核心系统。

在这些业务系统中,经常糅合了支付,帐务,会计等多业务领域的知识;同时糅合了通信,协议,安全,编码等多种技术领域知识;若是涉及到多系统对接,甚至还要经常面临多种不一样的解决方案的整合。

怎么办?

1,问题分层,转化为业务领域,技术领域。经过协议或者接口先屏蔽技术上的差别性。各层只关注本身的问题。

2,问题分块,同层问题转化为A,B,C等不一样业务领域;定义他们彼此服务整合的方式。

3,关注要素,忽略细节 ;关注抽象,忽略具体;……

————————其实就是分而治之,化繁为简;抓住主要矛盾的过程。

领域驱动开发的威力

领域模型的核心是抽象和分治(less is more)

例子1:linux很神奇的管道的原理么(命令经过|无限组装)?

1,任何io操做都是文件

2,任何文件有三个默认io方向(stdin,stdout,stderror)

3,pipe的做用是连接上下文件,转化stdout stdin

ls *|grep abc 的底层原理就是

ls * (输出到stdout) (转化上一个的stdout为下一个的stdin) grep abc( 从stdin)

顺便说一下 不仅仅你看到的文件 linux下几乎啥都是file(命令,设备……),你想一想这样玩的威力吧

再说一下应对复杂度的威力,说一下金融届有名的三户模型

卡客帐,卡即支付工具的抽象,客即人的抽象,帐即资金的抽象。

1,存折换成卡,卡换成app,核心不须要任何变更

2,红包,优惠券,信贷帐户怎么玩?其实就是帐户之间增长父子结构而已。

(红包,优惠券,信贷帐户特征是有额度;但都是假的,真实发生交易的时候才操做真实资金帐户;其余状况下不做为资金处理:解决方案就是设置父子帐户,子帐户即便红包信贷帐户,对子帐户的操做实际操做的是户帐户资金。不须要开发)

这三户模型的抽象,也有助于解决金融产品一些快速的创新和复杂的产品设计——前提是开发和产品理解这个抽象,我真见过再设计一大套红包,信贷帐户表,搞一大堆专门处理他们逻辑差别性的金融系统——这样就致使成天忙死了,而且问题不断。

人的抽象在支付上用处不大,可是在风控上意义重大。风控的本质上就是对人的理解和博弈。不论啥卡欺诈,帐户欺诈,设备……最终都是要挂到这个概念上的,不论任何规则,模型,也最终都要落实到这个模型上的。

卡客帐:金融业务和金融风险的完美建模有没有。

领域模型开发要注意那些

  1. 领域划分,定义
  2. 概念定义
  3. 概念职责,行为,服务
  4. 概念之间关系
  5. 应对变化

24.介绍一下了解的 Java 领域的 Web Service 框架

略,浪费时间

25.Web Server、Web Container 与 Application Server 的区别是什么

Web Server:Web server 是指可以接收,解析,处理HTTP请求,并将处理后的结果返回给合适的客户端(好比浏览器)的服务器。例如IHS(IBM HTTP Server)和Apache,IHS是创建在Apahce之上的由IBM添加更多功能后的服务器,都处理HTTP请求(正如IHS名字所显示的 http server)
Web Container:Web容器J2EE标准的实现,为serverlet和jsp提供运行环境。例如,当一个HTTP请求经过要访问一个web组件(一般是一个serverlet或者是jsp),一般是将这个请求转发给web container处理完毕后再返回到web server。Tomcat是一个轻量级的web container。
Application Server: 是一个完整的server,它提供整个业务模块 (EJBs,ADFs,etc)运行的环境。除了单独做为一个web container外,它还能处理HTTP请求(固然包括其它协议,好比tcp,消息队列等)。Websphere 和weblogic 都属于此类

26.微服务(MicroServices)与巨石型应用(Monolithic Applications)之间的区别在哪里

不造

27.描述 Cookie 和 Session 的做用,区别和各自的应用范围,Session工做原理

写完保存失败,不写了。

28.你经常使用的持续集成(Continuous Integration)、静态代码分析(Static Code Analysis)工具备哪些

jekins,soner还有阿里代码规约插件

29.简述下数据库正则化(Normalizations)

不造

30.KISS,DRY,YAGNI 等原则是什么含义    参考连接

原则1:不作重复的事(Don't Repeat Yourself)
原则2:保持简单直接(Keep it Simple Stupid)
原则3:你不须要它(You Ain’t Gonna Need It)

31.分布式事务的原理,优缺点,如何使用分布式事务?   参考连接

仍是看参考连接吧,晚上资料有的是。

32.布式集群下如何作到惟一序列号        snowflake连接

数据库自增id;每一个服务器一个id,订单号包含服务器id;zookeeper;最好的是facebook的snowflake

33.Http请求头都有哪些,分别是什么意思    参考连接


34.http请求结构,分别是什么   参考连接

HTTP请求报文
请求行、请求头部、空行、请求数据

这里写图片描述

 

 

这里写图片描述

HTTP响应报文:
响应行、响应头、响应体

这里写图片描述

35.HTTPS 的加密方式是什么,讲讲整个加密解密流程

对称密钥和非对称密钥方式,RSA和DES。过程我都熟悉,就不写了偷笑

36.HTTPS和HTTP的区别

在应用层(http)和传输层(tcp)间加了一层会话层(SSL)
在URL前加https://前缀代表是用SSL加密的。 你的电脑与服务器之间收发的信息传输将更加安全。
Web服务器启用SSL须要得到一个服务器证书并将该证书与要使用SSL的服务器绑定。
http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。http的链接很简单,是无状态的,...
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议
要比http协议安全

37.HTTP链接池实现原理    参考连接


38.HTTP集群方案

感受问的是负载均衡,Nginx、一致性hash,差很少吧

39.Nginx、lighttpd、Apache三大主流 Web服务器的区别    参考连接

这里写图片描述

40.是否看过框架的一些代码


41.持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些

略,看我的了

42.数值提高是什么    参考连接

数字类型提高机制被用于算术运算符上,一般使用场景为:

  • 同一类型转换 
    虽然并没有什么做用,但有时可使代码更清晰。
  • 拓宽原始类型转换 
    指byte、short、int、long、float、double由低向高转换。
  • 自动拆箱转换 
    基础类型引用类的拆箱方法,如r.intValue()

43.你能解释一下里氏替换原则吗    参考连接

任何基类能够出现的地方,子类必定能够出现

44.你是如何测试一个应用的?知道哪些测试框架


45.传输层常见编程协议有哪些?并说出各自的特色    参考连接

TCP协议:面向链接的可靠传输协议。利用TCP进行通讯时,首先要经过三步握手,以创建通讯双方的链接。TCP提供了数据的确认和数据重传的机制,保证发送的数据必定能到达通讯的对方。

UDP协议:是无链接的,不可靠的传输协议。采用UDP进行通讯时不用创建链接,能够直接向一个IP地址发送数据,可是不能保证对方是否能收到