目录
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。

如图,每个服务器(虚线)部署了一台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
```