[架構]閘道器服務設計
閘道器服務設計
second60 20180408
1 什麼是閘道器服務
通常情況,服務內部的各個程序是獨立的,如果外部服務需要訪問內部的服務,就必須通過閘道器服務(gateway service)。
1.1 閘道器的作用
閘道器服務,通常是外部訪問的唯一介面,訪問內部的所有服務都必須先經過閘道器服務。閘道器服務的主要功能是訊息解析過濾,路由,轉發等。
1.2 閘道器的目的
a)統一性:閘道器可以使外接服務呼叫統一介面,而無須知道內部具體實現
b)無狀態:閘道器是狀態無關,所以外部服務可連到任何一個閘道器處理服務
c)擴充套件性:閘道器可無限擴充套件的,分佈到不同機器,不同地域,實現不同地區跨服處理
d)安全性閘道器使內部服務更加安全,當某一閘道器受到攻擊或
1.3 通用閘道器服務圖
1.4 閘道器服務流程
外部服務連線閘道器,要進行服務處理,必先把訊息傳送到閘道器,然後閘道器再解析後轉發到相關服務進行處理,處理完後再發送訊息給外部服務。
流程分解:
a) 外部服務傳送訊息到閘道器
b) 閘道器對訊息進行(部份)解析和過濾
c) 閘道器轉發到指定服務處理
d) 指定服務轉發結果給閘道器服
e) 閘道器服再轉發給外部服務
2 閘道器服的功能分析
閘道器服務的主要功能是訊息解析過濾,路由,轉發等。下面將分析三個主要功能和實現。
2.1 訊息解析過濾
在外部服務傳送訊息到閘道器服務後,閘道器服務第一部要做的就是訊息處理。訊息處理包括:協議解析,協議過濾,協議分發
假設,定義的協議格式為:
長度欄位 | 命令 | 子命令 | 加密訊息內容 |
其中:
長度:為兩個位元組,是整個訊息的長度(欄位+命令+子命令+加密訊息內容)
命令:一位元組,是大協議命令
子命令:為命令的子命令(可有可無)
加密訊息內容:為加密後的訊息內容
(當然還可以加一些加密的金鑰資訊,及攜帶資訊uid等,這裡只介紹最常用的處理方法)
2.1.1 協議解析
協議解析通常是協議頭的解析。協議解析,可以分兩種:部份解析,全部解析。
部份解析:即只解析協議頭部,如上面協議為:長度,命令,子命令。訊息內容的加密解析由處理的服務去解析。
優點是:節省解密處理時間
缺點是:內部每個服務都進行解密處理。
全部解析:把整個訊息都解析,解密。
優點是:統一解密處理,內部服務可以無須再解密,還有及時處理解密錯誤
缺點是:閘道器服務效率會有降低
2.1.2 訊息過濾
在TCP層收到一條訊息後,協議格式錯誤,命令字錯誤,長度不正確,或解密不正確等訊息,將會進行過濾處理,並記錄。同時,也可對非法使用者,非法IP等在閘道器服務層進行過濾處理,從而增強了內部服務的安全性,大大減輕內部服務的壓力。
過濾條件:
a) 協議格式錯誤
b) 命令字未定義
c) 長度不正確
d) 解密不正確
e) 黑名單使用者
d) 黑名單IP
過濾條件,根據實際需求增減。
2.2 路由
路由,簡單地說,是就找一個從源到目的最優路徑。閘道器服務,也會維護一份路由表。
2.2.1 路由表
路由表的維護分兩種:靜態路由表和動態路由表。
靜態路由表:是本地的,可以設定一些預設的路由服務到本地檔案。當服務啟動時,先載入本地路由表進行服務互連。
動態路由表:是服務啟動後,啟定時器定時去讀取動態路由的資訊,新增或修改路由後都能及時感知。
例如,路由表定義如下:
服務id | 服務角色 | 服務IP地址 | 服務埠號 | 其他 |
1 | serviceA | 127.0.0.1 | 5001 | |
2 | serviceA | 127.0.0.1 | 5002 | |
3 | serviceB | 127.0.0.1 | 5003 | |
4 | serviceB | 127.0.0.1 | 5004 | |
5 | serviceC | 127.0.0.1 | 5005 |
路由表還可以加其他資訊,如跨地區,跨服,分服,分組等。具體看需求。
動態路由的獲取方法:
a) 採用http方法讀取(建議)
b) 路由表存在資料庫中
c) 路由表存在本地
採用http方法是最常用的方法之一。
2.2.2 路由表的維護
在2.2.1中,雖然讀取了路由表,但並不等於服務都是存在的,可能會存在服務未啟動,或服務不存在等。所以閘道器服務要和其他服務定時試探並互聯。
閘道器服務,會每隔一段時間,對路由表中的其他服務進行試探,如果沒有連線,會試探連線。
連線狀態如下:
a) 未連線
b) 連線中
c) 連線成功
d) 連線斷開
e) 退休中
路由表流程:
a) 服務開啟,讀取本地路由配置
b) 服務開啟後,定時(每隔一分鐘),讀取動態路由配置
c) 對讀取的路由配置中的服務進行試探並連線
d) 重啟路由表服務狀態
參考:
map[“service_id”] = 1
map[“service_role”] = serviceA
map[“service_ip”] = 127.0.0.1
map[“service_port”] = 5001
map[“service_state”] = EService_Connect;
map[“service_zone”] = zone1 (可用叢集用)
map[“service_region”]=region1(分割槽分服)
map[“service_cmd”]=cmd1,cmd2,cmd3,cmd4
2.3 轉發
轉發,即把正常解析後的訊息,根據路由規則,轉發到相關的服務。
轉發的流程為:
a) 可根據服務命令字cmd查詢到可用的某個對應最優服務
b) 把正確解析訊息轉發到相關服務進行處理
轉發規則:規則有很多,可以按命令字轉發,也可以按角色進行轉發,規則是死的,人是活的。具體的規則按需求定義。
參考:
為從map中,查詢一個最優的,存活的服務進行處理。
3. 其他
此文只介紹和閘道器的大體原理和功能,裡面有很多細節,後面再補充,如怎麼樣去負載均衡,怎麼樣去找一個最優的閘道器服務,怎麼加解密等。原理懂了,程式碼不是問題。