搜狐云景paas平台实践之路
前言:
搜狐云景作为搜狐的paas平台,在2014年5月22日的云计算大会上正式发布了公测。初测,注册用户必须先申请邀请码参与公测会赠送用户100元电子券,经过实名认证之后会再赠送100电子券,目测可以对试用用户基本app够跑半年。
除了用户中心的一些基本安全信息设置和各种账单外,我想主要对其控制台的使用进行研究一番。
废话不多说,在绑定邮箱并充值10元成正式用户之后,无阻挡进行各种测试吧。
dashboard很清新干净,是一个对用户基本消费情况和使用资源服务的基本概览。
---------------------------------------------------
一、来创建个应用
这里需要选择选择应用的基本类型是web或后台worker;
运行环境需要事先选择好,其java就提供三种不同的运行环境,支持语言类型也挺多的,基本的主流语言都有支持到了;
实例类型也就是容器类型,使用linux lxc技术,提供了六种不同的容器来运行我们的程序。
创建成功之后,会有一些默认的配置。
- 域名:cstest.sohuapps.com
- 版本:1
- 实例配置:3-8,可以自定义配置
- 容器类型:C2,可以自定义配置
- 黏性会话:关闭,可以自定义配置
- 外网访问:关闭,可以自定义配置
- git服务:git@git.cloudscape.sohu.com:cs/cstest.git,据了解后续会开启git push自动部署功能。
- 自动调度:开启,可以自定义规则引擎,这个比较牛逼,目测国内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
- 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
[plain] view plaincopy
- 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
[plain] view plaincopy
- 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
[plain] view plaincopy
- appid: 666666666
- start: $PHP_FPM_START
2.5 LUA
[plain] view plaincopy
- appid: 666666666
- start: $LUA_START
2.6 NODEJS
[plain] view plaincopy
- appid: 666666666
- web_health: true
- web_health_conf:
- path: /
- timeout: 500ms
- success: [200,201,403,301,302]
- try_restart:
- enable: true
- fall: 10
- start: $NODEJS $USER_DIR/app/main.js
2.7 PYTHON
[java] view plaincopy
- appid: 666666666
- start: $UWSGI_START
2.8 PYTHON with WEBPY
[plain] view plaincopy
- appid: 666666666
- start: $PYTHON $USER_DIR/bin/main.py 8080
- try_restart: {fall: 10, enable: true}
- web_health: true
- web_health_conf:
- path: /
- success: [200, 201, 403, 301, 302]
- 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)
总结一下,
三、高级进阶
提供语言支持太多,不能面面俱到,下面以java为例,介绍一下搜狐云景提供的一些高级功能。
3.1 日志输出
- 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
哈,是不是很简单呢。
- 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 服务使用
- //(a)、获取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, appinfos is empty , code: " + result.getCode() + ", message: "
- + res.get(ApiKeys._message));
- return Collections.emptyList();
- }
- List<RedisInstanceNode> list = (List<RedisInstanceNode>) JsonUtils.readValueAsList(
- JsonUtils.writeValueAsString(nodesJson), ArrayList.class, RedisInstanceNode.class);
- return list;
- }
- (b)、根据返回的实例nodes列表构建redis 连接池,笔者使用了强大的jedis。
- 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管理功能,这就相当于是个VPS拉,前提是要上传了公钥之后才能使用这么强大的功能。
不过,别失望,很多命令是不能使用的哦,看来是对命令进行了精简呢。不过这已经是很强大了,进去能看到我们的自己的日志了和进程等信息。
- 1、很抱歉,ssh的管理功能不能每个实例都能打开,最多只能起两个,好在可以关闭,自己能自由切换。
- 2、然后,其停止和卸载app的地方隐藏的很深啊,类似于github上的要delete一个项目一样,要深层隐藏,可能为了确保用户不误操作吧。
- 3、配置app.yaml比较麻烦,有个模板对应改是好点的。
- 4、服务开放的虽然基本的够用,但是还是少了点,像很多cdn呐,mongodb啊,存储类的服务都没有,期待很快开放。
搜狐云景paas平台实践之路的更多相关文章
- 浅谈搜狐云景PAAS平台
前言: 搜狐云景作为搜狐的paas平台,在2014年5月22日的云计算大会上正式公布了公測.初測,注冊用户必须先申请邀请码參与公測会赠送用户100元电子券,经过实名认证之后会再赠送100电子券.目測能 ...
- 体验搜狐PaaS平台搜狐云景-自动调度(Autoscale)
今天,收到一封「搜狐云景」送邀请码的邮件,价值 200 rmb,立马前往官网简单了解一下,这个玩意儿是搜狐公司云战略的一个产品,一个 PaaS 平台,简单了解了一下特性: 1.自由定制运行环境,这表示 ...
- Python伪开发者对于搜狐云景的测评
Python伪开发者对于搜狐云景的测评 本人是GAE和OpenShift的狂热爱好者,玩过各种国外PaaS.某次想搞个稍微复杂点的Python Web程序,需要比较好的网络传输速度,就试图找前PM(P ...
- SAE、搜狐云景和百度云之初见
近期有需求将我们的应用部署到公有云的服务平台上,于是找了几家公有云服务做了一下调研, 首先对比一下他们提供的功能: 功能 SAE 搜狐云景 百度云 版本控制工具 svn GIT,和百度云的比起来,用 ...
- 搜狐云景client工具评測之WordPress的搭建
搜狐云景是搜狐推出的一款PaaS产品,眼下还处在公測阶段,拿到邀请码后试用了一下,感觉还不错. 搜狐云景提供了四种方式部署应用,感觉应该能够满足各种口味的码农:1. zip包的形式在网页上传并部署 ...
- 终极套娃 2.0|云原生 PaaS 平台的可观测性实践分享
某个周一上午,小涛像往常一样泡上一杯热咖啡 ️,准备打开项目协同开始新一天的工作,突然隔壁的小文喊道:"快看,用户支持群里炸锅了 -" 用户 A:"Git 服务有点问题, ...
- 从 Spark 到 Kubernetes — MaxCompute 的云原生开源生态实践之路
2019年5月14日,喜提浙江省科学技术进步一等奖的 MaxCompute 是阿里巴巴自研的 EB 级大数据计算平台.该平台依托阿里云飞天基础架构,是阿里巴巴在10年前做飞天系统的三大件之分布式计算部 ...
- 灵雀云容器PaaS平台助力知名股份制银行金融科技革新
互联网.科技和金融的碰撞给银行业带来巨大影响.IT技术起初是传统金融提升效率的工具和方法,随着新技术的演进,技术成为驱动变革的核心要素.Fintech金融科技以技术和数据为驱动,用创新的方法改变了金融 ...
- 终极指南:企业级云原生 PaaS 平台日志分析架构全面解析
早些时候 Erda Show 针对微服务监控.日志等内容做了专场分享,很多同学听完后意犹未尽,想了解更多关于日志分析的内容.Erda 团队做日志分析也有一段时间了,所以这次打算和大家详细分享一下我们在 ...
随机推荐
- tomcat version
Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules 转自:http://jingwang0 ...
- Android 对话框弹出位置和透明度的设置
在Android中 我们经常会用AlertDialog来显示对话框.通过这个对话框是显示在屏幕中心的.但在某些程序中,要求对话框可以显示在不同的位置.例如,屏幕的上 方或下方.要实现这种效果.就需要获 ...
- hadoop2 环境的搭建(自动HA)
zookeeper:hadoop112.hadoop113.hadoop114 namenode:hadoop110和hadoop111 datanode:hadoop112.hadoop113.ha ...
- poj 1177 Picture (线段树 扫描线 离散化 矩形周长并)
题目链接 题意:给出n个矩形,每个矩形给左下 和 右上的坐标,求围成的周长的长度. 分析: 首先感谢大神的博客,最近做题经常看大神的博客:http://www.cnblogs.com/kuangbin ...
- poj 3368 Frequent values(RMQ)
题目:http://poj.org/problem?id=3368 题意:给定n个数,顺序为非下降,询问某个区间内的数出现最多的数的 出现次数.. 大白书上的 例题..算是RMQ变形了, 对 原数组重 ...
- noi2002银河英雄传说(并查集)
首先表示对C++读入读出问题复杂程度的敬畏,看了好多没讲明白的,本题用cin竟然过不了评测,搞scanf的读入搞了好久.... 本题确实是一道经典的并查集题型,不多讲,拿来练练手用的(其中经历很惨) ...
- MySQL Timeout解析
“And God said, Let there be network: and there was timeout”在使用MySQL的过程中,你是否遇到了众多让人百思不得其解的Timeout?那么这 ...
- css动画集合地址
CSS3 UI Lib库是由腾讯AlloyTeam前端开发团队建立,主要收集国内外友好体验和创意的界面组件Demo. 它除了使用CSS3技术外,还使用了HTML5,JS,JX,jQuery等技术,来达 ...
- ASP.NET MVC实现多个按钮提交事件
有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较 ...
- jrtplib跨网络通讯NAT穿透问题解决方法
前几篇文章讲了使用jrtplib在Android和pc端进行通讯的方法 在实际项目中,手机端和pc端一般不会在同一个子网内,两者之间联络可能要走路由器之类的NAT(网络地址转换 Network Add ...