# 多网络支持

### 背景

在工控行业等场合, 要求每台服务器都是多网卡, 且通过不同网络, 不同交换机互联, 即每个服务都至少有两个ip地址可以访问, 当一路网络(交换机)出现问题, 这个服务也能通过另外一路网络正常工作, 从而保证服务的高可用性.

### 多网络需求

* 双网络情况下, AB服务分别部署在两台机器上, 每台服务器有两个网络(两个ip), x & y代表不同的网络, 比如A服务ip为: ip\_x\_1, ip\_y\_1, B服务ip为: ip\_x\_2, ip\_y\_2
* 对同一个服务, 如果某个网络是联通的, 则一直选择这个网络通信, 除非不通, 才切换到另外一个网络;
* 服务采用集群概念, 没有主从概念, 核心是出现问题需要切换到另外一个网络, 从而保证服务的高可用性;
* 客户端A和服务端B(部署了n台机器), 只要和某一个节点, 某一个网络通信成功, 就可以正常工作;

### 设计思路

框架支持双网的修改:

* 服务都绑定在0.0.0.0上, 这样所有网卡都绑定了;
* 在t\_node\_info表需要增加映射关系, 添加这个节点对应的内网ip(多个), 这个映射关系让tarsnode自己上报, tarsnode启动时上报自己的ip, 记录到框架中!
* tarsregistry加载服务的时候, 如果发现是0.0.0.0, 将地址换成这个节点对应的多个ip地址
* tarsregistry做名字服务查询服务的ip时, 就会查询服务的多个ip地址(因为上一个环节记录了服务的多个ip)
* 客户端和服务器端rpc时, 首先会拿到服务器对应多个ip地址, 依次轮流通信, 如果通信失败, 则切换到下一个ip地址

普通rpc调用通过以上方式即可完成双网支持, 且有网络不通, 则会自动屏蔽(需要调节rpc通信网络故障的敏感度), 但是对于raft机制的服务而言, 需要做额外的处理, 以保证raft机制的正常工作:

* raft节点的判断, 不再以ip为维度判断, 以EndpointF中的nodeName为key判断有哪些节点, 以节点名称作为key, 而不是以ip作为key
* 同一个节点可能对应多个ip list, 将多个ip组合成一个地址, 然后获取prx, 例如: obj\@tcp -h ip1 -p port1:tcp -h ip2 -p port2
* 节点间通信时, prx->rpc调用时, 会依次轮流通信, 如果通信失败, 则切换到下一个ip地址

原则上, 可以支持n网, 而不仅仅是双网!


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://tarscloud.gitbook.io/tarsdocs/qi-ye-ban-ben-jie-shao/tars-interfaces.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
