Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] Routing API #414

Closed
ghost opened this issue Mar 21, 2021 · 16 comments · May be fixed by #412
Closed

[Feature] Routing API #414

ghost opened this issue Mar 21, 2021 · 16 comments · May be fixed by #412
Labels
enhancement New feature or request

Comments

@ghost
Copy link

ghost commented Mar 21, 2021

增加动态调整路由的API

 rpc AddRule(AddRuleRequest) returns (AddRuleResponse){}
 rpc AlterRule(AlterRoutingRuleRequest) returns (AlterRuleResponse){}
 rpc RemoveRule(RemoveRoutingRuleRequest) returns (RemoveRuleResponse){}
 rpc SetRules(repeated RoutingRule) returns (){}
 rpc GetRules() returns (repeated RoutingRule){}

 rpc AddBalancer(AddBalancerRequest) returns (AddBalancerResponse){}
 rpc AlterBalancer(AlterBalancerRequest) returns (AlterBalancerResponse){}
 rpc RemoveBalancer(RemoveBalancerRequest) returns (RemoveBalancerResponse){} 
 rpc GetBalancers() returns (repeated BalancingRule){}
  • AddRuleRequest中加入指定index字段,不指定则append到最后

draft 1

#412 中,@tat5522 引入了的 6 个API :

 rpc AddRoutingRule(AddRoutingRuleRequest) returns (AddRoutingRuleResponse){}
 rpc AlterRoutingRule(AlterRoutingRuleRequest) returns (AlterRoutingRuleResponse){}
 rpc RemoveRoutingRule(RemoveRoutingRuleRequest) returns (RemoveRoutingRuleResponse){}
 rpc AddBalancingRule(AddBalancingRuleRequest) returns (AddBalancingRuleResponse){}
 rpc AlterBalancingRule(AlterBalancingRuleRequest) returns (AlterBalancingRuleResponse){}
 rpc RemoveBalancingRule(RemoveBalancingRuleRequest) returns (RemoveBalancingRuleResponse){} 

此方式可以调整任意一个路由规则,但是需要为每一条路由引入 Tag。
此方案可能需要添加几个借口获取 BalancingRules 与 RoutingRules。
此方案的 AddRoutingRule 还需要考虑添加规则的位置。

draft 2

 rpc SetRules(repeated RoutingRule) returns (){}
 rpc GetRules() returns (repeated RoutingRule){}
 rpc SetBalancer(BalancingRule) returns (){}
 rpc GetBalancers() returns (repeated BalancingRule){}

与方案1不同,方案二选择修改整个路由规则,无需为每个路由添加tag。
在一定程度上,所有路由规则是一个整体。因此我认为,修个整个路由规则更加合理。

希望能够与 @DuckSoft @2dust @yuhan6665 @CerteKim 等第三方客户端作者共同确定此接口。

@ghost ghost added the enhancement New feature or request label Mar 21, 2021
@rurirei
Copy link
Contributor

rurirei commented Mar 21, 2021

此方式可以调整任意一个路由规则,但是需要为每一条路由引入 Tag

former agreed as it is similar to v2ray/xray routing conf in personally.

@tat5522
Copy link

tat5522 commented Mar 21, 2021

此方式可以调整任意一个路由规则,但是需要为每一条路由引入 Tag。

通过此方案可以很容易的控制路由规则,无控制路由规则需求时RuleObject中无需带入Tag属性,与现有Config没有变化。
此方案使用者只需做好对应的关系映射采用Tag进行控制。

在一定程度上,所有路由规则是一个整体。因此我认为,修个整个路由规则更加合理。

此方案由于没有Tag属性,控制时需要对所有路由规则进行遍历找到所需修改的路由规则再修改。
个人认为此方案对于使用者提升了复杂度。

@ghost
Copy link
Author

ghost commented Mar 21, 2021

@tat5522

将二者合并?

 rpc AddRule(AddRuleRequest) returns (AddRuleResponse){}
 rpc AlterRule(AlterRoutingRuleRequest) returns (AlterRuleResponse){}
 rpc RemoveRule(RemoveRoutingRuleRequest) returns (RemoveRuleResponse){}
 rpc SetRules(repeated RoutingRule) returns (){}
 rpc GetRules() returns (repeated RoutingRule){}

 rpc AddBalancer(AddBalancerRequest) returns (AddBalancerResponse){}
 rpc AlterBalancer(AlterBalancerRequest) returns (AlterBalancerResponse){}
 rpc RemoveBalancer(RemoveBalancerRequest) returns (RemoveBalancerResponse){} 
 rpc GetBalancers() returns (repeated BalancingRule){}

另:现在的 AddRoutingRule 实为 AppendRoutingRule,是否有必要修改?

@tat5522
Copy link

