这个TCP代理功能终于写完了,有什么疑问吗?
摘要:24年终自己立了flag: 25年做些轮子玩(用于浪费生命,赚不了钱) 所以25年就准备用c#写一个网络代理NZOrz(nginx知道吧,就那玩意儿干的事),包含 udptcphttp1 2 3, 至于为啥不用rust写,主要由于某台电
24年终自己立了flag: 25年做些轮子玩(用于浪费生命,赚不了钱)
所以25年就准备用c#写一个网络代理NZOrz(nginx知道吧,就那玩意儿干的事),包含 udp/tcp/http1 2 3,
至于为啥不用rust写,主要由于某台电脑某些不可告知的原因不方便安装rust,所以等我写完c#的,后面有空再说吧(应该25年没时间了吧)
代码借鉴出处
秉承将生命浪费到底的造轮子精神,实力不行就尽可能借鉴(抄袭,读书人的事,怎么能说呢)
所以这里首先列举一下借鉴出处
借鉴 Kestrel 的 socket 处理核心 (理论上基于Kestrel也是可行的)
借鉴 Yarp 各项代理处理 (实现只有http)
所以整体实现上都是socket 上层做多线程处理,不编写与系统内核交互或者其他io事件库打交道的代码
(为啥?要打跨平台交道,我不如直接用 rust 写 linux的,window写不写看心情,反正服务器是王道是不是)
局限
不得不先提一个局限,dotnet 的socket 没有提供统一的跨进程socket转移api,因为dotnet是跨平台的,不同系统存在差异,该issue Migrate Socket between processes 已经多年没有下文了
所以不好做到热重启
初步完成进度
TCP server core
TCP proxy core
dns (use system dns, no query from dns server )
LoadBalancingPolicy
Passive HealthCheck
TCP Connected Active HealthCheck
Configuration
reload config and rebind
Log
UDP server core
Config Validators
UDP proxy core
HTTP1 server core
HTTP2 server core
HTTP3 server core
HTTP proxy core
Metrics
对,目前主要是完成了基础的 tcp 部分(代理协议不支持,毕竟有那么多,时间也有限),下一步以 udp 为优先,(文档吗?等我先完成再说)
tcp代理使用
目前没有提供现成打包好的exe或者docker镜像,毕竟离完成还有很远的距离
要玩可以这样
建一个 net8.0 或者net9.0 的Console 项目
安装package
dotnet add package NZ.Orz --version 0.0.0.2-beta
入口代码
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using NZ.Orz;
using NZ.Orz.ReverseProxy.L4;
var app = NZApp.CreateBuilder(args)
.UseJsonConfig()
.Build();
await app.RunAsync();
配置 文件 appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
"ReverseProxy": {
"Routes": {
"apidemo": {
"Protocols": "TCP",
"Match": {
"Hosts": [ "*:5000" ]
},
"ClusterId": "apidemo",
"RetryCount": 1,
"Timeout": "00:00:11"
}
},
"Clusters": {
"apidemo": {
"LoadBalancingPolicy": "RoundRobin",
"HealthCheck": {
"Active": {
"Enable": false,
"Policy": "Connect"
}
},
"Destinations": [
{
"Address": "[::1]:5144"
