当前位置: 首页 > news >正文

C++负载均衡远程调用学习之自定义内存池管理

目录

 

1.内存管理_io_buf的结构分析

2.Lars_内存管理_io_buf内存块的实现

3.buf总结

4.buf_pool连接池的单例模式设计和基本属性

5.buf_pool的初始化构造内存池

6.buf_pool的申请内存和重置内存实现

7.课前回顾


 

1.内存管理_io_buf的结构分析

## 3) Lars系统总体架构

​        对于一个部门的后台,为增强灵活性,一个服务可以被抽象为命令字:`modid+cmdid`的组合,称为**一个模块**,而这个服务往往有多个服务节点,其所有服务节点的地址集合被称为这个模块下的**路由**,节点地址简称为节点

- `modid`:标识业务的大类,如:“直播列表相关”

- `cmdid`:标识具体服务内容,如:“批量获取直播列表”

  ​    业务代码利用modid,cmdid,就可以调用对应的远程服务一个Lars系统包含一个DNSService,一个Report Service,以及部署于每个服务器的LoadBalance Agent,业务代码通过API与ELB系统进行交互

**API** :根据自身需要的`modid,cmdid`,向ELB系统获取节点、汇报节点调用结果;提供`C++`、`Java`、`Python`接口

**LoadBalance Agent**:运行于每个服务器上,负责为此服务器上的业务提供节点获取、节点状态汇报、路由管理、负载调度等核心功能

**DNSService** : 运行于一台服务器上(也可以用LVS部署多实例防单点),负责`modid,cmdid`到节点路由的转换

**Report Service** : 运行于DNSService同机服务器上,负责收集各`modid,cmdid`下各节点调用状况,可用于观察、报警

`modid,cmdid`数据由`Mysql`管理,具体SQL脚本在`common/sql`路径下
至于`modid,cmdid`的注册、删除可以利用Web端操作MySQL。



![1-Lars-总体架构设计](./pictures/1-Lars-%E6%80%BB%E4%BD%93%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1.png)

如图,每个服务器(虚线)部署了一台LoadBalance Agent,以及多个业务服务

1. 开发者在Web端注册、删除、修改`modid,cmdid`的路由信息,信息被写入到MySQL数据库;
2. 服务器上每个业务biz都把持着自己需要通信的远程服务标识`modid+cmdid`,每个biz都向本机LoadBalance Agent获取远程节点,进而可以和远程目标服务通信,此外业务模块会汇报本次的节点调用结果给LoadBalance Agent;
3. LoadBalance Agent负责路由管理、负载均衡等核心任务,并周期性向DNSService获取最新的路由信息,周期性把各`modid,cmdid`的各节点一段时间内的调用结果传给Report Service
4. DNSService监控MySQL,周期性将最新路由信息加载出来;
5. Report Service将各`modid,cmdid`的各节点一段时间内的调用结果写回到MySQL,方便Web端查看、报警

2.Lars_内存管理_io_buf内存块的实现

# 二、项目目录构建

​    首先在一切开始之前,我们应该将最基本的项目架构创建出来。



1)创建Lars代码总目录

```bash
$cd ~/
$mkdir Lars
```





2) 创建一个模块Lars_reactor

lars_reactor是一个网络IO库,是我们要实现的,我们就先以它作为第一个子项目进行构建。

```bash
$mkdir lars_reactor
```

然后在lars_reactor模块下创建一系列文件,如下

```bash
.
├── example
│   └── testlib
│       ├── hello_lars.cpp
│       └── Makefile
├── include
│   └── tcp_server.h
├── lib
├── Makefile
└── src
    └── tcp_server.cpp
```

3.buf总结

3)代码编写

> src/tcp_server.cpp

```cpp
#include <iostream>

void lars_hello() 
{
    std::cout <<"lars hello" <<std::endl; 
}
```

> src/tcp_server.h

```cpp
#pragma once

void lars_hello();

4.buf_pool连接池的单例模式设计和基本属性

我们要生成一个lib库文件liblreactor.a,来提供一些reactor模块的API接口。

生成liblreactor.a的Makefile如下

> lars_reactor/Makefile

```makefile
TARGET=lib/liblreactor.a
CXX=g++
CFLAGS=-g -O2 -Wall -fPIC -Wno-deprecated

SRC=./src

