[Lars源代碼](https://github.com/aceld/Lars)
https://github.com/aceld/Lars
# **Lars**
(**L**oad balance **A**nd **R**emote service schedule **S**ystem)
# 系統開發環境:
`Linux` : Ubuntu18.04
`protobuf` : libprotoc 3.6.1版本及以上
`mysql`: mysql Ver 14.14 Distrib 5.7.27 版本及以上
`g++`: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 版本及以上
# 第1章-概述
Lars是一個簡單、易用、高性能的服務間遠程調用管理、調度、負載均衡系統。
## 1) 優勢
1. **性能強悍**
集群支持千萬并發鏈接,滿足用戶的海量業務訪問需求。
2. **高可用**
采用集群化部署,支持多可用區的容災,無縫實時切換。
3. **靈活擴展**
自動分發,與彈性伸縮無縫集成,靈活擴展用戶用于的對外服務能力。
4. **簡單易用**
快速部署、實時生效,支持多種協議,多種調度算法,用戶可以高效的管理和調整服務分發策略等。
## 2) 應用場景
### (1)、大型門戶網站
? 針對大型門戶網站訪問量高的特點,通過彈性負載均衡將用戶的訪問流量均勻的分發到多個后端云服務器上,確保業務快速平穩的運行
#### 優勢
- 靈活擴展
可根據實際的用戶訪問量,自動擴展負載分發能力
- 高性能
集群支持高并發連接,滿足海量訪問量訴求

### (2)、跨可用區同城容災
? 彈性負載均衡可將流量跨可用區進行分發,建立實時的同城容災機制,滿足銀行貿易等企業對系統的高可用性要求。
#### 優勢
- 靈活擴展
可根據實際的用戶訪問量,自動擴展負載分發能力
- 同城容災
支持跨可用區的雙活容災,實現無縫實時切換

### (3)、電商搶購
? 電商業務呈現出較強的潮汐效應。Lars通過和彈性伸縮等服務的無縫集成,自動創建后端云服務器,將流量自動分發到新的云服務器,緩解了促銷高峰時期的系統壓力。
#### 優勢
- 彈性伸縮
根據業務流量實時創建或移除云服務器
- 高可用
通過健康檢查快速屏蔽異常云服務器,確保業務高可用
- 高性能
集群支持高并發連接,滿足海量訪問量訴求

## 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端查看、報警。
---
### 關于作者:
作者:`Aceld(劉丹冰)`
mail: [danbing.at@gmail.com](mailto:danbing.at@gmail.com)
github: [https://github.com/aceld](https://github.com/aceld)
原創書籍: [http://www.hmoore.net/@aceld](http://www.hmoore.net/@aceld)

>**原創聲明:未經作者允許請勿轉載, 如果轉載請注明出處**
- 一、Lars系統概述
- 第1章-概述
- 第2章-項目目錄構建
- 二、Reactor模型服務器框架
- 第1章-項目結構與V0.1雛形
- 第2章-內存管理與Buffer封裝
- 第3章-事件觸發EventLoop
- 第4章-鏈接與消息封裝
- 第5章-Client客戶端模型
- 第6章-連接管理及限制
- 第7章-消息業務路由分發機制
- 第8章-鏈接創建/銷毀Hook機制
- 第9章-消息任務隊列與線程池
- 第10章-配置文件讀寫功能
- 第11章-udp服務與客戶端
- 第12章-數據傳輸協議protocol buffer
- 第13章-QPS性能測試
- 第14章-異步消息任務機制
- 第15章-鏈接屬性設置功能
- 三、Lars系統之DNSService
- 第1章-Lars-dns簡介
- 第2章-數據庫創建
- 第3章-項目目錄結構及環境構建
- 第4章-Route結構的定義
- 第5章-獲取Route信息
- 第6章-Route訂閱模式
- 第7章-Backend Thread實時監控
- 四、Lars系統之Report Service
- 第1章-項目概述-數據表及proto3協議定義
- 第2章-獲取report上報數據
- 第3章-存儲線程池及消息隊列
- 五、Lars系統之LoadBalance Agent
- 第1章-項目概述及構建
- 第2章-主模塊業務結構搭建
- 第3章-Report與Dns Client設計與實現
- 第4章-負載均衡模塊基礎設計
- 第5章-負載均衡獲取Host主機信息API
- 第6章-負載均衡上報Host主機信息API
- 第7章-過期窗口清理與過載超時(V0.5)
- 第8章-定期拉取最新路由信息(V0.6)
- 第9章-負載均衡獲取Route信息API(0.7)
- 第10章-API初始化接口(V0.8)
- 第11章-Lars Agent性能測試工具
- 第12章- Lars啟動工具腳本