From fd196fbbabad15c3fad99ca38f9dd8d1d085f19c Mon Sep 17 00:00:00 2001 From: Thomas Risberg Date: Wed, 16 Dec 2015 15:34:41 -0500 Subject: [PATCH] Update MySQL sample --- streaming/http-to-mysql/README.adoc | 106 ++++++++++-------- streaming/http-to-mysql/create-table.sql | 6 - streaming/http-to-mysql/data.txt | 10 -- .../http-to-mysql/img/mysql_table_results.png | Bin 24793 -> 0 bytes 4 files changed, 58 insertions(+), 64 deletions(-) delete mode 100644 streaming/http-to-mysql/create-table.sql delete mode 100644 streaming/http-to-mysql/data.txt delete mode 100644 streaming/http-to-mysql/img/mysql_table_results.png diff --git a/streaming/http-to-mysql/README.adoc b/streaming/http-to-mysql/README.adoc index fb7e3f7..59d7bc7 100644 --- a/streaming/http-to-mysql/README.adoc +++ b/streaming/http-to-mysql/README.adoc @@ -1,27 +1,39 @@ -# HTTP to MySQL Demo +:sectnums: += HTTP to MySQL 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 to MySQL database through `jdbc` sink. 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] and 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. -# 1: Prerequisites for Local SPI +== Using Local SPI + +=== Prerequisites 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] -* Running instance of `redis` -* Running instance of `mysql` -* Create the `names` table (in `mysql`) using `create-table.sql` +* Running instance of link:http://redis.io/[Redis] +* Running instance of link:http://www.mysql.com/[MySQL] +* A database utility tool such as link:http://dbeaver.jkiss.org/[DBeaver] or link:https://www.dbvis.com/[DbVisualizer] +* Create the `test` database with a `names` table (in MySQL) using: ++ +``` +CREATE DATABASE test; +USE test; +CREATE TABLE names +( + name varchar(255) +); +``` -## 1.1: Running the Sample Locally +=== Running the Sample Locally . Launch the locally built `admin` application + ``` -→ cd -→ java -jar spring-cloud-dataflow-admin-local/target/spring-cloud-dataflow-admin-local-1.0.0.BUILD-SNAPSHOT.jar +$ cd +$ java -jar spring-cloud-dataflow-admin-local/target/spring-cloud-dataflow-admin-local-1.0.0.BUILD-SNAPSHOT.jar ``` + @@ -30,8 +42,8 @@ In order to get started, make sure that you have the following components: + ``` -→ cd -→ java -jar spring-cloud-dataflow-shell/target/spring-cloud-dataflow-shell-1.0.0.BUILD-SNAPSHOT.jar +$ cd +$ java -jar spring-cloud-dataflow-shell/target/spring-cloud-dataflow-shell-1.0.0.BUILD-SNAPSHOT.jar ____ ____ _ __ / ___| _ __ _ __(_)_ __ __ _ / ___| | ___ _ _ __| | @@ -55,10 +67,12 @@ dataflow:>version + ``` -dataflow:>stream create --name mysqlstream --definition "http | jdbc --includes='mysql:mysql-connector-java:5.1.37' --spring.datasource.url='jdbc:mysql://:/' --spring.datasource.username= --spring.datasource.password= --tableName=names --columns=name --spring.datasource.driverClassName=com.mysql.jdbc.Driver --initialize=true" --deploy +dataflow:>stream create --name mysqlstream --definition "http --server.port=8787 | jdbc --includes='mysql:mysql-connector-java:5.1.37' --spring.datasource.url='jdbc:mysql://localhost:3306/test' --tableName=names --columns=name --spring.datasource.driverClassName=com.mysql.jdbc.Driver --initialize=false" --deploy Created and deployed new stream 'mysqlstream' ``` +NOTE: If MySQL 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.datasource.url='jdbc:mysql://:/' --spring.datasource.username= --spring.datasource.password=` + + . Verify the stream is successfully deployed + @@ -76,34 +90,26 @@ dataflow:>stream list Logs will be in /var/folders/c3/ctx7_rns6x30tq7rb76wzqwr0000gp/T/spring-cloud-data-flow-284240942697761420/mysqlstream.http ``` -+ -. Lookup the `port` for `mysqlstream-http` application from the logs [i.e: `/var/folders/c3/ctx7_rns6x30tq7rb76wzqwr0000gp/T/spring-cloud-data-flow-284240942697761420/mysqlstream.http`]. -+ - -``` -2015-12-15 16:38:55.557 INFO 19089 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 46073 (http) -2015-12-15 16:38:55.559 INFO 19089 --- [ main] o.s.c.s.m.http.HttpSourceApplication : Started HttpSourceApplication in 4.558 seconds (JVM running for 8.733) -``` -+ - -. Post sample data pointing to the `http` endpoint: `http://localhost:46073/messages` [i.e: **46073** in this case] +. Post sample data pointing to the `http` endpoint: `http://localhost:8787/messages` [`8787` is the `server.port` we specified for the `http` source in this case] + ``` -dataflow:>http post --contentType 'application/json' --target http://localhost:46073/messages --data "{\"name\": \"Foo\"}" -> POST (application/json;charset=UTF-8) http://localhost:46073/messages {"name": "Spring Boot"} +dataflow:>http post --contentType 'application/json' --target http://localhost:8787/messages --data "{\"name\": \"Foo\"}" +> POST (application/json;charset=UTF-8) http://localhost:8787/messages {"name": "Spring Boot"} > 202 ACCEPTED ``` + -. Use a database utility tool such as http://dbeaver.jkiss.org/[DBeaver] to connect to the MySQL instance. Query the table `names` to list all the 10 rows +. Connect to the MySQL instance and query the table `test.names` to list the new rows: + ``` -select * from names; +select * from test.names; ``` + . That's it; you're done! -# 2: Prerequisites for Pivotal Cloud Foundry SPI +== Using Pivotal Cloud Foundry SPI + +=== Prerequisites In order to get started, make sure that you have the following components: @@ -112,18 +118,26 @@ In order to get started, make sure that you have the following components: * 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 `mysql` -* Create the `names` table (in `mysql`) using `create-table.sql` +* A database utility tool such as link:http://dbeaver.jkiss.org/[DBeaver] or link:https://www.dbvis.com/[DbVisualizer] +* Create the `names` table (in MySQL) using: ++ +``` +CREATE TABLE names +( + name varchar(255) +); +``` -## 2.1: Running the Sample in Cloud Foundry +=== Running the Sample in Cloud Foundry . Verify that CF instance is reachable + ``` -→ cf api +$ cf api API endpoint: https://api.system.navy.springapps.io (API version: 2.43.0) -→ cf apps +$ cf apps Getting apps in org sabby-dataflow / space development as sabby... OK @@ -137,7 +151,7 @@ No apps found + ``` -→ cf apps +$ cf apps Getting apps in org sabby-dataflow / space development as sabby... OK @@ -148,12 +162,12 @@ s-c-dataflow-admin started 1/1 1G 1G s-c-dataflow- + . 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`. +. Connect to Spring Cloud Data Flow's `shell` + ``` -→ cd -→ java -jar spring-cloud-dataflow-shell/target/spring-cloud-dataflow-shell-1.0.0.BUILD-SNAPSHOT.jar +$ cd +$ java -jar spring-cloud-dataflow-shell/target/spring-cloud-dataflow-shell-1.0.0.BUILD-SNAPSHOT.jar ____ ____ _ __ / ___| _ __ _ __(_)_ __ __ _ / ___| | ___ _ _ __| | @@ -201,7 +215,7 @@ dataflow:>stream list + ``` -→ cf apps +$ cf apps Getting apps in org sabby-dataflow / space development as sabby... OK @@ -214,27 +228,22 @@ s-c-dataflow-admin started 1/1 1G 1G s-c-da . Lookup the `url` for `mysqlstream-http` application from the list above. Post sample data pointing to the `http` endpoint: `/messages` + ``` -dataflow:>script --file /spring-cloud-dataflow-samples/http-to-mysql/data.txt -http post --contentType 'application/json' --target http://mysqlstream-http.app.navy.springapps.io/messages --data "{\"name\": \"Spring Boot 1\"}" -> POST (application/json;charset=UTF-8) http://mysqlstream-http.app.navy.springapps.io/messages {"name": "Spring Boot 1"} +http post --contentType 'application/json' --target http://mysqlstream-http.app.navy.springapps.io/messages --data "{\"name\": \"Bar"}" +> POST (application/json;charset=UTF-8) http://mysqlstream-http.app.navy.springapps.io/messages {"name": "Bar"} > 202 ACCEPTED -... -... -... ``` + -. Use a database utility tool such as http://dbeaver.jkiss.org/[DBeaver] to connect to the MySQL instance. Query the table `names` to list all the 10 rows +. Connect to the MySQL instance and query the table `test.names` to list the new rows: + ``` select * from names; ``` -image:img/mysql_table_results.png[Table Results] + . Now, let's try to take advantage of Pivotal Cloud Foundry's platform capability. Let's scale the `mysqlstream-http` application from 1 to 3 instances + ``` -→ cf scale mysqlstream-http -i 3 +$ cf scale mysqlstream-http -i 3 Scaling app mysqlstream-http in org sabby-dataflow / space development as sabby... OK ``` @@ -242,7 +251,7 @@ OK . Verify App instances (3/3) running successfully + ``` -→ cf apps +$ cf apps Getting apps in org sabby-dataflow / space development as sabby... OK @@ -254,7 +263,8 @@ s-c-dataflow-admin started 1/1 1G 1G s-c-da + . That's it; you're done! -# 3: Summary +:!sectnums: +== Summary In this sample, you have learned: diff --git a/streaming/http-to-mysql/create-table.sql b/streaming/http-to-mysql/create-table.sql deleted file mode 100644 index f4c9465..0000000 --- a/streaming/http-to-mysql/create-table.sql +++ /dev/null @@ -1,6 +0,0 @@ -DROP TABLE IF EXISTS names; - -CREATE TABLE names -( - name varchar(255) -); \ No newline at end of file diff --git a/streaming/http-to-mysql/data.txt b/streaming/http-to-mysql/data.txt deleted file mode 100644 index 35a276b..0000000 --- a/streaming/http-to-mysql/data.txt +++ /dev/null @@ -1,10 +0,0 @@ -http post --contentType 'application/json' --target http://YOUR-mysqlstream-http-APP-URL/messages --data "{\"name\": \"Spring Boot 1\"}" -http post --contentType 'application/json' --target http://YOUR-mysqlstream-http-APP-URL/messages --data "{\"name\": \"Spring Boot 2\"}" -http post --contentType 'application/json' --target http://YOUR-mysqlstream-http-APP-URL/messages --data "{\"name\": \"Spring Boot 3\"}" -http post --contentType 'application/json' --target http://YOUR-mysqlstream-http-APP-URL/messages --data "{\"name\": \"Spring Boot 4\"}" -http post --contentType 'application/json' --target http://YOUR-mysqlstream-http-APP-URL/messages --data "{\"name\": \"Spring Boot 5\"}" -http post --contentType 'application/json' --target http://YOUR-mysqlstream-http-APP-URL/messages --data "{\"name\": \"Spring Boot 6\"}" -http post --contentType 'application/json' --target http://YOUR-mysqlstream-http-APP-URL/messages --data "{\"name\": \"Spring Boot 7\"}" -http post --contentType 'application/json' --target http://YOUR-mysqlstream-http-APP-URL/messages --data "{\"name\": \"Spring Boot 8\"}" -http post --contentType 'application/json' --target http://YOUR-mysqlstream-http-APP-URL/messages --data "{\"name\": \"Spring Boot 9\"}" -http post --contentType 'application/json' --target http://YOUR-mysqlstream-http-APP-URL/messages --data "{\"name\": \"Spring Boot 10\"}" diff --git a/streaming/http-to-mysql/img/mysql_table_results.png b/streaming/http-to-mysql/img/mysql_table_results.png deleted file mode 100644 index 39ea33876ce5c9bf60eb1f232b672ce9da3b60ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24793 zcmce-Wmq23mL-h4ySux)yK92GI|P^D?hxE9Xz<|f8XSVV2X}{gA-DV9neP6&XMTMA z;CZV~ol{5m+H0>};YtdU@Gv+qKtMq7(o$k7KtRC3fZu~q5P<);eTo@CKrk(qqM}OD zqM}4fj`n7jHl{#8QsGG{kV*-Q7=vebg`q(hP~tKN?QU^;pj1+jxWv%JiAX9+HMCnW zmEg$8bhItgXgWzP7-DF!k$xbz;F@5GE;YGSG-sd$o9&$T`(wPUZXNpLnP)jpcBfen zkU-N=ffI_srod9$;b4ZZdUdG_TsWt0LLgv%;4(l=sUjWb78XqR%l8YgxoP{}Kd~!1 ztDdTe2aRCUfQ0g(D64~hu>~=b{0JPz3ze|kgUyaKe-YwDuWH?h-ca3c) zvB0#c@67d9ltwgV!o-D=ongvxE}%m!m{fE6wi5G(Z&|waa5gD{K`o7h6vB5Cρ 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 s10dcv=<-v<=MwnlhiQ