通过扩展应用程序运行时指标(比如内存和响应时间),使用 IBM Bluemix® Auto-Scaling 让您的应用程序变得富有弹性。在本教程中,我将详细介绍 Auto-Scaling 服务中的一个新特性,该特性允许用户通过 REST API 管理其 Auto-Scaling 服务。对于不愿通过 Bluemix UI 管理 Auto-Scaling 服务的用户,或者希望进一步分析 Auto-Scaling 数据的用户,该特性极为有用。
“ 使用 Auto-Scaling REST API 管理 Auto-Scaling 服务,该服务有助于提高您的应用程序的弹性,并在 Bluemix 上工作时降低成本。 ”
您可以通过将应用程序与一个 Auto-Scaling 服务实例绑定在一起,向您的应用程序提供 Auto-Scaling 功能。参阅 " 让您的应用程序在 Bluemix 上富有弹性 ",了解如何在 Bluemix 中部署您的应用程序,并将 Auto-Scaling 服务与 Bluemix UI 绑定在一起。
借助 Cloud Foundry CLI,您可以发出一个 cf
命令来完成许多任务,就像您在 Bluemix UI 中所做的那样。例如,要绑定 Auto-Scaling 服务,请执行以下操作:
cf marketplace
命令检查当前 Auto-Scaling 服务: > cf marketplace Getting services from marketplace in org <ORG> / space <SPACE> as <USERNAME>... OK service plans description Auto-Scaling free Automatically increase or decrease the number of application instances based on a policy you define. mysql 100 MySQL database
提示:使用 cf marketplace -s <SERVICE>
查看给定服务的各项计划的描述。
cf create-service
创建一个 Auto-Scaling 服务实例: >cf create-service Auto-scaling free ScalingService Creating service instance ScalingService in <ORG> / space <SPACE> as <USERNAME>... OK >
>cf bind-service <APP NAME> ScalingService Binding service ScalingService to app Hello in org <ORG> / space <SPACE> as <USERNAME>... OK
提示:使用 cf restage <APP NAME>
确保您的环境变量更改起效。
> cf restage <APP NAME> Restaging app Hello in org <ORG> / space <ORG> as <USERNAME>... -----> Downloaded app package (4.0K) -----> Downloaded app buildpack cache (4.0K) … >
用于 Auto-Scaling 服务的 REST API 具有以下先决条件:AccessToken、Endpoint 和 app_id。
cf oauth-token
命令获得: >cf oauth-token Getting OAuth token... OK bearer eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJhNjIzMGE1YS1mNzE3LTQ0YjItOWM3Yi1kNGJkYThhZGU0NjkiLCJzdWIiOiI4OGViNjM2My1hMjkzLTRlZTItYWQ1MS0yOGVkMTZmZjMwNzQiLCJzY29wZSI6WyJjbG91ZF9jb250cm9sbGVyLnJlYWQiLCJwYXNzd29yZC53cml0ZSIsImNsb3VkX2NvbnRyb2xsZXIud3JpdGUiLCJvcGVuaWQiXSwiY2xpZW50X2lkIjoiY2YiLCJjaWQiOiJjZiIsImF6cCI6ImNmIiwiZ3JhbnRfdHlwZSI6InBhc3N3b3JkIiwidXNlcl9pZCI6Ijg4ZWI2MzYzLWEyOTMtNGVlMi1hZDUxLTI4ZWQxNmZmMzA3NCIsIm9yaWdpbiI6InVhYSIsInVzZXJfbmFtZSI6InRlc3RAY24uaWJtLmNvbSIsImVtYWlsIjoidGVzdEBjbi5pYm0uY29tIiwicmV2X3NpZyI6ImQ4ZTRmNDAyIiwiaWF0IjoxNDU1NjA3NTQ1LCJleHAiOjE0NTU2NTA3NDUsImlzcyI6Imh0dHBzOi8vdWFhLnRlc3QubmcuYmx1ZW1peC5uZXQvb2F1dGgvdG9rZW4iLCJ6aWQiOiJ1YWEiLCJhdWQiOlsiY2xvdWRfY29udHJvbGxlciIsInBhc3N3b3JkIiwiY2YiLCJvcGVuaWQiXX0.rOLWkEqS6fuoCkDw-6U4sySbcYSWqrn_fNQL7fNCTvQ
返回的长字符串(以 "bearer" 开头)是您将使用的 AccessToken。这个 AccessToken 还可以在 Cloud Foundry CLI 配置文件中找到。在您安装它并进行登录后,一个 config.json 文件会出现在当前用户的主目录中。在该文件中搜索 "AccessToken"。
备注 :AccessToken 仅对有限的一段时间有效。 如果 AccessToken 过时,可能向 REST API 请求返回 401 Unauthorized
响应。在这种情况下,您需要重新登录并获得最新的 AccessToken。
{ … "Auto-Scaling": [ { "name": "Auto-Scaling-iw", "label": "Auto-Scaling", "plan": "free", "credentials": { "agentUsername": <AGENTUSERNAME>, "api_url": "https://ScalingAPI.test.bluemix.net", "service_id": "3f42b7ff-d939-4ff2-9a55-cb09cef9ab9e", "app_id": "2287f442-a7f3-4799-8919-d3908c386fa3", "url": "https://Scaling3.test.bluemix.net", "agentPassword": <AGENTPASSWORD> } } ] … }
Auto-Scaling 服务的 “凭证” 还可以在
cf env <APPNAME>
命令的返回结果中找到:
cf env <APPNAME> Getting env variables for app Hello in org <ORG> / space <SPACE> as <USERNAME>... OK System-Provided: { "VCAP_SERVICES": { "Auto-Scaling": [ { "credentials": { "agentPassword": <AGENTPASSWORD>, "agentUsername": <AGENTUSERNAME>, "api_url": "https://ScalingAPI.test.bluemix.net", "app_id": "aa8d19b6-eceb-4b6e-b034-926a87e98a51", "service_id": "8f482f78-58d8-493c-829b-635e4cbfd817", "url": "https://Scaling.test.bluemix.net" }, "label": "Auto-Scaling", "name": "ScalingService", "plan": "free", "tags": [ "bluemix_extensions", "ibm_created", "dev_ops" ] } ...
cf app <APPNAME> --guid
命令找到它: > cf app <APPNAME> --guid aa8d19b6-eceb-4b6e-b034-926a87e98a51 >
现在,您已经满足了上述前提条件,您可以使用 REST API 来管理您的应用程序的 Auto-Scaling 服务。目前,您可以采用以下两种方法之一发出这个 API 请求:浏览器中的 RESTClient 插件,或者通过一个工具,比如 curl。下面,我将向您展示这两种情况。
在使用 REST Client 插件时,比如图 1 中所示的 Firefox,可以向 Auto-Scaling API 触发一个 REST 请求,以便执行您的命令。您需要提供以下插件:
Auto-Scaling Public REST API 文档中可以找到的每个 API 的详细说明。
对于 Create Policy API 这种特殊情况,您需要指定三个标头,如图 1 所示:
这个 API 需要 PUT 的一个方法。
在 URL 中,开头部分是 Auto-Scaling API 的端点,如您在第 2 步中所见。该 URL 的其余部分取决于您使用的 API;对于 Create Policy API,URL 的该部分的格式为 v1/autoscaler/apps/ appid /policy,其中的 "appid" 可用您想要使用 Auto-Scaling 政策设置的应用程序的 GUID 来替换。您可以通过检查 VCAP_SERVICE 获得应用程序 GUID,如第 2 步中所示。
在 Create Policy API 的主体中,您需要提供一个 JSON 格式的政策文件来定义为您的应用程序设置的缩放策略。此外,该策略设置的细节可在 Auto-Scaling Public REST API 文档中找到。
如果成功执行命令,则会返回状态码和主体,并将它们显示在 RESTClient UI 中(参见图 1)。对于这个特定的 Create Policy API,将会返回一个 "policyId"。如果出现错误,或者 Auto-Scaling API 服务器检测到错误,则会返回一个包含状态码的错误消息,该状态码表明了错误信息的原因,如图 2 所示:
您还可以通过工具(比如 curl)调用 Auto-Scaling REST API,如下面代码清单中所示。为脚本和 JSON 文件中的 CF_ORG
和 SERVICE_NAME
这类变量提供值,然后执行以下操作:
准备应用程序:
#!/bin/bash -e $cfcmd login -o $CF_ORG -s $CF_SPACE -u $CF_USER -p $CF_PASSWORD if [ $? -ne 0 ]; then echo "login failed" exit 255 fi $cfcmd push $APP_NAME -p $APP_FILE if [ $? -ne 0 ]; then echo "push App failed" exit 254 fi $cfcmd create-service $service free $SERVICE_NAME if [ $? -ne 0 ]; then echo "create service failed" exit 253 fi $cfcmd bind-service $APP_NAME $SERVICE_NAME if [ $? -ne 0 ]; then echo "bind service failed" exit 252 fi $cfcmd restage ${APP_NAME}
运行 Create Policy REST API:
if $cfcmd oauth-token | grep "Unknown command" &> /dev/null ; then oauth_token=$($cfcmd oauth-token | grep bearer | sed -e s/bearer/Bearer/g) else oauth_token=` cat ~/.cf/config.json | grep AccessToken | awk -F ":" '{print $2}' | sed -e 's/[",]//g' | grep bearer | sed -e s/bearer/Bearer/g ` fi app_guid=$($cfcmd app $APP_NAME --guid) API_url=$($cfcmd env $APP_NAME | grep "api_url" | awk '{print $2}' | cut -d "," -f1 | cut -d "/"" -f2 ) # create policy cf_url="$API_url/v1/autoscaler/apps/$app_guid/policy" curl_cmd="curl $cf_url -X 'PUT' -H 'Content-Type:application/json' -H 'Accept:application/json' -H 'Authorization:$oauth_token' --data-binary @policy.json -s -o response.txt -w '%{http_code}/n'" eval status_code=/$/($curl_cmd/) if [[ $status_code -eq 201 ]]; then echo "create policy successfully" else echo "========== ERROR: create policy failed for application ${APP_NAME} with status_code: ${status_code}" exit 251 fi
借助 curl 或类似工具,您可以获得与使用 REST 客户端浏览器插件相同的效果。然而,REST 插件可能更灵活,因为您可以用它来处理响应数据,比如,将缩放历史数据提取到一个 .csv 文件中,以便进一步分析这些数据(参见图 3)。