Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
dz̸ËѺüÔÆ¾°PAASƽ̨
 
×÷Õß Pautcher_0µÄ²©¿Í£¬»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-07-11
  3107  次浏览      30
 

ǰÑÔ£º

ËѺüÔÆ¾°×÷ΪËѺüµÄpaasƽ̨£¬ÔÚ2014Äê5ÔÂ22ÈÕµÄÔÆ¼ÆËã´ó»áÉÏÕýʽ·¢²¼Á˹«²â¡£³õ²â£¬×¢²áÓû§±ØÐëÏÈÉêÇëÑûÇëÂë²ÎÓ빫²â»áÔùËÍÓû§100Ôªµç×Óȯ£¬¾­¹ýʵÃûÈÏÖ¤Ö®ºó»áÔÙÔùËÍ100µç×Óȯ£¬Ä¿²â¿ÉÒÔ¶ÔÊÔÓÃÓû§»ù±¾app¹»ÅܰëÄê¡£

³ýÁËÓû§ÖÐÐĵÄһЩ»ù±¾°²È«ÐÅÏ¢ÉèÖú͸÷ÖÖÕ˵¥Í⣬ÎÒÏëÖ÷Òª¶ÔÆä¿ØÖÆÌ¨µÄʹÓýøÐÐÑо¿Ò»·¬¡£

·Ï»°²»¶à˵£¬ÔÚ°ó¶¨ÓÊÏä²¢³äÖµ10Ôª³ÉÕýʽÓû§Ö®ºó£¬ÎÞ×èµ²½øÐи÷ÖÖ²âÊÔ°É¡£

dashboardºÜÇåиɾ»£¬ÊÇÒ»¸ö¶ÔÓû§»ù±¾Ïû·ÑÇé¿öºÍʹÓÃ×ÊÔ´·þÎñµÄ»ù±¾¸ÅÀÀ¡£

Ò»¡¢À´´´½¨¸öÓ¦ÓÃ

ÕâÀïÐèҪѡÔñÑ¡ÔñÓ¦ÓõĻù±¾ÀàÐÍÊÇweb»òºǫ́worker£»

ÔËÐл·¾³ÐèÒªÊÂÏÈÑ¡ÔñºÃ£¬Æäjava¾ÍÌṩÈýÖÖ²»Í¬µÄÔËÐл·¾³£¬Ö§³ÖÓïÑÔÀàÐÍҲͦ¶àµÄ£¬»ù±¾µÄÖ÷Á÷ÓïÑÔ¶¼ÓÐÖ§³Öµ½ÁË£»

ʵÀýÀàÐÍÒ²¾ÍÊÇÈÝÆ÷ÀàÐÍ£¬Ê¹ÓÃlinux lxc¼¼Êõ£¬ÌṩÁËÁùÖÖ²»Í¬µÄÈÝÆ÷À´ÔËÐÐÎÒÃǵijÌÐò¡£

´´½¨³É¹¦Ö®ºó£¬»áÓÐһЩĬÈϵÄÅäÖá£

ÓòÃû£ºcstest.sohuapps.com
°æ±¾£º1
ʵÀýÅäÖãº3-8£¬¿ÉÒÔ×Ô¶¨ÒåÅäÖÃ
ÈÝÆ÷ÀàÐÍ£ºC2£¬¿ÉÒÔ×Ô¶¨ÒåÅäÖÃ
ð¤ÐԻỰ£º¹Ø±Õ£¬¿ÉÒÔ×Ô¶¨ÒåÅäÖÃ
ÍâÍø·ÃÎÊ£º¹Ø±Õ£¬¿ÉÒÔ×Ô¶¨ÒåÅäÖÃ
git·þÎñ£ºgit@git.cloudscape.sohu.com:cs/cstest.git£¬¾ÝÁ˽âºóÐø»á¿ªÆôgit push×Ô¶¯²¿Êð¹¦ÄÜ¡£
×Ô¶¯µ÷¶È£º¿ªÆô£¬¿ÉÒÔ×Ô¶¨Ò广ÔòÒýÇæ£¬Õâ¸ö±È½ÏÅ£±Æ£¬Ä¿²â¹úÄÚpaas»¹Ã»ÓÐÖ§³Öµ½ÕâµãµÄ¡£</span>

