分享

Cloud Foundry:我们的博客APP - 如何绑定服务

本帖最后由 xioaxu790 于 2014-6-19 14:19 编辑
问题导读:
1、如何创建CF的服务?


2、如何将创建的CF服务绑定到我们的APP中?





在上一篇文章<Cloud Foundry 快速入门 (cf工具)>,我们简单快速的上传了一个小应用,了解了CF部署APP的流程。但是如果我们想要APP有更强大的功能,它就必须有那些最常见的服务,例如数据库(mysql, postgres)键值存储(redis, rabbitmq),log分析等等。幸运的是,很多最流行服务的供应商已经和CF合作集成,可以即时的给我们的APP提供服务。

今天我会为大家介绍如何创建CF的服务,并绑定该服务到我们的APP。我们所push的APP是根据这个rails教程做成的blogger。地址在这里,你可以克隆我的修改: git clone 地址在这里。这是一个和数据库结合的博客应用程序,所以我们会在CF里创建一个mysql数据库服务。

整个流程的大概顺序是:
1. 创建应用 (暂时不启动)
2. 创建服务 (可以和1互换)
3. 绑定应用和服务
4. 启动已经绑定服务的应用

- 服务的市场 (cf marketplace)
  'cf marketplace'会列出当前CF所集成的所有服务(service)以及它们的套餐(plans)。目前免费账户可以使用最初级的套餐。
  ~/workspace/blogger $ cf marketplace
  1. Getting services from marketplace in org my-pivotal-org / space development as jda@gopivotal.com... OK  
  2.   
  3. service          plans                                                                 description  
  4. blazemeter       free-tier, basic1kmr, pro5kmr, pp10kmr, hv40kmr                       The JMeter Load Testing Cloud  
  5. cleardb          spark, boost, amp, shock                                              Highly available MySQL for your Apps.  
  6. cloudamqp        lemur, tiger, bunny, rabbit, panda                                    Managed HA RabbitMQ servers in the cloud  
  7. cloudforge       free, standard, pro                                                   Development Tools In The Cloud  
  8. elephantsql      turtle, panda, hippo, elephant                                        PostgreSQL as a Service  
  9. ironmq           pro_platinum, pro_gold, large, medium, small, pro_silver              Powerful Durable Message Queueing Service  
  10. ironworker       large, pro_gold, pro_platinum, pro_silver, small, medium              Scalable Background and Async Processing  
  11. loadimpact       lifree, li100, li500, li1000                                          Cloud-based, on-demand website load testing  
  12. memcachedcloud   25mb, 100mb, 250mb, 500mb, 1gb, 2-5gb, 5gb                            Enterprise-Class Memcached for Developers  
  13. mongolab         sandbox                                                               Fully-managed MongoDB-as-a-Service  
  14. newrelic         standard                                                              Manage and monitor your apps  
  15. rediscloud       25mb, 100mb, 250mb, 500mb, 1gb, 2-5gb, 5gb, 10gb, 50gb                Enterprise-Class Redis for Developers  
  16. searchify        small, plus, pro                                                      Custom search you control  
  17. searchly         small, micro, professional, advanced, starter, business, enterprise   Search Made Simple. Powered-by ElasticSearch  
  18. sendgrid         free, bronze, silver, gold, platinum                                  Email Delivery. Simplified.
复制代码


- 服务的创建 (cf create-service)
  比如我们需要一个数据库服务,我们可以调用下面的命令来创建这个服务,而服务供应商则会根据我们的要求,在他们的'云'里建造一个新的数据库。
  ~/workspace/blogger $ cf create-service cleardb spark mydb
  1. Creating service mydb in org my-pivotal-org / space development as jda@gopivotal.com...  
  2. OK  
复制代码

  现在我们就可以在自己的空间里看到新建的数据库服务。
  ~/workspace/blogger $ cf services
  1. Getting services in org my-pivotal-org / space development as jda@gopivotal.com...
  2. OK
  3. name   service   plan    bound apps  
  4. mydb   cleardb   spark  
复制代码


- 服务的绑定 (cf bind-service)
  服务的绑定是指应用程序知道服务的存在,并且获取其验证信息的步骤。我们现在已经有了服务,那我们就来上传blogger吧!
  我对教程里代码的主要改动(1 of 3)是config/database.yml。数据库验证信息都改成了动态的获取,是从一个'VCAP_SERVICES'的环境变量读出的。这个环境变量则是在绑定服务之后而生成的。
  1. <%  
  2.   mydb = JSON.parse(ENV['VCAP_SERVICES'])["cleardb"]  
  3.   credentials = mydb.first["credentials"]  
  4. %>  
  5. ...  
  6. production:  
  7.   adapter: pg  
  8.   encoding: utf8  
  9.   reconnect: false  
  10.   pool: 5  
  11.   host: <%= credentials["host"] %>  
  12.   username: <%= credentials["username"] %>  
  13.   password: <%= credentials["password"] %>  
  14.   database: <%= credentials["database"] %>  
  15.   port: <%= credentials["port"] %>
复制代码
第二个改动是在Gemfile里加了一行"gem 'mysql2'"。这样我们的blogger就可以通过这个依赖和数据库联系。

  第三个改动则是在config/environments/production.rb,将config.assets.compile = false改成了config.assets.compile = true。这个改动主要是用于启用assets(javascript, scss)的动态编译。

  我们可以push了!需要注意的是我们上传APP后还不能start,因为我们还未绑定APP所需的数据库。
  ~/workspace/blogger $ cf push iblogger --no-start
  1. Creating app iblogger in org my-pivotal-org / space development as jda@gopivotal.com...  
  2. OK  
  3.   
  4. Using route iblogger.cfapps.io  
  5. Binding iblogger.cfapps.io to iblogger...  
  6. OK  
  7.   
  8. Uploading iblogger...  
  9. Uploading from: /Users/jda/workspace/blogger  
  10. 1.8M, 480 files  
  11. OK
