1. 我们每次在使用`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

    1. //lars 系统初始化注册modid/cmdid使用(首次拉取)(初始化使用,只调用一次即可)
    2. int lars_client::reg_init(int modid, int cmdid)
    3. {
    4. route_set route;
    5. int retry_cnt = 0;
    6. while (route.empty() && retry_cnt < 3) {
    7. get_route(modid, cmdid, route);
    8. if (route.empty() == true) {
    9. usleep(50000); // 等待50ms
    10. }
    11. else {
    12. break;
    13. }
    14. ++retry_cnt;//尝试3次
    15. }
    16. if (route.empty() == true) {
    17. return lars::RET_NOEXIST;//3
    18. }
    19. return lars::RET_SUCC; //0
    20. }

    然后我们在使用lars api进行开发的时候,采用如下步骤

    api/cpp/example/example.cpp

    1. #include "lars_api.h"
    2. #include <iostream>
    3. void usage()
    4. {
    5. printf("usage: ./example [modid] [cmdid]\n");
    6. }
    7. int main(int argc, char **argv)
    8. {
    9. int ret = 0;
    10. if (argc != 3) {
    11. usage();
    12. return 1;
    13. }
    14. int modid = atoi(argv[1]);
    15. int cmdid = atoi(argv[2]);
    16. lars_client api;
    17. std::string ip;
    18. int port;
    19. //1. lars_api 初始化(只调用一次)
    20. ret = api.reg_init(modid, cmdid);
    21. if (ret != 0) {
    22. std::cout << "modid " << modid << ", cmdid " << cmdid << " still not exist host, after register, ret = " << ret << std::endl;
    23. }
    24. //2. 获取modid/cmdid下全部的host的ip+port
    25. route_set route;
    26. ret = api.get_route(modid, cmdid, route);
    27. if (ret == 0) {
    28. std::cout << "get route succ!" << std::endl;
    29. for (route_set_it it = route.begin(); it != route.end(); it++) {
    30. std::cout << "ip = " << (*it).first << ", port = " << (*it).second << std::endl;
    31. }
    32. }
    33. //3. 获取一个host的ip+port
    34. int cnt = 0;
    35. ret = api.get_host(modid, cmdid, ip, port);
    36. if (ret == 0) {
    37. std::cout << "host is " << ip << ":" << port << std::endl;
    38. //上报调用结果 0 表示成功, 1 表示过载
    39. //这里为了测试结果,随机添加过载记录
    40. if (cnt % 3 == 0) {
    41. api.report(modid, cmdid, ip, port, 1);
    42. }
    43. else {
    44. api.report(modid, cmdid, ip, port, 0);
    45. }
    46. }
    47. return 0;
    48. }