±ÊÕß·¢ÏÖ£¬

Èç¹ûÎÒÃÇûÓÐÉÏ´«³ÌÐò°ü£¬Ëü»á¸ù¾ÝÎÒÃÇ´´½¨Ó¦ÓÃÑ¡ÔñµÄÔËÐл·¾³Ìṩһ¸öĬÈϵijÌÐò°ü·Åµ½Ó¦Óõİ汾1ÖС£

Æô¶¯Ö®ºó£¬·ÃÎÊÓòÃû http://cstest.sohuapps.com ¾ÍÄÜ¿´µ½Ò»¸öºÜ¼òµ¥µÄhello world£¡

¶þ¡¢Ïê½â´úÂë°ü

¾­¹ý±È½ÏÉîÈëµÄÁ˽⣬´úÂë°ü½á¹¹Ê×ÏÈÎÞÂÛÄÄÖÖÓïÑÔ¶¼Ö»ÄÜÊÇzip°üµÄ½á¹¹£¬½â¿ªÖ®ºóµÄ±ê׼Ŀ¼ÈçÏ£º

²»ÄÑ·¢ÏÖ£¬ÓÐÕâÑù¼¸¸öÎļþ»òÕßĿ¼£º

È»ºó£¬ÎÒÒªÖØµãÆÊÎöÒ»ÏÂÕâ¸öapp.yamlÎļþ£¬ËüµÄÅäÖÃÓÐÎÞ¡¢ÊÇ·ñÕýÈ·¡¢¾ßÌå²ÎÊýÉèÖÃÖ±½Ó¾ö¶¨appµÄ ÔËÐÐ×´¿öºÍ¼à¿Ø×´Ì¬¡£

¶ÔÓÚËѺüÔÆ¾°paasÉÏÌṩµÄ°ËÖÖÔËÐл·¾³£¬ËüÃǵÄapp.yamlÅäÖö¼ÊDz»Ò»ÑùµÄ£¬ÉõÖÁ ÓÚpythonÓëpython on webpyµÄapp.yamlÅäÖö¼ÊDz»Ò»ÑùµÄ¡£

ÏÂÃæÎÒ¶ÔÓÚÔÆ¾°ÌṩµÄÁùÖÖÓïÑÔ£¬°ËÀà»·¾³µÄÅäÖýøÐÐÏêϸ½éÉÜ£¬²¢ÎªÃ¿¸öÔËÐл·¾³Ìṩһ¸ö¿ÉÔËÐеÄÄ£°å³ÌÐò°ü£¬Îª´ó¼ÒÌṩ²Î¿¼¡£

2.0 È«²¿²ÎÊý

Ê×ÏÈÌùÉÏÒ»ÕÅÌṩµÄËùÓвÎÊýÅäÖ㬵«²¢²»ÊÇÿ¸öÔËÐеÄÓïÑÔ¶¼ÄÜʹÓá£

2.1 Java on jetty

appid: 666666666
start: $JETTY_START
tcp_health: false
tcp_health_port: [8001, 8002]
try_restart: {fall: 10, enable: true}
web_health: true
web_health_conf:
path: /
success: [200, 201, 403, 301, 302]
timeout: 500ms

2.2 Java on resin

appid: 666666666
start: $RESIN_START
tcp_health: false
tcp_health_port: [8001, 8002]
try_restart: {fall: 10, enable: true}
web_health: true
web_health_conf:
path: /
success: [200, 201, 403, 301, 302]
timeout: 500ms

2.3 Java on tomcat

