1. 程式人生 > >[架構]閘道器服務設計

[架構]閘道器服務設計

閘道器服務設計

second60  20180408

1 什麼是閘道器服務

  通常情況,服務內部的各個程序是獨立的,如果外部服務需要訪問內部的服務,就必須通過閘道器服務(gateway service)。

1.1 閘道器的作用

閘道器服務,通常是外部訪問的唯一介面,訪問內部的所有服務都必須先經過閘道器服務。閘道器服務的主要功能是訊息解析過濾,路由,轉發等。

1.2 閘道器的目的

a)統一性:閘道器可以使外接服務呼叫統一介面,而無須知道內部具體實現

b)無狀態:閘道器是狀態無關,所以外部服務可連到任何一個閘道器處理服務

c)擴充套件性:閘道器可無限擴充套件的,分佈到不同機器,不同地域,實現不同地區跨服處理

d)安全性閘道器使內部服務更加安全,當某一閘道器受到攻擊或

coredump,可以切換到其他服處理

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. 其他

此文只介紹和閘道器的大體原理和功能,裡面有很多細節,後面再補充,如怎麼樣去負載均衡,怎麼樣去找一個最優的閘道器服務,怎麼加解密等。原理懂了,程式碼不是問題。