最后
看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。
开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题。
注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友
互联网工程师必备的面试1000题
而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。
本人的配置实例:
<VirtualHost *:80>
ServerAdmin limingzhong1985@gmail.com
ServerName 10.10.141.40 ServerAlias localhost
ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On
ProxyPassReverse / balancer://cluster/
ErrorLog “log/error.log”
CustomLog “log/access.log” common
注:1、balancer://是告诉Apache需要进行负载均衡的代理;
2、后面的cluster是集群名,可以随意取;
3、两个日志引擎ErrorLog负责记 录错误,CustomLog负责记录所有的http访问以及返回状态,日志名可以自己取。
6、再次打开D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf,文件结束处添加如下代码:
ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://10.10.141.39:8009 loadfactor=1 route=jvm1
BalancerMember ajp://10.10.141.40:8009 loadfactor=1 route=jvm2
注:1、ProxyRequests Off 是告诉Apache需要使用反向代理;
2、<proxy balancer://cluster>用于配置工作在集群中的节点列表,这里的“cluster”必须与上面的集群名保持一致;
3、Apache通过ajp协议与tomcat进行通信,ip地址和端口唯一确定了tomcat节点和配置的ajp接受端口;
4、loadfactor是负载因 子,Apache会按负载因子的比例向后端tomcat节点转发请求,负载因子越大,对应的tomcat服务器就会处理越多的请求,如两个tomcat都 是1,Apache就按1:1的比例转发,如果是2和1就按2:1的比例转发;
5、route参数对应后续tomcat配置中的引擎路径 (jvmRoute)。
7、重新启动Apache服务,在浏览器中访问:http:10.10.141.40,你会发现得到了一个503的错误,内容如下:
Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime orcapacityproblems. Please try again later
打开刚刚配置的错误文件,我们会发现如下信息:
…
[Mon Jun 18 17:59:16 2012] [error] (OS 10061)由于目标机器积极拒绝,无法连接。 : proxy: AJP: attempt to connect to 10.10.141.40:8009 (10.10.141.40) failed
[Mon Jun 18 17:59:16 2012] [error] ap_proxy_connect_backend disabling worker for (10.10.141.40)
[Mon Jun 18 17:59:16 2012] [error] proxy: AJP: failed to make connection to backend: 10.10.141.40
[Mon Jun 18 17:59:23 2012] [error] (OS 10060)由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
: proxy: AJP: attempt to connect to 10.10.141.39:8009 (10.10.141.39) failed
[Mon Jun 18 17:59:23 2012] [error] ap_proxy_connect_backend disabling worker for (10.10.141.39)
[Mon Jun 18 17:59:23 2012] [error] proxy: AJP: failed to make connection to backend: 10.10.141.39
从上面的信息我们可以知道:连接 10.10.141.40 和 10.10.141.39 两台服务器失败,原因是还没有启动Tomcat造成的。
8、配置Tomcat----server.xml文件
8.1、如果是2个Tomcat处于不同的机器上,就不需要修改任何端口;只是需要把注释符放开,同时将注释掉;
8.2、对于10.10.141.40的机器,将改为,怎么知道要改成这样呢,看下面的配置:
ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://10.10.141.39:8009 loadfactor=1 route=jvm1
BalancerMember ajp://10.10.141.40:8009 loadfactor=1 route=jvm2
在我的配置中,10.10.141.40对应的是:route=jvm2 ;
注:jvmRoute对应Apache httpd.conf中BalancerMember中配置的route参数。 8.3、对于Tomcat安装在同一台机器上的情况,则需要做端口修改工作,同时上面的配置可以修改为如下情形:
ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://localhost:8009loadfactor=1 route=jvm1
BalancerMember ajp://localhost:9009loadfactor=1 route=jvm2
接下来修改<Connector port=“8009” protocol=“AJP/1.3” redirectPort=“8443” />,将jvm2对应的Tomcat配置修改为<Connector port=“9009” protocol=“AJP/1.3” redirectPort=“8443” />。
注:端口对应 Apache httpd.conf中BalancerMember中配置的ajp连接端口。
8.4、将的注释放开,目的是可以在集群中的所有tomcat节点间共享会话(Session)。
8.5、配置Connector的端口,把jvm2设置为在9080端口侦听,保证2个Tomcat的监听端口的不同。
8.6、server.xml文件配置完毕后,我们放入一个简单的java项目应用测试,两个目的:
a:测试session信息是否丢失,即同一个请求在不同刷新过程中是否改变,如果改变则配置失败,反之配置成功;
b:测试session是否在集群中的各个节点中成功复制,复制成功则才能实现集群的目的:负载均衡; 在此引用一个网络上的测试session的例子:
在每个Tomcat的webapps目录下新建test目录,在test目录下新建test.jsp文件,代码如下:
[java] view plain copy print ?
-
<%@ page contentType=“text/html; charset=GBK” %>
-
<%@ page import=“java.util.*” %>
-
Cluster App Test -
Server Info:
-
<%
-
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+“
”);%> -
<%
-
out.println(“
ID " + session.getId()+”
"); -
String dataName = request.getParameter(“dataName”);
-
if (dataName != null && dataName.length() > 0) {
-
String dataValue = request.getParameter(“dataValue”);
-
session.setAttribute(dataName, dataValue);
-
}
-
out.print(“Session 列表”);
-
Enumeration e = session.getAttributeNames();
-
while (e.hasMoreElements()) {
-
String name = (String)e.nextElement();
-
String value = session.getAttribute(name).toString();
-
out.println( name + " = " + value+“
”); -
System.out.println( name + " = " + value);
-
}
-
%>
-
<form action=“test.jsp” method=“POST”>
-
名称:<input type=text size=20 name=“dataName”>
-
-
值:<input type=text size=20 name=“dataValue”>
-
8.7、在test目录下新建WEB-INF目录和web.xml,在节点下加入,通知Tomcat在当前应用集群中的所有节点间实现Session共享。
8.8、启动两个Tomcat节点和Apache服务,进行测试,在浏览器中输入:http://10.10.141.40/test/test.jsp
测试结果:
1、ID A13F7FD30C2ACA712BDF6EFAF9B7FD38.jvm2
Session 列表1 = 1
2、ID A13F7FD30C2ACA712BDF6EFAF9B7FD38.jvm1
Session 列表1 = 1
3、ID A13F7FD30C2ACA712BDF6EFAF9B7FD38.jvm2
Session 列表1 = 1
2 = 3
4、ID A13F7FD30C2ACA712BDF6EFAF9B7FD38.jvm1
Session 列表1 = 1
3 = 4
2 = 3
注:1、由于博客有时候上传执行图片有点不尽人意,所以这里摘录了几条数据,进行说明;
2、通过这些数据可以知道,前面的sessionId是固定没变得,当我们不停的点击提交时,小数点后面的内容变了,实际上可以知道是哪个节点处理了当次请求,说明sessionId在各个节点的复制成功了,达到了我们预想的测试目的b;
3、通过每条数据下得Session 列表可以知道:当我们增加新的数据的时候,前面存入session里面的数据并没有丢失,说明我们预想测试目的a成功了; 4、其实我们从两个Tomcat的控制台也可以看得出来,sessionId在不同节点是相同的;
总结
我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。
Mybatis源码解析
比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。
Mybatis源码解析
[外链图片转存中…(img-WSvMk1Hy-1715810688298)]
[外链图片转存中…(img-c1uBvvIJ-1715810688298)]