我们每次在使用`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
//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
#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+portroute_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+portint 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;}
