【Lars教程目錄】
Lars源代碼
https://github.com/aceld/Lars
【Lars系統(tǒng)概述】
第1章-概述
第2章-項(xiàng)目目錄構(gòu)建
【Lars系統(tǒng)之Reactor模型服務(wù)器框架模塊】
第1章-項(xiàng)目結(jié)構(gòu)與V0.1雛形
第2章-內(nèi)存管理與Buffer封裝
第3章-事件觸發(fā)EventLoop
第4章-鏈接與消息封裝
第5章-Client客戶端模型
第6章-連接管理及限制
第7章-消息業(yè)務(wù)路由分發(fā)機(jī)制
第8章-鏈接創(chuàng)建/銷毀Hook機(jī)制
第9章-消息任務(wù)隊(duì)列與線程池
第10章-配置文件讀寫功能
第11章-udp服務(wù)與客戶端
第12章-數(shù)據(jù)傳輸協(xié)議protocol buffer
第13章-QPS性能測(cè)試
第14章-異步消息任務(wù)機(jī)制
第15章-鏈接屬性設(shè)置功能
【Lars系統(tǒng)之DNSService模塊】
第1章-Lars-dns簡(jiǎn)介
第2章-數(shù)據(jù)庫(kù)創(chuàng)建
第3章-項(xiàng)目目錄結(jié)構(gòu)及環(huán)境構(gòu)建
第4章-Route結(jié)構(gòu)的定義
第5章-獲取Route信息
第6章-Route訂閱模式
第7章-Backend Thread實(shí)時(shí)監(jiān)控
【Lars系統(tǒng)之Report Service模塊】
第1章-項(xiàng)目概述-數(shù)據(jù)表及proto3協(xié)議定義
第2章-獲取report上報(bào)數(shù)據(jù)
第3章-存儲(chǔ)線程池及消息隊(duì)列
【Lars系統(tǒng)之LoadBalance Agent模塊】
第1章-項(xiàng)目概述及構(gòu)建
第2章-主模塊業(yè)務(wù)結(jié)構(gòu)搭建
第3章-Report與Dns Client設(shè)計(jì)與實(shí)現(xiàn)
第4章-負(fù)載均衡模塊基礎(chǔ)設(shè)計(jì)
第5章-負(fù)載均衡獲取Host主機(jī)信息API
第6章-負(fù)載均衡上報(bào)Host主機(jī)信息API
第7章-過期窗口清理與過載超時(shí)(V0.5)
第8章-定期拉取最新路由信息(V0.6)
第9章-負(fù)載均衡獲取Route信息API(0.7)
第10章-API初始化接口(V0.8)
第11章-Lars Agent性能測(cè)試工具
第12章- Lars啟動(dòng)工具腳本
五厚宰、Lars-Reporter Service開發(fā)
1) 簡(jiǎn)介
負(fù)責(zé)接收各agent對(duì)某modid娇昙、cmdid下節(jié)點(diǎn)的調(diào)用狀態(tài)的上報(bào)。
目前
agent
我們還沒有實(shí)現(xiàn)矾踱,就可以把a(bǔ)gent當(dāng)成一個(gè)普通客戶端就可以哭廉。
agent會(huì)把代理的host節(jié)點(diǎn)的狀態(tài)上報(bào)給Reporter慌洪,Reporter負(fù)責(zé)存儲(chǔ)在Mysql數(shù)據(jù)庫(kù)中只冻。
業(yè)務(wù):
Reporter服務(wù)模型采用了single thread TCP服務(wù)器 + 線程池處理請(qǐng)求
主線程Reporter負(fù)責(zé)接收agent請(qǐng)求,并根據(jù)請(qǐng)求中攜帶的
modid
和cmdid
蝙寨,拼接后進(jìn)行murmurHash
(一致性hash)壁肋,分配到某個(gè)線程的MQ上-
Thread 1~N們負(fù)責(zé)處理請(qǐng)求:把MQ上的請(qǐng)求中的數(shù)據(jù)同步更新到MySQL數(shù)據(jù)表
由于agent上報(bào)給Reporter的信息是攜帶時(shí)間的,且僅作為前臺(tái)展示方便查看服務(wù)的過載情況籽慢,故通信僅有請(qǐng)求沒有響應(yīng)
于是Reporter服務(wù)只要可以高效讀取請(qǐng)求即可,后端寫數(shù)據(jù)庫(kù)的實(shí)時(shí)性能要求不高猫胁。
架構(gòu)圖如下:
2) 數(shù)據(jù)庫(kù)創(chuàng)建
- 表
ServerCallStatus
:
字段 | 數(shù)據(jù)類型 | 是否可以為空 | 主鍵 | 默認(rèn) | 附加 | 說明 |
---|---|---|---|---|---|---|
modid | int(11) | No | 是 | NULL | 模塊ID | |
modid | int(11) | No | 是 | NULL | 指令I(lǐng)D | |
ip | int(11) | No | 是 | NULL | 服務(wù)器IP地址 | |
port | int(11) | No | 是 | NULL | 服務(wù)器端口 | |
caller | int(11) | No | 是 | NULL | 調(diào)用者 | |
succ_cnt | int(11) | No | NULL | 成功次數(shù) | ||
err_cnt | int(11) | No | NULL | 失敗次數(shù) | ||
ts | bigint(20) | No | NULL | 記錄時(shí)間 | ||
overload | char(1) | No | NULL | 是否過載 |
Lars/base/sql/lars_dns.sql
DROP TABLE IF EXISTS `ServerCallStatus`;
CREATE TABLE `ServerCallStatus` (
`modid` int(11) NOT NULL,
`cmdid` int(11) NOT NULL,
`ip` int(11) NOT NULL,
`port` int(11) NOT NULL,
`caller` int(11) NOT NULL,
`succ_cnt` int(11) NOT NULL,
`err_cnt` int(11) NOT NULL,
`ts` bigint(20) NOT NULL,
`overload` char(1) NOT NULL,
PRIMARY KEY (`modid`,`cmdid`,`ip`,`port`,`caller`),
KEY `mlb_index` (`modid`,`cmdid`,`ip`,`port`,`caller`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3) Proto協(xié)議定義
Lars/base/proto/lars.proto
syntax = "proto3";
package lars;
/* Lars系統(tǒng)的消息ID */
enum MessageId {
ID_UNKNOW = 0; //proto3 enum第一個(gè)屬性必須是0箱亿,用來(lái)占位
ID_GetRouteRequest = 1; //向DNS請(qǐng)求Route對(duì)應(yīng)的關(guān)系的消息ID
ID_GetRouteResponse = 2; //DNS回復(fù)的Route信息的消息ID
ID_ReportStatusRequest = 3; //上報(bào)host調(diào)用狀態(tài)信息請(qǐng)求消息ID
}
//一個(gè)管理的主機(jī)的信息
message HostInfo {
int32 ip = 1;
int32 port = 2;
}
//請(qǐng)求lars-dns route信息的消息內(nèi)容
message GetRouteRequest {
int32 modid = 1;
int32 cmdid = 2;
}
//lars-dns 回復(fù)的route信息消息內(nèi)容
message GetRouteResponse {
int32 modid = 1;
int32 cmdid = 2;
repeated HostInfo host = 3;
}
message HostCallResult {
int32 ip = 1; //主機(jī)ip
int32 port = 2; //主機(jī)端口
uint32 succ = 3; //調(diào)度成功
uint32 err = 4; //調(diào)度失敗
bool overload = 5; //是否過載
}
//上報(bào) 負(fù)載均衡 調(diào)度數(shù)據(jù) 給 lars_reporter 的消息內(nèi)容
message ReportStatusReq {
int32 modid = 1;
int32 cmdid = 2;
int32 caller = 3;
repeated HostCallResult results = 4;
uint32 ts = 5;
}
關(guān)于作者:
作者:Aceld(劉丹冰)
mail: danbing.at@gmail.com
github: https://github.com/aceld
原創(chuàng)書籍gitbook: http://legacy.gitbook.com/@aceld
原創(chuàng)聲明:未經(jīng)作者允許請(qǐng)勿轉(zhuǎn)載, 如果轉(zhuǎn)載請(qǐng)注明出處