tat5522 commented Mar 21, 2021

 rpc AddRule(AddRuleRequest) returns (AddRuleResponse){}
 rpc AlterRule(AlterRoutingRuleRequest) returns (AlterRuleResponse){}
 rpc RemoveRule(RemoveRoutingRuleRequest) returns (RemoveRuleResponse){}
 rpc SetRules(repeated RoutingRule) returns (){}
 rpc GetRules() returns (repeated RoutingRule){}

 rpc AddBalancer(AddBalancerRequest) returns (AddBalancerResponse){}
 rpc AlterBalancer(AlterBalancerRequest) returns (AlterBalancerResponse){}
 rpc RemoveBalancer(RemoveBalancerRequest) returns (RemoveBalancerResponse){} 
 rpc GetBalancers() returns (repeated BalancingRule){}

两者合并挺好。

另:现在的 AddRoutingRule 实为 AppendRoutingRule,是否有必要修改?

保持AddRoutingRule是为了与HandlerService风格保持一致。确实AppendRoutingRule更符合实际。

@ghost
Copy link
Author

ghost commented Mar 21, 2021

或许可以修改 AddRoutingRule,使其将新规则添加到指定位置?

@tat5522
Copy link

tat5522 commented Mar 21, 2021

或许可以修改 AddRoutingRule,使其将新规则添加到指定位置?

AddRuleRequest中加入指定index字段,不指定则append到最后

@ghost
Copy link
Author

ghost commented Mar 21, 2021

好的。

@RPRX @AkinoKaede 是否还有其他补充?

@AkinoKaede
Copy link
Contributor

GetRules() 是获取所有规则吗,或许可以增加一个 GetRule(),通过 tag 获取单条规则。

@tat5522
Copy link

tat5522 commented Mar 22, 2021

@JimhHan

我在尝试添加GetRules相关API,遇到了一个问题。

RoutingObject在初始化的时候,Domain如果带有geosite:参数,这个参数在infra/conf/router.go中会被parseDomainRule方法转为具体的domain内容。而这个内容在后面app/router/router.go中被rule.BuildCondition()方法转为DomainMatcher对象,这个过程似乎是不可逆转的。

Rule对象在转为RoutingRule时似乎无法拿到内容。

另外现有的Domain加载都是由infra/conf包来进行加载,函数都是私有方法。API加入的地方是在app/router下,外部添加RoutingRule时,也无法加载geosite:geoip:具体的内容。这一点想询问是否可以把infra/conf下的一些方法进行导出给其它的包使用?

@tat5522
Copy link

tat5522 commented Mar 22, 2021

另外现有的Domain加载都是由infra/conf包来进行加载,函数都是私有方法。API加入的地方是在app/router下,外部添加RoutingRule时,也无法加载geosite:geoip:具体的内容。这一点想询问是否可以把infra/conf下的一些方法进行导出给其它的包使用?

打算采用与config一致的结构作为API的参数,这样可以调用infra/conf/router.go``ParseRule方法。与config保持一致,API入参也与config一致

@ghost
Copy link
Author

ghost commented Mar 22, 2021

@tat5522

不需要修改 infra/conf,加载 geo*dat 的函数本质为 proto. Unmarshal,调用者可以自行解析。

另:我最近会将 GeoSite GeoIProuter 中剥离,并实现单独的配置解析。您可以先跳过这方面的内容。

@tat5522
Copy link

tat5522 commented Mar 23, 2021

 rpc AddRule(AddRuleRequest) returns (AddRuleResponse){}
 rpc AlterRule(AlterRoutingRuleRequest) returns (AlterRuleResponse){}
 rpc RemoveRule(RemoveRoutingRuleRequest) returns (RemoveRuleResponse){}

 rpc AddBalancer(AddBalancerRequest) returns (AddBalancerResponse){}
 rpc AlterBalancer(AlterBalancerRequest) returns (AlterBalancerResponse){}
 rpc RemoveBalancer(RemoveBalancerRequest) returns (RemoveBalancerResponse){} 

上述API已实现并提交。

GetXXX相关API因为rule.BuildCondition()时被转为了Matcher对象,获取不到原有的内容,这部分API暂未实现。

@tat5522
Copy link

tat5522 commented Apr 22, 2021

 rpc SetRules(repeated RoutingRule) returns (){}
 rpc GetRules() returns (repeated RoutingRule){}
 rpc GetRule(GetRoutingRuleRequest) returns (RoutingRule){}

 rpc GetBalancers() returns (repeated BalancingRule){}

上述路由API已经实现。其中RoutingRule相关Get API,由于部分Condition转换成对应的Matcher无法还原成RoutingRule,故在转换的时候增加了一个副本保存原有内容。
为了不占用内存,默认不开启副本备份。需要添加环境变量XRAY_ROUTER_API_GETSET才可以开启。不开启无法使用GetRuleAPI。
@RPRX @AkinoKaede @JimhHan

@ghost
Copy link

ghost commented Nov 3, 2023

2023年clash死了,这个还有希望支持么?

@yuhan6665
Copy link
Member

可以 来一个大佬 整理一下代码

@ghost
Copy link

ghost commented Nov 9, 2023

@yuhan6665 可以参考sing-box?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants