当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
反应器设计模式(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
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
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
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启动时,会建立几种类加载器:
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/下的)
首字母 | 指代 | 概念 |
---|---|---|
S | 单一功能原则 | 认为对象应该仅具备一种单一功能的概念。 |
O | 开闭原则 | 认为“软件体应该是对于扩展开放的,可是对于修改封闭的”的概念。 |
L | 里氏替换原则 | 认为“程序中的对象应该是能够在不改变程序正确性的前提下被它的子类所替换的”的概念。 参考契约式设计。 |
I | 接口隔离原则 | 认为“多个特定客户端接口要好于一个宽泛用途的接口”[5] 的概念。 |
D | 依赖反转原则 | 认为一个方法应该听从“依赖于抽象而不是一个实例”[5] 的概念。 依赖注入是该原则的一种实现方式。 |
略,看参考连接吧
用例图(use case diagram)、类图(class diagram)、时序图(sequence diagram)、协做图(collaboration diagram)、状态图(statechart diagram)、活动图(activity diagram)、构件图(component diagram)、部署图(deployment diagram)等。
三种图最为重要,分别是:
用例图(用来捕获需求,描述系统的功能,经过该图能够迅速的了解系统的功能模块及其关系)、
类图(描述类以及类与类之间的关系,经过该图能够快速了解系统)、
时序图(描述执行特定任务时对象之间的交互关系以及执行顺序,经过该图能够了解对象能接收的消息也就是说对象可以向外界提供的服务)。
阻塞IO(blocking IO)
非阻塞IO (nonblocking IO)
IO复用(select 和poll) (IO multiplexing)
信号驱动IO (signal driven IO (SIGIO))
异步IO (asynchronous IO (the POSIX aio_functions))
前四种都是同步,只有最后一种才是异步IO。
更多可查看参考连接
下列文件所在目录:/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的时候最好能够适当地增长该值) |
restful:
一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件能够更简洁,更有层次,更易于实现缓存等机制。
如何理解restful:客户端用到的手段,只能是HTTP协议。具体来讲,就是HTTP协议里面,四个表示操做方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操做:GET用来获取资源,POST用来新建资源(也能够用于更新资源),PUT用来更新资源,DELETE用来删除资源。
restful的总结:领域模型是领域内的概念类或现实世界中对象的可视化表示,又称为概念模型或分析对象模型,它专一于分析问题领域自己,发掘重要的业务领域概念,并创建业务领域概念之间的关系。
贫血模型是指使用的领域对象中只有setter和getter方法(POJO),全部的业务逻辑都不包含在领域对象中而是放在业务逻辑层。有人将咱们这里说的贫血模型进一步划分红失血模型(领域对象彻底没有业务逻辑)和贫血模型(领域对象有少许的业务逻辑),咱们这里就不对此加以区分了。
充血模型将大多数业务逻辑和持久化放在领域对象中,业务逻辑(业务门面)只是完成对业务逻辑的封装、事务和权限等的处理。下面两张图分别展现了贫血模型和充血模型的分层架构。
贫血模型
充血模型
贫血模型下组织领域逻辑一般使用事务脚本模式,让每一个过程对应用户可能要作的一个动做,每一个动做由一个过程来驱动。也就是说在设计业务逻辑接口的时候,每一个方法对应着用户的一个操做,这种模式有如下几个有点:
- 它是一个大多数开发者都可以理解的简单过程模型(适合国内的绝大多数开发者)。
- 它可以与一个使用行数据入口或表数据入口的简单数据访问层很好的协做。
- 事务边界的显而易见,一个事务开始于脚本的开始,终止于脚本的结束,很容易经过代理(或切面)实现声明式事务。
然而,事务脚本模式的缺点也是不少的,随着领域逻辑复杂性的增长,系统的复杂性将迅速增长,程序结构将变得极度混乱。开源中国社区上有一篇很好的译文《贫血领域模型是如何致使糟糕的软件产生》对这个问题作了比较细致的阐述。
什么是领域驱动开发
将问题抽象为一个领域解决方案。并针对此领域(即抽象)进行开发的方式。
领域驱动开发解决了什么问题
解决两个问题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,红包,优惠券,信贷帐户怎么玩?其实就是帐户之间增长父子结构而已。
(红包,优惠券,信贷帐户特征是有额度;但都是假的,真实发生交易的时候才操做真实资金帐户;其余状况下不做为资金处理:解决方案就是设置父子帐户,子帐户即便红包信贷帐户,对子帐户的操做实际操做的是户帐户资金。不须要开发)
这三户模型的抽象,也有助于解决金融产品一些快速的创新和复杂的产品设计——前提是开发和产品理解这个抽象,我真见过再设计一大套红包,信贷帐户表,搞一大堆专门处理他们逻辑差别性的金融系统——这样就致使成天忙死了,而且问题不断。
人的抽象在支付上用处不大,可是在风控上意义重大。风控的本质上就是对人的理解和博弈。不论啥卡欺诈,帐户欺诈,设备……最终都是要挂到这个概念上的,不论任何规则,模型,也最终都要落实到这个模型上的。
卡客帐:金融业务和金融风险的完美建模有没有。
领域模型开发要注意那些
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 都属于此类
不造
写完保存失败,不写了。
jekins,soner还有阿里代码规约插件
原则1:不作重复的事(Don't Repeat Yourself)
原则2:保持简单直接(Keep it Simple Stupid)
原则3:你不须要它(You Ain’t Gonna Need It)
仍是看参考连接吧,晚上资料有的是。
数据库自增id;每一个服务器一个id,订单号包含服务器id;zookeeper;最好的是facebook的snowflake
略
HTTP请求报文
请求行、请求头部、空行、请求数据
对称密钥和非对称密钥方式,RSA和DES。过程我都熟悉,就不写了
在应用层(http)和传输层(tcp)间加了一层会话层(SSL)
在URL前加https://前缀代表是用SSL加密的。 你的电脑与服务器之间收发的信息传输将更加安全。
Web服务器启用SSL须要得到一个服务器证书并将该证书与要使用SSL的服务器绑定。
http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。http的链接很简单,是无状态的,...
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议
要比http协议安全
略
感受问的是负载均衡,Nginx、一致性hash,差很少吧
略
略,看我的了
数字类型提高机制被用于算术运算符上,一般使用场景为:
r.intValue()
。任何基类能够出现的地方,子类必定能够出现
略
TCP协议:面向链接的可靠传输协议。利用TCP进行通讯时,首先要经过三步握手,以创建通讯双方的链接。TCP提供了数据的确认和数据重传的机制,保证发送的数据必定能到达通讯的对方。
UDP协议:是无链接的,不可靠的传输协议。采用UDP进行通讯时不用创建链接,能够直接向一个IP地址发送数据,可是不能保证对方是否能收到