如何在C++中判断URL是否指向当前服务器自身
C++ 分布式集群过滤自身主机URL的实现方案
实现逻辑非常简单,不需要引入额外依赖,用C++标准库就能完成:
核心思路
每个节点本地存储自身对外服务的唯一URL标识,遍历全量主机列表时直接跳过和自身URL匹配的条目即可,全量主机列表可以统一维护不用针对每个节点单独裁剪。
具体实现步骤
1. 提前确定本地节点的URL标识
节点启动时就生成/读取自身对外服务的URL(格式和全量列表里的URL规则完全一致,比如统一为http://对外IP:服务端口),可以通过以下任意一种方式获取:
- 从本地配置文件读取
- 通过启动参数传入
- 调用系统接口读取网卡对外IP,拼接固定服务端口生成
2. 实现过滤逻辑
直接用STL的std::copy_if就能完成过滤,示例代码如下:
#include <vector> #include <string> #include <algorithm> /** * @brief 过滤全量主机列表,移除本地节点自身的URL * @param all_hosts 统一维护的全量主机URL列表 * @param local_url 本地节点的对外服务URL * @return 过滤后可连接的目标主机列表 */ std::vector<std::string> filter_self_host(const std::vector<std::string>& all_hosts, const std::string& local_url) { std::vector<std::string> valid_hosts; std::copy_if(all_hosts.begin(), all_hosts.end(), std::back_inserter(valid_hosts), [&local_url](const std::string& host_url) { // 不匹配自身URL的条目才保留 return host_url != local_url; }); return valid_hosts; }
注意事项
- 必须保证全量列表里的URL格式和本地节点URL格式完全一致,避免出现
http://10.0.0.1:8080和http://10.0.0.1:8080/(多尾斜杠)、http://node1:8080(用域名)匹配失败的问题 - 如果主机列表存储的是自定义结构体,只要把lambda表达式里的比较逻辑替换为结构体对应的URL字段比较即可,逻辑完全通用
- 全量列表规模很大的场景,可以提前将URL预计算为哈希值,直接比较哈希值减少长字符串比较的开销
内容的提问来源于stack exchange,提问作者user491880
相关产品推荐
相关产品推荐

