## 11) API初始化接口(V0.8)
? 我們每次在使用`get_host`,`get_route`的時候,首次拉取一定是不成功的,因為第一首次拉取,agent server并沒有對當前的`modid/cmdid`的route信息做本地緩存,所以我們可以提供一個初始化的接口,在初始化過程中,首先對當前的modid/cmdid全部進行獲取,也就是調用一次`get_route()`方法。來讓agent針對當前`modid/cmdid`向`dns service`拉取下來對應的host信息。
> api/cpp/lars_api/lars_api.cpp
```c
//lars 系統初始化注冊modid/cmdid使用(首次拉取)(初始化使用,只調用一次即可)
int lars_client::reg_init(int modid, int cmdid)
{
route_set route;
int retry_cnt = 0;
while (route.empty() && retry_cnt < 3) {
get_route(modid, cmdid, route);
if (route.empty() == true) {
usleep(50000); // 等待50ms
}
else {
break;
}
++retry_cnt;//嘗試3次
}
if (route.empty() == true) {
return lars::RET_NOEXIST;//3
}
return lars::RET_SUCC; //0
}
```
然后我們在使用lars api進行開發的時候,采用如下步驟
> api/cpp/example/example.cpp
```c
#include "lars_api.h"
#include <iostream>
void usage()
{
printf("usage: ./example [modid] [cmdid]\n");
}
int main(int argc, char **argv)
{
int ret = 0;
if (argc != 3) {
usage();
return 1;
}
int modid = atoi(argv[1]);
int cmdid = atoi(argv[2]);
lars_client api;
std::string ip;
int port;
//1. lars_api 初始化(只調用一次)
ret = api.reg_init(modid, cmdid);
if (ret != 0) {
std::cout << "modid " << modid << ", cmdid " << cmdid << " still not exist host, after register, ret = " << ret << std::endl;
}
//2. 獲取modid/cmdid下全部的host的ip+port
route_set route;
ret = api.get_route(modid, cmdid, route);
if (ret == 0) {
std::cout << "get route succ!" << std::endl;
for (route_set_it it = route.begin(); it != route.end(); it++) {
std::cout << "ip = " << (*it).first << ", port = " << (*it).second << std::endl;
}
}
//3. 獲取一個host的ip+port
int cnt = 0;
ret = api.get_host(modid, cmdid, ip, port);
if (ret == 0) {
std::cout << "host is " << ip << ":" << port << std::endl;
//上報調用結果 0 表示成功, 1 表示過載
//這里為了測試結果,隨機添加過載記錄
if (cnt % 3 == 0) {
api.report(modid, cmdid, ip, port, 1);
}
else {
api.report(modid, cmdid, ip, port, 0);
}
}
return 0;
}
```
---
### 關于作者:
作者:`Aceld(劉丹冰)`
mail: [danbing.at@gmail.com](mailto:danbing.at@gmail.com)
github: [https://github.com/aceld](https://github.com/aceld)
原創書籍: [http://www.hmoore.net/@aceld](http://www.hmoore.net/@aceld)

>**原創聲明:未經作者允許請勿轉載, 如果轉載請注明出處**
- 一、Lars系統概述
- 第1章-概述
- 第2章-項目目錄構建
- 二、Reactor模型服務器框架
- 第1章-項目結構與V0.1雛形
- 第2章-內存管理與Buffer封裝
- 第3章-事件觸發EventLoop
- 第4章-鏈接與消息封裝
- 第5章-Client客戶端模型
- 第6章-連接管理及限制
- 第7章-消息業務路由分發機制
- 第8章-鏈接創建/銷毀Hook機制
- 第9章-消息任務隊列與線程池
- 第10章-配置文件讀寫功能
- 第11章-udp服務與客戶端
- 第12章-數據傳輸協議protocol buffer
- 第13章-QPS性能測試
- 第14章-異步消息任務機制
- 第15章-鏈接屬性設置功能
- 三、Lars系統之DNSService
- 第1章-Lars-dns簡介
- 第2章-數據庫創建
- 第3章-項目目錄結構及環境構建
- 第4章-Route結構的定義
- 第5章-獲取Route信息
- 第6章-Route訂閱模式
- 第7章-Backend Thread實時監控
- 四、Lars系統之Report Service
- 第1章-項目概述-數據表及proto3協議定義
- 第2章-獲取report上報數據
- 第3章-存儲線程池及消息隊列
- 五、Lars系統之LoadBalance Agent
- 第1章-項目概述及構建
- 第2章-主模塊業務結構搭建
- 第3章-Report與Dns Client設計與實現
- 第4章-負載均衡模塊基礎設計
- 第5章-負載均衡獲取Host主機信息API
- 第6章-負載均衡上報Host主機信息API
- 第7章-過期窗口清理與過載超時(V0.5)
- 第8章-定期拉取最新路由信息(V0.6)
- 第9章-負載均衡獲取Route信息API(0.7)
- 第10章-API初始化接口(V0.8)
- 第11章-Lars Agent性能測試工具
- 第12章- Lars啟動工具腳本