C++负载均衡远程调用学习之HOOK注册机制

目录

1.larV0.7-hook流程的说明

2.larV0.7-TCP_server集成链接HOOK函数

3.larV0.7-TCP_client集成链接HOOK注册功能


1.larV0.7-hook流程的说明

7.1 数据库表相关查询方法实现

​ 我们先实现一些基本的数据表达查询方法:

> lars_dns/src/dns_route.cpp

```c

/*

* return 0, 表示 加载成功,version没有改变

* 1, 表示 加载成功,version有改变

* -1 表示 加载失败

* */

int Route::load_version()

{

//这里面只会有一条数据

snprintf(_sql, 1000, "SELECT version from RouteVersion WHERE id = 1;");

int ret = mysql_real_query(&_db_conn, _sql, strlen(_sql));

if (ret)

{

fprintf(stderr, "load version error: %s\n", mysql_error(&_db_conn));

return -1;

}

MYSQL_RES *result = mysql_store_result(&_db_conn);

if (!result)

{

fprintf(stderr, "mysql store result: %s\n", mysql_error(&_db_conn));

return -1;

}

long line_num = mysql_num_rows(result);

if (line_num == 0)

{

fprintf(stderr, "No version in table RouteVersion: %s\n", mysql_error(&_db_conn));

return -1;

}

MYSQL_ROW row = mysql_fetch_row(result);

//得到version

long new_version = atol(row0);

if (new_version == this->_version)

{

//加载成功但是没有修改

return 0;

}

this->_version = new_version;

printf("now route version is %ld\n", this->_version);

mysql_free_result(result);

return 1;

}

2.larV0.7-TCP_server集成链接HOOK函数

//加载RouteData到_temp_pointer

int Route::load_route_data()

{

_temp_pointer->clear();

snprintf(_sql, 100, "SELECT * FROM RouteData;");

int ret = mysql_real_query(&_db_conn, _sql, strlen(_sql));

if (ret)

{

fprintf(stderr, "load version error: %s\n", mysql_error(&_db_conn));

return -1;

}

MYSQL_RES *result = mysql_store_result(&_db_conn);

if (!result)

{

fprintf(stderr, "mysql store result: %s\n", mysql_error(&_db_conn));

return -1;

}

long line_num = mysql_num_rows(result);

MYSQL_ROW row;

for (long i = 0;i < line_num; ++i)

{

row = mysql_fetch_row(result);

int modid = atoi(row1);

int cmdid = atoi(row2);

unsigned ip = atoi(row3);

int port = atoi(row4);

uint64_t key = ((uint64_t)modid << 32) + cmdid;

uint64_t value = ((uint64_t)ip << 32) + port;

(*_temp_pointer)key.insert(value);

}

printf("load data to tmep succ! size is %lu\n", _temp_pointer->size());

mysql_free_result(result);

return 0;

}

3.larV0.7-TCP_client集成链接HOOK注册功能

//将temp_pointer的数据更新到data_pointer

void Route::swap()

{

pthread_rwlock_wrlock(&_map_lock);

route_map *temp = _data_pointer;

_data_pointer = _temp_pointer;

_temp_pointer = temp;

pthread_rwlock_unlock(&_map_lock);

}

//加载RouteChange得到修改的modid/cmdid

//将结果放在vector中

void Route::load_changes(std::vector<uint64_t> &change_list)

{

//读取当前版本之前的全部修改

snprintf(_sql, 1000, "SELECT modid,cmdid FROM RouteChange WHERE version <= %ld;", _version);

int ret = mysql_real_query(&_db_conn, _sql, strlen(_sql));

if (ret)

{

fprintf(stderr, "mysql_real_query: %s\n", mysql_error(&_db_conn));

return ;

}

MYSQL_RES *result = mysql_store_result(&_db_conn);

if (!result)

{

fprintf(stderr, "mysql_store_result %s\n", mysql_error(&_db_conn));

return ;

}

long lineNum = mysql_num_rows(result);

if (lineNum == 0)

{

fprintf(stderr, "No version in table ChangeLog: %s\n", mysql_error(&_db_conn));

return ;

}

MYSQL_ROW row;

for (long i = 0;i < lineNum; ++i)

{

row = mysql_fetch_row(result);

int modid = atoi(row0);

int cmdid = atoi(row1);

uint64_t key = (((uint64_t)modid) << 32) + cmdid;

change_list.push_back(key);

}

mysql_free_result(result);

}

相关推荐
nice_lcj52011 分钟前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
蒸蒸yyyyzwd32 分钟前
学习笔记 八股手撕
笔记·学习
骑着蜗牛撵大象32739 分钟前
2026 后端 AI 工程化:Spring AI 管调用、MCP 管工具、Agent 内嵌管自治
java·人工智能·后端·spring·ai·可观测性·mcp
tryxr41 分钟前
JVM 垃圾回收机制
java·jvm·gc·垃圾回收
揣一尾游鱼yu2 小时前
Spring上(IOC)笔记
java·笔记·spring·ioc
荣码2 小时前
长上下文与大文档处理:200页PDF怎么喂给AI,我踩了4个坑
java·python
樱花树下的数学喵2 小时前
手写简易 STL string|C++ 字符串底层实现
开发语言·c++
AI吃大瓜2 小时前
指针压力表读数3:C/C++实现指针压力表读数(可实时检测)
c++·指针读数·指针压力表·压力表自动读数·压力表读数
-银雾鸢尾-2 小时前
两数之和-C++实现
c++·算法
极限挑战哥2 小时前
共享电单车联营平台分账架构实践:二清合规与自动分账零人工方案
java·大数据·人工智能·微信小程序·架构·微信公众平台