From 8c65f58b1ce8fea11bc81ea51ef9115d1e55d01c Mon Sep 17 00:00:00 2001 From: mrFlick72 Date: Fri, 3 May 2019 22:02:36 +0200 Subject: [PATCH 01/14] netflix set up --- docker/docker-compose.yml | 7 +++ hello-service/build.gradle | 8 ++- hello-service/profile.gradle | 12 +++++ .../profiles/kubernetes_build.gradle | 4 ++ hello-service/profiles/netflix_build.gradle | 3 ++ .../main/resources/application-netflix.yml | 9 ++++ message-service/build.gradle | 6 +-- message-service/profile.gradle | 12 +++++ .../profiles/kubernetes_build.gradle | 4 ++ message-service/profiles/netflix_build.gradle | 3 ++ .../main/resources/application-netflix.yml | 7 +++ ui/pom.xml | 45 ++++++++++++----- ui/src/main/frontend/package.json | 50 +++++++++++++++++++ ui/src/main/frontend/webpack.config.js | 50 +++++++++++++++++++ ui/src/main/resources/application-netflix.yml | 16 ++++++ 15 files changed, 215 insertions(+), 21 deletions(-) create mode 100644 docker/docker-compose.yml create mode 100644 hello-service/profile.gradle create mode 100644 hello-service/profiles/kubernetes_build.gradle create mode 100644 hello-service/profiles/netflix_build.gradle create mode 100644 hello-service/src/main/resources/application-netflix.yml create mode 100644 message-service/profile.gradle create mode 100644 message-service/profiles/kubernetes_build.gradle create mode 100644 message-service/profiles/netflix_build.gradle create mode 100644 message-service/src/main/resources/application-netflix.yml create mode 100644 ui/src/main/frontend/package.json create mode 100644 ui/src/main/frontend/webpack.config.js create mode 100644 ui/src/main/resources/application-netflix.yml diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000..f7f6659 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,7 @@ +version: "3.0" + +services: + eureka-server: + image: springcloud/eureka + ports: + - 8761:8761 \ No newline at end of file diff --git a/hello-service/build.gradle b/hello-service/build.gradle index e8cec9e..495921f 100644 --- a/hello-service/build.gradle +++ b/hello-service/build.gradle @@ -27,11 +27,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-webflux' implementation 'org.springframework.boot:spring-boot-starter-actuator' - - implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes' - implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-config' - implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-ribbon' - + compile 'org.projectlombok:lombok:1.18.6' testImplementation 'org.springframework.boot:spring-boot-starter-test' @@ -52,3 +48,5 @@ docker { pull true noCache true } + +apply from: rootProject.file('profile.gradle'); \ No newline at end of file diff --git a/hello-service/profile.gradle b/hello-service/profile.gradle new file mode 100644 index 0000000..3854b4c --- /dev/null +++ b/hello-service/profile.gradle @@ -0,0 +1,12 @@ +if (project.hasProperty('kubernetes')) { + println("kubernetes") + dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes' + implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-config' + } +} else if (project.hasProperty('netflix')) { + println("netflix") + dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + } +} \ No newline at end of file diff --git a/hello-service/profiles/kubernetes_build.gradle b/hello-service/profiles/kubernetes_build.gradle new file mode 100644 index 0000000..8986dc6 --- /dev/null +++ b/hello-service/profiles/kubernetes_build.gradle @@ -0,0 +1,4 @@ +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes' + implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-config' +} \ No newline at end of file diff --git a/hello-service/profiles/netflix_build.gradle b/hello-service/profiles/netflix_build.gradle new file mode 100644 index 0000000..f6b40be --- /dev/null +++ b/hello-service/profiles/netflix_build.gradle @@ -0,0 +1,3 @@ +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' +} \ No newline at end of file diff --git a/hello-service/src/main/resources/application-netflix.yml b/hello-service/src/main/resources/application-netflix.yml new file mode 100644 index 0000000..05ddf29 --- /dev/null +++ b/hello-service/src/main/resources/application-netflix.yml @@ -0,0 +1,9 @@ +server: + use-forward-headers: true + port: 7070 + +hello-service-uri: http://message-service/message/random + +management: + server: + port: 7071 \ No newline at end of file diff --git a/message-service/build.gradle b/message-service/build.gradle index ddc1f08..cf2071e 100644 --- a/message-service/build.gradle +++ b/message-service/build.gradle @@ -25,9 +25,6 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-webflux' implementation 'org.springframework.boot:spring-boot-starter-actuator' - implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes' - implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-config' - implementation 'com.fasterxml.jackson.module:jackson-module-kotlin' implementation 'org.jetbrains.kotlin:kotlin-reflect' implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' @@ -36,6 +33,7 @@ dependencies { testImplementation 'io.projectreactor:reactor-test' } + dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" @@ -64,3 +62,5 @@ docker { pull true noCache true } + +apply from: rootProject.file('profile.gradle'); \ No newline at end of file diff --git a/message-service/profile.gradle b/message-service/profile.gradle new file mode 100644 index 0000000..3854b4c --- /dev/null +++ b/message-service/profile.gradle @@ -0,0 +1,12 @@ +if (project.hasProperty('kubernetes')) { + println("kubernetes") + dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes' + implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-config' + } +} else if (project.hasProperty('netflix')) { + println("netflix") + dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + } +} \ No newline at end of file diff --git a/message-service/profiles/kubernetes_build.gradle b/message-service/profiles/kubernetes_build.gradle new file mode 100644 index 0000000..8986dc6 --- /dev/null +++ b/message-service/profiles/kubernetes_build.gradle @@ -0,0 +1,4 @@ +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes' + implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-config' +} \ No newline at end of file diff --git a/message-service/profiles/netflix_build.gradle b/message-service/profiles/netflix_build.gradle new file mode 100644 index 0000000..f6b40be --- /dev/null +++ b/message-service/profiles/netflix_build.gradle @@ -0,0 +1,3 @@ +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' +} \ No newline at end of file diff --git a/message-service/src/main/resources/application-netflix.yml b/message-service/src/main/resources/application-netflix.yml new file mode 100644 index 0000000..8660fad --- /dev/null +++ b/message-service/src/main/resources/application-netflix.yml @@ -0,0 +1,7 @@ +server: + use-forward-headers: true + port: 9090 + +management: + server: + port: 9091 \ No newline at end of file diff --git a/ui/pom.xml b/ui/pom.xml index d7f513c..f37f63e 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -20,20 +20,7 @@ - - org.springframework.cloud - spring-cloud-starter-kubernetes - - - - org.springframework.cloud - spring-cloud-starter-kubernetes-config - - - org.springframework.cloud - spring-cloud-starter-kubernetes-ribbon - org.springframework.cloud @@ -64,6 +51,38 @@ + + + netflix + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + + + + kubernetes + + + org.springframework.cloud + spring-cloud-starter-kubernetes + + + + org.springframework.cloud + spring-cloud-starter-kubernetes-config + + + + org.springframework.cloud + spring-cloud-starter-kubernetes-ribbon + + + + + ui-interface diff --git a/ui/src/main/frontend/package.json b/ui/src/main/frontend/package.json new file mode 100644 index 0000000..2a97803 --- /dev/null +++ b/ui/src/main/frontend/package.json @@ -0,0 +1,50 @@ +{ + "name": "family-budget-ui", + "version": "1.0.0", + "description": "Family Budget UI library", + "babel": { + "presets": [ + "react", + "env" + ] + }, + "scripts": { + "build": "webpack --config webpack.config.js", + "watch": "webpack --watch" + }, + "author": "mrFlick72", + "license": "ISC", + "devDependencies": { + "babel-core": "^6.26.2", + "babel-preset-env": "^1.6.1", + "babel-preset-react": "^6.24.1", + "clean-webpack-plugin": "^0.1.19", + "css-loader": "^0.28.11", + "html-webpack-plugin": "^3.2.0", + "uglifyjs-webpack-plugin": "^2.1.1", + "webpack": "^4.29.0", + "webpack-cli": "^3.2.1" + }, + "dependencies": { + "babel-loader": "^7.1.4", + "build": "^0.1.4", + "d3": "^5.9.2", + "moment": "^2.22.1", + "prop-types": "^15.6.1", + "react": "^16.3.2", + "react-d3": "^0.4.0", + "react-datetime": "^2.14.0", + "react-dom": "^16.3.2", + "react-number-format": "^3.3.3", + "react-redux": "^5.0.7", + "react-router": "^4.2.0", + "react-router-dom": "^4.2.2", + "react-select": "^1.2.1", + "react-select-2": "^2.0.11", + "rxjs": "^6.0.0", + "select2-bootstrap4-theme": "^1.0.0", + "style-loader": "^0.21.0", + "url-search-params-polyfill": "^3.0.0", + "uuid": "^3.3.2" + } +} diff --git a/ui/src/main/frontend/webpack.config.js b/ui/src/main/frontend/webpack.config.js new file mode 100644 index 0000000..089acda --- /dev/null +++ b/ui/src/main/frontend/webpack.config.js @@ -0,0 +1,50 @@ +var path = require('path'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); + +const BUID_DIR = path.resolve(__dirname + "../../../../target/classes/static"); + +module.exports = { + mode: 'production', + entry: { + familyBudget: path.resolve(__dirname, './app/family-budget-site/index.js'), + admin: path.resolve(__dirname, './app/admin-site/index.js') + }, + resolve: { + extensions: [".js", ".jsx"] + }, + plugins: [ + new HtmlWebpackPlugin({ + chunks: ['familyBudget'], + filename: "index.html", + template: path.resolve(__dirname, "../resources/static/index.html") + }), + new HtmlWebpackPlugin({ + chunks: ['admin'], + filename: "admin.html", + template: path.resolve(__dirname, "../resources/static/admin.html") + }) + ], + module: { + rules: [ + { + test: /\.css$/, + use: ['style-loader', 'css-loader'] + }, + { + test: path.join(__dirname, "."), + exclude: path.resolve(__dirname, "node_modules"), + use: { + loader: "babel-loader", + options: { + presets: ["env", "react"] + } + } + + } + ] + }, + output: { + filename: '[name]_bundle.js', + path: BUID_DIR + } +}; \ No newline at end of file diff --git a/ui/src/main/resources/application-netflix.yml b/ui/src/main/resources/application-netflix.yml new file mode 100644 index 0000000..f1ce346 --- /dev/null +++ b/ui/src/main/resources/application-netflix.yml @@ -0,0 +1,16 @@ +spring: + cloud: + gateway: + routes: + - id: hello-service + uri: lb://hello-service/ + predicates: + - Path=/ui/hello-service/** + filters: + - StripPrefix=2 + - id: message-service + uri: lb://message-service/ + predicates: + - Path=/ui/message-service/** + filters: + - StripPrefix=2 \ No newline at end of file From 30530531773426472c3829127db511db79624527 Mon Sep 17 00:00:00 2001 From: mrFlick72 Date: Sat, 4 May 2019 00:51:39 +0200 Subject: [PATCH 02/14] front end in react --- ui/pom.xml | 44 +++++++++++++++++++ .../main/frontend/app/component/Jumbotron.js | 19 ++++++++ .../frontend/app/component/TextInputForm.js | 12 +++++ .../app/message-site/MessageSiteApp.js | 8 ++++ .../main/frontend/app/message-site/index.js | 7 +++ .../app/messages-site/MessageSiteApp.js | 8 ++++ .../main/frontend/app/messages-site/index.js | 7 +++ .../app/repository/MessageRepository.js | 9 ++++ ui/src/main/frontend/app/site/MainSiteApp.js | 32 ++++++++++++++ ui/src/main/frontend/app/site/index.js | 7 +++ ui/src/main/frontend/package.json | 23 +++------- ui/src/main/frontend/webpack.config.js | 12 ++--- ui/src/main/resources/static/index.html | 28 +----------- 13 files changed, 165 insertions(+), 51 deletions(-) create mode 100644 ui/src/main/frontend/app/component/Jumbotron.js create mode 100644 ui/src/main/frontend/app/component/TextInputForm.js create mode 100644 ui/src/main/frontend/app/message-site/MessageSiteApp.js create mode 100644 ui/src/main/frontend/app/message-site/index.js create mode 100644 ui/src/main/frontend/app/messages-site/MessageSiteApp.js create mode 100644 ui/src/main/frontend/app/messages-site/index.js create mode 100644 ui/src/main/frontend/app/repository/MessageRepository.js create mode 100644 ui/src/main/frontend/app/site/MainSiteApp.js create mode 100644 ui/src/main/frontend/app/site/index.js diff --git a/ui/pom.xml b/ui/pom.xml index f37f63e..9c7f56d 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -92,6 +92,50 @@ spring-boot-maven-plugin + + com.github.eirslett + frontend-maven-plugin + 1.6 + + + src/main/frontend + + + + + install node and npm + + install-node-and-npm + + + v9.8.0 + 5.8.0 + + + + + npm install + + npm + + + install + + + + + npm build + + npm + + + run-script build + + + + + + com.spotify docker-maven-plugin diff --git a/ui/src/main/frontend/app/component/Jumbotron.js b/ui/src/main/frontend/app/component/Jumbotron.js new file mode 100644 index 0000000..a7737a1 --- /dev/null +++ b/ui/src/main/frontend/app/component/Jumbotron.js @@ -0,0 +1,19 @@ +import React from "react" +import TextInputForm from "./TextInputForm"; + +export default ({title, submitFn, inputRef, message}) => { + console.log(inputRef.current) + return
+

