摘要:源碼分析之入口背景去年有個(gè)整合多個(gè)平臺(tái)的項(xiàng)目,底層是華為華等不同平臺(tái)的環(huán)境,應(yīng)用管理層為。我們對(duì)接華為華等平臺(tái)時(shí),對(duì)于不同的認(rèn)證方式,就是使用這種方式,大大減少了開(kāi)發(fā)量。
openstack4j 源碼分析之入口 背景
去年有個(gè)整合多個(gè)openstack平臺(tái)的項(xiàng)目,底層是華為、華3等不同平臺(tái)的openstack環(huán)境,應(yīng)用管理層為java。雖然各平臺(tái)功能與原生openstack有所增加,但總體接口風(fēng)格還是openstack的邏輯。由于openstack接口眾多,一個(gè)個(gè)去適配接口的工作量巨大,所以決定基于openstack的java sdk來(lái)開(kāi)發(fā)。對(duì)比了幾種常見(jiàn)sdk,最后決定選用openstack4j來(lái)開(kāi)發(fā)。
Apache jclouds apache的開(kāi)源sdk,大而全、雜,可以對(duì)接所有常見(jiàn)的云平臺(tái),文檔較少,使用maven引入。
openstack-java-sdk 由愛(ài)好者開(kāi)發(fā)及維護(hù)的sdk,更新很慢,github的demo已經(jīng)不能成功連接最新的openstack版本。
openstack4j 官網(wǎng)資料、文檔豐富,接口上手簡(jiǎn)單,更新快。
入口openstack4j的官網(wǎng)demo給出的入口是
OSClient.OSClientV3 os = OSFactory.builderV3() .endpoint("http://127.0.0.1:5000/v3") .credentials("admin", "secret", Identifier.byName("Default")) .scopeToProject(Identifier.byName("admin")) .authenticate();
OSFactory是一個(gè)抽象類,通過(guò)它我們可以創(chuàng)建出不同的OSClient,而OSClient則是我們用來(lái)操作openstack的接口類。OSClient分為V2和V3版本,對(duì)應(yīng)openstack V2 與 V3版本的認(rèn)證模塊(Keystone)。
OSClientV2 與 OSClientV3均為OSClient接口類的內(nèi)部類,通過(guò)下面的代碼可以看到,除了在認(rèn)證模塊有所區(qū)別外,其他模塊沒(méi)有任何區(qū)別。
interface OSClientV2 extends OSClient{ Access getAccess(); org.openstack4j.api.identity.v2.IdentityService identity(); }
interface OSClientV3 extends OSClient{ Token getToken(); org.openstack4j.api.identity.v3.IdentityService identity(); }
OSFactory工廠類是使用建造者模式(Builder Pattern)來(lái)將復(fù)雜的對(duì)象構(gòu)造過(guò)程和主類分離的,具體的對(duì)象構(gòu)造行為是由OSClientBuilder來(lái)完成,其中包含了endpoint、credentials、scopeToProject等方法來(lái)接收外界傳入的登錄所需信息。
public abstract class OSClientBuilder> implements IOSClientBuilder { String endpoint; String user; String password; public T endpoint(String endpoint) { this.endpoint = endpoint; return (T) this; } public T credentials(String user, String password) { this.user = user; this.password = password; return (T) this; }
登錄信息保存在OSClientBuilder對(duì)象中,然后通過(guò)authenticate()方法,根據(jù)不同的版本進(jìn)行認(rèn)證。
public static class ClientV2 extends OSClientBuilderimplements IOSClientBuilder.V2 { @Override public OSClientV2 authenticate() throws AuthenticationException { if (tokenId != null) { checkArgument(tenantName != null || tenantId != null, "TenantId or TenantName is required when using Token Auth"); return (OSClientV2) OSAuthenticator.invoke(new TokenAuth(tokenId, tenantName, tenantId), endpoint, perspective, config, provider); } if (raxApiKey) { return (OSClientV2) OSAuthenticator.invoke( new RaxApiKeyCredentials(user, password), endpoint, perspective, config, provider); } return (OSClientV2) OSAuthenticator.invoke( new Credentials(user, password, tenantName, tenantId), endpoint, perspective, config, provider); } }
public static class ClientV3 extends OSClientBuilderimplements IOSClientBuilder.V3 { @Override public OSClientV3 authenticate() throws AuthenticationException { if (tokenId != null && tokenId.length() > 0) return (OSClientV3) OSAuthenticator.invoke(new KeystoneAuth(tokenId, scope), endpoint, perspective, config, provider); return (OSClientV3) OSAuthenticator.invoke(new KeystoneAuth(user, password, domain, scope), endpoint, perspective, config, provider); } }
入口處的代碼主要關(guān)聯(lián)三個(gè)類(接口),OSFactory、OSClientBuilder(IOSClientBuilder)、OSClient,由OSFactory調(diào)用OSClientBuilder類構(gòu)建OSClient對(duì)象,然后進(jìn)行認(rèn)證,完成了入口處的代碼邏輯。
可以看到,為了避免由于openstack的認(rèn)證方式更改而帶來(lái)的openstack4j認(rèn)證對(duì)象的劇烈改動(dòng),入口類之間的耦合很低,易于擴(kuò)展。使用建造者模式(Builder Pattern)生成認(rèn)證信息,將復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建可以創(chuàng)建不同的表示。對(duì)于不同的認(rèn)證方式,只需要增加或者減少部分組合方法即可。
而對(duì)于大版本之間的不同,如V2和V3,則使用工廠模式(Factory Pattern),IOSClientBuilder定義一個(gè)創(chuàng)建對(duì)象的接口,讓其子類自己決定實(shí)例化哪一個(gè)工廠類,工廠模式使其創(chuàng)建過(guò)程延遲到子類進(jìn)行。當(dāng)出現(xiàn)認(rèn)證版本之間的差異時(shí),只需要在IOSClientBuilder接口類中創(chuàng)建自己的靜態(tài)工廠接口類,就可以輕松完成認(rèn)證過(guò)程的更改。我們對(duì)接華為、華3等平臺(tái)時(shí),對(duì)于不同的認(rèn)證方式,就是使用這種方式,大大減少了開(kāi)發(fā)量。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/67201.html
摘要:也就是說(shuō),封裝了一個(gè)自己的對(duì)象,而不是和與他平級(jí)的共享。但和需求的鏡像顆粒度不同,這樣做的好處是耦合度低,代碼更加分離。對(duì)象生成創(chuàng)建的對(duì)象時(shí),使用模式。對(duì)應(yīng)的類關(guān)系圖其中位于包下,中可以獲取到所有資源的對(duì)象構(gòu)建器。 通過(guò)上一篇我們獲得到了經(jīng)過(guò)認(rèn)證的OSClient,通過(guò)這個(gè)接口,我們就使用openstack4j的所有功能了。但openstack4j是一個(gè)用來(lái)便于我們更方便調(diào)用opens...
摘要:一方面是因?yàn)橄胍朔约旱亩栊裕硪环矫嬉彩窍胫匦聹毓室槐?。一共分成了個(gè)基礎(chǔ)部分,后續(xù)還會(huì)繼續(xù)記錄。文章中如果有筆誤或者不正確的解釋,也歡迎批評(píng)指正,共同進(jìn)步。最后地址部分源碼 Why? 網(wǎng)上現(xiàn)有的Vue源碼解析文章一搜一大批,但是為什么我還要去做這樣的事情呢?因?yàn)橛X(jué)得紙上得來(lái)終覺(jué)淺,絕知此事要躬行。 然后平時(shí)的項(xiàng)目也主要是Vue,在使用Vue的過(guò)程中,也對(duì)其一些約定產(chǎn)生了一些疑問(wèn),可...
摘要:一方面是因?yàn)橄胍朔约旱亩栊裕硪环矫嬉彩窍胫匦聹毓室槐?。一共分成了個(gè)基礎(chǔ)部分,后續(xù)還會(huì)繼續(xù)記錄。文章中如果有筆誤或者不正確的解釋,也歡迎批評(píng)指正,共同進(jìn)步。最后地址部分源碼 Why? 網(wǎng)上現(xiàn)有的Vue源碼解析文章一搜一大批,但是為什么我還要去做這樣的事情呢?因?yàn)橛X(jué)得紙上得來(lái)終覺(jué)淺,絕知此事要躬行。 然后平時(shí)的項(xiàng)目也主要是Vue,在使用Vue的過(guò)程中,也對(duì)其一些約定產(chǎn)生了一些疑問(wèn),可...
摘要:源碼分析開(kāi)門篇生命周期入口文件用戶發(fā)起的請(qǐng)求都會(huì)經(jīng)過(guò)應(yīng)用的入口文件,通常是文件。注冊(cè)錯(cuò)誤和異常機(jī)制執(zhí)行注冊(cè)錯(cuò)誤和異常處理機(jī)制。由三部分組成應(yīng)用關(guān)閉方法錯(cuò)誤處理方法異常處理方法注冊(cè)應(yīng)用關(guān)閉方法是為了便于攔截一些系統(tǒng)錯(cuò)誤。 源碼分析—開(kāi)門篇 thinkphp生命周期 1、入口文件 用戶發(fā)起的請(qǐng)求都會(huì)經(jīng)過(guò)應(yīng)用的入口文件,通常是 ==public/index.php==文件。當(dāng)然,你也可以更改...
摘要:源碼分析入口篇源碼分析應(yīng)用入口用戶發(fā)起的請(qǐng)求都會(huì)經(jīng)過(guò)應(yīng)用的入口文件,通常是文件。當(dāng)然,你也可以更改或者增加新的入口文件。通常,我們不建議在應(yīng)用入口文件中加入過(guò)多的代碼,尤其是和業(yè)務(wù)邏輯相關(guān)的代碼。 源碼分析---入口篇 源碼分析 應(yīng)用入口 用戶發(fā)起的請(qǐng)求都會(huì)經(jīng)過(guò)應(yīng)用的入口文件,通常是 ==public/index.php==文件。當(dāng)然,你也可以更改或者增加新的入口文件。 通常入口文件的...
閱讀 2373·2021-11-24 11:15
閱讀 3266·2021-11-24 10:46
閱讀 1576·2021-11-24 09:39
閱讀 4084·2021-08-18 10:21
閱讀 1616·2019-08-30 15:53
閱讀 1538·2019-08-30 11:19
閱讀 3463·2019-08-29 18:42
閱讀 2508·2019-08-29 16:58