使用华为SDK开发MRS API应用初实践(Java语言)

举报
breakDawn 发表于 2023/12/27 22:39:58 2023/12/27
【摘要】 在今天的技术世界里,接入华为云服务API可以比你想象的更简单。作为一名华为云相关的开发者,我深知那些看似繁琐的请求体编写和URL拼接实际上有多么耗时。幸运的是,华为云提供了一整套易于使用的SDK,大大简化了整个开发过程。在这篇文章中,我将分享我的个人经验和实用技巧,希望能帮助像我一样的开发者更高效地使用MRS服务,无论你是刚刚起步还是正在寻找改进开发流程的方法,这里都有你需要的东西。 SDK...

在今天的技术世界里,接入华为云服务API可以比你想象的更简单。
作为一名华为云相关的开发者,我深知那些看似繁琐的请求体编写和URL拼接实际上有多么耗时。幸运的是,华为云提供了一整套易于使用的SDK,大大简化了整个开发过程。
在这篇文章中,我将分享我的个人经验和实用技巧,希望能帮助像我一样的开发者更高效地使用MRS服务,无论你是刚刚起步还是正在寻找改进开发流程的方法,这里都有你需要的东西。

SDK获取

首先,你需要根据你的语言,选取SDK的获取方式。
我们可以进入这个链接SDK中心——MapReduce服务
里面针对5种不同的语言,都提供了相关的安装方式。
image.png

我的语言环境是JAVA,因此只需要在pom文件中加入

<dependency>
    <groupId>com.huaweicloud.sdk</groupId>
    <artifactId>huaweicloud-sdk-mrs</artifactId>
    <version>3.1.74</version>
</dependency>

实际版本号按需选择,例如你想使用的API是最近刚发布的,那么就需要使用最新的mrs sdk版本号(上面那个链接里所显示的版本号)。

但是在工程实践中引入第三方包时,很容易存在版本依赖冲突, 例如工程需要的jackson版本和sdk依赖的jackson版本不一致导致应用时报错。

一种处理方式是手动分析依赖树,在pom里进行指定包的exclude的排除。
另一种官方的处理方式,是改为引入如下这个bundle包:

<dependency>
    <groupId>com.huaweicloud.sdk</groupId>
    <artifactId>huaweicloud-sdk-bundle</artifactId>
    <version>${version}</version>
</dependency>

这个包包含了所有支持的服务和重定向了SDK依赖的第三方软件,可以避免和工程自身依赖的库产生冲突。但注意bunlde包里已经包含了mrs服务的包了,无需再进行额外引入。

配置认证信息

要发起华为云的API调用,首先必须得有相应的认证信息。
在SDK调用中,一般都是使用ak sk来发起调用,无需再自己编写向IAM获取临时token的操作。
由于MRS服务是region级服务, 我们只需要创建BasicCredentials即可(如果是region级服务的调用需要使用GlobalCredetials,比如EPS等)

       BasicCredentials auth = new BasicCredentials()
                .withAk(你的AK)
                .withSk(你的SK)
                .withProjectId(你的projectId);

ak 和sk可以在用户右上角的认证凭据中创建,或者通过IAM的API进行创建。
创建永久访问密钥

需要注意的是,生产实践中 ak sk应当密文存放,使用时再解密,确保安全。

创建初始连接配置

生产实践中,很少使用默认配置,一般都会设置一定的超时时间等

HttpConfig httpConfig = HttpConfig.getDefaultHttpConfig();

我们可以在HttpConfig代码中查看有哪些可以设置的参数,使用builder模式进行配置。
常见的几个有:

  • 超时时间
HttpConfig httpConfig = HttpConfig.getDefaultHttpConfig().withTimeout(60);
  • 网络代理。如果你是在封闭的内部开发环境上,试图访问华为云的api,一般都需要配置相关代理才能从sdk中正常访问。
