http The instance will work in HTTP mode. The client request will be
analyzed in depth before connecting to any server. Any request
which is not RFC-compliant will be rejected. Layer 7 filtering,
processing and switching will be possible. This is the mode which
brings HAProxy most of its value.
tcp The instance will work in pure TCP mode. A full-duplex connection
will be established between clients and servers, and no layer 7
examination will be performed. This is the default mode. It
should be used for SSL, SSH, SMTP, ...
@:看了文档之后发现haproxy所谓的4层代理,我个人认为它并不是真正意义上的4层代理,:haproxy的4层tcp模式的工作原理如下图。
package com.framework.code.demo;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class MySqlReplicationDriverDemo {
public static void main(String[] args) throws Exception {
//监听本机3306端口,本机作为代理服务器
ServerSocket serverSocket = new ServerSocket(3306);
//这里为了测试只能与一个客户端进行连接
final Socket socket = serverSocket.accept();
//对应客户端的输出流
final InputStream clientInputStream = socket.getInputStream();
//对应客户端的输入流
final OutputStream clientOutputStream = socket.getOutputStream();
//与真实后端服务器进行tcp连接
Socket mysqlSocker = new Socket("192.168.80.111", 3306);
//对应后端输入流
final InputStream realInputStream = mysqlSocker.getInputStream();
//对应后端输出流
final OutputStream realOutputStream = mysqlSocker.getOutputStream();
//启动一个线程,负责读取客户端的输入数据,从客户端读取的所有数据全部转发给后端真实服务器
//clientInputStream >> realOutputStream
new Thread(new Runnable() {
@Override
public void run() {
try {
byte[] cache = new byte[2048];
while(true) {
//读取客户端的二进制数据
int index = clientInputStream.read(cache);
if(index == -1) {
return;
}
//全部发送给真实服务器
realOutputStream.write(cache, 0, index);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
//启动一个线程,负责读取真实服务器的输入数据,全部发送给客户端
//realInputStream >> clientOutputStream
new Thread(new Runnable() {
@Override
public void run() {
try {
byte[] cache = new byte[2048];
while(true) {
//读取真实服务器的二进制数据
int index = realInputStream.read(cache);
if(index == -1) {
return;
}
//全部发送给客户端
clientOutputStream.write(cache, 0, index);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
Thread.sleep(300000);
}
}