jdk1.7中提供了Object.equals,Object.hashCode方法非常方便。

传统的socket分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class BIOServer {

public static void main(String[] args) throws IOException {

ServerSocket serverSocket = new ServerSocket(10086);
System.out.println("Server started");
while (true){
Socket socket = serverSocket.accept(); // Blocking
System.out.println("a new client connected");
handler(socket);
}
}

private static void handler(Socket socket) {
byte[] buf = new byte[1024];
try {
InputStream inputStream = socket.getInputStream();
while (true){
int read = inputStream.read(buf); // Blocking
if (read != -1){
System.out.println(new String(buf,0,read));
} else {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println("socket closed");
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

以上的代码有2个地方阻塞:ServerSocket.acceptInputStream.read。当我们启动上述server,一旦有一个客户端连接到server,server就会阻塞,从而以后的客户端想要连接到server都不会打印”a new client connected”。一种常见的解决方案是创建一个新的handler线程,每个客户端连接的时候都创建一个新的线程为其服务,就好比一个餐厅每来一个客人都安排一个服务生,资源消耗非常大。所以传统的socket是无法实现长连接的服务器的,但是用短连接还是比较合适的,老版本的tomcat就是基于socket,因为http的问答机制,不会出现线程一直被一个客户端占用的情况,一个线程可以为多个客户端服务。

传统的socket单线程情况下只能为一个客户端服务,用线程池的情况下可以为多个客户端服务,但是资源消耗太大。

微服务

daily build很痛苦,每次commit都需要跑一个较大的CI,很耗时。让小的和频繁的升级成为可能,应用架构更加弹性可伸缩(横向拓展的一个重要目标就是无状态)。微服务带来的一个挑战是我们面对的不仅仅是一个应用,而是多个应用,有点像分布式系统。

为什么nginx比apache性能高很多

nginx采用事件驱动的epoll模型,而apache采用select轮询机制(类似于死循环)。

参考资料