{title}

+
+ + + +
+ +

{message}

+
+} diff --git a/ui/src/main/frontend/app/component/TextInputForm.js b/ui/src/main/frontend/app/component/TextInputForm.js new file mode 100644 index 0000000..57af835 --- /dev/null +++ b/ui/src/main/frontend/app/component/TextInputForm.js @@ -0,0 +1,12 @@ +import React from "react" + +export default ({value, onChangeHandler, componentId, componentLabel, componentPlaceholder, inputRef}) => { + return
+ + +
+} \ No newline at end of file diff --git a/ui/src/main/frontend/app/message-site/MessageSiteApp.js b/ui/src/main/frontend/app/message-site/MessageSiteApp.js new file mode 100644 index 0000000..aa9908c --- /dev/null +++ b/ui/src/main/frontend/app/message-site/MessageSiteApp.js @@ -0,0 +1,8 @@ +import React from "react" + +export default class MainSiteApp extends React.Component { + + render() { + return
+ } +} \ No newline at end of file diff --git a/ui/src/main/frontend/app/message-site/index.js b/ui/src/main/frontend/app/message-site/index.js new file mode 100644 index 0000000..b7a7b7e --- /dev/null +++ b/ui/src/main/frontend/app/message-site/index.js @@ -0,0 +1,7 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import MessageSiteApp from "./MessageSiteApp"; + +if(document.getElementById('app')){ + ReactDOM.render(, document.getElementById('app')); +} \ No newline at end of file diff --git a/ui/src/main/frontend/app/messages-site/MessageSiteApp.js b/ui/src/main/frontend/app/messages-site/MessageSiteApp.js new file mode 100644 index 0000000..aa9908c --- /dev/null +++ b/ui/src/main/frontend/app/messages-site/MessageSiteApp.js @@ -0,0 +1,8 @@ +import React from "react" + +export default class MainSiteApp extends React.Component { + + render() { + return
+ } +} \ No newline at end of file diff --git a/ui/src/main/frontend/app/messages-site/index.js b/ui/src/main/frontend/app/messages-site/index.js new file mode 100644 index 0000000..b7a7b7e --- /dev/null +++ b/ui/src/main/frontend/app/messages-site/index.js @@ -0,0 +1,7 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import MessageSiteApp from "./MessageSiteApp"; + +if(document.getElementById('app')){ + ReactDOM.render(, document.getElementById('app')); +} \ No newline at end of file diff --git a/ui/src/main/frontend/app/repository/MessageRepository.js b/ui/src/main/frontend/app/repository/MessageRepository.js new file mode 100644 index 0000000..963c200 --- /dev/null +++ b/ui/src/main/frontend/app/repository/MessageRepository.js @@ -0,0 +1,9 @@ +const SAY_HELLO_TO = (name) => `/ui/hello-service/hello/ ${name}` +export default class MessageRepository { + + + sayHelloTo(name) { + return fetch(SAY_HELLO_TO(name)).then(data => data.json()); + } + +} \ No newline at end of file diff --git a/ui/src/main/frontend/app/site/MainSiteApp.js b/ui/src/main/frontend/app/site/MainSiteApp.js new file mode 100644 index 0000000..c9298b1 --- /dev/null +++ b/ui/src/main/frontend/app/site/MainSiteApp.js @@ -0,0 +1,32 @@ +import React from "react" +import Jumbotron from "../component/Jumbotron"; +import MessageRepository from "../repository/MessageRepository"; + +export default class MainSiteApp extends React.Component { + + constructor(props) { + super(props) + + this.state = { + message: "" + } + + this.inputRef = React.createRef() + this.messageRepository = new MessageRepository(); + } + + sayHello() { + console.log(this.inputRef) + console.log(this.inputRef.current) + this.messageRepository + .sayHelloTo(this.inputRef.current) + .then(message => this.setState({message: message})) + } + + render() { + return + } +} \ No newline at end of file diff --git a/ui/src/main/frontend/app/site/index.js b/ui/src/main/frontend/app/site/index.js new file mode 100644 index 0000000..c0b8505 --- /dev/null +++ b/ui/src/main/frontend/app/site/index.js @@ -0,0 +1,7 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import MainSiteApp from "./MainSiteApp"; + +if(document.getElementById('app')){ + ReactDOM.render(, document.getElementById('app')); +} \ No newline at end of file diff --git a/ui/src/main/frontend/package.json b/ui/src/main/frontend/package.json index 2a97803..b927fcd 100644 --- a/ui/src/main/frontend/package.json +++ b/ui/src/main/frontend/package.json @@ -1,7 +1,7 @@ { - "name": "family-budget-ui", + "name": "ui", "version": "1.0.0", - "description": "Family Budget UI library", + "description": "UI of My say hello on kubernetes", "babel": { "presets": [ "react", @@ -23,28 +23,15 @@ "html-webpack-plugin": "^3.2.0", "uglifyjs-webpack-plugin": "^2.1.1", "webpack": "^4.29.0", - "webpack-cli": "^3.2.1" + "webpack-cli": "^3.3.1" }, "dependencies": { + "acorn": "^6.1.1", "babel-loader": "^7.1.4", "build": "^0.1.4", - "d3": "^5.9.2", - "moment": "^2.22.1", "prop-types": "^15.6.1", "react": "^16.3.2", - "react-d3": "^0.4.0", - "react-datetime": "^2.14.0", "react-dom": "^16.3.2", - "react-number-format": "^3.3.3", - "react-redux": "^5.0.7", - "react-router": "^4.2.0", - "react-router-dom": "^4.2.2", - "react-select": "^1.2.1", - "react-select-2": "^2.0.11", - "rxjs": "^6.0.0", - "select2-bootstrap4-theme": "^1.0.0", - "style-loader": "^0.21.0", - "url-search-params-polyfill": "^3.0.0", - "uuid": "^3.3.2" + "style-loader": "^0.21.0" } } diff --git a/ui/src/main/frontend/webpack.config.js b/ui/src/main/frontend/webpack.config.js index 089acda..cd96fd7 100644 --- a/ui/src/main/frontend/webpack.config.js +++ b/ui/src/main/frontend/webpack.config.js @@ -6,22 +6,22 @@ const BUID_DIR = path.resolve(__dirname + "../../../../target/classes/static"); module.exports = { mode: 'production', entry: { - familyBudget: path.resolve(__dirname, './app/family-budget-site/index.js'), - admin: path.resolve(__dirname, './app/admin-site/index.js') + site: path.resolve(__dirname, './app/site/index.js'), + messagesSite: path.resolve(__dirname, './app/messages-site/index.js') }, resolve: { extensions: [".js", ".jsx"] }, plugins: [ new HtmlWebpackPlugin({ - chunks: ['familyBudget'], + chunks: ['site'], filename: "index.html", template: path.resolve(__dirname, "../resources/static/index.html") }), new HtmlWebpackPlugin({ - chunks: ['admin'], - filename: "admin.html", - template: path.resolve(__dirname, "../resources/static/admin.html") + chunks: ['messagesSite'], + filename: "messages.html", + template: path.resolve(__dirname, "../resources/static/messages.html") }) ], module: { diff --git a/ui/src/main/resources/static/index.html b/ui/src/main/resources/static/index.html index 43d9b89..e96b4b2 100644 --- a/ui/src/main/resources/static/index.html +++ b/ui/src/main/resources/static/index.html @@ -10,20 +10,7 @@ - -
-

Hello, world!

-
-
- - -
- -
-
- -

-
+
- \ No newline at end of file From 4c17b25a1094fb90530b96724cdc969b982ba1e2 Mon Sep 17 00:00:00 2001 From: mrFlick72 Date: Sat, 4 May 2019 11:28:07 +0200 Subject: [PATCH 03/14] startup config for netflix configuration --- docker/docker-compose.yml | 8 +++++++- docker/starter.sh | 31 +++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 docker/starter.sh diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index f7f6659..a07aab5 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -4,4 +4,10 @@ services: eureka-server: image: springcloud/eureka ports: - - 8761:8761 \ No newline at end of file + - 8761:8761 + mongo: + image: mongo + ports: + - "27017:27017" + volumes: + - "${MONGO_VOLUME}:/var/lib/mongodb" \ No newline at end of file diff --git a/docker/starter.sh b/docker/starter.sh new file mode 100644 index 0000000..c0159ff --- /dev/null +++ b/docker/starter.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +docker-compose up 2>docker.log & + +cd .. + +PROJECT_HOME=`pwd` + +HELLO_SERVICE_JAR_DIR=$PROJECT_HOME/hello-service/build/libs +MESSAGE_SERVICE_JAR_DIR=$PROJECT_HOME/message-service/build/libs +UI_JAR_DIR=$PROJECT_HOME/ui/target + +echo "The content of PROJECT_HOME is: $PROJECT_HOME" +echo "The content of HELLO_SERVICE_JAR_DIR is: $HELLO_SERVICE_JAR_DIR" +echo "The content of MESSAGE_SERVICE_JAR_DIR is: $MESSAGE_SERVICE_JAR_DIR" +echo "The content of UI_JAR_DIR is: $UI_JAR_DIR" + + +echo "start of hello-service" +cd $HELLO_SERVICE_JAR_DIR +java -jar -Dspring.profiles.active=netflix hello-service.jar >$PROJECT_HOME/hello-service.log & + + +echo "start of message-service" +cd $MESSAGE_SERVICE_JAR_DIR +java -jar -Dspring.profiles.active=netflix message-service.jar >$PROJECT_HOME/message-service.log & + + +echo "start of ui" +cd $UI_JAR_DIR +java -jar -Dspring.profiles.active=netflix ui-interface.jar >$PROJECT_HOME/ui-interface.log & From dbd40f8ab591f875d8b669d69e85fcd765cbe398 Mon Sep 17 00:00:00 2001 From: mrFlick72 Date: Sat, 4 May 2019 12:29:36 +0200 Subject: [PATCH 04/14] front end bug fix --- ui/src/main/frontend/app/component/Jumbotron.js | 2 +- .../frontend/app/message-site/MessageSiteApp.js | 8 -------- ui/src/main/frontend/app/message-site/index.js | 7 ------- .../frontend/app/repository/MessageRepository.js | 4 ++-- ui/src/main/frontend/app/site/MainSiteApp.js | 16 +++++++++------- ui/src/main/frontend/webpack.config.js | 2 +- 6 files changed, 13 insertions(+), 26 deletions(-) delete mode 100644 ui/src/main/frontend/app/message-site/MessageSiteApp.js delete mode 100644 ui/src/main/frontend/app/message-site/index.js diff --git a/ui/src/main/frontend/app/component/Jumbotron.js b/ui/src/main/frontend/app/component/Jumbotron.js index a7737a1..f0bca7c 100644 --- a/ui/src/main/frontend/app/component/Jumbotron.js +++ b/ui/src/main/frontend/app/component/Jumbotron.js @@ -2,7 +2,7 @@ import React from "react" import TextInputForm from "./TextInputForm"; export default ({title, submitFn, inputRef, message}) => { - console.log(inputRef.current) + console.log(inputRef) return

{title}

diff --git a/ui/src/main/frontend/app/message-site/MessageSiteApp.js b/ui/src/main/frontend/app/message-site/MessageSiteApp.js deleted file mode 100644 index aa9908c..0000000 --- a/ui/src/main/frontend/app/message-site/MessageSiteApp.js +++ /dev/null @@ -1,8 +0,0 @@ -import React from "react" - -export default class MainSiteApp extends React.Component { - - render() { - return
- } -} \ No newline at end of file diff --git a/ui/src/main/frontend/app/message-site/index.js b/ui/src/main/frontend/app/message-site/index.js deleted file mode 100644 index b7a7b7e..0000000 --- a/ui/src/main/frontend/app/message-site/index.js +++ /dev/null @@ -1,7 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import MessageSiteApp from "./MessageSiteApp"; - -if(document.getElementById('app')){ - ReactDOM.render(, document.getElementById('app')); -} \ No newline at end of file diff --git a/ui/src/main/frontend/app/repository/MessageRepository.js b/ui/src/main/frontend/app/repository/MessageRepository.js index 963c200..e1ab2da 100644 --- a/ui/src/main/frontend/app/repository/MessageRepository.js +++ b/ui/src/main/frontend/app/repository/MessageRepository.js @@ -1,6 +1,6 @@ -const SAY_HELLO_TO = (name) => `/ui/hello-service/hello/ ${name}` -export default class MessageRepository { +const SAY_HELLO_TO = (name) => `/ui/hello-service/hello/${name}`; +export default class MessageRepository { sayHelloTo(name) { return fetch(SAY_HELLO_TO(name)).then(data => data.json()); diff --git a/ui/src/main/frontend/app/site/MainSiteApp.js b/ui/src/main/frontend/app/site/MainSiteApp.js index c9298b1..d8c5b3f 100644 --- a/ui/src/main/frontend/app/site/MainSiteApp.js +++ b/ui/src/main/frontend/app/site/MainSiteApp.js @@ -8,25 +8,27 @@ export default class MainSiteApp extends React.Component { super(props) this.state = { - message: "" - } + message: "initial message" + }; - this.inputRef = React.createRef() + this.inputRef = React.createRef(); this.messageRepository = new MessageRepository(); + this.sayHello = this.sayHello.bind(this); } sayHello() { - console.log(this.inputRef) - console.log(this.inputRef.current) + console.log("this.inputRef") + console.log("this.inputRef " + this.inputRef.current.value) this.messageRepository - .sayHelloTo(this.inputRef.current) + .sayHelloTo(this.inputRef.current.value) .then(message => this.setState({message: message})) } render() { + console.log(this.inputRef) return + submitFn={this.sayHello}/> } } \ No newline at end of file diff --git a/ui/src/main/frontend/webpack.config.js b/ui/src/main/frontend/webpack.config.js index cd96fd7..5e80a51 100644 --- a/ui/src/main/frontend/webpack.config.js +++ b/ui/src/main/frontend/webpack.config.js @@ -4,7 +4,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin'); const BUID_DIR = path.resolve(__dirname + "../../../../target/classes/static"); module.exports = { - mode: 'production', + // mode: 'production', entry: { site: path.resolve(__dirname, './app/site/index.js'), messagesSite: path.resolve(__dirname, './app/messages-site/index.js') From e710e27b0e45728edebd398b310388b395378041 Mon Sep 17 00:00:00 2001 From: mrFlick72 Date: Sat, 4 May 2019 19:57:09 +0200 Subject: [PATCH 05/14] front end bug fix --- ui/src/main/frontend/app/component/TextInputForm.js | 1 - ui/src/main/frontend/app/repository/MessageRepository.js | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/src/main/frontend/app/component/TextInputForm.js b/ui/src/main/frontend/app/component/TextInputForm.js index 57af835..9edb9bd 100644 --- a/ui/src/main/frontend/app/component/TextInputForm.js +++ b/ui/src/main/frontend/app/component/TextInputForm.js @@ -6,7 +6,6 @@ export default ({value, onChangeHandler, componentId, componentLabel, componentP
} \ No newline at end of file diff --git a/ui/src/main/frontend/app/repository/MessageRepository.js b/ui/src/main/frontend/app/repository/MessageRepository.js index e1ab2da..a3c893f 100644 --- a/ui/src/main/frontend/app/repository/MessageRepository.js +++ b/ui/src/main/frontend/app/repository/MessageRepository.js @@ -3,7 +3,8 @@ const SAY_HELLO_TO = (name) => `/ui/hello-service/hello/${name}`; export default class MessageRepository { sayHelloTo(name) { - return fetch(SAY_HELLO_TO(name)).then(data => data.json()); + return fetch(SAY_HELLO_TO(name)) + .then(data => data.text()); } } \ No newline at end of file From 93ee558894562f04cb8ba6ed11966b5841394bc7 Mon Sep 17 00:00:00 2001 From: mrFlick72 Date: Sat, 4 May 2019 20:55:17 +0200 Subject: [PATCH 06/14] Jumbotron component refactoring --- docker/starter.sh | 6 ++-- .../main/frontend/app/component/Jumbotron.js | 17 +++++------ .../app/messages-site/MessageSiteApp.js | 30 +++++++++++++++++-- ui/src/main/frontend/app/site/MainSiteApp.js | 20 +++++++++---- 4 files changed, 52 insertions(+), 21 deletions(-) diff --git a/docker/starter.sh b/docker/starter.sh index c0159ff..73d5207 100644 --- a/docker/starter.sh +++ b/docker/starter.sh @@ -26,6 +26,6 @@ cd $MESSAGE_SERVICE_JAR_DIR java -jar -Dspring.profiles.active=netflix message-service.jar >$PROJECT_HOME/message-service.log & -echo "start of ui" -cd $UI_JAR_DIR -java -jar -Dspring.profiles.active=netflix ui-interface.jar >$PROJECT_HOME/ui-interface.log & +#echo "start of ui" +#cd $UI_JAR_DIR +#java -jar -Dspring.profiles.active=netflix ui-interface.jar >$PROJECT_HOME/ui-interface.log & diff --git a/ui/src/main/frontend/app/component/Jumbotron.js b/ui/src/main/frontend/app/component/Jumbotron.js index f0bca7c..8b74cf2 100644 --- a/ui/src/main/frontend/app/component/Jumbotron.js +++ b/ui/src/main/frontend/app/component/Jumbotron.js @@ -1,19 +1,16 @@ import React from "react" import TextInputForm from "./TextInputForm"; -export default ({title, submitFn, inputRef, message}) => { - console.log(inputRef) +export default ({title, leadSection, bottomSection}) => { return

{title}

- - - - + +
+ {leadSection} +
+
-

{message}

+ {bottomSection}
} diff --git a/ui/src/main/frontend/app/messages-site/MessageSiteApp.js b/ui/src/main/frontend/app/messages-site/MessageSiteApp.js index aa9908c..e2b884c 100644 --- a/ui/src/main/frontend/app/messages-site/MessageSiteApp.js +++ b/ui/src/main/frontend/app/messages-site/MessageSiteApp.js @@ -1,8 +1,34 @@ import React from "react" +import Jumbotron from "../component/Jumbotron"; +import MessageRepository from "../repository/MessageRepository"; -export default class MainSiteApp extends React.Component { +export default class MessageSiteApp extends React.Component { + + constructor(props) { + super(props) + + this.state = { + message: "initial message" + }; + + this.inputRef = React.createRef(); + this.messageRepository = new MessageRepository(); + this.sayHello = this.sayHello.bind(this); + } + + sayHello() { + console.log("this.inputRef") + console.log("this.inputRef " + this.inputRef.current.value) + this.messageRepository + .sayHelloTo(this.inputRef.current.value) + .then(message => this.setState({message: message})) + } render() { - return
+ console.log(this.inputRef) + return } } \ No newline at end of file diff --git a/ui/src/main/frontend/app/site/MainSiteApp.js b/ui/src/main/frontend/app/site/MainSiteApp.js index d8c5b3f..ed56cc7 100644 --- a/ui/src/main/frontend/app/site/MainSiteApp.js +++ b/ui/src/main/frontend/app/site/MainSiteApp.js @@ -1,6 +1,7 @@ import React from "react" import Jumbotron from "../component/Jumbotron"; import MessageRepository from "../repository/MessageRepository"; +import TextInputForm from "../component/TextInputForm"; export default class MainSiteApp extends React.Component { @@ -8,7 +9,7 @@ export default class MainSiteApp extends React.Component { super(props) this.state = { - message: "initial message" + message: "No message right now" }; this.inputRef = React.createRef(); @@ -17,18 +18,25 @@ export default class MainSiteApp extends React.Component { } sayHello() { - console.log("this.inputRef") - console.log("this.inputRef " + this.inputRef.current.value) this.messageRepository .sayHelloTo(this.inputRef.current.value) .then(message => this.setState({message: message})) } render() { - console.log(this.inputRef) + let leadSection =
+ + + + let bottomSection =

{this.state.message}

+ return + leadSection={leadSection} + bottomSection={bottomSection} + message={this.state.message}/> } } \ No newline at end of file From 45fa5a994be521e9bc1f52e011b59677bbb24e04 Mon Sep 17 00:00:00 2001 From: mrFlick72 Date: Sat, 4 May 2019 23:46:38 +0200 Subject: [PATCH 07/14] messages page --- .../main/frontend/app/component/Jumbotron.js | 1 - .../app/messages-site/MessageSiteApp.js | 47 ++++++++++++++----- .../app/repository/MessageRepository.js | 22 +++++++++ ui/src/main/resources/static/messages.html | 4 ++ 4 files changed, 62 insertions(+), 12 deletions(-) diff --git a/ui/src/main/frontend/app/component/Jumbotron.js b/ui/src/main/frontend/app/component/Jumbotron.js index 8b74cf2..23e8ad5 100644 --- a/ui/src/main/frontend/app/component/Jumbotron.js +++ b/ui/src/main/frontend/app/component/Jumbotron.js @@ -1,5 +1,4 @@ import React from "react" -import TextInputForm from "./TextInputForm"; export default ({title, leadSection, bottomSection}) => { return
diff --git a/ui/src/main/frontend/app/messages-site/MessageSiteApp.js b/ui/src/main/frontend/app/messages-site/MessageSiteApp.js index e2b884c..4ec0209 100644 --- a/ui/src/main/frontend/app/messages-site/MessageSiteApp.js +++ b/ui/src/main/frontend/app/messages-site/MessageSiteApp.js @@ -1,6 +1,7 @@ import React from "react" import Jumbotron from "../component/Jumbotron"; import MessageRepository from "../repository/MessageRepository"; +import TextInputForm from "../component/TextInputForm"; export default class MessageSiteApp extends React.Component { @@ -8,27 +9,51 @@ export default class MessageSiteApp extends React.Component { super(props) this.state = { - message: "initial message" + messages: [] }; this.inputRef = React.createRef(); this.messageRepository = new MessageRepository(); - this.sayHello = this.sayHello.bind(this); + this.saveMessage = this.saveMessage.bind(this); + this.displayMessages = this.displayMessages.bind(this); } - sayHello() { - console.log("this.inputRef") - console.log("this.inputRef " + this.inputRef.current.value) + saveMessage() { this.messageRepository - .sayHelloTo(this.inputRef.current.value) - .then(message => this.setState({message: message})) + .saveMessage({message: this.inputRef.current.value}) + .then(response => this.displayMessages()) + } + + componentDidMount() { + this.displayMessages(); + } + + displayMessages() { + this.messageRepository.findMessages() + .then(data => { + console.log(data) + this.setState({messages: data}) + }) } render() { - console.log(this.inputRef) - return + + + + + let bottomSection = +
    + {this.state.messages.map(message => { + return
  • {message.message}
  • + })} +
+ return + leadSection={leadSection} + bottomSection={bottomSection}/> } } \ No newline at end of file diff --git a/ui/src/main/frontend/app/repository/MessageRepository.js b/ui/src/main/frontend/app/repository/MessageRepository.js index a3c893f..3895642 100644 --- a/ui/src/main/frontend/app/repository/MessageRepository.js +++ b/ui/src/main/frontend/app/repository/MessageRepository.js @@ -1,4 +1,5 @@ const SAY_HELLO_TO = (name) => `/ui/hello-service/hello/${name}`; +const SAVE_A_NEW_MESSAGE = "/ui/message-service/message"; export default class MessageRepository { @@ -7,4 +8,25 @@ export default class MessageRepository { .then(data => data.text()); } + saveMessage(message) { + return fetch(SAVE_A_NEW_MESSAGE, { + method: "POST", + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(message), + credentials: 'same-origin' + }) + } + + findMessages() { + return fetch(SAVE_A_NEW_MESSAGE, { + method: "GET", + headers: { + 'Accept': 'application/json' + }, + credentials: 'same-origin' + }).then(response => response.json()) + } + } \ No newline at end of file diff --git a/ui/src/main/resources/static/messages.html b/ui/src/main/resources/static/messages.html index 189a12f..da1b673 100644 --- a/ui/src/main/resources/static/messages.html +++ b/ui/src/main/resources/static/messages.html @@ -10,6 +10,9 @@ +
+ - \ No newline at end of file From 9cc943ce4e10e5d077d5bd60d47a6ac17e13a326 Mon Sep 17 00:00:00 2001 From: mrFlick72 Date: Sun, 5 May 2019 13:55:35 +0200 Subject: [PATCH 09/14] delete messages --- .../valeriovaudi/messageservice/MessageServiceApplication.kt | 3 +-- ui/src/main/frontend/webpack.config.js | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/message-service/src/main/kotlin/it/valeriovaudi/messageservice/MessageServiceApplication.kt b/message-service/src/main/kotlin/it/valeriovaudi/messageservice/MessageServiceApplication.kt index 0e33997..8bed833 100644 --- a/message-service/src/main/kotlin/it/valeriovaudi/messageservice/MessageServiceApplication.kt +++ b/message-service/src/main/kotlin/it/valeriovaudi/messageservice/MessageServiceApplication.kt @@ -71,8 +71,7 @@ class MessageRoute(private val messageRepository: MessageRepository) { DELETE("/message/{messageId}") { val messageId = it.pathVariable("messageId") - it.bodyToMono(Message::class.java) - .flatMap { messageRepository.deleteById(messageId) } + messageRepository.deleteById(messageId) .flatMap { noContent().build() } } } diff --git a/ui/src/main/frontend/webpack.config.js b/ui/src/main/frontend/webpack.config.js index 5e80a51..fb82e7b 100644 --- a/ui/src/main/frontend/webpack.config.js +++ b/ui/src/main/frontend/webpack.config.js @@ -44,7 +44,7 @@ module.exports = { ] }, output: { - filename: '[name]_bundle.js', + filename: '[name]_[hash]_bundle.js', path: BUID_DIR } }; \ No newline at end of file From c2b5bcbc23e08f43b86a832401e0856f85f2129e Mon Sep 17 00:00:00 2001 From: mrFlick72 Date: Sun, 5 May 2019 14:02:33 +0200 Subject: [PATCH 10/14] awesome icon! --- ui/src/main/frontend/app/messages-site/MessageSiteApp.js | 6 ++++-- ui/src/main/resources/static/messages.html | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ui/src/main/frontend/app/messages-site/MessageSiteApp.js b/ui/src/main/frontend/app/messages-site/MessageSiteApp.js index 8fe8f9c..e32b076 100644 --- a/ui/src/main/frontend/app/messages-site/MessageSiteApp.js +++ b/ui/src/main/frontend/app/messages-site/MessageSiteApp.js @@ -58,8 +58,10 @@ export default class MessageSiteApp extends React.Component { return
  • {message.message} - 14 + + Delete +
  • })} diff --git a/ui/src/main/resources/static/messages.html b/ui/src/main/resources/static/messages.html index e96b4b2..c3342d3 100644 --- a/ui/src/main/resources/static/messages.html +++ b/ui/src/main/resources/static/messages.html @@ -22,6 +22,7 @@ + \ No newline at end of file From 3e0db964367e707a41672e595731065001fa7184 Mon Sep 17 00:00:00 2001 From: mrFlick72 Date: Sun, 5 May 2019 14:48:47 +0200 Subject: [PATCH 11/14] kube config refactoring --- docker/kubernetes/ui-interface.yml | 7 ++ docker/mongo.yml | 32 ------- .../src/main/kubernetes/hello-service-k8s.yml | 85 ----------------- .../main/kubernetes/message-service-k8s.yml | 87 ----------------- ui/src/main/kubernetes/ui-interface-k8s.yml | 95 ------------------- 5 files changed, 7 insertions(+), 299 deletions(-) delete mode 100644 docker/mongo.yml delete mode 100644 hello-service/src/main/kubernetes/hello-service-k8s.yml delete mode 100644 message-service/src/main/kubernetes/message-service-k8s.yml delete mode 100644 ui/src/main/kubernetes/ui-interface-k8s.yml diff --git a/docker/kubernetes/ui-interface.yml b/docker/kubernetes/ui-interface.yml index 23dbd88..379d349 100644 --- a/docker/kubernetes/ui-interface.yml +++ b/docker/kubernetes/ui-interface.yml @@ -4,6 +4,13 @@ metadata: name: ui-interface data: application.yaml: |- + ribbon: + eureka: + enabled: false + client: + enabled: true + ServerListRefreshInterval: 50 + spring: cloud: gateway: diff --git a/docker/mongo.yml b/docker/mongo.yml deleted file mode 100644 index 9ea08ff..0000000 --- a/docker/mongo.yml +++ /dev/null @@ -1,32 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: mongo -spec: - replicas: 1 - selector: - matchLabels: - app: mongo - template: - metadata: - labels: - app: mongo - spec: - containers: - - name: mongo - image: mongo - imagePullPolicy: "IfNotPresent" - ports: - - containerPort: 27017 - ---- - -kind: Service -apiVersion: v1 -metadata: - name: mongo-svc -spec: - selector: - app: mongo - ports: - - port: 27017 \ No newline at end of file diff --git a/hello-service/src/main/kubernetes/hello-service-k8s.yml b/hello-service/src/main/kubernetes/hello-service-k8s.yml deleted file mode 100644 index 6ac9b75..0000000 --- a/hello-service/src/main/kubernetes/hello-service-k8s.yml +++ /dev/null @@ -1,85 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: hello-service-config - labels: - app: hello-service -data: - hello-service-uri: "http://message-service/message/random" - ---- - -apiVersion: apps/v1 -kind: Deployment -metadata: - name: hello-service-deployment - labels: - app: hello-service -spec: - replicas: 3 - strategy: - type: RollingUpdate - rollingUpdate: - maxSurge: 1 - maxUnavailable: 25% - selector: - matchLabels: - app: hello-service - template: - metadata: - labels: - app: hello-service - spec: - containers: - - name: hello-service - image: mrflick72/hello-service:latest - ports: - - containerPort: 8080 - - livenessProbe: - httpGet: - path: /actuator/health - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 5 - successThreshold: 1 - - readinessProbe: - httpGet: - path: /actuator/health - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 5 - successThreshold: 1 - envFrom: - - configMapRef: - name: hello-service-config - ---- - -kind: Service -apiVersion: v1 -metadata: - name: hello-service-svc -spec: - selector: - app: hello-service - ports: - - protocol: TCP - port: 8080 ---- - -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: hello-service-ingress - annotations: - nginx.ingress.kubernetes.io/rewrite-target: /$1 -spec: - rules: - - http: - paths: - - path: /hello-service/?(.*) - backend: - serviceName: hello-service-svc - servicePort: 8080 \ No newline at end of file diff --git a/message-service/src/main/kubernetes/message-service-k8s.yml b/message-service/src/main/kubernetes/message-service-k8s.yml deleted file mode 100644 index 548b43e..0000000 --- a/message-service/src/main/kubernetes/message-service-k8s.yml +++ /dev/null @@ -1,87 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: message-service-config - labels: - app: message-service -data: - SPRING_DATA_MONGODB_HOST: "mongo-svc" - SERVER_USEFORWARDHEADERS: "true" - ---- - -apiVersion: apps/v1 -kind: Deployment -metadata: - name: message-service-deployment - labels: - app: message-service -spec: - replicas: 3 - strategy: - type: RollingUpdate - rollingUpdate: - maxSurge: 1 - maxUnavailable: 25% - selector: - matchLabels: - app: message-service - template: - metadata: - labels: - app: message-service - spec: - containers: - - name: message-service - image: mrflick72/message-service:latest - ports: - - containerPort: 8080 - - livenessProbe: - httpGet: - path: /actuator/health - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 5 - successThreshold: 1 - - readinessProbe: - httpGet: - path: /actuator/health - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 5 - successThreshold: 1 - envFrom: - - configMapRef: - name: message-service-config ---- - -kind: Service -apiVersion: v1 -metadata: - name: message-service -spec: - selector: - app: message-service - ports: - - protocol: TCP - port: 8080 - targetPort: 8080 ---- - -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: message-service-ingress - annotations: - nginx.ingress.kubernetes.io/rewrite-target: /$1 -spec: - rules: - - host: message-service.com - http: - paths: - - path: /message-service/?(.*) - backend: - serviceName: message-service - servicePort: 8080 diff --git a/ui/src/main/kubernetes/ui-interface-k8s.yml b/ui/src/main/kubernetes/ui-interface-k8s.yml deleted file mode 100644 index 9f4899d..0000000 --- a/ui/src/main/kubernetes/ui-interface-k8s.yml +++ /dev/null @@ -1,95 +0,0 @@ -kind: ConfigMap -apiVersion: v1 -metadata: - name: ui-interface -data: - application.yaml: |- - ribbon: - eureka: - enabled: false - client: - enabled: true - ServerListRefreshInterval: 50 - - spring: - cloud: - gateway: - routes: - - id: hello-service - uri: lb://hello-service-svc/ - predicates: - - Path=/hello-service/** - filters: - - StripPrefix=1 - ---- - -apiVersion: apps/v1 -kind: Deployment -metadata: - name: ui-interface-deployment - labels: - app: ui-interface -spec: - replicas: 3 - strategy: - type: RollingUpdate - rollingUpdate: - maxSurge: 1 - maxUnavailable: 25% - selector: - matchLabels: - app: ui-interface - template: - metadata: - labels: - app: ui-interface - spec: - containers: - - name: ui-interface - image: mrflick72/ui-interface:latest - ports: - - containerPort: 8080 - livenessProbe: - httpGet: - path: /actuator/health - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 5 - successThreshold: 1 - - readinessProbe: - httpGet: - path: /actuator/health - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 5 - successThreshold: 1 ---- - -kind: Service -apiVersion: v1 -metadata: - name: ui-interface -spec: - selector: - app: ui-interface - ports: - - protocol: TCP - port: 808 ---- - -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: ui-interface-ingress - annotations: - nginx.ingress.kubernetes.io/rewrite-target: /$1 -spec: - rules: - - http: - paths: - - path: /ui/?(.*) - backend: - serviceName: ui-interface - servicePort: 8080 From 859d724160d889b4c02fdb345e63da3af8d8ce0a Mon Sep 17 00:00:00 2001 From: mrFlick72 Date: Sun, 5 May 2019 15:41:03 +0200 Subject: [PATCH 12/14] spring security and session --- docker/docker-compose.yml | 9 +++- ui/pom.xml | 19 +++++++++ .../it/valeriovaudi/ui/UiApplication.java | 41 +++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index a07aab5..7cf77fe 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -2,10 +2,17 @@ version: "3.0" services: eureka-server: + container_name: eureka image: springcloud/eureka ports: - - 8761:8761 + - "8761:8761" + redis: + container_name: redis + image: redis + ports: + - "6379:6379" mongo: + container_name: mongo image: mongo ports: - "27017:27017" diff --git a/ui/pom.xml b/ui/pom.xml index 9c7f56d..8d2a625 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -21,6 +21,20 @@ + + org.springframework.session + spring-session-core + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.session + spring-session-data-redis + org.springframework.cloud @@ -32,6 +46,11 @@ spring-boot-starter-actuator + + org.springframework.boot + spring-boot-starter-security + + org.springframework.boot spring-boot-starter-test diff --git a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java index 6a986b0..4c6c28d 100644 --- a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java +++ b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java @@ -3,6 +3,15 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.server.SecurityWebFilterChain; + +import static java.util.Arrays.asList; @EnableDiscoveryClient @SpringBootApplication @@ -12,4 +21,36 @@ public static void main(String[] args) { SpringApplication.run(UiApplication.class, args); } +} + +@EnableWebFluxSecurity +class SecurityConfig { + + @Bean + public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { + return http.authorizeExchange() + .pathMatchers("/index.html").hasRole("USER") + .pathMatchers("/messages.html").hasRole("ADMIN") + .anyExchange().permitAll() + .and().formLogin() + .and().logout() + .and().build(); + } + + @Bean + public MapReactiveUserDetailsService userDetailsService() { + UserDetails user = User.withDefaultPasswordEncoder() + .username("user") + .password("secret") + .roles("USER") + .build(); + + UserDetails admin = User.withDefaultPasswordEncoder() + .username("admin") + .password("secret") + .roles("USER") + .build(); + + return new MapReactiveUserDetailsService(asList(admin, user)); + } } \ No newline at end of file From b01a4484048a70155dc91b28041a8e22fc08b28b Mon Sep 17 00:00:00 2001 From: mrFlick72 Date: Sun, 5 May 2019 15:51:02 +0200 Subject: [PATCH 13/14] spring security and session --- ui/src/main/java/it/valeriovaudi/ui/UiApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java index 4c6c28d..2b19cff 100644 --- a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java +++ b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java @@ -48,7 +48,7 @@ public MapReactiveUserDetailsService userDetailsService() { UserDetails admin = User.withDefaultPasswordEncoder() .username("admin") .password("secret") - .roles("USER") + .roles("ADMIN") .build(); return new MapReactiveUserDetailsService(asList(admin, user)); From 3804a3a272d3d6a6b7c844d25e3ba5048554d28a Mon Sep 17 00:00:00 2001 From: mrFlick72 Date: Sun, 5 May 2019 18:17:40 +0200 Subject: [PATCH 14/14] spring security and session --- ui/src/main/java/it/valeriovaudi/ui/UiApplication.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java index 2b19cff..a634eed 100644 --- a/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java +++ b/ui/src/main/java/it/valeriovaudi/ui/UiApplication.java @@ -4,12 +4,15 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.annotation.Bean; +import org.springframework.security.authorization.AuthorizationDecision; +import org.springframework.security.authorization.ReactiveAuthorizationManager; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.web.server.SecurityWebFilterChain; +import reactor.core.publisher.Mono; import static java.util.Arrays.asList; @@ -28,7 +31,7 @@ class SecurityConfig { @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { - return http.authorizeExchange() + return http.csrf().disable().authorizeExchange() .pathMatchers("/index.html").hasRole("USER") .pathMatchers("/messages.html").hasRole("ADMIN") .anyExchange().permitAll()