Communications Support
容器使得Servlet与Web Server 之间的交流更加方便,Servlet主要注重自身逻辑,不用考虑Server Socket, 监听端口等其他事情
Lifecycle Management
容器管理了Servlet的生命周期
Multithreading Support
多线程支持
Declarative Security
With a Container, you
get to use an XML deployment descriptor to configure (and modify) security without having to hard-code it into your servlet (or any other) class code. Think about that! You can manage and change your security without touching and recompiling your Java source files.
应该是指通过xml的Deploy Description 方便灵活配置
With HTTP you use high-level HTTP protocol(that works on top of a socket). It's session-less which means you send text request like GET google.com and receive text or binary data in return, after that connection is closed(in HTTP 1.1 persistent connections are available)
好文更新
谁说前端不需要懂-Nginx反向代理与负载均衡 https://juejin.im/post/5b01336af265da0b8a67e5c9?utm_source=wechat
整体结构图
Tomcat
tomcat 是一个web container(或者叫Servlet容器)生成动态web内容
Tomcat 作为容器做了什么
Apache 与 Nginx 的优缺点对比
参考:https://www.cnblogs.com/huangye-dream/p/3550328.html nginx优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源。 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下,nginx 能保持低资源低消耗高性能。
apache 相对于nginx 的优点: rewrite ,比nginx 的rewrite 强大 模块超多,基本想到的都可以找到 少bug ,nginx 的bug 相对较多 超稳定 存在就是理由,一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache 吧。目前我们用Nginx作为web 服务器
端口的作用?
A port represents a logical connection to a particular piece of software running on the server hardware 如果没有端口号的话, server 就不知道client 要连哪个应用
web server 与 web contaienr app 之间如何关联的
Tomcat 如何找到请求url对应的servlet
servlet 有3种name
通过Deployment Descriptor(DD即web.xml配置文件)去做Servlet和URL的映射
tomcat 主要目录结构
java应用build后会生成webapp目录,通过脚本,我们会把生成的webapp放在tomcat文件夹下,大致结构为
开发时,java 文件一般就放在工程目录的src文件夹下没什么特别
分布式服务
既然每一个应用系统都需要执行许多相同的业务操作,比如用户管理、商品管理等,那么可以将这些共用的业务提取出来,独立部署。由这些可复用的业务连接数据库,提供共用业务服务,而应用系统只需要管理用户界面,通过分布式服务调用共用业务服务完成具体业务操作
RPC(Remote Procedure Call) 远程服务调用
参考:https://zhuanlan.zhihu.com/p/36427583 因为分布式,我们把一些相同业务抽离出来了形成Service B,那么显然Service A 需要调用Service B.
所以RPC 主要需要解决两个问题: 1.解决分布式系统中,服务之间的调用问题。 2.远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。使用代理模式,代理本地方法,由代理去发请求 目前我们的后端用的是dubbo,阿里的分布式服务框架 来进行远程调用。既然是分布式了,那么一个服务可能有多个实例,你在调用时,要如何获取这些实例的地址呢?这时候就需要一个服务注册中心,比如在Dubbo里头,就可以使用Zookeeper作为注册中心,在调用时,从Zookeeper获取服务的实例列表,再从中选择一个进行调用。
集群
对于用户访问集中的模块(比如网站的首页),需要让多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务,提供更好的并发特性。
缓存
反向代理:
反向代理属于网站前端架构的一部分,部署在网站的前端,当用户请求到达网站的数据中心时,最先访问到的就是反向代理服务器,这里缓存网站的静态资源,无需将请求继续转发给应用服务器就能返回给用户(我们的活动落地页shtml结尾的,就是用了varnish缓存的)
本地缓存:(用很少)
在应用服务器本地缓存着热点数据,应用程序可以在本机内存中直接访问数据,而无需访问数据库。
分布式缓存:
将数据缓存在一个专门的分布式缓存集群中,应用程序通过网络通信访问缓存数据
Memcached分布式缓存集群的访问模型
Memcached采用一种集中式的缓存集群管理,也被称作互不通信的分布式架构方式。缓存与应用分离部署,缓存系统部署在一组专门的服务器上,应用程序通过一致性Hash等路由算法选择缓存服务器远程访问缓存数据
如何理解不通信? 缓存服务器不只一台比如有十台 那么 以名字以1开头的缓存 我放在第一台, 以2开头的我放在第二台。。。。 这样子每台的数据都不一样 也不用去同步, 但是对于应用方来说 还是都一样的
异步消息队列
不用实时处理的内容,可以塞在队列里异步处理
HTTP vs Socket
HTTP 只是一个传输协议,本身不具备传输能力,它只是一个在socket之上的协议。它是一种text request
Socket 是对 TCP/IP 协议的封装,Socket 只是个接口不是协议,通过 Socket 我们才能使用 TCP/IP 协议,除了 TCP,也可以使用 UDP 协议来传递数据。 很多情况下,都是需要服务器端向客户端主动推送数据,保持客户端与服务端的实时同步。
若双方是 Socket连接,可以由服务器直接向客户端发送数据。若双方是 HTTP 连接,则服务器需要等客户端发送请求后,才能将数据回传给客户端。
因此,客户端定时向服务器端发送请求,不仅可以保持在线,同时也询问服务器是否有新数据,如果有就将数据传给客户端。 参考资料: 1.http://www.cnblogs.com/xclidongbo/p/4032904.html?utm_source=tuicool&utm_medium=referral 2.https://stackoverflow.com/questions/10765897/whats-the-memcached-server
目前中间层职责
参考资料: 1.zookeeper是什么 https://www.zhihu.com/question/37564946