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

```

  1. 创建一个模块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

```

相关推荐
我最厉害。,。3 小时前
C2远控篇&C&C++&ShellCode分离&File提取&Http协议&Argv参数&Sock管道
c语言·c++·http
Cyrus_柯3 小时前
C++(面向对象编程——关键字)
开发语言·c++·算法·面向对象
2013编程爱好者3 小时前
C++二分查找
开发语言·c++·算法·二分查找
叶子椰汁3 小时前
ORMPP链接MySQL 8.0错误
服务器·数据库·c++·mysql
十五年专注C++开发4 小时前
QSimpleUpdater:解锁 Qt 应用自动更新的全新姿势
开发语言·c++·qt
杰_happy4 小时前
设计模式:原型模式(C++)
c++·设计模式·原型模式
OpenC++4 小时前
【C++】简单工厂模式/工厂方法模式/抽象工厂模式对比
c++·设计模式·简单工厂模式·工厂方法模式·抽象工厂模式
虾球xz5 小时前
CppCon 2016 学习:BUILDING A MODERN C++ FORGE FOR COMPUTE AND GRAPHICS
开发语言·c++·学习
future14125 小时前
C#核心学习
学习·c#
不太可爱的叶某人5 小时前
【学习笔记】深入理解Java虚拟机学习笔记——第7章 虚拟机类加载机制
java·笔记·学习