软件的三大类型,单机,cs ,bs
海量数据可以保存缓存,减少查询数据库的次数,加快访问的速度,缓存的失效可以定期的失效或者在数据发生变化时失效,可以分为粗粒度的失效和细粒度的失效。
可以将数据库中本来是空数据的,做空数据的缓存保存在一定的数据结构中,查询的时候从缓存就知道数据中对应的值为空。
还有一种技术就是页面静态化,同时对数据量大和并发量高都有好处。页面静态化可以通过程序中的一些模板来实现如freemarker等
数据库优化:表结构优化,sql语法逻辑优化
分区:可以部分表达到分表类似的效果,就是将一张表中的数据按照一定的规则分到不同的区来保存,这样在查询数据时如果数据的范围在同一个区内就可以只对一个区的数据进行操作。这样的操作数据量更小,速度更快。对程序透明,程序不需要做任何改动
分表
按操作的类型分表,按字段的范围分表,按操作的时间段分区
索引的优化
使用存储过程代替直接操作,存储过程只编译一次
分离活跃的数据:比如说将论坛中活跃的用户保存到一张表,不活跃的用户分离到另一张表中,查询时先查默认表,查不到时再去不活跃的用户表中查询。
批量读取和延迟修改
减少操作的次数来提高效率
将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,它把启动的入口和具体的管理类分开,可以方便的创建出多种启动方式。