阿里专有云OpenAPI开发实践之消息队列

企业在使用阿里专有云服务的时候,自带的ASCM操作界面不一定满足企业的管理需求,并且提供的功能也不一定很全面,那么企业要按自己的需求开发一套操作界面,可以吗?专有云提供了一套庞大的OpenAPI,可能不一定包含所有功能,但已经很强大,可以满足企业日常大部分需求。专有云上的产品众多,不同的产品也是由不同的团队开发,提供的接口也不尽相同,这篇文章分享一下其中一个产品–消息队列MQ。

这里说的消息队列,对应的是MQ RocketMQ版。原名开放消息服务,简称ONS。本文介绍的不是对MQ产品本身的发布/订阅这种使用,而是使用OpenAPI开发MQ控制台功能。在开发之前,我们自然需要了解尽可能多的资料,有没有什么途径可以了解API呢?其实在官网已经提供了一些文档,可以帮助我们了解产品的API接口。

环境介绍

软件版本
专有云3.12.0、3.14.0

文档资料

消息队列MQ产品的Endpoint

不同的云产品有自己的Endpoint,消息队列的Endpoint格式如下:
https://mq.console.ext.xxx.xxx.xxx

xxx.xxx.xxx是企业专有云的域名,比如: m.myself.com,那么完整Endpoint就是: https://mq.console.ext.m.myself.com
这个地址是根据专有云运维团队进行配置的,如果不对可以咨询运维具体的Endpoint
另外需要注意的是,专有云服务有白名单功能,不是任意IP都可以访问,如果telnet不通,可以申请开通专有云访问权限

消息队列产品没有相应的SDK

开发专有云消息队列控制台功能,没有相应的SDK,只能根据接口文档进行http请求的调用。

简单调用示例

以查询MQ实例列表接口为例,请求的完整接口地址是:
https://mq.console.ext.m.myself.com/json/instance/list

请求示例代码:

    @Test
    void onsDemo_oneInstanceList() {
        //设置Http的Header
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        //设置访问参数
        Map<String, Object> params = new LinkedHashMap<>();
        params.put("_accesskey", accessKeyId);
        params.put("__preventCache", String.valueOf(System.currentTimeMillis()));
        params.put("_regionId", aliyunPropClientProperties.getRegionId());
        params.put("_signature", SignatureUtils.getSignatureOpenApi(accessKeySecret, params));

        HttpEntity entity = new HttpEntity<>(params, headers);

        String url = "https://mq.console.ext.m.myself.com";
        String path = "/json/instance/list";

        StringBuilder urlBuilder = new StringBuilder();
        urlBuilder.append(url).append(path).append("?");
        for(Map.Entry<String, Object> entry : params.entrySet()) {
            urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
        }
        urlBuilder.setLength(urlBuilder.length()-1);

        ResponseEntity<String> testResult = restTemplate.getForEntity(new URI(urlBuilder.toString()), String.class);
        assertEquals(HttpStatus.OK, testResult.getStatusCode());
    }

RAM授权

  • 如果提示没有权限,或者查不到数据,需要对用户进行RAM授权。
  • 参考官方资料:https://help.aliyun.com/document_detail/112711.html
  • RAM授权示例如下
{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "mq:OnsInstanceBaseInfo",
        "mq:QueryGroupSubDetail",
        "mq:*Query",
        "mq:Query*",
        "mq:List*",
        "mq:*List",
        "mq:PUB",
        "mq:SUB"
      ],
      "Resource": [
        "acs:mq:*:*:*"
      ]
    },
    {
      "Action": [
        "mq:QueryGroupSubDetail"
      ],
      "Resource": "*",
      "Effect": "Allow"
    }
  ]
}

《开发指南》之外的OpenAPI

《开发指南》中有获取Topic授权列表,接口地址是/json/empower/list

但是《开发指南》中并没有获取Group授权列表的接口说明,经过咨询得知,接口地址是/json/empower/listGroup

总结

  • 消息队列的控制台API没有SDK,需要使用原生http发起请求
  • 使用RestTemplate这个工具调用时,需要把签名后的url包装成URI对象,否则会报-4009签名错误
  • 《开发指南》没有的API,需要咨询阿里TIM团队进一步确认是否有相应的接口
  • 专有云有IP白名单限制,不是每个人的IP都可以访问专有云,需要申请开通访问权限
  • 界面是靠组织用户角色进行管理,OpenAPI是靠RAM授权,没有RAM授权就会出现在界面上能正常查到数据,通过API查不到
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