前言:

搜狐云景作为搜狐的paas平台,在2014年5月22日的云计算大会上正式发布了公测。初测,注册用户必须先申请邀请码参与公测会赠送用户100元电子券,经过实名认证之后会再赠送100电子券,目测可以对试用用户基本app够跑半年。

除了用户中心的一些基本安全信息设置和各种账单外,我想主要对其控制台的使用进行研究一番。

废话不多说,在绑定邮箱并充值10元成正式用户之后,无阻挡进行各种测试吧。

dashboard很清新干净,是一个对用户基本消费情况和使用资源服务的基本概览。

---------------------------------------------------

一、来创建个应用

这里需要选择选择应用的基本类型是web或后台worker;

运行环境需要事先选择好,其java就提供三种不同的运行环境,支持语言类型也挺多的,基本的主流语言都有支持到了;

实例类型也就是容器类型,使用linux lxc技术,提供了六种不同的容器来运行我们的程序。

创建成功之后,会有一些默认的配置。

 [plain] view plaincopy
  1. 域名:cstest.sohuapps.com
  2. 版本:1
  3. 实例配置:3-8,可以自定义配置
  4. 容器类型:C2,可以自定义配置
  5. 黏性会话:关闭,可以自定义配置
  6. 外网访问:关闭,可以自定义配置
  7. git服务:git@git.cloudscape.sohu.com:cs/cstest.git,据了解后续会开启git push自动部署功能。
  8. 自动调度:开启,可以自定义规则引擎,这个比较牛逼,目测国内paas还没有支持到这点的。</span>

笔者发现,

如果我们没有上传程序包,它会根据我们创建应用选择的运行环境提供一个默认的程序包放到应用的版本1中。

启动之后,访问域名 http://cstest.sohuapps.com就能看到一个很简单的hello world!

--------------------------------------------------

二、详解代码包

经过比较深入的了解,代码包结构首先无论哪种语言都只能是zip包的结构,解开之后的标准目录如下:

不难发现,有这样几个文件或者目录:

app.yaml 文件,
承载整个app运行的核心配置文件
app 项目运行的核心代码目录
页面代码目录,对于Java,是WEB-INF所在的目录;
对于PHP, 是PHP页面所在目录。
conf 个性化配置目录;
包括,nginx server段自定义配置、nginx server段自定义配置、自定义host配置等
bin 用户自定义脚本目

然后,我要重点剖析一下这个app.yaml文件,它的配置有无、是否正确、具体参数设置直接决定app的 运行状况和监控状态。

对于搜狐云景paas上提供的八种运行环境,它们的app.yaml配置都是不一样的,甚至 于python与python on webpy的app.yaml配置都是不一样的。

下面我对于云景提供的六种语言,八类环境的配置进行详细介绍,并为每个运行环境提供一个可运行的模板程序包,为大家提供参考。

2.0 全部参数

首先贴上一张提供的所有参数配置,但并不是每个运行的语言都能使用。

2.1 Java on jetty

  1. appid: 666666666
  2. start: $JETTY_START
  3. tcp_health: false
  4. tcp_health_port: [8001, 8002]
  5. try_restart: {fall: 10, enable: true}
  6. web_health: true
  7. web_health_conf:
  8. path: /
  9. success: [200, 201, 403, 301, 302]
  10. timeout: 500ms
 

2.2 Java on resin

[plain] view plaincopy

  1. appid: 666666666
  2. start: $RESIN_START
  3. tcp_health: false
  4. tcp_health_port: [8001, 8002]
  5. try_restart: {fall: 10, enable: true}
  6. web_health: true
  7. web_health_conf:
  8. path: /
  9. success: [200, 201, 403, 301, 302]
  10. timeout: 500ms
 

2.3 Java on tomcat

[plain] view plaincopy

  1. appid: 666666666
  2. start: $TOMCAT_START
  3. tcp_health: false
  4. tcp_health_port: [8001, 8002]
  5. try_restart: {fall: 10, enable: true}
  6. web_health: true
  7. web_health_conf:
  8. path: /
  9. success: [200, 201, 403, 301, 302]
  10. timeout: 500ms
 
 

2.4 PHP

[plain] view plaincopy

  1. appid: 666666666
  2. start: $PHP_FPM_START
 
 

2.5 LUA

[plain] view plaincopy

  1. appid: 666666666
  2. start: $LUA_START
 
 

2.6 NODEJS

