资讯专栏INFORMATION COLUMN

openstack4j 源码分析 (一) 入口

KnewOne / 2906人阅读

摘要:源码分析之入口背景去年有个整合多个平台的项目,底层是华为华等不同平台的环境,应用管理层为。我们对接华为华等平台时,对于不同的认证方式,就是使用这种方式,大大减少了开发量。

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 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);
      }

}

入口处的代码主要关联三个类(接口),OSFactory、OSClientBuilder(IOSClientBuilder)、OSClient,由OSFactory调用OSClientBuilder类构建OSClient对象,然后进行认证,完成了入口处的代码逻辑。

可以看到,为了避免由于openstack的认证方式更改而带来的openstack4j认证对象的剧烈改动,入口类之间的耦合很低,易于扩展。使用建造者模式(Builder Pattern)生成认证信息,将复杂的构建与其表示相分离,使得同样的构建可以创建不同的表示。对于不同的认证方式,只需要增加或者减少部分组合方法即可。

而对于大版本之间的不同,如V2和V3,则使用工厂模式(Factory Pattern),IOSClientBuilder定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。当出现认证版本之间的差异时,只需要在IOSClientBuilder接口类中创建自己的静态工厂接口类,就可以轻松完成认证过程的更改。我们对接华为、华3等平台时,对于不同的认证方式,就是使用这种方式,大大减少了开发量。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67201.html

相关文章

  • openstack4j 源码分析(二) model对象

    摘要:也就是说,封装了一个自己的对象,而不是和与他平级的共享。但和需求的镜像颗粒度不同,这样做的好处是耦合度低,代码更加分离。对象生成创建的对象时,使用模式。对应的类关系图其中位于包下,中可以获取到所有资源的对象构建器。 通过上一篇我们获得到了经过认证的OSClient,通过这个接口,我们就使用openstack4j的所有功能了。但openstack4j是一个用来便于我们更方便调用opens...

    pingan8787 评论0 收藏0
  • 入口文件开始,分析Vue源码实现

    摘要:一方面是因为想要克服自己的惰性,另一方面也是想重新温故一遍。一共分成了个基础部分,后续还会继续记录。文章中如果有笔误或者不正确的解释,也欢迎批评指正,共同进步。最后地址部分源码 Why? 网上现有的Vue源码解析文章一搜一大批,但是为什么我还要去做这样的事情呢?因为觉得纸上得来终觉浅,绝知此事要躬行。 然后平时的项目也主要是Vue,在使用Vue的过程中,也对其一些约定产生了一些疑问,可...

    Karrdy 评论0 收藏0
  • 入口文件开始,分析Vue源码实现

    摘要:一方面是因为想要克服自己的惰性,另一方面也是想重新温故一遍。一共分成了个基础部分,后续还会继续记录。文章中如果有笔误或者不正确的解释,也欢迎批评指正,共同进步。最后地址部分源码 Why? 网上现有的Vue源码解析文章一搜一大批,但是为什么我还要去做这样的事情呢?因为觉得纸上得来终觉浅,绝知此事要躬行。 然后平时的项目也主要是Vue,在使用Vue的过程中,也对其一些约定产生了一些疑问,可...

    nidaye 评论0 收藏0
  • thinkphp源码分析)—开门篇

    摘要:源码分析开门篇生命周期入口文件用户发起的请求都会经过应用的入口文件,通常是文件。注册错误和异常机制执行注册错误和异常处理机制。由三部分组成应用关闭方法错误处理方法异常处理方法注册应用关闭方法是为了便于拦截一些系统错误。 源码分析—开门篇 thinkphp生命周期 1、入口文件 用户发起的请求都会经过应用的入口文件,通常是 ==public/index.php==文件。当然,你也可以更改...

    flybywind 评论0 收藏0
  • thinkphp源码分析(二)—入口

    摘要:源码分析入口篇源码分析应用入口用户发起的请求都会经过应用的入口文件,通常是文件。当然,你也可以更改或者增加新的入口文件。通常,我们不建议在应用入口文件中加入过多的代码,尤其是和业务逻辑相关的代码。 源码分析---入口篇 源码分析 应用入口 用户发起的请求都会经过应用的入口文件,通常是 ==public/index.php==文件。当然,你也可以更改或者增加新的入口文件。 通常入口文件的...

    lingdududu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<