溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用kubernetes中的Scheme機(jī)制進(jìn)行反序列化的操作

發(fā)布時(shí)間:2020-05-26 15:33:45 來源:億速云 閱讀:1007 作者:鴿子 欄目:云計(jì)算

在web開發(fā)中隨著版本的更新迭代,通常要在系統(tǒng)中維護(hù)多個(gè)版本的api,多個(gè)版本的api在數(shù)據(jù)結(jié)構(gòu)上往往也各不相同,今天就來一起學(xué)習(xí)下kubernetes中的Scheme機(jī)制是如何解決這個(gè)問題的,如何借助HTTP請(qǐng)求里面的數(shù)據(jù)進(jìn)行反序列化操作

1. web請(qǐng)求的處理流程

1.1 HTTP請(qǐng)求處理流程

使用kubernetes中的Scheme機(jī)制進(jìn)行反序列化的操作
通常首先是webServer先進(jìn)行Http協(xié)議的處理,然后解析成基礎(chǔ)的webServer內(nèi)部的一個(gè)Http請(qǐng)求對(duì)象, 通常該對(duì)象持有對(duì)應(yīng)請(qǐng)求的請(qǐng)求頭和底層對(duì)應(yīng)的字節(jié)序列(從socket流中讀取)
接著首先會(huì)通常根據(jù)對(duì)應(yīng)的編碼格式來進(jìn)行反序列化,完成從字節(jié)序列到當(dāng)前接口的業(yè)務(wù)模型的映射, 然后在交給業(yè)務(wù)邏輯處理,從而最終進(jìn)行持久化存儲(chǔ), 本文的重點(diǎn)也就在反序列化部分

2.模型映射的實(shí)現(xiàn)

2.1 描述資源版本信息

/api/{version}/{resource}/{action}

上面是一個(gè)基礎(chǔ)的web url通常我們都會(huì)為每個(gè)版本注冊(cè)一個(gè)對(duì)應(yīng)的URL, 其中會(huì)包含很關(guān)鍵的兩個(gè)信息即version與resource,通過這兩個(gè)信息,通常我們就可以知道這可能是某個(gè)資源的那個(gè)版本, 如果我們把后面的action也包裹進(jìn)來,我們通常就可以知道對(duì)應(yīng)的資源的那個(gè)具體操作

2.2 Group組信息

使用kubernetes中的Scheme機(jī)制進(jìn)行反序列化的操作
在微服務(wù)流行的今天我們通常會(huì)為按照業(yè)務(wù)功能來進(jìn)行微服務(wù)的切分,本質(zhì)上一個(gè)微服務(wù)可能就是實(shí)現(xiàn)某個(gè)具體業(yè)務(wù)場(chǎng)景的功能集合,比如用戶系統(tǒng)通常會(huì)包含用戶的所有相關(guān)操作,在kubernetes中也有類似的概念就是所謂的Group

POST /apis/batch/v1beta1/namespaces/{namespace}/cronjobs
POST /apis/apps/v1/namespaces/{namespace}/daemonsets

我們來看一個(gè)實(shí)例這是一個(gè)創(chuàng)建daemonsets和cronjobs的url, 如果按照Group、resource、version來進(jìn)行拆分可以拆成如下:batch、v1beta1、cronjobs和apps、v1、daemonsets,也就是大家嘗試的GroupVersionKind,其中kind對(duì)應(yīng)的就是resource

2.3 模型映射的實(shí)現(xiàn)

使用kubernetes中的Scheme機(jī)制進(jìn)行反序列化的操作
我們通過url里面獲取到資源的GroupVersionKind信息,如何將其映射為一個(gè)具體的類型呢? 這貌似就很簡(jiǎn)單了結(jié)合反射和map來進(jìn)行就可以了,我們通過url獲取到對(duì)應(yīng)想的GVK信息,然后在通過我們的映射表,就知道對(duì)應(yīng)的模型是哪個(gè),接下來就只需要進(jìn)行轉(zhuǎn)換就行了

gvkToType map[schema.GroupVersionKind]reflect.Type

3.反序列化實(shí)現(xiàn)

3.1 解碼機(jī)制

那如何將對(duì)應(yīng)的Http里面的數(shù)據(jù)流反序列化成內(nèi)部的一個(gè)對(duì)象呢,別忘記了是Http協(xié)議, 肯定就是header頭里面的信息了,我們通過header頭里面的序列化就可以知道對(duì)應(yīng)的編碼格式,只需要調(diào)用對(duì)應(yīng)格式的解碼就可以完成了

Content-Type: "application/json"

3.2 默認(rèn)對(duì)象

使用kubernetes中的Scheme機(jī)制進(jìn)行反序列化的操作
如果要將json格式的字節(jié)數(shù)組進(jìn)行解碼通常要進(jìn)行如下操作,我們需要傳入一個(gè)目標(biāo)對(duì)象的指針,然后由json將對(duì)應(yīng)的字節(jié)數(shù)據(jù)解析到目標(biāo)對(duì)象中,我們也需要這樣一個(gè)對(duì)象,用于存儲(chǔ)反序列化的結(jié)果

func Unmarshal(data []byte, v interface{}) error {}

那只要我再提供一個(gè)當(dāng)前版本對(duì)應(yīng)的對(duì)象構(gòu)造函數(shù)是不是就可以呢?答案是的

func() Object{ return 目標(biāo)對(duì)象 },

4. 設(shè)計(jì)總結(jié)

使用kubernetes中的Scheme機(jī)制進(jìn)行反序列化的操作
首先在進(jìn)行url注冊(cè)的時(shí)候,我們構(gòu)造出對(duì)應(yīng)url映射的資源的版本信息即GroupVersionKind,后續(xù)的很多操作我們可以通過對(duì)應(yīng)的版本映射獲取對(duì)應(yīng)的目標(biāo)操作或者對(duì)象,然后再通過Header里面的字段獲取對(duì)應(yīng)的解碼器,并將Body里面的字節(jié)序列進(jìn)行解碼到目標(biāo)對(duì)象,就可以實(shí)現(xiàn)多版本資源的映射和反序列化操作了

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI