Skip to content

Latest commit

 

History

History
336 lines (218 loc) · 8.95 KB

README_ZH.md

File metadata and controls

336 lines (218 loc) · 8.95 KB

vproxy

Build Status

简介

VProxy是一个零依赖的基于NIO的TCP负载均衡器。本项目仅需要Java 11即可运行。

  1. clone,2) 编译,3) 运行!

特性

  1. TCP和TLS负载均衡
  2. HTTP/1.x和HTTP/2负载均衡,支持根据Host分发请求
  3. 支持其他协议的负载均衡,例如grpc, dubbo
  4. Socks5服务
  5. DNS服务,支持A|AAAA记录
  6. 与Kubernetes整合
  7. 封装好的针对特定场景的应用,例如WebSocksProxyAgentWebSocksProxyServer

构建

使用已构建的版本

查看 release page.

For linux

使用release页面中最新的vproxy-linux二进制文件。

或者

使用jlink打包的运行时文件:点这里下载。

For macos

使用release页面中最新的vproxy-macos二进制文件。

For windows

Java运行时可以从这里下载。

For musl

使用jlink打包的运行时文件:点这里下载。

打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。另外在编译前,你还需要配置JAVA_HOME环境变量。

make vfdposix
java -Dvfd=posix -Djava.library.path=./base/src/main/c -jar build/libs/vproxy.jar -Deploy=HelloWorld

如果要使用F-Stack版本,可以按照这个文档的步骤执行:fstack-how-to.md

此外,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工具:

  1. io.vproxy.ui.calculator.CalculatorMain: IPv4网段计算器

目标

  • 零依赖: 除了java和kotlin标准库外不加任何依赖。
  • 简单:代码简单易懂。
  • 运行时可修改:更新配置不需要重启。
  • 高效:性能是首要目标之一。
  • 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

详细信息可见这里

vpctl

我们提供一个命令行客户端应用,来帮助你操作vproxy实例。你可以参考vpctl的仓库以获取更多信息。

该工具经过完整的测试,并且非常简单易用。该工具的仓库里提供了一些例子供参考。

简易模式

你可以用一行命令启动一个简单的负载均衡:

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-controllerresp-controller。后续则可以使用curl或者redis-cli来操作该vproxy实例。当然你也可以直接通过标准输入(stdin)来操作vproxy实例。

查看command.mdapi文档以获取更多信息。

文档

产品

贡献

目前只有自己在维护这个项目。希望能有更多人加入 :)

感谢曾经提交过PR的贡献者,见CONTRIB