[plain] view plaincopy

  1. appid: 666666666
  2. web_health: true
  3. web_health_conf:
  4. path: /
  5. timeout: 500ms
  6. success: [200,201,403,301,302]
  7. try_restart:
  8. enable: true
  9. fall: 10
  10. start: $NODEJS $USER_DIR/app/main.js
 

2.7 PYTHON

[java] view plaincopy

  1. appid: 666666666
  2. start: $UWSGI_START
 
 

2.8 PYTHON with WEBPY

[plain] view plaincopy

  1. appid: 666666666
  2. start: $PYTHON $USER_DIR/bin/main.py 8080
  3. try_restart: {fall: 10, enable: true}
  4. web_health: true
  5. web_health_conf:
  6. path: /
  7. success: [200, 201, 403, 301, 302]
  8. timeout: 500ms
 

2.9 RUBY ON RAILS

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

 
 

总结一下,

appid是貌似9位随机数字,start是其根据配置命令启动的参数,这俩参数是必须滴。
从其app.yaml的配置来看,其格式要求是很严格的,必须严格按照 yaml的格式填写,包括空格,缩进等方面,比这就在这方面吃过亏。
其次,从其每种运行环境的配置来看,各项参数并不是在每个运行环境和语言中都能支持到的,需要做些调整,笔者最大化的使用了这些参数。
最后,要使用示例代码只需要,修改zip包中app.yaml中的appid为你的appid即可。
 
---------------------------------------------------------------------
 
 
 

三、高级进阶

提供语言支持太多,不能面面俱到,下面以java为例,介绍一下搜狐云景提供的一些高级功能。

3.1 日志输出

        搜狐云景对日志输出位置要严格要求的,不能随便自定义路径,只能输出到 /opt/logs目录下,而且自定义的日志文件是不会被采集和保存的,如果想要被云景paas收集并保存必须写到它们预定义的环境变量 ${LOG_FILE}中。
        由于笔者使用log4j作为日志输出,因此,给大家提供一个log4j的配置片段,如下:
  1. log4j.rootCategory=INFO,FILE
  2. log4j.appender.A1=org.apache.log4j.ConsoleAppender
  3. log4j.appender.A1.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss}]%-5p %c(line\:%L) %x-%m%n
  5. log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
  6. log4j.appender.FILE.Threshold = INFO
  7. log4j.appender.FILE.File=${LOG_FILE}
  8. log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
  9. log4j.appender.FILE.layout.ConversionPattern=[%d{yyyy-MM-dd HH\:mm\:ss}]%-5p %c(line\:%L) %x-%m%n

哈,是不是很简单呢。

但是,要知道如果要使用log4j的配置,还需要做一些特定的配置,比如需要配置一个servlet来加载logj.properties文件,不多说,自行搜索,笔者后面也会附上代码包供各位看官细细研究。
 
使用的方式不外乎如下:
  1. Logger log = LoggerFactory.getLogger(LogTest.class);
  2. log.info("info| " + Thread.currentThread().getName() + " is running!");
  3. log.warn("warn| there is some warning messages");
  4. log.debug("debug| I am doing system debug");
  5. log.error("error| sorry ,some errors happend!");
  6. log.trace("trace| unknown messages following!");

3.2 服务使用

        纵观搜狐云景提供的服务,mysql,memcache,redis,storage等基本服务都支持,满足了我的大部分需求,笔者仅以使用redis为例介绍一下如何高大上的使用redis的缓存服务功能。
首先需要到服务中去申请一个redis服务,记住是可以自定义服务名称的哦。
        
 
然后笔者具体介绍一下代码中的使用方案。
        它们会提供一个URL告诉我们可用的服务列表,然后也提供了获取服务列表认证所需要的UID和password。
