首先,使用者資料會經過 kafka 佇列傳遞到我們的業務層。我們希望使用者能夠通過乙個通用層接入我們的kafka服務,但是有的使用者希望能夠直接連到我們的 kafka 上面,這就需要我們的 kafka 對外暴露broke服務以便被接入。那麼如何保證使用者資料接入的可靠性和安全性,就成為了這篇文章的主要內容。
我們希望其他公司資料接入的方式盡量松耦合,盡量不依賴內部架構,而對於一些使用者要直接接入 kafka 的要求也可以支援。同時,還要保證資料在傳遞過程中的安全性,防止惡意的連線攻擊等。具體如下幾點:
1. 接入方式盡量松耦合;
2. 連線的可靠性,即只有特定的使用者或ip 可以建立連線;
3. 資料的安全性,傳遞過程中的資料是經過加密的;
4. 支援使用者直連 kafka 的broke,但客戶端的所有行為都是被許可的。
首先,我們希望使用者的接入方式是簡單的、通用的、安全的,是不影響內部業務邏輯的。其次,對於那些指定要直連 kafka 的接入方式,也應該是支援的。那麼下面就有了兩種情況:普通接入方式和 kafka 接入方式。
近年來,當提到業務對接或者資料傳遞的時候,大家首先想到的就是「調介面」,那麼這個「介面」其實也就是http 介面,大家普遍認為是最普通的、也是最簡單的一種資料傳遞方式,那麼,既然普通簡單,那就是我們所需要的。
所以,接入流程應該是這樣的:接入方先呼叫我們的http 介面,然後我們在web服務中把資料傳遞到kafka中,然後再到我們的業務層。如圖:
這種方式我也稱之為http接入方式,當乙個使用者需要使用我們的 iot,那麼接入的方式就應該優先使用這種方式。
所謂的kafka 接入,就是指使用者使用kafka的客戶端程式直連broke服務群的方式。這種接入方式就需要暴露broke來提供使用者連線,需要給出連線broke的ip和埠。
為了實現我們的既定目標,也需要把client和broke之間加入類似ssl的安全層協議,幸好,kafka對client支援tls和sasl兩種認證方式,在這之間,我選擇tls雙向認證。
what is sasl?
sasl是乙個依賴於其他協議的框架,本質上是乙個間接層,允許在現有的應用程式協議中插入可插入的身份驗證系統和資料安全性(e.g ldap, smtp, subversion, …)。
它是否以及如何提供安全的身份驗證和資料加密,很大程度上取決於該框架內使用的底層機制。如果使用sasl中,可以選擇使用gssapi、kerberos、ntlm等。
如上個接入方式所說,tls雙向認證協議保證了雙方的可靠性,同時也能保證資料的安全性。在這種情況下,我們能夠保證連線到我們kafka的客戶端都是我們允許的,只是並不能約束客戶端的行為,比如說,客戶端可以隨意讀取所有的topic資料,這顯然是不能允許的。
還好,kafka支援使用acl許可權控制機制。kafka附帶乙個可插拔的認證,並使用zookeeper來儲存所有的acl。kafka的acl在一般格式定義」principal p is [allowed/denied] operation o from host h on resource r」,意思就是說可以使某個資源針對特定ip特定使用者進行特定的操作。
例子:假設你要新增乙個acl 「以允許198.51.100.0和198.51.100.1,principal為user:bob和user:alice對主題是test-topic有read和write的執行許可權」 。可通過以下命令實現:
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal user:bob --allow-principal user:alice --allow-host 198.51.100.0 --allow-host 198.51.100.1 --operation read --operation write --topic test-topic
這樣,其實就能很好的達到我們的要求:進行細粒度的許可權控制。
所以,這種情況下,接入的資料流程圖應該是這樣的:
那麼現在問題又來了,當我們的內網需要使用這群kafka的時候,也需要進行配置tls雙向認證嗎?顯然是不需要的,一來太麻煩,二來沒必要,因為不會有不信任的連線,也不會洩露資料,三的話就是使用tls雙向認證會大幅度影響效率,延長建立連線的時間。
這樣的話,就應該採用混合式的連線方式比較好,若**roke提供對外網的連線,若**roke提供對內網的連線,而所有的broke之間採用文字的方式傳輸資料。改進後的設計圖如下:
方案定論
綜合以上兩種接入方式,我們既要支援http接入,又要支援kafka接入方式,那麼最後的部署方式應該是這樣的:
Spring整合Dubbo對外提供服務
1.新增依賴 dubbox compile group com.alibaba name dubbo version 2.5.3 compile io.netty netty 3.7.0.final zookeeper客戶端 compile com.github.sgroschupf zkclien...
伺服器對外提供了哪些資源
文字內容 內容音訊內容 網頁中的資料,也是伺服器對外提供的一種對外提供的資源 各行各業排行榜等。如上圖 都是資料 html是網頁的骨架 css是網頁的顏值 j ascript是網頁的行為 資料則是網頁的靈魂 骨架 顏值 行為皆為資料服務 資料,在網頁中無處不在 資料也是伺服器對外提供的一種資源。只要...
模組對外提供介面 技巧總結
1 乙個模組需要對外開放一些介面,使外部可以訪問本模組的東東.最簡單 最方便的對外介面是 set 1 set 2 set 3 get 1 get 2 get 3 對每乙個類似的功能實現乙個對外的介面,但是這樣導致的問題是,介面太多,比較亂.可以提供乙個通用的設定 獲取資料結構的介面.eg 1 int...