// 根据需要配置网络代理,网络代理默认的协议为 `http` 协议
HttpConfig httpConfig = HttpConfig.getDefaultHttpConfig()
    // 请根据实际情况替换示例中的代理地址和端口号
    .withProxyHost("你的代理域名")
    .withProxyPort("你的代理端口")
    // 如果代理需要认证,请配置用户名和密码
    .withProxyUsername(System.getenv("PROXY_USERNAME"))
    .withProxyPassword(System.getenv("PROXY_PASSWORD"));
  • SSL配置,防止拦截
    为了避免调用过程被中间人恶意攻击进行拦截,可以配置SSL认证
// 自定义SSLSocketFactory和TrustManager,需要用户自行实现
HttpConfig httpConfig = HttpConfig.getDefaultHttpConfig()
    .withSSLSocketFactory(sslSocketFactory)
    .withX509TrustManager(trustManager);

这部分和常见的HTTP客户端设置ssl和trust信任内容类似,这里不再详述。

创建客户端

创建客户端就非常简单了,将上面的认证凭据和http配置用于客户端构建即可

MrsClient client = MrsClient.newBuilder()
        .withCredential(auth)
         .withHttpConfig(httConfig)
         .build();

需要注意的是你要使用的是MRS服务哪个版本的API。
如果是V1的API,MrsClient在import时选择的应该是com.huaweicloud.sdk.mrs.v1这个包路径下的。
如果是V2的API,则就是com.huaweicloud.sdk.mrs.v2包路径下的,否则后面可能会发现找不到对应API的调用方法。

发起调用

我们无需去官网文档特地查找api的url是什么,亦或是请求体的参数叫什么名字。
在SDK中都可以直接使用,各个api,都会提供符合规范的方法名直接调用。

比如我希望查询running状态的集群列表,直接在请求里设置集群状态,并调用客户端里的listClusters方法即可:

 MrsClient client = MrsClient.newBuilder()
                .withCredential(auth)
                .withRegion(MrsRegion.valueOf("cn-north-4"))
                .build();
        ListClustersRequest request = new ListClustersRequest();
        request.withClusterState("running");
        try {
            ListClustersResponse response = client.listClusters(request);
            System.out.println(response.toString());
        } catch (ConnectionException e) {
            // 连接失败,一般需要检查网络或者代理配置
        } catch (RequestTimeoutException e) {
            // 连接超时,同样检查网络
        } catch (ServiceResponseException e) {
            // API响应异常,可以打印此时的状态码、错误消息、请求ID等
            System.out.println(e.getHttpStatusCode());
            System.out.println(e.getRequestId());
            System.out.println(e.getErrorCode());
            System.out.println(e.getErrorMsg());
        }

当我们调用过程发生异常时,请尽量打印出ServiceResponseException里的requestId,方便联系MRS服务的运维人员进行该请求的定位和排查。

更精细化的调用过程

上述直接调用listClusters时使用的是默认的发送逻辑和配置。
如果希望做更多定制化的处理,需要改成使用
client.listClustersInvoker(request)*
来创建自定义请求过程,并进行相应的逻辑拼接。

例如我们可以在invoker后面自定义相应的请求头修改返回的语言:

    ListClustersResponse response = client.listClustersInvoker(request)
    // 自定义请求头
    .addHeader("X-Language", "zh-cn")
    .invoke();

也可以设置请求的重试逻辑:

    ListClustersResponse response = client.listClustersInvoker(request)
        .retryTimes(重试次数,最大30)
        .retryCondition(
            (resp, ex) -> (针对返回值和异常判断的重试条件))
        .invoke();

其他

另外,如果需要更详细的指导,可以学习官方资料SDK概述中的内容, 或者使用API Explore来进行简单sdk示例的自动生成。

总而言之,华为云SDK的易用性对于我们的开发工作会带来极大的效率提升,使繁琐的API调用开发变得简单易行,无论你是在构建复杂的企业级应用还是简单的个人项目,华为云SDK都将是你上云之路的可靠伙伴。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。