appid: 666666666
start: $TOMCAT_START
tcp_health: false
tcp_health_port: [8001, 8002]
try_restart: {fall: 10, enable: true}
web_health: true
web_health_conf:
path: /
success: [200, 201, 403, 301, 302]
timeout: 500ms

2.4 PHP

appid: 666666666
start: $PHP_FPM_START

2.5 LUA

appid: 666666666
start: $LUA_START

2.6 NODEJS

appid: 666666666
start: $LUA_START

2.6 NODEJS

appid: 666666666
web_health: true
web_health_conf:&nbsp;
&nbsp; &nbsp; path: /
&nbsp; &nbsp; timeout: 500ms
&nbsp; &nbsp; success: [200,201,403,301,302]
try_restart:&nbsp;
&nbsp; &nbsp; enable: true
&nbsp; &nbsp; fall: 10
start: $NODEJS $USER_DIR/app/main.js

2.7 PYTHON

appid: 666666666
start: $UWSGI_START

2.8 PYTHON with WEBPY

appid: 666666666
start: $PYTHON $USER_DIR/bin/main.py 8080
try_restart: {fall: 10, enable: true}
web_health: true
web_health_conf:
&nbsp; &nbsp; path: /
&nbsp; &nbsp; success: [200, 201, 403, 301, 302]
&nbsp; &nbsp; timeout: 500ms

2.9 RUBY ON RAILS

appid: 666666666
web_health: true
start: /opt/apps/ruby/bin/unicorn_rails -c /opt/src/app/unicorn.rb -D
stop: kill $(cat /opt/conf/unicorn.pid)

×ܽáһϣ¬

appidÊÇÃ²ËÆ9Î»Ëæ»úÊý×Ö£¬startÊÇÆä¸ù¾ÝÅäÖÃÃüÁîÆô¶¯µÄ²ÎÊý£¬ÕâÁ©²ÎÊýÊDZØÐëµÎ¡£

´ÓÆäapp.yamlµÄÅäÖÃÀ´¿´£¬Æä¸ñʽҪÇóÊǺÜÑϸñµÄ£¬±ØÐëÑϸñ°´ÕÕ yamlµÄ¸ñʽÌîд£¬°üÀ¨¿Õ¸ñ£¬Ëõ½øµÈ·½Ã棬±ÈÕâ¾ÍÔÚÕâ·½Ãæ³Ô¹ý¿÷¡£

Æä´Î£¬´ÓÆäÿÖÖÔËÐл·¾³µÄÅäÖÃÀ´¿´£¬¸÷Ïî²ÎÊý²¢²»ÊÇÔÚÿ¸öÔËÐл·¾³ºÍÓïÑÔÖж¼ÄÜÖ§³Öµ½µÄ£¬ÐèÒª×öЩµ÷Õû£¬±ÊÕß×î´ó»¯µÄʹÓÃÁËÕâЩ²ÎÊý¡£

×îºó£¬ÒªÊ¹ÓÃʾÀý´úÂëÖ»ÐèÒª£¬ÐÞ¸Äzip°üÖÐapp.yamlÖеÄappidΪÄãµÄappid¼´¿É¡£

Èý¡¢¸ß¼¶½ø½×

ÌṩÓïÑÔÖ§³ÖÌ«¶à£¬²»ÄÜ̾̾¾ãµ½£¬ÏÂÃæÒÔjavaΪÀý£¬½éÉÜÒ»ÏÂËѺüÔÆ¾°ÌṩµÄһЩ¸ß¼¶¹¦ÄÜ¡£

3.1 ÈÕÖ¾Êä³ö

