全部产品

离线版数据服务更新

更新时间:2021-05-20 11:37:09

升级指南

离线版因为可以脱离公网使用,仅有查询功能,所以离线库升级无法在离线sdk中继续完成,可通过API的方式获取离线库文件下载地址,通过与本地文件版本号对比选择合适时间下载并替换完成升级。

注意

如果对数据精确度要求较高推荐经常更新离线库文件,阿里数据源一般24小时更新一次。授权文件通常因为购买的服务发生变配升级、续费而产生更新,强烈推荐发现新版授权文件后立即更新,确保服务升级续费在您本地生效。sdk更新频率较低,如果发现有升级也推荐更新(sdk更新可能要重启服务,建议在业务低峰期处理)。

1、手动升级

阿里云控制台页面直接下载最新的离线库文件、sdk、授权文件配置离线文件路径重新启动服务或者替换实例进行升级

优点:方便、简单、快速使用服务

缺点:当前节点可能需要停止服务

2、自动升级(推荐)

通过API获取离线库文件、sdk、授权文件等下载地址,与本地版本号对比,自动下载文件、替换文件、更换实例或重启服务进行升级

优点:可升级集群,保持文件最新,可不停止服务进行升级

缺点:升级方案需要自行设置

以下三个API用于升级离线产品,演示代码默认使用SpringBoot(仅仅是为了方便显示json返回值)

(1)、通过DescribeGeoipInstances获取所有已购买的产品实例列表(instanceId即实例ID,也可手动获取)返回结果如下所示:

{
    "productCode": "geoipv4offline",
    "instanceId": "geoipv4offline_cn-*",
    "versionCode": "version_standard",
    "status": "OPEN",
    "createTime": "2020-08-19T03:15Z",
    "createTimestamp": 1597806917000,
    "expireTime": "2022-02-22T16:00Z",
    "expireTimestamp": 1645545600000,
    "maxQps": 150000,
    "maxQpd": null
}

(2)、通过 DescribeGeoipInstanceDataInfos 根据传入参数获取离线版实例数据信息,需要使用instanceId参数。