笔者建议使用提供的uid和password来在自己的程序中动态获取,http rest的get请求方式,你懂得。
 
        贴上两段代码,来获取redis实例,并构建使用它。
  1. //(a)、获取redis服务列表
  1. static List<RedisInstanceNode> getNodes(String uid, String password) throws ServiceException {
  2. Map<String, String> params = ParamUtils.getDefaultParams();
  3. params.put("uid", uid);
  4. params.put("password", password);
  5. String endpoint = "http://internal.cloudscape.sohu.com";
  6. String action = "/redis/service_instance/nodes";
  7. String url = endpoint + action;
  8. int timeout = HttpUtils.getRestTimeout();
  9. if (httpService == null) {
  10. httpService = new HttpServiceImpl();
  11. }
  12. HttpService.HttpResult result = httpService.httpGet(url, params, timeout);
  13. String info = result.getResult();
  14. Map<String, JsonNode> res = JsonUtils.readValueAsJson(info);
  15. JsonNode nodesJson = res.get(ApiKeys._nodes);
  16. if (nodesJson == null || nodesJson.isNull()) {
  17. log.info("open api return error message, appinfos is empty , code: " + result.getCode() + ", message: "
  18. + res.get(ApiKeys._message));
  19. return Collections.emptyList();
  20. }
  21. List<RedisInstanceNode> list = (List<RedisInstanceNode>) JsonUtils.readValueAsList(
  22. JsonUtils.writeValueAsString(nodesJson), ArrayList.class, RedisInstanceNode.class);
  23. return list;
  24. }
  1. (b)、根据返回的实例nodes列表构建redis 连接池,笔者使用了强大的jedis。
  1. private static ShardedJedisPool pool;
  1. for (RedisInstanceNode redis : nodes) {
  2. String ip = redis.getIp();
  3. int port = redis.getPort();
  4. int master = redis.getIsMaster();
  5. JedisShardInfo jsi;
  6. if (master == 1) {
  7. jsi = new JedisShardInfo(ip, port, "master");
  8. jsi.setPassword(key);
  9. jsi.setTimeout(3600000);
  10. shards.add(jsi);
  11. } else {
  12. continue;
  13. }
  14. }
  15. JedisPoolConfig jpc = new JedisPoolConfig();
  16. jpc.setMaxActive(500);// 最大活动实例数目
  17. jpc.setMaxIdle(200);// 最大停止实例数目
  18. jpc.setMaxWait(5000);// 最大等待时间
  19. jpc.setTestOnBorrow(false);
  20. pool = new ShardedJedisPool(jpc, shards);
  1. //(c)、使用连接池,进行数据set与get
  1. try {
  2. jedis = pool.getResource();
  3. jedis.setex("test-key", defaultTimeout, "test-value");
  4. } catch (Exception ex) {
  5. log.error(ex.getMessage(), ex);
  6. if (jedis != null) {
  7. pool.returnBrokenResource(jedis);
  8. }
  9. } finally {
  10. if (jedis != null) {
  11. pool.returnResource(jedis);
  12. }
  13. }

好了,这样就能使用redis服务了,其余的几类服务类似吧。

 
 

3.3 ssh登录

首先说,这个功能必须赞一个,敢于把ssh功能开放出来,是一个很大的勇气。
上个图,

可以看到可以为每个实例单独的开启SSH管理功能,这就相当于是个VPS拉,前提是要上传了公钥之后才能使用这么强大的功能。

根据提供的ssh命令,可以登录到容器进行查看了。
      
 

不过,别失望,很多命令是不能使用的哦,看来是对命令进行了精简呢。不过这已经是很强大了,进去能看到我们的自己的日志了和进程等信息。

 
期待未来有更好更强大的功能。
 
虽然有这么多好处,但是还是有一些不足要吐一吐的。
 
  • 1、很抱歉,ssh的管理功能不能每个实例都能打开,最多只能起两个,好在可以关闭,自己能自由切换。
  • 2、然后,其停止和卸载app的地方隐藏的很深啊,类似于github上的要delete一个项目一样,要深层隐藏,可能为了确保用户不误操作吧。
  • 3、配置app.yaml比较麻烦,有个模板对应改是好点的。
  • 4、服务开放的虽然基本的够用,但是还是少了点,像很多cdn呐,mongodb啊,存储类的服务都没有,期待很快开放。
 联系email:pautcher@gmail.com
 
未完,待续......
 
以上内容,纯属笔者千辛万苦呕心沥血书写,如有雷同,纯属不幸。
 