ËѺüÔÆ¾°¶ÔÈÕÖ¾Êä³öλÖÃÒªÑϸñÒªÇóµÄ£¬²»ÄÜËæ±ã×Ô¶¨Òå·¾¶£¬Ö»ÄÜÊä³öµ½ /opt/logsĿ¼Ï£¬¶øÇÒ×Ô¶¨ÒåµÄÈÕÖ¾ÎļþÊDz»»á±»²É¼¯ºÍ±£´æµÄ£¬Èç¹ûÏëÒª±»Ôƾ°paasÊÕ¼¯²¢±£´æ±ØÐëдµ½ËüÃÇÔ¤¶¨ÒåµÄ»·¾³±äÁ¿ ${LOG_FILE}ÖС£

ÓÉÓÚ±ÊÕßʹÓÃlog4j×÷ΪÈÕÖ¾Êä³ö£¬Òò´Ë£¬¸ø´ó¼ÒÌṩһ¸ölog4jµÄÅäÖÃÆ¬¶Î£¬ÈçÏ£º

log4j.rootCategory=INFO,FILE
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss}]%-5p %c(line\:%L) %x-%m%n
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.Threshold = INFO
log4j.appender.FILE.File=${LOG_FILE}
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss}]%-5p %c(line\:%L) %x-%m%n

¹þ£¬ÊDz»ÊǺܼòµ¥ÄØ¡£

µ«ÊÇ£¬ÒªÖªµÀÈç¹ûҪʹÓÃlog4jµÄÅäÖ㬻¹ÐèÒª×öÒ»Ð©ÌØ¶¨µÄÅäÖ㬱ÈÈçÐèÒªÅäÖÃÒ»¸öservletÀ´¼ÓÔØlogj.propertiesÎļþ£¬²»¶à˵£¬×ÔÐÐËÑË÷£¬±ÊÕߺóÃæÒ²»á¸½ÉÏ´úÂë°ü¹©¸÷λ¿´¹ÙϸϸÑо¿¡£

ʹÓõķ½Ê½²»ÍâºõÈçÏ£º

Logger log = LoggerFactory.getLogger(LogTest.class);
log.info("info| " + Thread.currentThread().getName() + " is running!");
log.warn("warn| there is some warning messages");
log.debug("debug| I am doing system debug");
log.error("error| sorry ,some errors happend!");
log.trace("trace| unknown messages following!");

3.2 ·þÎñʹÓÃ

×ݹÛËѺüÔÆ¾°ÌṩµÄ·þÎñ£¬mysql£¬memcache£¬redis£¬storageµÈ»ù±¾·þÎñ¶¼Ö§³Ö£¬Âú×ãÁËÎҵĴ󲿷ÖÐèÇ󣬱ÊÕß½öÒÔʹÓÃredisΪÀý½éÉÜÒ»ÏÂÈçºÎ¸ß´óÉϵÄʹÓÃredisµÄ»º´æ·þÎñ¹¦ÄÜ¡£

Ê×ÏÈÐèÒªµ½·þÎñÖÐÈ¥ÉêÇëÒ»¸öredis·þÎñ£¬¼ÇסÊÇ¿ÉÒÔ×Ô¶¨Òå·þÎñÃû³ÆµÄŶ¡£

È»ºó±ÊÕß¾ßÌå½éÉÜһϴúÂëÖеÄʹÓ÷½°¸¡£

ËüÃÇ»áÌṩһ¸öURL¸æËßÎÒÃÇ¿ÉÓõķþÎñÁÐ±í£¬È»ºóÒ²ÌṩÁË»ñÈ¡·þÎñÁбíÈÏÖ¤ËùÐèÒªµÄUIDºÍpassword¡£

±ÊÕß½¨ÒéʹÓÃÌṩµÄuidºÍpasswordÀ´ÔÚ×Ô¼ºµÄ³ÌÐòÖж¯Ì¬»ñÈ¡£¬http restµÄgetÇëÇó·½Ê½£¬Äã¶®µÃ¡£

ÌùÉÏÁ½¶Î´úÂ룬À´»ñÈ¡redisʵÀý£¬²¢¹¹½¨Ê¹ÓÃËü¡£

