我在Bluemix上有两个应用程序,我需要将一个应用程序的URL提供给另一个应用程序。
$response = http_get("myOrdersApp12345.mybluemix.net/api");
在我的源代码中对URL进行硬编码似乎是一个坏主意......如果网址发生了变化怎么办?
答案 0 :(得分:4)
对源代码中的URL或任何凭据进行硬编码是不好的做法。在Bluemix中,您可以使用VCAP_SERVICES环境变量将这些凭据传递给应用程序。这是保存Bluemix服务凭据的相同环境变量。
您实际上是通过创建用户提供的服务来创建您的组织和空间可见的服务。
创建一项新服务,为该服务的消费者提供网址:
$ cf cups myOrdersAppService -p "url"
url> myOrdersApp12345.mybluemix.net/api
Creating user provided service myOrdersApp in org **** / space ****
OK
然后将此服务绑定到需要此“url”信息的应用程序
$ cf bind-service myOtherApplication myOrdersAppService
myOtherApplication可以通过解析VCAP_SERVICES环境变量来获取url。例如,在PHP中:
$services = getenv("VCAP_SERVICES");
$services_json = json_decode($services, true);
for ($i = 0; $i < sizeof($services_json["user-provided"]); $i++){
if ($services_json["user-provided"][$i]["name"] == "myOrdersApp"){
$ordersHost = $services_json["user-provided"][$i]["credentials"]["url"];
$response = http_get($ordersHost);
}
}
您可以使用相同的方法来共享任何外部服务(如数据库)的凭据。使用微服务架构时,此功能变得非常有用。
$ cf cups myExternalDB -p "host, username, password"
host> 123.123.123.123
username> myusername
password> mypassw0rd
有关详细信息,请查看此文档:http://docs.cloudfoundry.org/devguide/services/user-provided.html
答案 1 :(得分:2)
我同意Ram的建议,即通过VCAP_SERVICES
检索服务参数,特别是当它指定服务绑定到您的应用程序所固有的信息时,如凭据。但是,对于更普通的配置属性(例如,支持哪些语言以及翻译位于何处?应该使用什么URL来调用此REST服务?),传统方法如在命令行上传递它们,从配置文件中检索它们,或者在部署时从管理员指定的环境变量中获取它们是完全合法的。
Pat Mueller的Keeping secrets – how your cloud application should access credentials and other private data很好地总结了选项和权衡。最重要的是,他强调了不硬编码敏感信息的重要性,特别是考虑到代码将存储在存储库中的可能性,在该存储库中不太明显谁将具有访问权限,这与系统维护的部署脚本不同管理员。