目錄
?
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
```
?