static List<RedisInstanceNode> 
getNodes(String uid, String password) throws ServiceException {
Map<String, String> params = ParamUtils.getDefaultParams();
params.put("uid", uid);
params.put("password", password);
String endpoint = "http://internal.cloudscape.sohu.com";
String action = "/redis/service_instance/nodes";
String url = endpoint + action;
int timeout = HttpUtils.getRestTimeout();
if (httpService == null) {
httpService = new HttpServiceImpl();
}
HttpService.HttpResult result =httpService.httpGet(url, params, timeout);
String info = result.getResult();
Map<String, JsonNode> res = JsonUtils.readValueAsJson(info);
JsonNode nodesJson = res.get(ApiKeys._nodes);
if (nodesJson == null || nodesJson.isNull()) {
log.info("open api return error message, ap pinfos is empty , code: " + result.getCode() + ", message: "
+ res.get(ApiKeys._message));
return Collections.emptyList();
}
List<RedisInstanceNode> list = (List<RedisInstanceNode>) JsonUtils.readValueAsList(
sonUtils.writeValueAsString(nodesJson), ArrayList.class, RedisInstanceNode.class);
return list;
}

//<span style="font-family: Arial, Helvetica, sans-serif;">
(b)¡¢</span><span style="font-family: Arial, Helvetica, sans-serif;">
¸ù¾Ý·µ»ØµÄʵÀýnodesÁÐ±í¹¹½¨redis Á¬½Ó³Ø£¬±ÊÕßʹÓÃÁËÇ¿´óµÄjedis¡£</span>

private static ShardedJedisPool pool;

for (RedisInstanceNode redis : nodes) {
String ip = redis.getIp();
int port = redis.getPort();
int master = redis.getIsMaster();
JedisShardInfo jsi;
if (master == 1) {
jsi = new JedisShardInfo(ip, port, "master");
jsi.setPassword(key);
jsi.setTimeout(3600000);
shards.add(jsi);
} else {
continue;
}
}
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxActive(500);// ×î´ó»î¶¯ÊµÀýÊýÄ¿
jpc.setMaxIdle(200);// ×î´óֹͣʵÀýÊýÄ¿
jpc.setMaxWait(5000);// ×î´óµÈ´ýʱ¼ä
jpc.setTestOnBorrow(false);
pool = new ShardedJedisPool(jpc, shards);

//£¨c£©¡¢Ê¹ÓÃÁ¬½Ó³Ø£¬½øÐÐÊý¾ÝsetÓëget

try {
jedis = pool.getResource();
jedis.setex("test-key", defaultTimeout, "test-value");
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
if (jedis != null) {
pool.returnBrokenResource(jedis);
}
} finally {
if (jedis != null) {
pool.returnResource(jedis);
}
}

ºÃÁË£¬ÕâÑù¾ÍÄÜʹÓÃredis·þÎñÁË£¬ÆäÓàµÄ¼¸Àà·þÎñÀàËÆ°É¡£

3.3 ssh怬

Ê×ÏÈ˵£¬Õâ¸ö¹¦ÄܱØÐëÔÞÒ»¸ö£¬¸ÒÓÚ°Ñssh¹¦ÄÜ¿ª·Å³öÀ´£¬ÊÇÒ»¸öºÜ´óµÄÓÂÆø¡£

Éϸöͼ£¬

¿ÉÒÔ¿´µ½¿ÉÒÔΪÿ¸öʵÀýµ¥¶ÀµÄ¿ªÆôSSH¹ÜÀí¹¦ÄÜ£¬Õâ¾ÍÏ൱ÓÚÊǸöVPSÀ­£¬Ç°ÌáÊÇÒªÉÏ´«Á˹«Ô¿Ö®ºó²ÅÄÜʹÓÃÕâôǿ´óµÄ¹¦ÄÜ¡£

¸ù¾ÝÌṩµÄsshÃüÁ¿ÉÒԵǼµ½ÈÝÆ÷½øÐв鿴ÁË¡£

