diff --git a/README.md b/README.md index de288f6..405e67c 100644 --- a/README.md +++ b/README.md @@ -126,8 +126,6 @@ rhoaias-client -s http://{公网IP}:8024 -t PCv11vMiZkigHfnzcMLTFg 你可以直接使用 kubernetes 目录下提供的[ingress-controller.yaml](./kubernetes/ingress-controller.yaml)部署文件。或者使用 helm 安装。helm-chart 位于`./kubernetes/ingress-rho-aias` 目录下。 -**注意:默认 ingress 是直接安装在 k8s 集群里的,如果要安装在集群外部,请确保该机器能够访问 k8s 集群,并配置`~/.kube/config`文件。** - ### 创建转发规则 在 Dashboard 的转发列表中,创建 http 转发,即可将指定的请求转发至内网指定的服务上。 @@ -152,7 +150,7 @@ Rho-Aias 可以直接使用 nuget 包添加到当前项目中。 dotnet add package Chaldea.Fate.RhoAias ``` -具体开发可以参考[开发文档]() +具体开发可以参考[开发文档](./docs/develop.md) ### Nuget 包列表 diff --git a/docs/develop.md b/docs/develop.md new file mode 100644 index 0000000..64d7666 --- /dev/null +++ b/docs/develop.md @@ -0,0 +1,158 @@ +# 开发文档 + +## 简单集成 + +以下为最简化的演示示例。 + +### 服务端开发 + +创建一个简单的服务端程序,服务端程序主要负责监听用户 http 请求或端口数据,并将此转发给客户端。 + +```bash +dotnet new webapi +``` + +添加包引用 + +```bash +dotnet add package Chaldea.Fate.RhoAias +``` + +打开 Program.cs 文件添加如下代码: + +```csharp +// 注册服务 +builder.Services.AddRhoAias(builder.Configuration); + +app.UseRhoAias(); +``` + +启动并运行 + +```bash +dotnet run +``` + +**说明** 程序运行后会监听端口,由于没有对 Kestrel 服务器做设置,默认 Http 监听和客户端连接转发都使用同一个端口。 + +添加初始化数据,可以使用 HostedService 来初始化,也可以直接在 Program 添加。 + +```csharp +var clientManager = app.Services.GetRequiredService(); +var proxyManager = app.Services.GetRequiredService(); +// 创建默认客户端 +var client = new Client +{ + Id = Guid.NewGuid(), + Name = "Testing", + Token = "1234567890" +}; +await clientManager.CreateClientAsync(client); + +// 创建一个转发配置 +var proxy = new Proxy +{ + Id = Guid.NewGuid(), + Name = "ForwardToClient", + ClientId = client.Id, + Type = ProxyType.HTTP, + Hosts = new[] { "localhost:5008" }, + /* + * 只把路径为/client的请求进行转发 + * 如果转发全部,那么当前程序的Controller接口就无法访问 + */ + Path = "/client/{**catch-all}", + // 目标webapi应用,演示中目标webapi应用和客户端共用一个项目 + Destination = "http://localhost:5283" +}; +proxy.EnsureLocalIp(); +await proxyManager.CreateProxyAsync(proxy); +``` + +### 客户端开发 + +创建客户端程序,客户端程序主要负责接受服务器流转的数据包,并发送到指定的目标 IP 和端口上。 + +客户端程序可以依据需求使用不同模板创建,如果只是用来转发数据流可以使用控制台程序,也可以使用 webapi 程序。 + +```bash +dotnet new webapi +``` + +添加包引用 + +```bash +dotnet add package Chaldea.Fate.RhoAias +``` + +打开 Program.cs 文件添加如下代码: + +```csharp +// 注册服务 +builder.Services.AddRhoAiasClient(builder.Configuration); +``` + +添加配置到 appsetting.json + +```json +"RhoAias": { + "Client": { + // 服务器地址 + "ServerUrl": "http://localhost:5008", + // 创建Client时定义的Token + "Token": "1234567890" + } +} +``` + +启动并运行 + +```bash +dotnet run +``` + +上述客户端示例使用了一个 webapi 模板,主要是为了演示服务器可以转发指定路径的请求到目标 webapi 应用上。为了简化客户端直接和 webapi 项目合并为一个项目了。 + +在客户端的 Controllers 文件夹中创建 ClientController.cs 文件,添加如下代码: + +```csharp +[ApiController] +public class ClientController : ControllerBase +{ + [HttpGet] + [Route("/client/test")] + public Task TestAsync() + { + return Task.FromResult("Message from client."); + } +} +``` + +验证结果,在浏览器中请求服务端的/client 接口,会全部转发到客户端的 api 上。 + +## 数据持久化 + +演示项目中,所有配置数据保存的内存中的,如果需要持久化,可以添加持久化的包到服务端项目中。 + +```bash +dotnet add package Chaldea.Fate.RhoAias.Repository.Sqlite +``` + +该包使用 Sqlite 作为持久化存储方案。你也可以通过创建自定义`Repository`类并实现`IRepository`接口来实现自定义存储。 + +可以引入EF来实现具体的数据库存储,示例: +```csharp +internal class MyRepository: IRepository where TEntity : class +{ + public async Task AnyAsync(Expression> predicate) + { + await using var context = _myDbFactory.CreateDbContext(); + return await context.Set().AnyAsync(predicate); + } +} +``` + +将存储替换成自定义存储类。 +```csharp +builder.Services.Replace(new ServiceDescriptor(typeof(IRepository<>), typeof(MyRepository<>), ServiceLifetime.Singleton)); +```