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