VProxy是一个零依赖的负载均衡器和SDN虚拟交换机。本项目仅需要Java 21即可运行。
- clone,2) 编译,3) 运行!
- TCP和TLS负载均衡
- HTTP/1.x和HTTP/2负载均衡,支持根据Host分发请求
- 支持其他协议的负载均衡,例如grpc, dubbo
- Socks5服务
- DNS服务,支持A|AAAA记录
- 与Kubernetes整合
- 封装好的针对特定场景的应用,例如
WebSocksProxyAgent
和WebSocksProxyServer
- 支持完整TCP/IP协议栈的SDN虚拟交换机
使用已构建的版本
查看 release page.
使用release页面中最新的vproxy-linux
二进制文件。
或者
使用jlink
打包的运行时文件:点这里下载。
使用release页面中最新的vproxy-macos
二进制文件。
Java运行时可以从这里下载。
使用jlink
打包的运行时文件:点这里下载。
打包前置需求
运行如下命令初始化submodules以及运行一些其他的初始化工作:
make init
打jar包
./gradlew clean jar
java -jar build/libs/vproxy.jar -Deploy=HelloWorld
jlink
make jlink
./build/image/bin/vproxy -Deploy=HelloWorld
docker
# make docker
docker run -it --rm vproxyio/vproxy -Deploy=HelloWorld
graal native-image
make image
./vproxy -Deploy=HelloWorld
native fds impl
仅支持macos(bsd)/linux。
make vfdposix
java -Dvfd=posix -Djava.library.path=./base/src/main/c -jar build/libs/vproxy.jar -Deploy=HelloWorld
此外,Windows有一个特别版本用于支持Tap设备:-Dvfd=windows
,但是普通fd和事件循环依旧是jdk selector channel.
make vfdwindows
java -Dvfd=windows -Djava.library.path=./base/src/main/c -jar build/libs/vproxy.jar -Deploy=HelloWorld
Windows TAP依赖OpenVPN TAP Driver。MacOS TAP依赖tuntaposx。
MacOS TUN、Linux TAP和TUN均无特殊依赖。
xdp
推荐使用5.10(或者至少5.4)内核来启用switch模块的xdp支持。
如果使用比较低的版本,则无法在不同xdp网口之间共享umem。
要编译xdp,你需要这些软件包:apt-get install -y linux-headers-$(uname -r) build-essential libelf-dev clang llvm
,然后执行:
make vpxdp
在非Linux平台下,可在容器中编译:
make vpxdp-linux
测试功能
执行测试用例:
./gradlew runTest
在docker中执行测试用例:
make dockertest
测试vswitch, docker network plugin, vpctl, k8s controller:
# 需要事先安装virtualbox
cd ./misc/auto-setup/
./auto-setup.sh
./auto-verify.sh
ui
vproxy提供了一些ui工具
./gradlew ui:jar
java -cp ./ui/build/libs/vproxy-ui.jar $mainClassName
目前可用的ui工具:
io.vproxy.ui.calculator.CalculatorMain
: IPv4网段计算器
- 零依赖: 所有依赖均来自vproxy子项目。
- 简单:代码简单易懂。
- 运行时可修改:更新配置不需要重启。
- 高效:性能是首要目标之一。
- TCP负载均衡:支持TCP以及一些基于TCP的协议,也允许你使用自己的协议。
- Kubernetes:将vproxy资源整合到k8s中。
- SDN:根据流表和路由规则修改、转发网络包。
作为库使用
gradle
implementation group: 'io.vproxy', name: 'vproxy-adaptor-netty', version: '1.0.0-BETA-12'
// 可用的artifact有:dep, base, adaptor-netty, adaptor-vertx
maven
<dependency>
<groupId>io.vproxy</groupId>
<artifactId>adaptor-netty</artifactId>
<version>1.0.0-BETA-12</version>
</dependency>
<!-- 可用的artifact有:dep, base, adaptor-netty, adaptor-vertx -->
module-info.java
requires io.vproxy.dep;
requires io.vproxy.base;
requires io.vproxy.adaptor.netty;
requires io.vproxy.adaptor.vertx;
netty
var acceptelg = new VProxyEventLoopGroup();
var elg = new VProxyEventLoopGroup(4);
var bootstrap = new ServerBootstrap();
bootstrap
.channel(VProxyInetServerSocketChannel.class)
.childHandler(new ChannelInitializer<>() {
@Override
protected void initChannel(Channel ch) {
ChannelPipeline p = ch.pipeline();
p.addLast(new HttpServerCodec());
p.addLast(new HttpHelloWorldServerHandler());
}
});
bootstrap.group(acceptelg, elg);
bootstrap.bind(hostname, port).sync();
在K8S中使用vproxy
添加crd并启动vproxy和controller
kubectl apply -f https://github.com/vproxy-tools/vpctl/blob/master/misc/crd.yaml
kubectl apply -f https://github.com/vproxy-tools/vpctl/blob/master/misc/k8s-vproxy.yaml
启动示例应用
kubectl apply -f https://github.com/vproxy-tools/vpctl/blob/master/misc/cr-example.yaml
详细信息可见这里
简易模式
你可以用一行命令启动一个简单的负载均衡:
java -Deploy=Simple -jar vproxy.jar \
bind {port} \
backend {host1:port1,host2:port2} \
[ssl {path of cert1,cert2} {path of key}] \
[protocol {...}] \
可以输入help
检查参数列表。
标准模式
使用help
查看启动参数。
在启动vproxy后,你可以输入System:
来运行系统指令,你可以创建http-controller
和resp-controller
。后续则可以使用curl
或者redis-cli
来操作该vproxy实例。当然你也可以直接通过标准输入(stdin)来操作vproxy实例。
查看command.md和api文档以获取更多信息。
- how-to-use.md(中文): 如何使用配置文件和controller。
- api.yaml: http-controller的api文档(swagger格式)。
- lb-example.md(中文): 关于TCP负载均衡的一个使用例子。
- architecture.md: 架构相关。
- extended-app.md(中文): 扩展应用的使用方式。
- websocks.md: The WebSocks Protocol.
- vproxy-kcp-tunnel.md: The KCP Tunnel Protocol.
- using-application-layer-protocols.md(中文): 关于如何使用(自定义的)应用层协议。
- vpws-direct-relay.md(中文): 如何使用
vpws-agent
的direct-relay
功能。
- VProxy软交换(vpss): 一个家用的软路由(交换机)。
目前只有我
自己在维护这个项目。希望能有更多人加入 :)
感谢曾经提交过PR的贡献者,见CONTRIB。