Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4133925
  • 博文数量: 626
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 11080
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-23 13:08
文章分类

全部博文(626)

文章存档

2015年(72)

2014年(48)

2013年(506)

分类: 服务器与存储

2013-10-10 10:06:34

我们在微软的Windows Azure云计算平台上进行软件开发时,很有可能会遇到这个需求,那就是获取用户的角色环境信息。比如要获取当前的实例名称、部署ID(DeploymentID)、甚至是要知道哪些角色在运行?哪些角色没有运行?如果我们要使用NodeJS来实现这些任务,那就需要一些技巧。因为角色环境类(RoleEnvironment)是托管的.NET代码。


在本文中,我们会讨论怎样设置正在运行的Azure角色信息,以便让这些信息能够很容易地被NodeJS服务器所访问。诀窍是使用环境变量和使用启动任务,用运行的PowerShell作为两者间的桥梁。


下面我创建了一个例子来说明这一点,大家可以自行测试。基本上,它获得了启动任务,它把Azure角色环境信息转存到环境变量,并用server.js脚本文件输出这些变量。无论如何,大家可以从下面的代码看它到底是怎么工作的。


我们需要完成下列任务:


1、创建一个启动任务,该任务运行一个cmd脚本,脚本可访问Azure角色环境信息;


2、设置环境变量的信息,以便于可以从NodeJS访问这些信息;


3、通过process.env对象,用server.js获取值。


下面进行详细说明。cmd脚本是这样的:


脚本一:setupenvironmentvariables.cmd


[javascript] view plaincopyprint?
  1. @ECHO off  
  2. %~d0  
  3. CD "%~dp0"  
  4.    
  5. IF EXIST %WINDIR%\SysWow64 (  
  6. set powerShellDir=%WINDIR%\SysWow64\windowspowershell\v1.0  
  7. ) ELSE (  
  8. set powerShellDir=%WINDIR%\system32\windowspowershell\v1.0  
  9. )  
  10.    
  11. ECHO Setting the Environment variables..  
  12. CALL %powerShellDir%\powershell.exe -Command Set-ExecutionPolicy unrestricted  
  13. CALL %powerShellDir%\powershell.exe -Command "& .\set_azure_role_information.ps1"  
  14. ECHO Done!  
  15.    
  16. ECHO Restarting IIS..  
  17. CALL iisreset  
  18. ECHO Done!  
  19.    
  20. ECHO Starting the W3SVC service..  
  21. CALL NET START W3SVC  
  22. ECHO Done!  


上面的代码解释如下:


1、要在Azure云上执行未签名的PowerShell脚本,你必须把执行策略(Execution Policy)设置为无限制(Unrestricted)。我使用了Set-ExecutionPolicy命令,但要注意它的值不会改变,除非你手动修改值。在PowerShell 2.0环境下,还可以使用-ExecutionPolicy命令来设置在当前范围下无限制。但是由于默认的WebRole模板使用了osFamily="1"设置,它在Windows Server 2008 SP2有效,所以我们不会使用此命令。


2、重点:在环境变量设置后,我们需要重启IIS服务器,重启W3SVC,让服务生效。Azure云平台的W3SVC设置为手工模式,因此这就是为什么它不会在IIS服务器复位后自动启动。


我们来看下一个PowerShell脚本:


脚本二:setazurerole_information.ps1

[javascript] view plaincopyprint?
  1. [Reflection.Assembly]::LoadWithPartialName("Microsoft.WindowsAzure.ServiceRuntime")  
  2. [Environment]::SetEnvironmentVariable("RoleName", [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Role.Name,"Machine")  
  3. [Environment]::SetEnvironmentVariable("RoleInstanceID", [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::CurrentRoleInstance.Id,"Machine")  
  4. [Environment]::SetEnvironmentVariable("RoleDeploymentID", [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::DeploymentId,"Machine")  
  5. [Environment]::SetEnvironmentVariable("IsAvailable", [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::IsAvailable,"Machine")  
  6. [Environment]::SetEnvironmentVariable("CustomVariable""Some value","Machine")  

代码说明:我们通过RoleEnvironment属性值设置一些环境变量。要注意,还可以设置自定义的环境变量。


脚本三:ServiceDefinition.csdef

[javascript] view plaincopyprint?
  1. "setup_environment_variables.cmd"  
  2.     executionContext="elevated" taskType="simple" />  



最后,我们用NodeJS编写server.js代码,它可以输出响应的结果。


脚本四:server.js

[javascript] view plaincopyprint?
  1. var http = require('http');  
  2. var port = process.env.port || 1337;  
  3.    
  4. http.createServer(function (req, res) {  
  5. res.writeHead(200, { 'Content-Type''text/plain' });  
  6.    
  7. res.write("Role Name: " + process.env.RoleName + "\n");  
  8. res.write("Role InstanceID: " + process.env.RoleInstanceID + "\n");  
  9. res.write("Role DeploymentID: " + process.env.RoleDeploymentID + "\n");  
  10. res.write("Is running?: " + process.env.IsAvailable + "\n");  
  11. res.write("Custom variable: " + process.env.CustomVariable + "\n");  
  12.    
  13. res.end();  
  14. }).listen(port);  

在模拟器上运行上面的例子,显示的结果如下:


阅读(1866) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~