搜狐云景paas平台实践之路的更多相关文章

  1. 浅谈搜狐云景PAAS平台

    前言: 搜狐云景作为搜狐的paas平台,在2014年5月22日的云计算大会上正式公布了公測.初測,注冊用户必须先申请邀请码參与公測会赠送用户100元电子券,经过实名认证之后会再赠送100电子券.目測能 ...

  2. 体验搜狐PaaS平台搜狐云景-自动调度(Autoscale)

    今天,收到一封「搜狐云景」送邀请码的邮件,价值 200 rmb,立马前往官网简单了解一下,这个玩意儿是搜狐公司云战略的一个产品,一个 PaaS 平台,简单了解了一下特性: 1.自由定制运行环境,这表示 ...

  3. Python伪开发者对于搜狐云景的测评

    Python伪开发者对于搜狐云景的测评 本人是GAE和OpenShift的狂热爱好者,玩过各种国外PaaS.某次想搞个稍微复杂点的Python Web程序,需要比较好的网络传输速度,就试图找前PM(P ...

  4. SAE、搜狐云景和百度云之初见

    近期有需求将我们的应用部署到公有云的服务平台上,于是找了几家公有云服务做了一下调研, 首先对比一下他们提供的功能: 功能 SAE 搜狐云景 百度云 版本控制工具 svn  GIT,和百度云的比起来,用 ...

  5. 搜狐云景client工具评測之WordPress的搭建

    搜狐云景是搜狐推出的一款PaaS产品,眼下还处在公測阶段,拿到邀请码后试用了一下,感觉还不错. 搜狐云景提供了四种方式部署应用,感觉应该能够满足各种口味的码农:1. zip包的形式在网页上传并部署   ...

  6. 终极套娃 2.0|云原生 PaaS 平台的可观测性实践分享

    某个周一上午,小涛像往常一样泡上一杯热咖啡 ️,准备打开项目协同开始新一天的工作,突然隔壁的小文喊道:"快看,用户支持群里炸锅了 -" 用户 A:"Git 服务有点问题, ...

  7. 从 Spark 到 Kubernetes — MaxCompute 的云原生开源生态实践之路

    2019年5月14日,喜提浙江省科学技术进步一等奖的 MaxCompute 是阿里巴巴自研的 EB 级大数据计算平台.该平台依托阿里云飞天基础架构,是阿里巴巴在10年前做飞天系统的三大件之分布式计算部 ...

  8. 灵雀云容器PaaS平台助力知名股份制银行金融科技革新

    互联网.科技和金融的碰撞给银行业带来巨大影响.IT技术起初是传统金融提升效率的工具和方法,随着新技术的演进,技术成为驱动变革的核心要素.Fintech金融科技以技术和数据为驱动,用创新的方法改变了金融 ...

  9. 终极指南:企业级云原生 PaaS 平台日志分析架构全面解析

    早些时候 Erda Show 针对微服务监控.日志等内容做了专场分享,很多同学听完后意犹未尽,想了解更多关于日志分析的内容.Erda 团队做日志分析也有一段时间了,所以这次打算和大家详细分享一下我们在 ...

随机推荐

  1. Java多线程3:Thread中start()和run()的区别

    原文:http://www.cnblogs.com/skywang12345/p/3479083.html start() 和 run()的区别说明start():它的作用是启动一个新线程,新线程会执 ...

  2. Android Andbase应用开发框架

    [运行说明]运行AndbaseDemo需要将文件中的Andbase库Add进demo中.1.andbase中包含了大量的开发常用手段.如网络下载,多线程与线程池的管理,数据库ORM,图片缓存管理,图片 ...

  3. jQuery-瀑布流-浮动布局(一

    jQuery-瀑布流-浮动布局(一)(延迟AJAX加载图片)   瀑布流:这种布局适合于小数据块,每个数据块内容相近且没有侧重.通常,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部 ...

  4. 图像二值化----otsu(最大类间方差法、大津算法)

    最大类间方差法是由日本学者大津于1979年提出的,是一种自适应的阈值确定的方法,又叫大津 法,简称OTSU.它是按图像的灰度特性,将图像分成背景和目标2部分.背景和目标之间的类间方差越大,说明构成图像 ...

  5. android自动更新软件版本

    根据网上的然后小改 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import j ...

  6. jpa-hibernate配置转换

    persistence.xml spring-demo-cfg.xml hibernate配置文件 Spring Data JPA:为简化JPA的开发提供帮助.EntityManager的创建与销毁. ...

  7. [原]用WebBrowser组件模拟人工运行搜索引擎自动点击搜索结果的实验

    本代码只是业余时间无聊写着试试,用WebBrowser组件模拟人工运行搜索引擎自动点击搜索结果的实验 这是网络中盛传的提高搜索引擎点击率的一种方式,当然属于作弊,不推荐各位使用.另外这种方式的性能不佳 ...

  8. 1888. Pilot Work Experience(dfs+bfs)

    1888 dfs找出连通块 块内构造数据 bfs找出最值 如果有多个连通块 那max就为49 可以起点不同 这样记得修改后面的数据 写的老长了.. #include <iostream> ...

  9. javac编译过程

    编译器把一种语言规范转化为另一种语言规范的这个过程需要哪些步骤:

  10. Windows SDK 实现不规则窗口介绍

    不规则窗口在程序界面设计中能提供非常好的用户体验,以下是我程序运行时的效果图: 以下是代码,注意需要修改一些简单的位置,如资源ID,项目的头文件等,这些是根据你创建的win32程序的项目名改变的,我的 ...