复制代码

  上传完毕!MySQL - ready! APP - ready! 开始绑定MySQL - APP绑定!
  ~/workspace/blogger $ cf bind-service iblogger mydb
  1. Binding service mydb to app iblogger in org my-pivotal-org / space development as jda@gopivotal.com...  
  2. OK  
  3. TIP: Use 'cf push' to ensure your env variable changes take effect  
复制代码


- APP的运行 (cf push)
  根据上一个命令返回的提示,这时我们可以重新启动(push)我们的APP。在下面的命令里<-c 'bundle exec rake db:migrate && bundle exec rails s -p $PORT'>注明的是APP编译好要运行的命令:'bundle exec rake db:migrate'会将数据库初始化;'bundle exec rails s -p $PORT'会启动rails的webserver。

  ~/workspace/blogger $ cf push iblogger -c 'bundle exec rake db:migrate && bundle exec rails s -p $PORT'
  1. Updating app iblogger in org my-pivotal-org / space development as jda@gopivotal.com...  
  2. OK  
  3.   
  4. Uploading iblogger...  
  5. Uploading from: /Users/jda/workspace/blogger  
  6. 1.8M, 480 files  
  7. OK  
  8.   
  9. Starting app iblogger in org my-pivotal-org / space development as jda@gopivotal.com...  
  10. OK  
  11. -----> Downloaded app package (8.5M)  
  12. -----> Using Ruby version: ruby-1.9.3  
  13. -----> Installing dependencies using Bundler version 1.3.2  
  14.         Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin --deployment  
  15.         Installing rake (10.1.0)  
  16.         Installing i18n (0.6.5)  
  17.         ...[output omitted]  
  18. -----> Writing config/database.yml to read from DATABASE_URL  
  19. -----> Preparing app for Rails asset pipeline  
  20.         Detected manifest file, assuming assets were compiled locally  
  21. -----> WARNINGS:  
  22.         ...  
  23. -----> Uploading droplet (44M)  
  24.   
  25. 0 of 1 instances running, 1 starting  
  26. 0 of 1 instances running, 1 starting  
  27. 1 of 1 instances running  
  28.   
  29. App started  
  30.   
  31. Showing health and status for app iblogger in org my-pivotal-org / space development as jda@gopivotal.com...  
  32. OK  
  33.   
  34. requested state: started  
  35. instances: 1/1  
  36. usage: 1G x 1 instances  
  37. urls: iblogger.cfapps.io  
  38.   
  39.       state     since                    cpu    memory         disk  
  40. #0   running   2014-04-30 06:18:25 PM   0.0%   171.1M of 1G   121.3M of 1G  
复制代码


  如果我们想亲自连接到数据库里查看我们的数据信息,我们可以通过'cf files'来获取数据库的验证信息。(请放心,我把下面数据库的密码改掉了:D)
  ~/workspace/blogger $ cf files iblogger logs/env.log
  1. Getting files for app iblogger in org my-pivotal-org / space development as jda@gopivotal.com...  
  2. OK  
  3.   
  4. TMPDIR=/home/vcap/tmp  
  5. VCAP_APP_PORT=63752  
  6. USER=vcap  
  7. VCAP_APPLICATION={"limits":{"mem":1024,"disk":1024,"fds":16384},"application_version":"152d7bc5-d2a2-4351-af07-552a62a75f1a","application_name":"iblogger","application_uris":["iblogger.cfapps.io"],"version":"152d7bc5-d2a2-4351-af07-552a62a75f1a","name":"iblogger","space_name":"development","space_id":"ce1a7115-ba9a-493e-8f74-145e7571ab7f","uris":["iblogger.cfapps.io"],"users":null,"instance_id":"d7209457daa5463c9c1840b94dbac877","instance_index":0,"host":"0.0.0.0","port":63752,"started_at":"2014-04-30 10:18:12 +0000","started_at_timestamp":1398853092,"start":"2014-04-30 10:18:12 +0000","state_timestamp":1398853092}  
  8. RACK_ENV=production  
  9. PATH=/home/vcap/app/bin:/home/vcap/app/vendor/bundle/ruby/1.9.1/bin:/bin:/usr/bin:/bin:/usr/bin  
  10. PWD=/home/vcap  
  11. LANG=en_US.UTF-8  
  12. VCAP_SERVICES={"cleardb":[{"name":"mydb","label":"cleardb","tags":["relational","Data Store","mysql"],"plan":"spark","credentials":{"jdbcUrl":"jdbc:mysql://username:password@mysql.host.url:3306/db_name","uri":"mysql://username:password@mysql.host.url:3306/db_name?reconnect=true","<strong>name</strong>":"db_name","<strong>hostname</strong>":"mysql.host.url","<strong>port</strong>":"3306","<strong>username</strong>":"username","<strong>password</strong>":"password"}}]}  
  13. SHLVL=1  
  14. HOME=/home/vcap/app  
  15. RAILS_ENV=production  
  16. GEM_PATH=/home/vcap/app/vendor/bundle/ruby/1.9.1:  
  17. PORT=63752  
  18. VCAP_APP_HOST=0.0.0.0  
  19. DATABASE_URL=mysql2://username:password@mysql.host.url:3306/db_name?reconnect=true  
  20. MEMORY_LIMIT=1024m  
  21. _=/usr/bin/env  
复制代码


去iblogger.cfapps.io留言吧!!

11.jpg




已有(2)人评论

跳转到指定楼层
ainubis 发表于 2015-3-29 20:52:48
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条