从零开始接入阿里云IP地理位置库在线版项目com.example.service.GeoipService.java添加如下代码

    //根据传入参数获取离线版实例数据信息
    public DescribeGeoipInstanceDataInfosResponse DescribeGeoipInstanceDataInfos(String instanceId) {
        DescribeGeoipInstanceDataInfosRequest request = new DescribeGeoipInstanceDataInfosRequest();
        request.setInstanceId(instanceId); 

        DescribeGeoipInstanceDataInfosResponse response = null;
        try {
            response = client.getAcsResponse(request);
            System.out.println(new Gson().toJson(response));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

        return response;
    }

从零开始接入阿里云IP地理位置库在线版项目com.example.controller.GeoipController.java添加如下代码

    @GetMapping("/online/dataInfos/{instanceId}")
    public DescribeGeoipInstanceDataInfosResponse dataInfos(@PathVariable String instanceId) {
        return geoipService.DescribeGeoipInstanceDataInfos(instanceId);
    }

在浏览器访问

http://127.0.0.1:8080/http/online/dataInfos/geoipv4offline_cn-*

参数为购买服务的实例ID

{
    "requestId": "BB2DB17C-EFA9-4ABF-8D57-02C02156CD0E",
    "dataInfos": [
        {
            "type": "IPV4_DATA",
            "version": "1.20210420122927",
            "updateTime": "2021-04-20T04:45Z",
            "updateTimestamp": 1618893902000,
            "downloadCount": 0
        },
        {
            "type": "LICENSE",
            "version": "1.20210222123044",
            "updateTime": "2021-02-22T04:30Z",
            "updateTimestamp": 1613968246000,
            "downloadCount": 202
        },
        {
            "type": "JAVA_SDK",
            "version": "1.20210113140642",
            "updateTime": "2021-01-13T08:30Z",
            "updateTimestamp": 1610526600000,
            "downloadCount": 96
        },
        {
            "type": "CPP_SDK",
            "version": "1.20200908161000",
            "updateTime": "2020-09-08T08:15Z",
            "updateTimestamp": 1599552901000,
            "downloadCount": 86
        },
        {
            "type": "PYTHON_SDK",
            "version": "1.20200903171000",
            "updateTime": "2020-09-03T09:19Z",
            "updateTimestamp": 1599124765000,
            "downloadCount": 85
        }
    ]
}

API返回了具体的sdk、授权文件、离线库等类型,根据类型继续调用API即可得到具体的文件下载地址

(3)、通过 DescribeGeoipInstanceDataUrl 根据传入参数获取离线版实例数据下载链接,需要使用instanceId、dataType(上个接口type字段)参数。

从零开始接入阿里云IP地理位置库在线版项目com.example.service.GeoipService.java添加如下代码

    //根据传入参数获取离线版实例数据下载链接
    public DescribeGeoipInstanceDataUrlResponse DescribeGeoipInstanceDataUrl(String instanceId, String dataType) {
        DescribeGeoipInstanceDataUrlRequest request = new DescribeGeoipInstanceDataUrlRequest();
        request.setInstanceId(instanceId);
        request.setDataType(dataType);

        DescribeGeoipInstanceDataUrlResponse response = null;
        try {
            response = client.getAcsResponse(request);
            //可以用 Getter方法拿到下载地址url或直接打印json
            //System.out.println(response.getFixedDomainDownloadUrl());
            System.out.println(new GsonBuilder().disableHtmlEscaping().create().toJson(response));   
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

        return response;
    }

从零开始接入阿里云IP地理位置库在线版项目com.example.controller.GeoipController.java添加如下代码

    @GetMapping("/online/dataUrl/{instanceId}/{dataType}")
    public DescribeGeoipInstanceDataUrlResponse dataUrl(@PathVariable String instanceId, @PathVariable String dataType) {
        System.out.println(instanceId);
        System.out.println(dataType);
        return geoipService.DescribeGeoipInstanceDataUrl(instanceId, dataType);
    }

在浏览器访问

http://127.0.0.1:8080/http/online/dataUrl/geoipv4offline_cn-*/IPV4_DATA

结果如下所示:得到当前类型的下载地址,可通过代码下载到本地替换数据完成离线库更新,其中fixedDomainDownloadUrl返回值为固定域名,推荐优先使用此地址下载,若需要配置安全策略,可将file.geoip.alidns.com域名加白名单。

{
    "fixedDomainDownloadUrl": "https://file.geoip.alidns.com/product/v1/ipv4/common/v1.20210420082401.dex?Expires=*",
    "requestId": "65E15C91-7FC4-4B99-9C94-692E9DEFE9F2",
    "downloadUrl": "http://geoip-sdk-user.oss-cn-zhangjiakou.aliyuncs.com/product/v1/ipv4/common/v1.20210420082401.dex?Expires=*"
}

http://127.0.0.1:8080/http/online/dataUrl/geoipv4offline_cn-*/LICENSE

http://127.0.0.1:8080/http/online/dataUrl/geoipv4offline_cn-*/JAVA_SDK

http://127.0.0.1:8080/http/online/dataUrl/geoipv4offline_cn-*/CPP_SDK

http://127.0.0.1:8080/http/online/dataUrl/geoipv4offline_cn-*/PYTHON_SDK

注意

获取的链接地址具有时效性,超时后需要重新请求获得地址

升级说明

离线库文件升级后要重新启动实例或平滑重启服务,新的实例才会生效(数据在第一次实例化后就已经全部加载到内存中,后续直接从内存读取),以java为例:

一、通过构造方法初始化后的实例重启

FastIPGeoClient fastIpGeoClient = new FastIPGeoClient(geoConf);

在自行下载升级离线数据后,需要配置新的实例,如:

FastIPGeoClient fastIpGeoClient2 = new FastIPGeoClient(geoConf2);

在自定义想替换的时机重新赋值,如:

fastIpGeoClient = fastIpGeoClient2;

二、通过静态方法(单例模式)初始化后的实例重启

因为是将加载字段、license文件路径、数据文件路径封装成一个实例,获取的实例不会重复创建。

FastIPGeoClient fastIpGeoClient = FastIPGeoClient.getSingleton(geoConf);

1、可以采用非单例方法来包装单例,然后在自定义想替换的时机重新实例化对象即可。

2、更改license或数据文件的路径,重新加载单例模式的实例。