成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

openstack4j 源碼分析 (一) 入口

KnewOne / 2996人閱讀

摘要:源碼分析之入口背景去年有個(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 OSClientBuilder implements 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 OSClientBuilder implements 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

相關(guān)文章

  • openstack4j 源碼分析(二) model對(duì)象

    摘要:也就是說(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...

    pingan8787 評(píng)論0 收藏0
  • 入口文件開(kāi)始,分析Vue源碼實(shí)現(xià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),可...

    Karrdy 評(píng)論0 收藏0
  • 入口文件開(kāi)始,分析Vue源碼實(shí)現(xià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),可...

    nidaye 評(píng)論0 收藏0
  • thinkphp源碼分析)—開(kāi)門篇

    摘要:源碼分析開(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)然,你也可以更改...

    flybywind 評(píng)論0 收藏0
  • thinkphp源碼分析(二)—入口

    摘要:源碼分析入口篇源碼分析應(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)然,你也可以更改或者增加新的入口文件。 通常入口文件的...

    lingdududu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<