軟件的三大類型,單機,cs ,bs前端
海量數據能夠保存緩存,減小查詢數據庫的次數,加快訪問的速度,緩存的失效能夠按期的失效或者在數據發生變化時失效,能夠分爲粗粒度的失效和細粒度的失效。java
能夠將數據庫中原本是空數據的,作空數據的緩存保存在必定的數據結構中,查詢的時候從緩存就知道數據中對應的值爲空。web
還有一種技術就是頁面靜態化,同時對數據量大和併發量高都有好處。頁面靜態化能夠經過程序中的一些模板來實現如freemarker等spring
數據庫優化:表結構優化,sql語法邏輯優化sql
分區:能夠部分表達到分表相似的效果,就是將一張表中的數據按照必定的規則分到不一樣的區來保存,這樣在查詢數據時若是數據的範圍在同一個區內就能夠只對一個區的數據進行操做。這樣的操做數據量更小,速度更快。對程序透明,程序不須要作任何改動數據庫
分表apache
按操做的類型分表,按字段的範圍分表,按操做的時間段分區緩存
索引的優化tomcat
使用存儲過程代替直接操做,存儲過程只編譯一次服務器
分離活躍的數據:好比說將論壇中活躍的用戶保存到一張表,不活躍的用戶分離到另外一張表中,查詢時先查默認表,查不到時再去不活躍的用戶表中查詢。
批量讀取和延遲修改
減小操做的次數來提升效率
將3,5秒的查詢合併到一次數據庫查詢來完成
延遲修改,先將一些修改保存到緩存中,一段時間統一同步到數據庫中
讀寫分離
數據庫服務器集羣,數據庫同步,將寫操做由一臺指定服務器完成,主服務器將寫後的數據同步到從服務器,讀數據的時候從從服務器讀取,將讀請求分配到多個服務器處理。
分佈式數據庫
將不一樣的表存放到不一樣的數據庫中,而後在放到不一樣的服務器上
若是須要調用多個表,就去不一樣的服務器去找,從而提升處理速度
高併發的解決方案
應用和靜態資源分離
頁面緩存
集羣與分佈式
反向代理
反向代理指的是客戶端直接訪問的服務器並不正真提供服務,它從別的服務器獲取資源而後將結果返回給用戶。
代理服務器是咱們主動使用的;反向代理服務器是服務器本身使用的;
反向代理服務器有三個做用:
能夠做爲前端服務器跟實際處理請求的服務器集成
能夠作負載均衡
轉發請求,將動態資源轉發到tomcat等動態資源服務上,靜態請求轉發到靜態服務器上
CDN
它實際上是一種特殊的集羣頁面緩存服務器,
常見的協議和標準
DNS協議
將域名解析爲ip
TCP/ip協議
查找地址和規定傳輸的規則
HTTP協議
應用層協議,用來解析包
javaweb中的servlet
對接收到的數據進行處理並生成要返回客戶端的結果
DNS的設置
萬網的解析頁面
本機解析域名先從hosts文件中查找,找到了就直接使用
java中socket的用法
普通socket
nioSocket
servletconfig是servlet的配置文件web.xml保存在,<init-param>中
Tomcat中servlet的init方法是在org.apache.catalina.core.StandardWrapper的ininServlet方法中調用,servletConfig傳入的是StandardWrapper自身的門面類standardWapperFacade
getServletName得到web.xml中定義的servlet-name;
getInitParameter方法用於得到init-param配置的參數
getInitParameterNames用於得到配置的全部的init-param的名字集合
getServletContext表明得到應用自己ApplicationContextFacade
servletConfig是Servlet級的,servletContext是context級的
GenericServlet是Servlet的默認實現,實現了ServletConfig接口,能夠直接調用servletCOnfig裏面的方法,2提供了無參數的init方法,提供了log方法
public ServletContext getServletContext() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}
return sc.getServletContext();
}
寫日誌交給servletContext完成
public void log(String msg) {
getServletContext().log(getServletName() + ": "+ msg);
}
httpservlet是用http協議實現的Servlet的基類,寫servlet時直接繼承它就能夠了,springmvc中的dispatcherServlet就是繼承了httpservlet,它從寫service方法將不一樣請求方式的request,reponse路由到不一樣的方法處理。
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
HttpServletRequest request;
HttpServletResponse response;
if (!(req instanceof HttpServletRequest &&
res instanceof HttpServletResponse)) {
throw new ServletException("non-HTTP request or response");
}
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
service(request, response);
}
}
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
if (ifModifiedSince < lastModified) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}
} else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else if (method.equals(METHOD_POST)) {
doPost(req, resp);
} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);
} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);
} else {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
//
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}
Tomcat分析
tomcat最頂層的容器叫server,表明整個服務器,server中至少包含一個service,service主要包含兩部分connector和container;connector用於處理和鏈接相關的事項,而且提供socket與request和response的轉換,Container用於封裝和管理servlet,以及具體處理request請求
tomcat裏的server由org.apache.catalina.startup.Catalina管理,Catalina是整個Tomcat的管理類,load,start,stop分別管理整個服務器的生命週期,load根據conf/server.xml建立server並調用server的init方法初始化,start用於啓動服務器,
tomcat的入口main在org.apache.catai\lina.startup.bootStrap中,相似一個catalinaAdaptor,它把啓動的入口和具體的管理類分開,能夠方便的建立出多種啓動方式。