²»¹ý£¬±ðʧÍû£¬ºÜ¶àÃüÁîÊDz»ÄÜʹÓõÄŶ£¬¿´À´ÊǶÔÃüÁî½øÐÐÁ˾«¼òÄØ¡£²»¹ýÕâÒѾ­ÊǺÜÇ¿´óÁË£¬½øÈ¥ÄÜ¿´µ½ÎÒÃǵÄ×Ô¼ºµÄÈÕÖ¾Á˺ͽø³ÌµÈÐÅÏ¢¡£
ÆÚ´ýδÀ´ÓиüºÃ¸üÇ¿´óµÄ¹¦ÄÜ¡£

ËäÈ»ÓÐÕâô¶àºÃ´¦£¬µ«ÊÇ»¹ÊÇÓÐһЩ²»×ãÒªÍÂһ͵ġ£

1¡¢ºÜ±§Ç¸£¬sshµÄ¹ÜÀí¹¦Äܲ»ÄÜÿ¸öʵÀý¶¼ÄÜ´ò¿ª£¬×î¶àÖ»ÄÜÆðÁ½¸ö£¬ºÃÔÚ¿ÉÒԹرգ¬×Ô¼ºÄÜ×ÔÓÉÇл»¡£

2¡¢È»ºó£¬ÆäÍ£Ö¹ºÍÐ¶ÔØappµÄµØ·½Òþ²ØµÄºÜÉî°¡£¬ÀàËÆÓÚgithubÉϵÄÒªdeleteÒ»¸öÏîĿһÑù£¬ÒªÉî²ãÒþ²Ø£¬¿ÉÄÜΪÁËÈ·±£Óû§²»Îó²Ù×÷°É¡£

3¡¢ÅäÖÃapp.yaml±È½ÏÂé·³£¬ÓиöÄ£°å¶ÔÓ¦¸ÄÊǺõãµÄ¡£

4¡¢·þÎñ¿ª·ÅµÄËäÈ»»ù±¾µÄ¹»Ó㬵«ÊÇ»¹ÊÇÉÙÁ˵㣬ÏñºÜ¶àcdnÄÅ£¬mongodb°¡£¬´æ´¢ÀàµÄ·þÎñ¶¼Ã»ÓУ¬ÆÚ´ýºÜ¿ì¿ª·Å¡£

   
3107 ´Îä¯ÀÀ       30
 
Ïà¹ØÎÄÕÂ

ÔÆ¼ÆËãµÄ¼Ü¹¹
¶ÔÔÆ¼ÆËã·þÎñÄ£ÐÍ
ÔÆ¼ÆËãºËÐļ¼ÊõÆÊÎö
Á˽âÔÆ¼ÆËãµÄ©¶´
 
Ïà¹ØÎĵµ

ÔÆ¼ÆËã¼ò½é
ÔÆ¼ÆËã¼ò½éÓëÔÆ°²È«
ÏÂÒ»´úÍøÂç¼ÆËã--ÔÆ¼ÆËã
ÈídzÎöÔÆ¼ÆËã
 
Ïà¹Ø¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þµÄ˼¿¼
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS
Ïà¹ØÅàѵ¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
Windows Azure ÔÆ¼ÆËãÓ¦ÓÃ

ĦÍÐÂÞÀ­ ÔÆÆ½Ì¨µÄ¹¹½¨ÓëÓ¦ÓÃ
ͨÓù«Ë¾GE DockerÔ­ÀíÓëʵ¼ù
ijÑз¢ÖÐÐÄ Openstackʵ¼ù
ÖªÃûµç×Ó¹«Ë¾ ÔÆÆ½Ì¨¼Ü¹¹ÓëÓ¦ÓÃ
ijµçÁ¦ÐÐÒµ »ùÓÚÔÆÆ½Ì¨¹¹½¨ÔÆ·þÎñ
ÔÆ¼ÆËãÓëWindows AzureÅàѵ
±±¾© ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