私有网络VPC

    Route

    确认Endpoint

    在确认您使用SDK时配置的Endpoint时,可先阅读开发人员指南中关于API服务域名 的部分,理解Endpoint相关的概念。百度智能云目前开放了多区域支持,请参考区域选择说明。

    目前支持区域对应信息为:

    访问区域 对应Endpoint
    北京 bcc.bj.baidubce.com
    广州 bcc.gz.baidubce.com
    苏州 bcc.su.baidubce.com
    香港 bcc.hkg.baidubce.com
    武汉 bcc.fwh.baidubce.com
    保定 bcc.bd.baidubce.com

    获取密钥

    要使用百度智能云Route,您需要拥有一个有效的 AK(Access Key ID)和SK(Secret Access Key)用来进行签名认证。AK/SK是由系统分配给用户的,均为字符串,用于标识用户,为访问Route做签名验证。 可以通过如下步骤获得并了解您的AK/SK信息:

    注册百度智能云账号

    创建AK/SK

    新建RouteClient

    RouteClient是Route服务的客户端,为开发者与Route服务进行交互提供了一系列的方法。

    使用AK/SK新建RouteClient 通过AK/SK方式访问Route,用户可以参考如下代码新建一个RouteClient:

    public class Sample {
        public static void main(String[] args) {
            String ACCESS_KEY_ID = <your-access-key-id>;                   // 用户的Access Key ID
            String SECRET_ACCESS_KEY = <your-secret-access-key>;           // 用户的Secret Access Key
    
            // 初始化一个RouteClient
            BceClientConfiguration config = new BceClientConfiguration();
            config.setCredentials(new DefaultBceCredentials(ACCESS_KEY_ID, SECRET_ACCESS_KEY));
            RouteClient client = new RouteClient(config);
        }
    }

    在上面代码中,ACCESS_KEY_ID对应控制台中的“Access Key ID”,SECRET_ACCESS_KEY对应控制台中的“Access Key Secret”,获取方式请参考《操作指南管理ACCESSKEY》。

    上面的方式使用默认域名作为Route的服务地址,如果用户需要自己指定域名,可以通过传入ENDPOINT参数来指定。

    String ACCESS_KEY_ID = <your-access-key-id>;                   // 用户的Access Key ID
    String SECRET_ACCESS_KEY = <your-secret-access-key>;           // 用户的Secret Access Key
    String ENDPOINT = <domain-name>;                               // 用户自己指定的域名
    
    BceClientConfiguration config = new BceClientConfiguration();
    config.setCredentials(new DefaultBceCredentials(ACCESS_KEY_ID,SECRET_ACCESS_KEY));
    config.setEndpoint(ENDPOINT);
    RouteClient client = new RouteClient(config);

    注意:ENDPOINT参数只能用指定的包含区域的域名来进行定义,不指定时默认为北京区域。

    使用STS创建RouteClient

    申请STS token

    Route可以通过STS机制实现第三方的临时授权访问。STS(Security Token Service)是百度智能云提供的临时授权服务。通过STS,您可以为第三方用户颁发一个自定义时效和权限的访问凭证。第三方用户可以使用该访问凭证直接调用百度智能云的API或SDK访问百度智能云资源。

    通过STS方式访问Route,用户需要先通过STS的client申请一个认证字符串,申请方式可参见百度智能云STS使用介绍

    用STS token新建RouteClient

    申请好STS后,可将STStoken配置到RouteClient中,用户可以参考如下代码新建一个RouteClient:

    public class StsExample {
        private static final String STS_ENDPOINT = "http://sts.bj.baidubce.com";
        private static final String ACCESS_KEY_ID = "your accesskey id";
        private static final String SECRET_ACCESS_KEY = "your secret accesskey";
    
        public static void main(String[] args) {
            BceCredentials credentials = new DefaultBceCredentials(ACCESS_KEY_ID, SECRET_ACCESS_KEY);
            StsClient client = new StsClient(
                    new BceClientConfiguration().withEndpoint(STS_ENDPOINT).withCredentials(credentials)
            );
            GetSessionTokenResponse response = client.getSessionToken(new GetSessionTokenRequest());
            // or simply call:
            // GetSessionTokenResponse response = client.getSessionToken();
            // or you can specify limited permissions with ACL:
            // GetSessionTokenResponse response = client.getSessionToken(new GetSessionTokenRequest().withAcl("blabla"));
            // build DefaultBceSessionCredentials object from response:
            BceCredentials routestsCredentials = new DefaultBceSessionCredentials(
                    response.getAccessKeyId(),
                    response.getSecretAccessKey(),
                    response.getSessionToken());
            System.out.println("==================================");
            System.out.println("GetSessionToken result:");
            System.out.println("    accessKeyId:  " + response.getAccessKeyId());
            System.out.println("    secretAccessKey:  " + response.getSecretAccessKey());
            System.out.println("    securityToken:  " + response.getSessionToken());
            System.out.println("    expiresAt:  " + response.getExpiration().toString());
            System.out.println("==================================");
    
            // build Route client
            BceClientConfiguration config = new BceClientConfiguration();
            config.setCredentials(routestsCredentials);
            RouteClient routeClient = new RouteClient(config);
        }
    }

    注意:目前使用STS配置client时,无论对应Route服务的endpoint在哪里,endpoint都需配置为http://sts.bj.baidubce.com。

    配置HTTPS协议访问Route

    Route支持HTTPS传输协议,您可以通过如下两种方式在Route Java SDK中使用HTTPS访问Route服务:

    • 在endpoint中指明https:
    String endpoint = "https://bcc.bj.baidubce.com";
    String ak = "ak";
    String sk = "sk";
    BceClientConfiguration config = new BceClientConfiguration();
    config.setCredentials(new DefaultBceCredentials(ak, sk));
    RouteClient client = new RouteClient(config);
    • 通过调用setProtocol方法设置https协议:
    String endpoint = "bcc.bj.baidubce.com"; // endpoint中不包含protocol
    String ak = "ak";
    String sk = "sk";
    BceClientConfiguration config = new BClientConfiguration();
    config.setCredentials(new DefaultBceCredentials(ak, sk));
    config.setEndpoint(ENDPOINT);
    config.setProtocol(Protocol.HTTPS); // 如果不指明, 则使用http
    RouteClient client = new RouteClient(config);

    注意:**如果在endpoint中指明了protocol, 则endpoint中的生效, 另外单独再调用setProtocol()不起作用。

    String endpoint = "https://bcc.bj.baidubce.com";
    String ak = "ak";
    String sk = "sk";
    BceClientConfiguration config = new BceClientConfiguration();
    config.setCredentials(new DefaultBceCredentials(ak, sk));
    config.setEndpoint(ENDPOINT);    
    config.setProtocol(Protocol.HTTPS); // endpoint中已经指明, 此为无效操作, 对http也是如此
    RouteClient client = new RouteClient(config);

    配置RouteClient

    如果用户需要配置RouteClient的一些细节的参数,可以在构造RouteClient的时候传入BceClientConfiguration对象。BceClientConfiguration是RouteClient服务的配置类,可以为客户端配置代理,最大连接数等参数。

    使用代理

    下面一段代码可以让客户端使用代理访问Route服务:

    String ACCESS_KEY_ID = <your-access-key-id>;                   // 用户的Access Key ID
    String SECRET_ACCESS_KEY = <your-secret-access-key>;           // 用户的Secret Access Key
    String ENDPOINT = <domain-name>;                               // 用户自己指定的域名
    
    // 创建BceClientConfiguration实例
    BceClientConfiguration config = new BceClientConfiguration();
    
    // 配置代理为本地8080端口
    config.setProxyHost("127.0.0.1");
    config.setProxyPort(8080);
    
    // 创建Route客户端
    config.setCredentials(new DefaultBceCredentials(ACCESS_KEY_ID,SECRET_ACCESS_KEY));
    config.setEndpoint(ENDPOINT);
    RouteClient client = new RouteClient(config);

    使用上面的代码段,客户端的所有操作都会通过127.0.0.1地址的8080端口做代理执行。

    对于有用户验证的代理,可以通过下面的代码段配置用户名和密码:

    // 创建BceClientConfiguration实例
    BceClientConfiguration config = new BceClientConfiguration();
        
    // 配置代理为本地8080端口
    config.setProxyHost("127.0.0.1");
    config.setProxyPort(8080);
        
    //设置用户名和密码
    config.setProxyUsername(<username>);                             //用户名
    config.setProxyPassword(<password>);                             //密码

    设置网络参数

    用户可以用BceClientConfiguration对基本网络参数进行设置:

    BceClientConfiguration config = new BceClientConfiguration();
        
    // 设置HTTP最大连接数为10
    config.setMaxConnections(10);
        
    // 设置TCP连接超时为5000毫秒
    config.setConnectionTimeout(5000);
        
    // 设置Socket传输数据超时的时间为2000毫秒
    config.setSocketTimeout(2000);

    参数说明

    通过BceClientConfiguration能指定的所有参数如下表所示:

    参数 说明
    UserAgent 用户代理,指HTTP的User-Agent头
    Protocol 连接协议类型
    ProxyDomain 访问NTLM验证的代理服务器的Windows域名
    ProxyHost 代理服务器主机地址
    ProxyPort 代理服务器端口
    ProxyUsername 代理服务器验证的用户名
    ProxyPassword 代理服务器验证的密码
    ProxyPreemptiveAuthenticationEnabled 是否设置用户代理认证
    ProxyWorkstation NTLM代理服务器的Windows工作站名称
    LocalAddress 本地地址
    ConnectionTimeoutInMillis 建立连接的超时时间(单位:毫秒)
    SocketTimeoutInMillis 通过打开的连接传输数据的超时时间(单位:毫秒)
    MaxConnections 允许打开的最大HTTP连接数
    RetryPolicy 连接重试策略
    SocketBufferSizeInBytes Socket缓冲区大小
    StreamBufferSize 流文件缓冲区大小

    查询路由表

    查询路由表,请求参数routeTableId和vpcId不可以同时为空。

    查询路由表实例代码如下:

    public GetRouteResponse getRoute(String routeTableId, String vpcId) {
        GetRouteRequest request = new GetRouteRequest();
        // routeTableId和vpcId不可以同时为空
        if (Strings.isNullOrEmpty(vpcId) && Strings.isNullOrEmpty(routeTableId)) {
            throw new IllegalArgumentException("routeTableId and vpcId should not be empty at the same time");
        }
        else if (!Strings.isNullOrEmpty(routeTableId)) {
            // 设置待查询的路由表id
            request.withRouteTableId(routeTableId);
        }
        else if (!Strings.isNullOrEmpty(vpcId)) {
            // 设置待查询的vpc的id
            request.withVpcId(vpcId);
        }
        return getRoutes(request);
    }

    也可以自定义配置更多其他参数,请求参数如下:

    参数名称 类型 是否必需 描述
    version String API版本号
    routeTableId String 路由表id,该参数和vpcId两者之间至少选一个
    vpcId String VPC的id,该参数和routeTableId两者之间至少选一个

    代码如下:

    private GetRouteResponse getRoutes(GetRouteRequest getRouteRequest) {
        // 校验请求参数是否为 null 
        checkNotNull(getRouteRequest, "route request should not be null");
        // 校验 routeTableId 和 vpcId 是否同时为 null 
        if (Strings.isNullOrEmpty(getRouteRequest.getRouteTableId())
                && Strings.isNullOrEmpty(getRouteRequest.getVpcId())) {
            throw new IllegalArgumentException("routeTableId and vpcId cannot be empty at the same time");
        }
        // 构建请求
        InternalRequest internalRequest = this.createRequest(
                getRouteRequest, HttpMethodName.GET, ROUTE_PREFIX);
        // 设置vpcId或routeTableId参数
        if (!Strings.isNullOrEmpty(getRouteRequest.getVpcId())) {
            internalRequest.addParameter("vpcId", getRouteRequest.getVpcId());
        }
        else if (!Strings.isNullOrEmpty(getRouteRequest.getRouteTableId())) {
            internalRequest.addParameter("routeTableId", getRouteRequest.getRouteTableId());
        }
        return this.invokeHttpClient(internalRequest, GetRouteResponse.class);
    }

    返回参数说明

    返回GetRouteRequest参数如下所示:

    参数名称 类型 描述
    routeTableId String 路由表的id
    vpcId String 路由表所属vpc的id
    routeRules RouteRule 路由规则

    RouteRule

    参数名称 类型 描述
    routeRuleId String 路由规则id
    routeTableId String 路由表id
    sourceAddress String 源网段
    destinationAddress String 目标网段
    nexthopId String 下一跳id,当nexthopType是本地网关类型时,该字段可以为空
    nexthopType String 路由类型。Bcc类型是"custom";VPN类型是"vpn";NAT类型是"nat”;系统默认类型是"sys”,VPC为每个子网自动生成一条默认路由规则,该类型的路由规则id是空,不可编辑和删除。
    description String 描述

    创建路由规则

    创建路由表规则,有以下几点需要注意:

    • 源网段选择自定义时,自定义网段需在已有子网范围内,0.0.0.0/0除外;
    • 目标网段不能与当前所在VPC cidr重叠(目标网段或本VPC cidr为0.0.0.0/0时例外);
    • 新增路由条目的源网段和目标网段,不能与路由表中已有条目源网段和目标网段完全一致。

    请求参数如下:

    参数名称 类型 是否必需 描述
    version String API版本号
    clientToken String 幂等性Token,是一个长度不超过64位的ASCII字符串。
    routeTableId String 路由表id
    sourceAddress String 源网段,可填全部网段0.0.0.0/0、VPC内已有子网网段或子网范围内网段
    destinationAddress String 目标网段,可以是0.0.0.0/0,否则目的地址不能与本VPC cidr重叠(目的网段或本VPC cidr为0.0.0.0/0时例外)
    nexthopId String 下一跳id
    nexthopType String 路由类型。Bcc类型是"custom";VPN类型是"vpn";NAT类型是"nat"
    description String 描述
    public CreateRouteResponse createRoute(CreateRouteRequest request) throws BceClientException {
        // 校验请求参数是否为 null    
        checkNotNull(request, "request should not be null.");
        // 校验是否存在 clientToken
        if (Strings.isNullOrEmpty(request.getClientToken())) {
            request.setClientToken(this.generateClientToken());
        }
        // 设置路由表id、源网段、目的网段、下一跳类型、描述等参数
        checkStringNotEmpty(request.getRouteTableId(), "routeTableId should not be empty");
        checkStringNotEmpty(request.getSourceAddress(), "source address should not be empty");
        checkStringNotEmpty(request.getDestinationAddress(), "destination address should not be empty");
        checkStringNotEmpty(request.getNexthopType(), "nexthop type  should not be empty");
        checkStringNotEmpty(request.getDescription(), "description should not be empty");
        // 构建请求
        InternalRequest internalRequest = this.createRequest(request, HttpMethodName.POST, ROUTE_PREFIX, ROUTE_RULE);
        internalRequest.addParameter("clientToken", request.getClientToken());
        fillPayload(internalRequest,request);
        return invokeHttpClient(internalRequest, CreateRouteResponse.class);
    }

    返回参数说明

    返回CreateRouteResponse参数如下所示:

    参数名称 类型 描述
    routeRuleId String 路由规则id

    删除路由规则

    可以根据routeRuleId删除路由规则

    public void deleteRouteRule(String routeRuleId) {
        deleteRouteRule(new DeleteRouteRequest().withRouteRuleId(routeRuleId));
    }

    也可以自定义配置更多其他参数,请求参数如下:

    参数名称 类型 是否必需 描述
    version String API版本号
    clientToken String 幂等性Token,是一个长度不超过64位的ASCII字符串。
    routeRuleId String 路由规则id

    代码如下:

    public void deleteRouteRule(DeleteRouteRequest deleteRouteRequest) {
        // 校验参数是否为null
        checkNotNull(deleteRouteRequest, "request should not be null.");
        // 校验routeRuleId是否为null
        checkNotNull(deleteRouteRequest.getRouteRuleId(), "request routeRuleId should not be null.");
        // 若用户设置 clientToken 则设置该参数
        if (Strings.isNullOrEmpty(deleteRouteRequest.getClientToken())) {
            deleteRouteRequest.setClientToken(this.generateClientToken());
        }
        // 构建请求
        InternalRequest internalRequest = this.createRequest(
                deleteRouteRequest, HttpMethodName.DELETE, ROUTE_PREFIX, ROUTE_RULE,
                deleteRouteRequest.getRouteRuleId());
        internalRequest.addParameter("clientToken", deleteRouteRequest.getClientToken());
        this.invokeHttpClient(internalRequest, AbstractBceResponse.class);
    }
    上一篇
    ACL
    下一篇
    NAT