INC=-I./include
OBJS = $(addsuffix .o, $(basename $(wildcard $(SRC)/*.cpp)))

$(TARGET): $(OBJS)
        mkdir -p lib
        ar cqs $@ $^

%.o: %.cpp
        $(CXX) $(CFLAGS) -c -o $@ $< $(INC)

.PHONY: clean

clean:
        -rm -f src/*.o $(TARGET)
```



4)编译

```bash
$cd lars/lars_reactor/
$make
$g++ -g -O2 -Wall -fPIC -Wno-deprecated -c -o src/tcp_server.o src/tcp_server.cpp -I./include
mkdir -p lib
ar cqs lib/liblreactor.a src/tcp_server.o
```

我们会在lib下得到一个liblreactor.a库文件。

5.buf_pool的初始化构造内存池

5)调用liblreactor.a接口

```bash
$cd lars/lars_reactor/
$mkdir example/testlib -p
$cd example/testlib/
```



> hello_lars.cpp

```cpp
#include "tcp_server.h"

int main() {

    lars_hello();

    return 0;
}
```

6.buf_pool的申请内存和重置内存实现

7.课前回顾

> Makefile

```makefile
CXX=g++
CFLAGS=-g -O2 -Wall -fPIC -Wno-deprecated 

INC=-I../../include
LIB=-L../../lib -llreactor 
OBJS = $(addsuffix .o, $(basename $(wildcard *.cc)))

all:
        $(CXX) -o hello_lars $(CFLAGS)  hello_lars.cpp $(INC) $(LIB)

clean:
        -rm -f *.o hello_lars
```



编译

```bash
$ make
g++ -o hello_lars -g -O2 -Wall -fPIC -Wno-deprecated   hello_lars.cpp -I../../include -L../../lib -llreactor 
```



执行

```cpp
$ ./hello_lars 
lars hello
```



我们现在一个基本的项目目录就构建好了,大致如下

```bash
Lars/
├── lars_reactor
│   ├── example
│   │   └── testlib
│   │       ├── hello_lars
│   │       ├── hello_lars.cpp
│   │       └── Makefile
│   ├── include
│   │   └── tcp_server.h
│   ├── lib
│   │   └── liblreactor.a
│   ├── Makefile
│   └── src
│       ├── tcp_server.cpp
│       └── tcp_server.o
└── README.md
```

 

http://www.xdnf.cn/news/228205.html

相关文章:

  • SVTAV1源码-set_all_ref_frame_type
  • 专家访谈:从文本到视频,GEO多模态优化的实战法则
  • IDEA git配置[通俗易懂]
  • halcon打开图形窗口
  • 模型部署技巧(一)
  • Python爬虫实战:获取彼岸网高清素材图片
  • Windows 10 环境二进制方式安装 MySQL 8.0.41
  • Locate 3D:Meta出品自监督学习3D定位方法
  • 大模型——使用 StarRocks 作为向量数据库
  • Go 写一个简单的Get和Post请求服务
  • 03_spring配置优先级
  • 回归分析丨基于R语言复杂数据回归与混合效应模型【多水平/分层/嵌套】技术与代码
  • 数智化招标采购系统针对供应商管理解决方案(采购如何管控供应商)
  • Qt/C++面试【速通笔记六】—Qt 中的线程同步
  • 合并两个有序数组
  • DataWorks Copilot 集成 Qwen3-235B-A22B混合推理模型,AI 效能再升级!
  • uniapp 实现时分秒 分别倒计时
  • 大数据平台与数据仓库的核心差异是什么?
  • MySQL RR (Repeatable Read) 隔离级别规则细节
  • 【计算机视觉】目标检测:深度解析Detectron2:Meta开源目标检测与图像分割框架实战指南
  • Linux Nginx网站服务【完整版】
  • 从高端制造到民生场景:天元轻量化软件的“破局”之路
  • 【QT】编写第一个 QT 程序 对象树 Qt 编程事项 内存泄露问题
  • 大语言模型 06 - 从0开始训练GPT 0.25B参数量 - MiniMind 实机配置 GPT训练基本流程概念
  • ASP.NET MVC​ 入门与提高指南六
  • 一套SaaS ERP管理系统源码,支持项目二开商用,SpringBoot+Vue+ElementUI+UniAPP
  • 11.Spring Boot 3.1.5 中使用 SpringDoc OpenAPI(替代 Swagger)生成 API 文档
  • 若依Vue + Spring Boot:前后端参数传递实践与 @RequestParam、@RequestBody、@ModelAttribute 使用详解
  • 解决vscode cmake提示检测到 #include 错误
  • 【Hive入门】Hive高级特性:事务表与ACID特性详解