多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 三、Lars-DNS Service开发 ## **1) 简介** 负责接收各agent对某modid、cmdid的请求并返回该modid、cmdid下的所有节点,即为agent提供获取路由服务 ### 1.1 架构 ![](https://img.kancloud.cn/ae/40/ae40825410fb56d82c2ade175f428f41_1112x744.png) ### **1.2 网络模块** ​ DnsService服务模型采用了one loop per thread TCP服务器,主要是基于Lars-Reactor: - 主线程Accepter负责接收连接(agent端连接) - Thread loop们负责处理连接的请求、回复;(agent端发送查询请求,期望获取结果) ### **1.3 双map模型** ​ DnsServer使用两个map存储路由数据(key = `modid<<32 + cmdid` , value = set of `ip<<32 + port`) - 一个`RouterDataMap_A`:主数据,查询请求在此map执行 - 另一个`RouterDataMap_B`:后台线程周期性重加载路由到此map,作为最新数据替换掉上一个map 这两个map分别由指针`data_pointer`与`temp_pointer`指向. ### 1.4 Backend Thread守护线程 **dns service还有个业务线程:** 1、负责周期性(default:1s)检查`RouteVersion`表版本号,如有变化,说明`RouteData`有变更,则重加载`RouteData`表内容;然后将`RouteChange`表中被变更的`modid`取出,根据订阅列表查出`modid`被哪些连接订阅后,向所有工作线程发送任务:要求订阅这些`modid`的连接推送`modid`路由到agent 2、此外,还负责周期性(default:8s)重加载`RouteData`表内容 **PS:重加载`RouteData`表内容的细节** 重加载`RouteData`表内容到`temp_pointer`指向的`RouterDataMap_B`,而后上写锁,交换指针`data_pointer`与`temp_pointer`的地址,于是完成了路由数据更新 ### **主业务** 1. 服务启动时,`RouteData`表被加载到`data_pointer`指向的`RouterDataMap_A`中, `temp_pointer`指向的`RouterDataMap_B`为空 2. 服务启动后,agent发来Query for 请求某`modid/cmdid`,到其所在Thread Loop上,上读锁查询`data_pointer`指向的`RouterDataMap_A`,返回查询结果; 3. 如果此`modid/cmdid`不存在,则把`agent ip+port`+`moid/cmdid`发送到Backend thread loop1的队列,让其记录到ClientMap 后台线程Backend thread每隔10s清空`temp_pointer`指向的`RouterDataMap_B`,再加载`RouteData`表内容到`temp_pointer`指向的`RouterDataMap_B`,加载成功后交换指针`data_pointer`与`temp_pointer`指针内容,于是完成了路由数据的更新. --- ### 关于作者: 作者:`Aceld(刘丹冰)` mail: [danbing.at@gmail.com](mailto:danbing.at@gmail.com) github: [https://github.com/aceld](https://github.com/aceld) 原创书籍: [https://www.kancloud.cn/@aceld](https://www.kancloud.cn/@aceld) ![](https://img.kancloud.cn/b0/d1/b0d11a21ba62e96aef1c11d5bfff2cf8_227x227.jpg) >**原创声明:未经作者允许请勿转载, 如果转载请注明出处**