摘要:源碼分析之入口背景去年有個整合多個平臺的項目,底層是華為華等不同平臺的環(huán)境,應(yīng)用管理層為。我們對接華為華等平臺時,對于不同的認證方式,就是使用這種方式,大大減少了開發(fā)量。
openstack4j 源碼分析之入口 背景
去年有個整合多個openstack平臺的項目,底層是華為、華3等不同平臺的openstack環(huán)境,應(yīng)用管理層為java。雖然各平臺功能與原生openstack有所增加,但總體接口風格還是openstack的邏輯。由于openstack接口眾多,一個個去適配接口的工作量巨大,所以決定基于openstack的java sdk來開發(fā)。對比了幾種常見sdk,最后決定選用openstack4j來開發(fā)。
Apache jclouds apache的開源sdk,大而全、雜,可以對接所有常見的云平臺,文檔較少,使用maven引入。
openstack-java-sdk 由愛好者開發(fā)及維護的sdk,更新很慢,github的demo已經(jīng)不能成功連接最新的openstack版本。
openstack4j 官網(wǎng)資料、文檔豐富,接口上手簡單,更新快。
入口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是一個抽象類,通過它我們可以創(chuàng)建出不同的OSClient,而OSClient則是我們用來操作openstack的接口類。OSClient分為V2和V3版本,對應(yīng)openstack V2 與 V3版本的認證模塊(Keystone)。
OSClientV2 與 OSClientV3均為OSClient接口類的內(nèi)部類,通過下面的代碼可以看到,除了在認證模塊有所區(qū)別外,其他模塊沒有任何區(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)來將復雜的對象構(gòu)造過程和主類分離的,具體的對象構(gòu)造行為是由OSClientBuilder來完成,其中包含了endpoint、credentials、scopeToProject等方法來接收外界傳入的登錄所需信息。
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對象中,然后通過authenticate()方法,根據(jù)不同的版本進行認證。
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)三個類(接口),OSFactory、OSClientBuilder(IOSClientBuilder)、OSClient,由OSFactory調(diào)用OSClientBuilder類構(gòu)建OSClient對象,然后進行認證,完成了入口處的代碼邏輯。
可以看到,為了避免由于openstack的認證方式更改而帶來的openstack4j認證對象的劇烈改動,入口類之間的耦合很低,易于擴展。使用建造者模式(Builder Pattern)生成認證信息,將復雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建可以創(chuàng)建不同的表示。對于不同的認證方式,只需要增加或者減少部分組合方法即可。
而對于大版本之間的不同,如V2和V3,則使用工廠模式(Factory Pattern),IOSClientBuilder定義一個創(chuàng)建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創(chuàng)建過程延遲到子類進行。當出現(xiàn)認證版本之間的差異時,只需要在IOSClientBuilder接口類中創(chuàng)建自己的靜態(tài)工廠接口類,就可以輕松完成認證過程的更改。我們對接華為、華3等平臺時,對于不同的認證方式,就是使用這種方式,大大減少了開發(fā)量。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67201.html
摘要:也就是說,封裝了一個自己的對象,而不是和與他平級的共享。但和需求的鏡像顆粒度不同,這樣做的好處是耦合度低,代碼更加分離。對象生成創(chuàng)建的對象時,使用模式。對應(yīng)的類關(guān)系圖其中位于包下,中可以獲取到所有資源的對象構(gòu)建器。 通過上一篇我們獲得到了經(jīng)過認證的OSClient,通過這個接口,我們就使用openstack4j的所有功能了。但openstack4j是一個用來便于我們更方便調(diào)用opens...
摘要:一方面是因為想要克服自己的惰性,另一方面也是想重新溫故一遍。一共分成了個基礎(chǔ)部分,后續(xù)還會繼續(xù)記錄。文章中如果有筆誤或者不正確的解釋,也歡迎批評指正,共同進步。最后地址部分源碼 Why? 網(wǎng)上現(xiàn)有的Vue源碼解析文章一搜一大批,但是為什么我還要去做這樣的事情呢?因為覺得紙上得來終覺淺,絕知此事要躬行。 然后平時的項目也主要是Vue,在使用Vue的過程中,也對其一些約定產(chǎn)生了一些疑問,可...
摘要:一方面是因為想要克服自己的惰性,另一方面也是想重新溫故一遍。一共分成了個基礎(chǔ)部分,后續(xù)還會繼續(xù)記錄。文章中如果有筆誤或者不正確的解釋,也歡迎批評指正,共同進步。最后地址部分源碼 Why? 網(wǎng)上現(xiàn)有的Vue源碼解析文章一搜一大批,但是為什么我還要去做這樣的事情呢?因為覺得紙上得來終覺淺,絕知此事要躬行。 然后平時的項目也主要是Vue,在使用Vue的過程中,也對其一些約定產(chǎn)生了一些疑問,可...
摘要:源碼分析開門篇生命周期入口文件用戶發(fā)起的請求都會經(jīng)過應(yīng)用的入口文件,通常是文件。注冊錯誤和異常機制執(zhí)行注冊錯誤和異常處理機制。由三部分組成應(yīng)用關(guān)閉方法錯誤處理方法異常處理方法注冊應(yīng)用關(guān)閉方法是為了便于攔截一些系統(tǒng)錯誤。 源碼分析—開門篇 thinkphp生命周期 1、入口文件 用戶發(fā)起的請求都會經(jīng)過應(yīng)用的入口文件,通常是 ==public/index.php==文件。當然,你也可以更改...
摘要:源碼分析入口篇源碼分析應(yīng)用入口用戶發(fā)起的請求都會經(jīng)過應(yīng)用的入口文件,通常是文件。當然,你也可以更改或者增加新的入口文件。通常,我們不建議在應(yīng)用入口文件中加入過多的代碼,尤其是和業(yè)務(wù)邏輯相關(guān)的代碼。 源碼分析---入口篇 源碼分析 應(yīng)用入口 用戶發(fā)起的請求都會經(jīng)過應(yīng)用的入口文件,通常是 ==public/index.php==文件。當然,你也可以更改或者增加新的入口文件。 通常入口文件的...
閱讀 2246·2021-11-24 11:15
閱讀 3094·2021-11-24 10:46
閱讀 1390·2021-11-24 09:39
閱讀 3930·2021-08-18 10:21
閱讀 1484·2019-08-30 15:53
閱讀 1401·2019-08-30 11:19
閱讀 3332·2019-08-29 18:42
閱讀 2329·2019-08-29 16:58