Menggunakan Pivotal Web Service
Pada workshop yang diadakan Pivotal kemarin, para peserta dipandu untuk membuat dan menjalankan aplikasi di Pivotal Web Services. Ini adalah layanan cloud PaaS yang disediakan oleh Pivotal untuk menjalankan aplikasi yang kita buat.
Secara garis besar, cara deploymentnya mirip dengan Heroku dan Openshift, seperti yang pernah saya bahas di artikel terdahulu. Perbedaan yang paling mendasar, kalau di Heroku dan Openshift kita mendeploy source code (untuk kemudian dilakukan build di cloud), maka di Pivotal Web Services ini (kita sebut PWS aja ya biar gak capek ngetiknya) kita mendeploy JAR atau WAR.
PWS ini berjalan menggunakan software Pivotal Cloud Foundry (PCF). Aplikasi PCF ini open source dan tersedia untuk diunduh. Jadi, kita bisa memasangnya di server kita sendiri. Mirip dengan Openshift, ada aplikasinya, open source, bisa diinstal di server sendiri (on premise).
Pivotal juga menyediakan versi mini dari PCF, disebut dengan PCF Dev, yang bisa diinstal dengan mudah di laptop kita sendiri. Soalnya kalau kita mau install PCF versi full, lumayan ribet juga, harus paham Linux, platform IaaS, dan juga setup jaringan untuk kebutuhan routing dan DNS. Walaupun demikian, siapkan koneksi internet yang mumpuni, karena setup PCF Dev ini akan mendownload bergiga-giga data.
Sedangkan bila ingin menginstal PCF versi full, bisa membaca dokumentasi di websitenya
Rekan-rekan bisa mengikuti panduan berikut dengan cara mendaftar di PWS. Setelah mendaftar, kita akan diberikan akun gratis untuk periode tertentu. Yuk kita mulai …
Daftar di run.pivotal.io
Langkah pertama tentunya adalah membuat akun alias mendaftar ke PWS. Tentunya untuk pendaftaran tidak perlu saya jelaskan lagi :D Jadi kita bisa lanjut ke langkah berikutnya.
Instalasi Aplikasi Command Line
Pengoperasian Cloud Foundry bisa dilakukan lewat web ataupun lewat command line. Tetapi lebih fleksibel dan mudah diikuti adalah metode Command Line. Perintahnya bisa dicopas dari artikel ini. Tidak demikian kalau versi web. Saya bisa menyediakan screenshot, tapi untuk mengikutinya harus klik sana sini.
Instalasi aplikasi command line bisa dibaca sendiri di websitenya Cloud Foundry. Silahkan ikuti panduan yang sesuai dengan sistem operasi masing-masing.
Setup Aplikasi Command Line
Karena Cloud Foundry bisa diinstal di local (dengan PWS Dev) ataupun di server kita sendiri (dengan PWS full), maka kita perlu memberitahu aplikasi command line mengenai server yang kita gunakan. Kemudian baru kita masukkan email dan password. Berikut perintahnya
cf login -a api.run.pivotal.io
API endpoint: api.run.pivotal.io
Email> endy.muhardin@gmail.com
Password>
Authenticating...
OK
Targeted org endy.muhardin.com
Targeted space development
API endpoint: https://api.run.pivotal.io (API version: 2.64.0)
User: endy.muhardin@gmail.com
Org: endy.muhardin.com
Space: development
Pada contoh di atas, saya arahkan ke server PWS, yaitu api.run.pivotal.io
.
Aplikasi yang akan dideploy
Untuk mempermudah pembaca mengikuti, Anda bisa menggunakan contoh aplikasi yang sudah saya buat selama praktek di workshop kemarin. Silahkan clone dari Github
git clone https://github.com/endymuhardin/pivotal-workshop.git
Setelah diclone, masuk ke foldernya, kemudian build projectnya.
cd pivotal-workshop
mvn clean package
Konfigurasi Cloud Foundry
Supaya Cloud Foundry tahu cara menjalankan aplikasi kita, perlu ada file konfigurasi. File konfigurasinya diberi nama manifest.yml
dan ditaruh di top level folder dalam project kita. Isinya sebagai berikut
---
applications:
- name: aplikasi-lab
memory: 512M
instances: 1
host: aplikasi-lab-${random-word}
path: target/aplikasi-lab-0.0.1-SNAPSHOT.jar
Deployment
Setelah itu, kita bisa melakukan deployment dengan perintah berikut
cf push
Berikut adalah outputnya
Using manifest file /Users/endymuhardin/Downloads/aplikasi-lab/manifest.yml
Creating app aplikasi-lab in org endy.muhardin.com / space development as endy.muhardin@gmail.com...
OK
Creating route aplikasi-lab-weightiest-reen.cfapps.io...
OK
Binding aplikasi-lab-weightiest-reen.cfapps.io to aplikasi-lab...
OK
Uploading aplikasi-lab...
Uploading app files from: /var/folders/l4/82c0hrld15g_fgn110435k7m0000gn/T/unzipped-app849606044
Uploading 316.8K, 90 files
Done uploading
OK
Starting app aplikasi-lab in org endy.muhardin.com / space development as endy.muhardin@gmail.com...
Downloading binary_buildpack...
Downloading nodejs_buildpack...
Downloading staticfile_buildpack...
Downloading java_buildpack...
Downloading ruby_buildpack...
Downloaded ruby_buildpack
Downloading dotnet_core_buildpack...
Downloaded nodejs_buildpack
Downloading dotnet_core_buildpack_beta...
Downloaded java_buildpack
Downloading php_buildpack...
Downloaded dotnet_core_buildpack
Downloading go_buildpack...
Downloaded staticfile_buildpack
Downloading python_buildpack...
Downloaded php_buildpack
Downloaded go_buildpack
Downloaded python_buildpack
Downloaded binary_buildpack
Downloaded dotnet_core_buildpack_beta
Creating container
Successfully created container
Downloading app package...
Downloaded app package (12.6M)
Staging...
-----> Java Buildpack Version: v3.10 (offline) | https://github.com/cloudfoundry/java-buildpack.git#193d6b7
-----> Downloading Open Jdk JRE 1.8.0_111 from https://java-buildpack.cloudfoundry.org/openjdk/trusty/x86_64/openjdk-1.8.0_111.tar.gz (found in cache)
Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (1.0s)
-----> Downloading Open JDK Like Memory Calculator 2.0.2_RELEASE from https://java-buildpack.cloudfoundry.org/memory-calculator/trusty/x86_64/memory-calculator-2.0.2_RELEASE.tar.gz (found in cache)
Memory Settings: -Xss349K -XX:MetaspaceSize=104857K -Xms681574K -Xmx681574K -XX:MaxMetaspaceSize=104857K
-----> Downloading Spring Auto Reconfiguration 1.10.0_RELEASE from https://java-buildpack.cloudfoundry.org/auto-reconfiguration/auto-reconfiguration-1.10.0_RELEASE.jar (found in cache)
Exit status 0
Staging complete
Uploading droplet, build artifacts cache...
Uploading build artifacts cache...
Uploading droplet...
Uploaded build artifacts cache (108B)
Uploaded droplet (57.7M)
Uploading complete
Destroying container
Successfully destroyed container
0 of 1 instances running, 1 starting
1 of 1 instances running
App started
OK
App aplikasi-lab was started using this command `CALCULATED_MEMORY=$($PWD/.java-buildpack/open_jdk_jre/bin/java-buildpack-memory-calculator-2.0.2_RELEASE -memorySizes=metaspace:64m..,stack:228k.. -memoryWeights=heap:65,metaspace:10,native:15,stack:10 -memoryInitials=heap:100%,metaspace:100% -stackThreads=300 -totMemory=$MEMORY_LIMIT) && JAVA_OPTS="-Djava.io.tmpdir=$TMPDIR -XX:OnOutOfMemoryError=$PWD/.java-buildpack/open_jdk_jre/bin/killjava.sh $CALCULATED_MEMORY" && SERVER_PORT=$PORT eval exec $PWD/.java-buildpack/open_jdk_jre/bin/java $JAVA_OPTS -cp $PWD/. org.springframework.boot.loader.JarLauncher`
Showing health and status for app aplikasi-lab in org endy.muhardin.com / space development as endy.muhardin@gmail.com...
OK
requested state: started
instances: 1/1
usage: 512M x 1 instances
urls: aplikasi-lab-weightiest-reen.cfapps.io
last uploaded: Wed Nov 23 09:09:16 UTC 2016
stack: cflinuxfs2
buildpack: java-buildpack=v3.10-offline-https://github.com/cloudfoundry/java-buildpack.git#193d6b7 java-main open-jdk-like-jre=1.8.0_111 open-jdk-like-memory-calculator=2.0.2_RELEASE spring-auto-reconfiguration=1.10.0_RELEASE
state since cpu memory disk details
#0 running 2016-11-23 04:10:11 PM 76.8% 267.6M of 512M 137.1M of 1G
Aplikasi kita sudah terdeploy dan bisa diakses di http://aplikasi-lab-weightiest-reen.cfapps.io
. Karena controller yang dibuat dimapping di url /user/
maka kita bisa jalankan controllernya dengan mengakses url http://aplikasi-lab-weightiest-reen.cfapps.io/user/
Setup Database
Aplikasi yang kita buat menggunakan database. Untuk itu, kita harus menyiapkan databasenya dulu. Cloud Foundry memiliki marketplace, yaitu tempat untuk mendapatkan service tambahan seperti database, email, message broker, dan sebagainya. Kita bisa cari service database dengan perintah cf marketplace
. Berikut adalah outputnya
Getting services from marketplace in org endy.muhardin.com / space development as endy.muhardin@gmail.com...
OK
service plans description
3scale free_appdirect, basic_appdirect* API Management Platform
app-autoscaler standard Scales bound applications in response to load (beta)
blazemeter free-tier, basic1kmr*, pro5kmr* Performance Testing Platform
cedexisopenmix opx_global*, openmix-gslb-with-fusion-feeds* Openmix Global Cloud and Data Center Load Balancer
cedexisradar free-community-edition Free Website and Mobile App Performance Reports
cleardb spark, boost*, amp*, shock* Highly available MySQL for your Apps.
cloudamqp lemur, tiger*, bunny*, rabbit*, panda* Managed HA RabbitMQ servers in the cloud
cloudforge free, standard*, pro* Development Tools In The Cloud
elephantsql turtle, panda*, hippo*, elephant* PostgreSQL as a Service
flashreport trial, basic*, silver*, gold*, platinum* Generate PDF from your data
gluon free, indie*, business*, enterprise* Mobile Synchronization and Cloud Integration
ironworker production*, starter*, developer*, lite Job Scheduling and Processing
loadimpact lifree, li100*, li500*, li1000* Performance testing for DevOps
memcachedcloud 100mb*, 250mb*, 500mb*, 1gb*, 2-5gb*, 5gb*, 30mb Enterprise-Class Memcached for Developers
memcachier dev, 100*, 250*, 500*, 1000*, 2000*, 5000*, 7500*, 10000*, 20000*, 50000*, 100000* The easiest, most advanced memcache.
mlab sandbox Fully managed MongoDB-as-a-Service
newrelic standard Manage and monitor your apps
pubnub free Build Realtime Apps that Scale
rediscloud 100mb*, 250mb*, 500mb*, 1gb*, 2-5gb*, 5gb*, 10gb*, 50gb*, 30mb Enterprise-Class Redis for Developers
searchify small*, plus*, pro* Custom search you control
searchly small*, micro*, professional*, advanced*, starter, business*, enterprise* Search Made Simple. Powered-by Elasticsearch
sendgrid free, bronze*, silver* Email Delivery. Simplified.
ssl basic* Upload your SSL certificate for your app(s) on your custom domain
stamplay plus*, premium*, core, starter* API-first development platform
statica starter, spike*, micro*, medium*, large*, enterprise*, premium* Enterprise Static IP Addresses
temporize small*, medium*, large* Simple and flexible job scheduling for your application
* These service plans have an associated cost. Creating a service instance will incur this cost.
TIP: Use 'cf marketplace -s SERVICE' to view descriptions of individual plans of a given service.
Kita akan gunakan service ClearDB yang menyediakan layanan MySQL. Gunakan paket spark
yang gratis.
Service ClearDB paket spark
diinisialisasi dengan perintah berikut
cf create-service cleardb spark aplikasi-lab-db
Outputnya seperti ini
Creating service instance aplikasi-lab-db in org endy.muhardin.com / space development as endy.muhardin@gmail.com...
OK
Bind service database ke aplikasi
Selanjutnya, kita sambungkan aplikasi kita ke database tersebut. Gunakan perintah cf bs
untuk melakukan bind service.
cf bs aplikasi-lab aplikasi-lab-db
Binding service aplikasi-lab-db to app aplikasi-lab in org endy.muhardin.com / space development as endy.muhardin@gmail.com...
OK
TIP: Use 'cf restage aplikasi-lab' to ensure your env variable changes take effect
Hasilnya bisa dilihat dengan perintah cf env
cf env aplikasi-lab
Getting env variables for app aplikasi-lab in org endy.muhardin.com / space development as endy.muhardin@gmail.com...
OK
System-Provided:
{
"VCAP_SERVICES": {
"cleardb": [
{
"credentials": {
"hostname": "us-cdbr-iron-east-04.cleardb.net",
"jdbcUrl": "jdbc:mysql://us-cdbr-iron-east-04.cleardb.net/ad_64335bf0ac3ef8d?user=b7882f306fb1a2\u0026password=34035fad",
"name": "ad_64335bf0ac3ef8d",
"password": "34035fad",
"port": "3306",
"uri": "mysql://b7882f306fb1a2:34035fad@us-cdbr-iron-east-04.cleardb.net:3306/ad_64335bf0ac3ef8d?reconnect=true",
"username": "b7882f306fb1a2"
},
"label": "cleardb",
"name": "aplikasi-lab-db",
"plan": "spark",
"provider": null,
"syslog_drain_url": null,
"tags": [
"Data Stores",
"Cloud Databases",
"Web-based",
"Online Backup \u0026 Storage",
"Single Sign-On",
"Cloud Security and Monitoring",
"Certified Applications",
"Developer Tools",
"Data Store",
"Development and Test Tools",
"Buyable",
"mysql",
"relational"
],
"volume_mounts": []
}
]
}
}
{
"VCAP_APPLICATION": {
"application_id": "30ab9b1b-64dd-458d-a027-a82beadbf05a",
"application_name": "aplikasi-lab",
"application_uris": [
"aplikasi-lab-weightiest-reen.cfapps.io"
],
"application_version": "64cc26f2-c28d-4f07-b31a-13e0d42c8df0",
"cf_api": "https://api.run.pivotal.io",
"limits": {
"disk": 1024,
"fds": 16384,
"mem": 512
},
"name": "aplikasi-lab",
"space_id": "02048815-c0b1-47ed-82f4-04a3efdfbfe2",
"space_name": "development",
"uris": [
"aplikasi-lab-weightiest-reen.cfapps.io"
],
"users": null,
"version": "64cc26f2-c28d-4f07-b31a-13e0d42c8df0"
}
}
No user-defined env variables have been set
No running env variables have been set
No staging env variables have been set
Konfigurasi Koneksi Database di Aplikasi
Biasanya, kita mengedit file application.properties
untuk mengatur JDBC URL, username, dan password database kita. Tapi kali ini tidak perlu. Spring Boot sudah menyediakan konfigurator otomatis untuk berbagai layanan cloud populer (Cloud Foundry, Openshift, Heroku, AWS, dan sebagainya). Kita cukup menambahkan dependensi paket spring-cloud-connector-starter
saja di pom.xml
.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cloud-connectors</artifactId>
</dependency>
Setelah ditambahkan dependensinya, lakukan build ulang dan push hasil buildnya
mvn clean package && cf push
Cek status aplikasi di cf
Untuk mengecek kondisi aplikasi kita di Cloud Foundry, kita jalankan perintah cf apps
.
cf apps
Getting apps in org endy.muhardin.com / space development as endy.muhardin@gmail.com...
OK
name requested state instances memory disk urls
aplikasi-lab started 1/1 512M 1G aplikasi-lab-weightiest-reen.cfapps.io, aplikasi-lab-nonflying-demipique.cfapps.io, aplikasi-lab-noncogent-semiproductiveness.cfapps.io, aplikasi-lab-unsolar-canoe.cfapps.io
Deployment ke Heroku
Untuk membuktikan kecanggihan Spring Cloud Connector, kita juga akan mendeploy aplikasi ini ke Heroku dan melihat sebanyak apa perubahan dan konfigurasi yang harus kita lakukan.
Dokumentasi lengkapnya bisa dibaca di blog tim Spring tentang Spring Cloud.
Sebelum menjalankan perintah ini, pastikan di komputer kita sudah terinstal aplikasi command line Heroku. Caranya bisa dilihat di artikel terdahulu.
Persiapan di sisi Heroku
Pertama, kita perlu membuat aplikasi dulu di Heroku. Berikut perintahnya
heroku apps:create
Dan ini outputnya
Creating app... done, ⬢ mysterious-spire-63516
https://mysterious-spire-63516.herokuapp.com/ | https://git.heroku.com/mysterious-spire-63516.git
Selanjutnya, kita beri nama aplikasinya
heroku config:set SPRING_CLOUD_APP_NAME=aplikasi-lab
Hasilnya seperti ini
Setting SPRING_CLOUD_APP_NAME and restarting ⬢ mysterious-spire-63516... done, v3
SPRING_CLOUD_APP_NAME: aplikasi-lab
Lalu, kita siapkan databasenya.
heroku addons:create heroku-postgresql:hobby-dev
Outputnya seperti ini
Creating heroku-postgresql:hobby-dev on ⬢ mysterious-spire-63516... free
Database has been created and is available
! This database is empty. If upgrading, you can transfer
! data from another database with pg:copy
Created postgresql-animated-92052 as DATABASE_URL
Use heroku addons:docs heroku-postgresql to view documentation
Persiapan di sisi heroku sudah selesai. Selanjutnya, kita bisa tampilkan log aplikasi kita di Heroku agar mudah memonitor kalau ada error.
heroku logs --tail
Konfigurasi Heroku
Seperti yang sudah-sudah, Heroku membutuhkan konfigurasi dalam file yang diberi nama Procfile
. Berikut isinya
web: java -Dserver.port=$PORT -Dspring.profiles.active=cloud -jar target/*.jar
Ini mirip dengan petunjuk saya di artikel terdahulu. Bedanya, di sini kita gunakan nama profil cloud
. Ini adalah nama khusus yang akan dikenali oleh spring-cloud-connector
. Kita juga tidak perlu membuatkan konfigurasi database khusus seperti di artikel sebelumnya.
Deployment ke Heroku
Deployment seperti biasa, cukup git push saja.
git add .
git commit -m "konfigurasi Heroku"
git push heroku master
Hasilnya bisa dilihat dengan perintah
heroku apps:info
Dan lihat outputnya
=== mysterious-spire-63516
Addons: heroku-postgresql:hobby-dev
Dynos: web: 1
Git URL: https://git.heroku.com/mysterious-spire-63516.git
Owner: endy.muhardin@gmail.com
Region: us
Repo Size: 12 KB
Slug Size: 75 MB
Stack: cedar-14
Web URL: https://mysterious-spire-63516.herokuapp.com/
Seperti biasa, saya menginisialisasi database menggunakan Flyway, sehingga pada waktu deployment, aplikasi akan otomatis membuat tabel dan mengisi sampel data. Mari kita cek apakah tabel dan datanya sudah ada.
Gunakan perintah berikut untuk connect ke database Heroku.
heroku pg:psql
Outputnya begini
---> Connecting to DATABASE_URL
psql (9.5.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
mysterious-spire-63516::DATABASE=>
Setelah mendapat prompt, kita bisa cek tabel yang ada di database dengan perintah \d
dan lihat datanya dengan perintah select * from s_user
.
Penutup
Demikian cara mendeploy aplikasi kita di server Cloud Foundry yang disediakan oleh Pivotal. Sebetulnya masih banyak fitur lain yang tersedia, seperti:
- Blue Green Deployment
- Horizontal dan Vertical Scale
- Autoscale
- dan sebagainya
Silahkan daftar dan coba-coba sendiri. Semoga bermanfaat