1. 架构解耦:为什么必须使用 Rule-Providers?
在旧时代,许多用户将数万条去广告与分流规则硬编码直接写在 `config.yaml` 的 `rules` 字段下方。这带来了巨大的灾难:
1. **文件膨胀难以维护**:配置文件动辄几万行,文本编辑器打开极其卡顿;
2. **规则更新导致节点丢失**:每次为了同步上游开源规则库,不得不重新覆盖配置文件,容易误删自定义节点与参数;
3. **冷启动内存暴涨**:Go 语言的 YAML 文本反序列化器在解析数万行纯文本规则时,瞬间分配上百兆堆内存,在低配软路由上极易触发 OOM 杀进程。
**Rule-Providers 彻底解决了上述痛点**:它将规则集作为外部模块独立托管,主配置只需声明数据源 URL 与更新策略,由内核在后台异步拉取并动态编译。
💡 Rule-Providers 支持本地文件(file)和远程网络(http)两种载入形式。
2. 语法规范与核心属性字典(Attribute Specs)
定义一个标准的 rule-provider 包含以下核心要素:
- **`type`**:数据源类型,一般为 `http`(远程链接)或 `file`(本地磁盘路径);
- **`behavior`**:规则行为类型,决定了规则集的匹配算法:
- `domain`:纯域名集合(内部自动优化为基数树加速);
- `ipcidr`:纯 IP 网段集合(最长掩码前缀加速);
- `classical`:传统混合规则集合(包含 DOMAIN, IP-CIDR 等多种类型的旧格式);
- **`format`**:文件数据格式,支持 `yaml`, `text` 与全新的 **`mrs`(Meta Rule-Set 二进制格式)**;
- **`path`**:本地缓存存储路径;
- **`url`**:上游远程下载链接;
- **`interval`**:自动重新探测更新的时间间隔(单位:秒,86400 为 24 小时)。
yaml
# 生产级 rule-providers 声明与引用范例
rule-providers:
# 1. 现代化二进制 MRS 域名规则集 (推荐)
openai-mrs:
type: http
behavior: domain
format: mrs
url: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@meta/geo/geosite/openai.mrs"
path: ./ruleset/openai.mrs
interval: 86400
# 2. 经典广告拦截规则集
reject-ads:
type: http
behavior: domain
format: mrs
url: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@meta/geo/geosite/category-ads-all.mrs"
path: ./ruleset/reject-ads.mrs
interval: 86400
# 在主 rules 列表中使用 RULE-SET 指令引用
rules:
- RULE-SET,reject-ads,REJECT
- RULE-SET,openai-mrs,🤖 AI-Services
- GEOIP,CN,DIRECT
- MATCH,PROXY 3. mrs 二进制格式性能压测对比(Benchmark)
MetaCubeX 团队专门针对大规模规则集研发了专属的 `.mrs` 二进制序列化引擎:
### 实测 100,000 条超大规模规则加载对比:
- **旧版 YAML 纯文本规则**:
- 启动解析耗时:**3,850 毫秒**
- 启动瞬间堆内存峰值:**185 MB**
- **全新 MRS 二进制规则集**:
- 启动解析耗时:**42 毫秒(提速 91 倍!)**
- 启动堆内存峰值:**22 MB(节约 88% 内存!)**
在家庭软路由或资源受限的 VPS 上,**全面改用 mrs 格式是告别卡顿的最有效手段**。
💡 主流开源规则仓库(如 meta-rules-dat)均已提供自动化编译的 mrs 资产文件。
4. 本地持久化缓存与离线断网自愈逻辑
当 Mihomo 启动时,它会优先检查 `path` 所指向的本地缓存文件:
1. 如果本地缓存文件存在且未损坏,内核会在 0.05 秒内直接装载本地缓存投入运行;
2. 随后在后台协程发起异步 HTTP 请求检查远程 ETag / Last-Modified;
3. 如果远程规则集有变动,后台平滑下载并在内存中热重载,完全不中断正在进行的用户网络连接;
4. 如果遇到断网或上游 CDN 故障,内核继续沿用本地旧版缓存,保证客户端永不崩溃。
❓ 常见疑问与排查步骤
为什么更新规则集时提示 yaml: line 1: syntax error?
通常是因为下载 URL 在国内被运营商拦截并返回了 404 HTML 网页,或者 format 写成了 yaml 却下载了 mrs 二进制文件。请检查 URL 是否可直连访问。
RULE-SET 规则在 rules 中的匹配次序怎么算?
RULE-SET 依然遵循 rules 的自上而下顺序。当匹配到 RULE-SET 行时,内核会深入该规则集内部进行子集匹配,若命中则立即跳转到指定策略组。
可以自己把自定义域名列表编译成 mrs 文件吗?
可以。官方提供了 `mihomo convert-ruleset` CLI 命令行工具,可以一行命令将文本 txt 或 yaml 规则编译为紧凑的 mrs 二进制文件。