278 lines
12 KiB
Plaintext
278 lines
12 KiB
Plaintext
:sectnums:
|
|
= HTTP to Cassandra Demo
|
|
|
|
In this demonstration, you will learn how to orchestrate a data pipeline using http://cloud.spring.io/spring-cloud-dataflow/[Spring Cloud Data Flow] to consume data from an _HTTP_ endpoint and write the payload to a _Cassandra_ database.
|
|
|
|
We will begin by discussing the steps to prep, configure and operationalize Spring Cloud Data Flow's `admin` Spring Boot application. We will deploy `admin` using https://github.com/spring-cloud/spring-cloud-dataflow/tree/master/spring-cloud-dataflow-admin-local[Local] as well as https://github.com/spring-cloud/spring-cloud-dataflow-admin-cloudfoundry[Cloud Foundry] SPIs (Service Provider Interface) to demonstrate how Spring Cloud Data Flow takes advantage of _dev-sandbox_ and _cloud-native_ platform capabilities respectively.
|
|
|
|
== Using Local SPI
|
|
|
|
=== Prerequisites
|
|
|
|
In order to get started, make sure that you have the following components:
|
|
|
|
* Local build of link:https://github.com/spring-cloud/spring-cloud-dataflow[Spring Cloud Data Flow]
|
|
* Running instance of link:http://redis.io/[Redis]
|
|
* Running instance of link:http://cassandra.apache.org/[Apache Cassandra]
|
|
* A database utility tool such as link:http://dbeaver.jkiss.org/[DBeaver] to connect to the Cassandra instance. You might have to provide `host`, `port`, `username` and `password` depending on the Cassandra configuration you are using.
|
|
* Create a keyspace and a `book` table in Cassandra using:
|
|
+
|
|
```
|
|
CREATE KEYSPACE clouddata WITH REPLICATION = { 'class' : 'org.apache.cassandra.locator.SimpleStrategy', 'replication_factor': '1' } AND DURABLE_WRITES = true;
|
|
USE clouddata;
|
|
CREATE TABLE book (
|
|
id uuid PRIMARY KEY,
|
|
isbn text,
|
|
author text,
|
|
title text
|
|
);
|
|
```
|
|
|
|
=== Running the Sample Locally
|
|
|
|
. Launch the locally built `admin` application
|
|
+
|
|
```
|
|
$ cd <PATH/TO/SPRING-CLOUD-DATAFLOW>
|
|
$ java -jar spring-cloud-dataflow-server-local/target/spring-cloud-dataflow-server-local-1.0.0.BUILD-SNAPSHOT.jar
|
|
|
|
```
|
|
+
|
|
|
|
. Connect to Spring Cloud Data Flow's `shell`
|
|
+
|
|
```
|
|
$ cd <PATH/TO/SPRING-CLOUD-DATAFLOW>
|
|
$ java -jar spring-cloud-dataflow-shell/target/spring-cloud-dataflow-shell-1.0.0.BUILD-SNAPSHOT.jar
|
|
|
|
____ ____ _ __
|
|
/ ___| _ __ _ __(_)_ __ __ _ / ___| | ___ _ _ __| |
|
|
\___ \| '_ \| '__| | '_ \ / _` | | | | |/ _ \| | | |/ _` |
|
|
___) | |_) | | | | | | | (_| | | |___| | (_) | |_| | (_| |
|
|
|____/| .__/|_| |_|_| |_|\__, | \____|_|\___/ \__,_|\__,_|
|
|
____ |_| _ __|___/ __________
|
|
| _ \ __ _| |_ __ _ | ___| | _____ __ \ \ \ \ \ \
|
|
| | | |/ _` | __/ _` | | |_ | |/ _ \ \ /\ / / \ \ \ \ \ \
|
|
| |_| | (_| | || (_| | | _| | | (_) \ V V / / / / / / /
|
|
|____/ \__,_|\__\__,_| |_| |_|\___/ \_/\_/ /_/_/_/_/_/
|
|
|
|
1.0.0.BUILD-SNAPSHOT
|
|
|
|
Welcome to the Spring Cloud Data Flow shell. For assistance hit TAB or type "help".
|
|
dataflow:>version
|
|
1.0.0.BUILD-SNAPSHOT
|
|
```
|
|
|
|
+
|
|
. Create the stream
|
|
+
|
|
```
|
|
dataflow:>stream create cassandrastream --definition "http --server.port=8888 --spring.cloud.stream.bindings.output.contentType='application/json' | cassandra --ingestQuery='insert into book (id, isbn, title, author) values (uuid(), ?, ?, ?)' --spring.cassandra.keyspace=clouddata" --deploy
|
|
|
|
Created and deployed new stream 'cassandrastream'
|
|
```
|
|
NOTE: If Cassandra isn't running on default port on `localhost` or if you need username and password to connect, use one of the following options to specify the necessary connection parameters: `--spring.cassandra.username='<USERNAME>' --spring.cassandra.password='<PASSWORD>' --spring.cassandra.port=<PORT> --spring.cassandra.contactPoints=<LIST-OF-HOSTS>`
|
|
|
|
+
|
|
. Verify the stream is successfully deployed
|
|
+
|
|
```
|
|
dataflow:>stream list
|
|
```
|
|
+
|
|
. Notice that `cassandrastream-http` and `cassandrastream-cassandra` link:https://github.com/spring-cloud/spring-cloud-stream-modules/[Spring Cloud Stream] modules are running as Spring Boot applications within the `admin` as a collocated process.
|
|
+
|
|
|
|
```
|
|
2015-12-15 15:52:31.576 INFO 18337 --- [nio-9393-exec-1] o.s.c.d.a.s.l.OutOfProcessModuleDeployer : deploying module org.springframework.cloud.stream.module:cassandra-sink:jar:exec:1.0.0.BUILD-SNAPSHOT instance 0
|
|
Logs will be in /var/folders/c3/ctx7_rns6x30tq7rb76wzqwr0000gp/T/spring-cloud-data-flow-284240942697761420/cassandrastream.cassandra
|
|
2015-12-15 15:52:31.583 INFO 18337 --- [nio-9393-exec-1] o.s.c.d.a.s.l.OutOfProcessModuleDeployer : deploying module org.springframework.cloud.stream.module:http-source:jar:exec:1.0.0.BUILD-SNAPSHOT instance 0
|
|
Logs will be in /var/folders/c3/ctx7_rns6x30tq7rb76wzqwr0000gp/T/spring-cloud-data-flow-284240942697761420/cassandrastream.http
|
|
```
|
|
+
|
|
. Post sample data pointing to the `http` endpoint: `http://localhost:8888` [`8888` is the `server.port` we specified for the `http` source in this case]
|
|
+
|
|
```
|
|
dataflow:>http post --contentType 'application/json' --data '{"isbn": "1599869772", "title": "The Art of War", "author": "Sun Tzu"}' --target http://localhost:8888
|
|
> POST (application/json;charset=UTF-8) http://localhost:8888 {"isbn": "1599869772", "title": "The Art of War", "author": "Sun Tzu"}
|
|
> 202 ACCEPTED
|
|
```
|
|
+
|
|
. Connect to the Cassandra instance and query the table `clouddata.book` to list the persisted records
|
|
+
|
|
```
|
|
select * from clouddata.book;
|
|
```
|
|
|
|
+
|
|
. That's it; you're done!
|
|
|
|
|
|
== Using Pivotal Cloud Foundry SPI
|
|
|
|
=== Prerequisites for Pivotal Cloud Foundry SPI
|
|
|
|
In order to get started, make sure that you have the following components:
|
|
|
|
* Cloud Foundry instance
|
|
* Local build of https://github.com/spring-cloud/spring-cloud-dataflow[Spring Cloud Data Flow]
|
|
* Local build of Spring Cloud Data Flow's https://github.com/spring-cloud/spring-cloud-dataflow-admin-cloudfoundry[Cloud-Foundry-Admin]
|
|
* Running instance of `redis` in Cloud Foundry
|
|
* Running instance of `cassandra` in Cloud Foundry or from another Cloud provider
|
|
* A database utility tool such as link:http://dbeaver.jkiss.org/[DBeaver] to connect to the Cassandra instance. You might have to provide `host`, `port`, `username` and `password` depending on the Cassandra configuration you are using.
|
|
* Create a `book` table in your Cassandra keyspace using:
|
|
+
|
|
```
|
|
CREATE TABLE book (
|
|
id uuid PRIMARY KEY,
|
|
isbn text,
|
|
author text,
|
|
title text
|
|
);
|
|
```
|
|
|
|
|
|
=== Running the Sample in Cloud Foundry
|
|
|
|
. Verify that CF instance is reachable
|
|
+
|
|
|
|
```
|
|
$ cf api
|
|
API endpoint: https://api.system.navy.springapps.io (API version: 2.43.0)
|
|
|
|
$ cf apps
|
|
Getting apps in org sabby-dataflow / space development as sabby...
|
|
OK
|
|
|
|
No apps found
|
|
```
|
|
+
|
|
. Follow the instructions to deploy Spring Cloud Data Flow's `admin` from https://github.com/spring-cloud/spring-cloud-dataflow-admin-cloudfoundry/blob/master/README.adoc[CF SPI] repo
|
|
|
|
+
|
|
. Once you complete step#3 from https://github.com/spring-cloud/spring-cloud-dataflow-admin-cloudfoundry/blob/master/README.adoc[CF SPI] instructions, you'll be able to list the newly deployed `s-c-dataflow-admin` application in Cloud Foundry
|
|
+
|
|
|
|
```
|
|
$ cf apps
|
|
Getting apps in org sabby-dataflow / space development as sabby...
|
|
OK
|
|
|
|
name requested state instances memory disk urls
|
|
s-c-dataflow-admin started 1/1 1G 1G s-c-dataflow-admin.app.navy.springapps.io
|
|
```
|
|
|
|
+
|
|
. Notice that `s-c-dataflow-admin` application is started and ready for interaction via `http://s-c-dataflow-admin.app.navy.springapps.io` endpoint
|
|
|
|
. Connect to Spring Cloud Data Flow's `shell`.
|
|
+
|
|
|
|
```
|
|
$ cd <PATH/TO/SPRING-CLOUD-DATAFLOW>
|
|
$ java -jar spring-cloud-dataflow-shell/target/spring-cloud-dataflow-shell-1.0.0.BUILD-SNAPSHOT.jar
|
|
|
|
____ ____ _ __
|
|
/ ___| _ __ _ __(_)_ __ __ _ / ___| | ___ _ _ __| |
|
|
\___ \| '_ \| '__| | '_ \ / _` | | | | |/ _ \| | | |/ _` |
|
|
___) | |_) | | | | | | | (_| | | |___| | (_) | |_| | (_| |
|
|
|____/| .__/|_| |_|_| |_|\__, | \____|_|\___/ \__,_|\__,_|
|
|
____ |_| _ __|___/ __________
|
|
| _ \ __ _| |_ __ _ | ___| | _____ __ \ \ \ \ \ \
|
|
| | | |/ _` | __/ _` | | |_ | |/ _ \ \ /\ / / \ \ \ \ \ \
|
|
| |_| | (_| | || (_| | | _| | | (_) \ V V / / / / / / /
|
|
|____/ \__,_|\__\__,_| |_| |_|\___/ \_/\_/ /_/_/_/_/_/
|
|
|
|
1.0.0.BUILD-SNAPSHOT
|
|
|
|
Welcome to the Spring Cloud Data Flow shell. For assistance hit TAB or type "help".
|
|
server-unknown:>
|
|
```
|
|
+
|
|
. Connect the `shell` with `admin` running at `http://s-c-dataflow-admin.app.navy.springapps.io`
|
|
+
|
|
|
|
```
|
|
server-unknown:>admin config server http://s-c-dataflow-admin.app.navy.springapps.io
|
|
Successfully targeted http://s-c-dataflow-admin.app.navy.springapps.io
|
|
dataflow:>version
|
|
1.0.0.BUILD-SNAPSHOT
|
|
```
|
|
+
|
|
. Create the stream
|
|
+
|
|
|
|
```
|
|
dataflow:>stream create cassandrastream --definition "http --spring.cloud.stream.bindings.output.contentType='application/json' | cassandra --ingestQuery='insert into book (id, isbn, title, author) values (uuid(), ?, ?, ?)' --spring.cassandra.username='<USERNAME>' --spring.cassandra.password='<PASSWORD>' --spring.cassandra.port=<PORT> --spring.cassandra.contactPoints=<HOST> --spring.cassandra.keyspace='<KEYSPACE>'" --deploy
|
|
|
|
Created and deployed new stream 'cassandrastream'
|
|
```
|
|
+
|
|
. Verify the stream is successfully deployed
|
|
+
|
|
```
|
|
dataflow:>stream list
|
|
```
|
|
+
|
|
. Notice that `cassandrastream-http` and `cassandrastream-cassandra` https://github.com/spring-cloud/spring-cloud-stream-modules/[Spring Cloud Stream] modules are running as _cloud-native_ (microservice) applications in Cloud Foundry
|
|
+
|
|
|
|
```
|
|
$ cf apps
|
|
Getting apps in org sabby-dataflow / space development as sabby...
|
|
OK
|
|
|
|
name requested state instances memory disk urls
|
|
cassandrastream-cassandra started 1/1 1G 1G cassandrastream-cassandra.app.navy.springapps.io
|
|
cassandrastream-http started 1/1 1G 1G cassandrastream-http.app.navy.springapps.io
|
|
s-c-dataflow-admin started 1/1 1G 1G s-c-dataflow-admin.app.navy.springapps.io
|
|
```
|
|
+
|
|
. Lookup the `url` for `cassandrastream-http` application from the list above. Post sample data pointing to the `http` endpoint: `<YOUR-cassandrastream-http-APP-URL>`
|
|
+
|
|
```
|
|
http post --contentType 'application/json' --data '{"isbn": "1599869772", "title": "The Art of War", "author": "Sun Tzu"}' --target http://<YOUR-cassandrastream-http-APP-URL>
|
|
> POST (application/json;charset=UTF-8) http://cassandrastream-http.app.navy.springapps.io {"isbn": "1599869772", "title": "The Art of War", "author": "Sun Tzu"}
|
|
> 202 ACCEPTED
|
|
```
|
|
+
|
|
. Connect to the Cassandra instance and query the table `book` to list the data inserted
|
|
+
|
|
```
|
|
select * from book;
|
|
```
|
|
|
|
+
|
|
. Now, let's try to take advantage of Pivotal Cloud Foundry's platform capability. Let's scale the `cassandrastream-http` application from 1 to 3 instances
|
|
+
|
|
```
|
|
$ cf scale cassandrastream-http -i 3
|
|
Scaling app cassandrastream-http in org sabby-dataflow / space development as sabby...
|
|
OK
|
|
```
|
|
+
|
|
. Verify App instances (3/3) running successfully
|
|
+
|
|
```
|
|
$ cf apps
|
|
Getting apps in org sabby-dataflow / space development as sabby...
|
|
OK
|
|
|
|
name requested state instances memory disk urls
|
|
cassandrastream-cassandra started 1/1 1G 1G cassandrastream-cassandra.app.navy.springapps.io
|
|
cassandrastream-http started 3/3 1G 1G cassandrastream-http.app.navy.springapps.io
|
|
s-c-dataflow-admin started 1/1 1G 1G s-c-dataflow-admin.app.navy.springapps.io
|
|
```
|
|
+
|
|
. That's it; you're done!
|
|
|
|
:!sectnums:
|
|
== Summary
|
|
|
|
In this sample, you have learned:
|
|
|
|
* How to use Spring Cloud Data Flow in `Local` and `Pivotal Cloud Foundry`
|
|
* How to use Spring Cloud Data Flow's `shell`
|
|
* How to create streaming data pipeline to connect and write to `Cassandra`
|
|
* How to scale data microservice applications on `Pivotal Cloud Foundry` |