diff --git a/pay-app-spring-microservices/README.md b/pay-app-spring-microservices/README.md index bc7c0ba..c326cc1 100644 --- a/pay-app-spring-microservices/README.md +++ b/pay-app-spring-microservices/README.md @@ -1,25 +1,25 @@ -# Microservicios con Spring Boot - -![Architecture](./resources/microservicesarchitecture.png) - -## Información de los microservicios -El microservicio de invoices, debe listar las facturas de clientes y además debe consumir una cola para cambiar el estado de la factura cuando esta se paga a través del microservicio de pago. -El microservicio de pago debe registrar el pago en su respectiva bd y además debe dejar un mensaje en una cola para actualizar la factura en el microservicio de facturas y además debe dejar un mensaje en una cola para registrar el movimiento en el microservicio de transacciones. -El microservicio de transacciones debe listar las transacciones de una factura, además debe consumir una cola para obtener las transacciones de pago del microservicio de pago. -Todos los microservicios deben consumir la cadena de conexión desde el servicio de configuración centralizada. - -La información de los endpoints disponibles por microservicio se incluyen en el documento de INFO.md -## Scripts de creación de bases de datos - -La informacion de como crear las bases de datos y sus respectivas tablas se incluyen en google.com - -## Tecnologías utilizadas - -- Spring Boot (Java Framework JDK v11+) -- Gradle (Gestor de dependencias) -- Postman (Test de endpoints/servicios rest) -- Postgresql (Base de Datos) -- MySQL (Base de Datos) -- MongoDB (Base de Datos NoSQL) -- Kafka (Gestor de Mensajería) -- Github (Repositorio para proyecto y Configuraciones de micorservicios) +# Microservicios con Spring Boot + +![Architecture](./resources/microservicesarchitecture.png) + +## Información de los microservicios +El microservicio de invoices, debe listar las facturas de clientes y además debe consumir una cola para cambiar el estado de la factura cuando esta se paga a través del microservicio de pago. +El microservicio de pago debe registrar el pago en su respectiva bd y además debe dejar un mensaje en una cola para actualizar la factura en el microservicio de facturas y además debe dejar un mensaje en una cola para registrar el movimiento en el microservicio de transacciones. +El microservicio de transacciones debe listar las transacciones de una factura, además debe consumir una cola para obtener las transacciones de pago del microservicio de pago. +Todos los microservicios deben consumir la cadena de conexión desde el servicio de configuración centralizada. + +La información de los endpoints disponibles por microservicio se incluyen en el documento de INFO.md +## Scripts de creación de bases de datos + +La informacion de como crear las bases de datos y sus respectivas tablas se incluyen en google.com + +## Tecnologías utilizadas + +- Spring Boot (Java Framework JDK v11+) +- Gradle (Gestor de dependencias) +- Postman (Test de endpoints/servicios rest) +- Postgresql (Base de Datos) +- MySQL (Base de Datos) +- MongoDB (Base de Datos NoSQL) +- Kafka (Gestor de Mensajería) +- Github (Repositorio para proyecto y Configuraciones de micorservicios) diff --git a/pay-app-spring-microservices/app-config/.gitignore b/pay-app-spring-microservices/app-config/.gitignore index c2065bc..132b469 100644 --- a/pay-app-spring-microservices/app-config/.gitignore +++ b/pay-app-spring-microservices/app-config/.gitignore @@ -1,37 +1,37 @@ -HELP.md -.gradle -build/ -!gradle/wrapper/gradle-wrapper.jar -!**/src/main/**/build/ -!**/src/test/**/build/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache -bin/ -!**/src/main/**/bin/ -!**/src/test/**/bin/ - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr -out/ -!**/src/main/**/out/ -!**/src/test/**/out/ - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ - -### VS Code ### -.vscode/ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/pay-app-spring-microservices/app-config/Dockerfile b/pay-app-spring-microservices/app-config/Dockerfile index 03735c2..7eb6816 100644 --- a/pay-app-spring-microservices/app-config/Dockerfile +++ b/pay-app-spring-microservices/app-config/Dockerfile @@ -1,13 +1,13 @@ -FROM openjdk:13-alpine as stage1 -COPY . /app -WORKDIR /app -RUN chmod 777 gradlew -RUN ./gradlew clean -RUN ./gradlew bootJar - - -FROM openjdk:13-alpine -EXPOSE 8010 -COPY --from=stage1 /app/build/libs/app-config-1.0.0.jar app-config.jar -#ADD ./build/libs/app-config-1.0.0.jar app-config.jar +FROM openjdk:13-alpine as stage1 +COPY . /app +WORKDIR /app +RUN chmod 777 gradlew +RUN ./gradlew clean +RUN ./gradlew bootJar + + +FROM openjdk:13-alpine +EXPOSE 8010 +COPY --from=stage1 /app/build/libs/app-config-1.0.0.jar app-config.jar +#ADD ./build/libs/app-config-1.0.0.jar app-config.jar ENTRYPOINT ["java", "-jar", "/app-config.jar"] \ No newline at end of file diff --git a/pay-app-spring-microservices/app-config/build.gradle b/pay-app-spring-microservices/app-config/build.gradle index f85f0d6..8169244 100644 --- a/pay-app-spring-microservices/app-config/build.gradle +++ b/pay-app-spring-microservices/app-config/build.gradle @@ -1,36 +1,36 @@ -plugins { - id 'org.springframework.boot' version '2.3.10.RELEASE' - id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'java' -} - -group = 'com.aforo' -version = '1.0.0' -sourceCompatibility = '11' - -repositories { - mavenCentral() -} - -ext { - set('springCloudVersion', "Hoxton.SR11") -} - -dependencies { - implementation 'org.springframework.cloud:spring-cloud-config-server' - implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery' - - testImplementation('org.springframework.boot:spring-boot-starter-test') { - exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' - } -} - -dependencyManagement { - imports { - mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" - } -} - -test { - useJUnitPlatform() -} +plugins { + id 'org.springframework.boot' version '2.3.10.RELEASE' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id 'java' +} + +group = 'com.aforo' +version = '1.0.0' +sourceCompatibility = '11' + +repositories { + mavenCentral() +} + +ext { + set('springCloudVersion', "Hoxton.SR11") +} + +dependencies { + implementation 'org.springframework.cloud:spring-cloud-config-server' + implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery' + + testImplementation('org.springframework.boot:spring-boot-starter-test') { + exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' + } +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} + +test { + useJUnitPlatform() +} diff --git a/pay-app-spring-microservices/app-config/gradle/wrapper/gradle-wrapper.properties b/pay-app-spring-microservices/app-config/gradle/wrapper/gradle-wrapper.properties index 549d844..aa991fc 100644 --- a/pay-app-spring-microservices/app-config/gradle/wrapper/gradle-wrapper.properties +++ b/pay-app-spring-microservices/app-config/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/pay-app-spring-microservices/app-config/gradlew b/pay-app-spring-microservices/app-config/gradlew old mode 100644 new mode 100755 index 8f89047..4f906e0 --- a/pay-app-spring-microservices/app-config/gradlew +++ b/pay-app-spring-microservices/app-config/gradlew @@ -26,22 +26,22 @@ # Resolve links: $0 may be a link PRG="$0" # Need this for relative symlinks. -while [ -h "$PRG" ]; do - ls=$(ls -ld "$PRG") - link=$(expr "$ls" : '.*-> \(.*\)$') - if expr "$link" : '/.*' >/dev/null; then - PRG="$link" - else - PRG=$(dirname "$PRG")"/$link" - fi +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi done -SAVED="$(pwd)" -cd "$(dirname \"$PRG\")/" >/dev/null -APP_HOME="$(pwd -P)" +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" cd "$SAVED" >/dev/null APP_NAME="Gradle" -APP_BASE_NAME=$(basename "$0") +APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -49,15 +49,15 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn() { - echo "$*" +warn () { + echo "$*" } -die() { - echo - echo "$*" - echo - exit 1 +die () { + echo + echo "$*" + echo + exit 1 } # OS specific support (must be 'true' or 'false'). @@ -65,118 +65,119 @@ cygwin=false msys=false darwin=false nonstop=false -case "$(uname)" in -CYGWIN*) - cygwin=true - ;; -Darwin*) - darwin=true - ;; -MINGW*) - msys=true - ;; -NONSTOP*) - nonstop=true - ;; +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ]; then - if [ -x "$JAVA_HOME/jre/sh/java" ]; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ]; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." - fi + fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ]; then - MAX_FD_LIMIT=$(ulimit -H -n) - if [ $? -eq 0 ]; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ]; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ]; then - warn "Could not set maximum file descriptor limit: $MAX_FD" +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi fi # For Darwin, add options to specify how the application appears in the dock if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ]; then - APP_HOME=$(cygpath --path --mixed "$APP_HOME") - CLASSPATH=$(cygpath --path --mixed "$CLASSPATH") - - JAVACMD=$(cygpath --unix "$JAVACMD") - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=$(find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null) - SEP="" - for dir in $ROOTDIRSRAW; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ]; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@"; do - CHECK=$(echo "$arg" | egrep -c "$OURCYGPATTERN" -) - CHECK2=$(echo "$arg" | egrep -c "^-") ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ]; then ### Added a condition - eval $(echo args$i)=$(cygpath --path --ignore --mixed "$arg") - else - eval $(echo args$i)="\"$arg\"" +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" fi - i=$(expr $i + 1) - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac fi # Escape application args -save() { - for i; do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/"; done - echo " " +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" diff --git a/pay-app-spring-microservices/app-config/gradlew.bat b/pay-app-spring-microservices/app-config/gradlew.bat index 107acd3..ac1b06f 100644 --- a/pay-app-spring-microservices/app-config/gradlew.bat +++ b/pay-app-spring-microservices/app-config/gradlew.bat @@ -1,89 +1,89 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pay-app-spring-microservices/app-config/settings.gradle b/pay-app-spring-microservices/app-config/settings.gradle index 7c9d23a..8564f1b 100644 --- a/pay-app-spring-microservices/app-config/settings.gradle +++ b/pay-app-spring-microservices/app-config/settings.gradle @@ -1 +1 @@ -rootProject.name = 'app-config' +rootProject.name = 'app-config' diff --git a/pay-app-spring-microservices/app-config/src/main/java/com/aforo/appconfig/AppConfigApplication.java b/pay-app-spring-microservices/app-config/src/main/java/com/aforo/appconfig/AppConfigApplication.java index c64a6b2..a06a851 100644 --- a/pay-app-spring-microservices/app-config/src/main/java/com/aforo/appconfig/AppConfigApplication.java +++ b/pay-app-spring-microservices/app-config/src/main/java/com/aforo/appconfig/AppConfigApplication.java @@ -1,15 +1,15 @@ -package com.aforo.appconfig; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.config.server.EnableConfigServer; - -@SpringBootApplication -@EnableConfigServer -public class AppConfigApplication { - - public static void main(String[] args) { - SpringApplication.run(AppConfigApplication.class, args); - } - -} +package com.aforo.appconfig; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.config.server.EnableConfigServer; + +@SpringBootApplication +@EnableConfigServer +public class AppConfigApplication { + + public static void main(String[] args) { + SpringApplication.run(AppConfigApplication.class, args); + } + +} diff --git a/pay-app-spring-microservices/app-config/src/main/resources/application.properties b/pay-app-spring-microservices/app-config/src/main/resources/application.properties index 7fd2213..c330798 100644 --- a/pay-app-spring-microservices/app-config/src/main/resources/application.properties +++ b/pay-app-spring-microservices/app-config/src/main/resources/application.properties @@ -1,15 +1,15 @@ -# Server -spring.application.name=app-config -server.port=8888 - -# Config -spring.cloud.config.server.git.uri=https://github.com/icesi-ops/training_microservices.git -spring.cloud.config.server.default-label=master -spring.cloud.config.server.git.search-paths=pay-app-spring-microservices/config -spring.cloud.config.server.git.skip-ssl-validation=true - -# Consul -spring.cloud.consul.host=consul -spring.cloud.consul.port=8500 -spring.cloud.consul.discovery.health-check-interval=5s -spring.cloud.consul.discovery.prefer-ip-address=true \ No newline at end of file +# Server +spring.application.name=app-config +server.port=8888 + +# Config +spring.cloud.config.server.git.uri=https://github.com/icesi-ops/training_microservices +spring.cloud.config.server.default-label=master +spring.cloud.config.server.git.search-paths=pay-app-spring-microservices/config +spring.cloud.config.server.git.skip-ssl-validation=true + +# Consul +spring.cloud.consul.host=consul +spring.cloud.consul.port=8500 +spring.cloud.consul.discovery.health-check-interval=5s +spring.cloud.consul.discovery.prefer-ip-address=true diff --git a/pay-app-spring-microservices/app-config/src/test/java/com/aforo/appconfig/AppConfigApplicationTests.java b/pay-app-spring-microservices/app-config/src/test/java/com/aforo/appconfig/AppConfigApplicationTests.java index 90d6ce9..6e9f318 100644 --- a/pay-app-spring-microservices/app-config/src/test/java/com/aforo/appconfig/AppConfigApplicationTests.java +++ b/pay-app-spring-microservices/app-config/src/test/java/com/aforo/appconfig/AppConfigApplicationTests.java @@ -1,13 +1,13 @@ -package com.aforo.appconfig; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class AppConfigApplicationTests { - - @Test - void contextLoads() { - } - -} +package com.aforo.appconfig; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class AppConfigApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/pay-app-spring-microservices/app-invoice/.gitignore b/pay-app-spring-microservices/app-invoice/.gitignore index c2065bc..132b469 100644 --- a/pay-app-spring-microservices/app-invoice/.gitignore +++ b/pay-app-spring-microservices/app-invoice/.gitignore @@ -1,37 +1,37 @@ -HELP.md -.gradle -build/ -!gradle/wrapper/gradle-wrapper.jar -!**/src/main/**/build/ -!**/src/test/**/build/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache -bin/ -!**/src/main/**/bin/ -!**/src/test/**/bin/ - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr -out/ -!**/src/main/**/out/ -!**/src/test/**/out/ - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ - -### VS Code ### -.vscode/ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/pay-app-spring-microservices/app-invoice/Dockerfile b/pay-app-spring-microservices/app-invoice/Dockerfile index 529bfb1..3ee629f 100644 --- a/pay-app-spring-microservices/app-invoice/Dockerfile +++ b/pay-app-spring-microservices/app-invoice/Dockerfile @@ -1,13 +1,13 @@ -FROM openjdk:13-alpine as stage1 -COPY . /app -WORKDIR /app -RUN chmod 777 gradlew -RUN ./gradlew clean -RUN ./gradlew bootJar - - -FROM openjdk:13-alpine -EXPOSE 8010 -COPY --from=stage1 /app/build/libs/app-invoice-1.0.0.jar app-invoice.jar -#ADD ./build/libs/app-config-1.0.0.jar app-config.jar +FROM openjdk:13-alpine as stage1 +COPY . /app +WORKDIR /app +RUN chmod 777 gradlew +RUN ./gradlew clean +RUN ./gradlew bootJar + + +FROM openjdk:13-alpine +EXPOSE 8010 +COPY --from=stage1 /app/build/libs/app-invoice-1.0.0.jar app-invoice.jar +#ADD ./build/libs/app-config-1.0.0.jar app-config.jar ENTRYPOINT ["java", "-jar", "/app-invoice.jar"] \ No newline at end of file diff --git a/pay-app-spring-microservices/app-invoice/build.gradle b/pay-app-spring-microservices/app-invoice/build.gradle index 76d0556..9ee384a 100644 --- a/pay-app-spring-microservices/app-invoice/build.gradle +++ b/pay-app-spring-microservices/app-invoice/build.gradle @@ -1,47 +1,50 @@ -plugins { - id 'org.springframework.boot' version '2.3.10.RELEASE' - id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'java' -} - - -group = 'com.aforo' -version = '1.0.0' -sourceCompatibility = '11' - -configurations { - compileOnly { - extendsFrom annotationProcessor - } -} - -repositories { - mavenCentral() -} - -ext { - set('springCloudVersion', "Hoxton.SR11") -} - -dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.kafka:spring-kafka' - implementation 'org.springframework.cloud:spring-cloud-starter-config' - - compileOnly 'org.projectlombok:lombok' - runtimeOnly 'org.postgresql:postgresql' - annotationProcessor 'org.projectlombok:lombok' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.kafka:spring-kafka-test' -} - -dependencyManagement { - imports { - mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" - } -} - -test { - useJUnitPlatform() -} +plugins { + id 'org.springframework.boot' version '2.3.10.RELEASE' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id 'java' +} + + +group = 'com.aforo' +version = '1.0.0' +sourceCompatibility = '11' + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +ext { + set('springCloudVersion', "Hoxton.SR11") +} + +dependencies { + + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.kafka:spring-kafka' + implementation 'org.springframework.cloud:spring-cloud-starter-config' + implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery' + implementation 'org.springframework.boot:spring-boot-starter-actuator' + + compileOnly 'org.projectlombok:lombok' + runtimeOnly 'org.postgresql:postgresql' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.kafka:spring-kafka-test' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} + +test { + useJUnitPlatform() +} diff --git a/pay-app-spring-microservices/app-invoice/gradle/wrapper/gradle-wrapper.jar b/pay-app-spring-microservices/app-invoice/gradle/wrapper/gradle-wrapper.jar index e708b1c..41d9927 100644 Binary files a/pay-app-spring-microservices/app-invoice/gradle/wrapper/gradle-wrapper.jar and b/pay-app-spring-microservices/app-invoice/gradle/wrapper/gradle-wrapper.jar differ diff --git a/pay-app-spring-microservices/app-invoice/gradle/wrapper/gradle-wrapper.properties b/pay-app-spring-microservices/app-invoice/gradle/wrapper/gradle-wrapper.properties index 549d844..aa991fc 100644 --- a/pay-app-spring-microservices/app-invoice/gradle/wrapper/gradle-wrapper.properties +++ b/pay-app-spring-microservices/app-invoice/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/pay-app-spring-microservices/app-invoice/gradlew b/pay-app-spring-microservices/app-invoice/gradlew old mode 100644 new mode 100755 index 8f89047..1b6c787 --- a/pay-app-spring-microservices/app-invoice/gradlew +++ b/pay-app-spring-microservices/app-invoice/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,168 +17,218 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ]; do - ls=$(ls -ld "$PRG") - link=$(expr "$ls" : '.*-> \(.*\)$') - if expr "$link" : '/.*' >/dev/null; then - PRG="$link" - else - PRG=$(dirname "$PRG")"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="$(pwd)" -cd "$(dirname \"$PRG\")/" >/dev/null -APP_HOME="$(pwd -P)" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=$(basename "$0") +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum -warn() { - echo "$*" -} +warn () { + echo "$*" +} >&2 -die() { - echo - echo "$*" - echo - exit 1 -} +die () { + echo + echo "$*" + echo + exit 1 +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "$(uname)" in -CYGWIN*) - cygwin=true - ;; -Darwin*) - darwin=true - ;; -MINGW*) - msys=true - ;; -NONSTOP*) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ]; then - if [ -x "$JAVA_HOME/jre/sh/java" ]; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ]; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." - fi + fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ]; then - MAX_FD_LIMIT=$(ulimit -H -n) - if [ $? -eq 0 ]; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ]; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ]; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ]; then - APP_HOME=$(cygpath --path --mixed "$APP_HOME") - CLASSPATH=$(cygpath --path --mixed "$CLASSPATH") - - JAVACMD=$(cygpath --unix "$JAVACMD") - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=$(find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null) - SEP="" - for dir in $ROOTDIRSRAW; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ]; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@"; do - CHECK=$(echo "$arg" | egrep -c "$OURCYGPATTERN" -) - CHECK2=$(echo "$arg" | egrep -c "^-") ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ]; then ### Added a condition - eval $(echo args$i)=$(cygpath --path --ignore --mixed "$arg") - else - eval $(echo args$i)="\"$arg\"" - fi - i=$(expr $i + 1) - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done fi -# Escape application args -save() { - for i; do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/"; done - echo " " -} -APP_ARGS=$(save "$@") +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/pay-app-spring-microservices/app-invoice/gradlew.bat b/pay-app-spring-microservices/app-invoice/gradlew.bat index 107acd3..ac1b06f 100644 --- a/pay-app-spring-microservices/app-invoice/gradlew.bat +++ b/pay-app-spring-microservices/app-invoice/gradlew.bat @@ -1,89 +1,89 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pay-app-spring-microservices/app-invoice/settings.gradle b/pay-app-spring-microservices/app-invoice/settings.gradle index e21d591..3eb196e 100644 --- a/pay-app-spring-microservices/app-invoice/settings.gradle +++ b/pay-app-spring-microservices/app-invoice/settings.gradle @@ -1 +1 @@ -rootProject.name = 'app-invoice' +rootProject.name = 'app-invoice' diff --git a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/AppInvoiceApplication.java b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/AppInvoiceApplication.java index da591f6..cf11d8f 100644 --- a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/AppInvoiceApplication.java +++ b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/AppInvoiceApplication.java @@ -1,13 +1,13 @@ -package com.aforo; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class AppInvoiceApplication { - - public static void main(String[] args) { - SpringApplication.run(AppInvoiceApplication.class, args); - } - -} +package com.aforo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AppInvoiceApplication { + + public static void main(String[] args) { + SpringApplication.run(AppInvoiceApplication.class, args); + } + +} diff --git a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/controller/InvoiceController.java b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/controller/InvoiceController.java index 9694557..16ac51c 100644 --- a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/controller/InvoiceController.java +++ b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/controller/InvoiceController.java @@ -1,29 +1,29 @@ -package com.aforo.controller; - -import com.aforo.model.Invoice; -import com.aforo.service.InvoiceService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@RestController -public class InvoiceController { - - @Autowired - private InvoiceService service; - - private Logger log = LoggerFactory.getLogger(InvoiceController.class); - - @GetMapping("/all") - public ResponseEntity> findAllInvoices() { - log.info("Consultando Invoices"); - var respose = service.findAllInvoices(); - return ResponseEntity.status(HttpStatus.CREATED).body(respose); - } -} +package com.aforo.controller; + +import com.aforo.model.Invoice; +import com.aforo.service.InvoiceService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class InvoiceController { + + @Autowired + private InvoiceService service; + + private Logger log = LoggerFactory.getLogger(InvoiceController.class); + + @GetMapping("/all") + public ResponseEntity> findAllInvoices() { + log.info("Consultando Invoices"); + var respose = service.findAllInvoices(); + return ResponseEntity.status(HttpStatus.CREATED).body(respose); + } +} diff --git a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/dao/InvoiceDao.java b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/dao/InvoiceDao.java index b22452f..25f03ee 100644 --- a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/dao/InvoiceDao.java +++ b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/dao/InvoiceDao.java @@ -1,15 +1,15 @@ -package com.aforo.dao; - -import com.aforo.model.Invoice; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.CrudRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface InvoiceDao extends CrudRepository { - - @Query("select i from Invoice i order by i.idInvoice") - List findAllInvoices(); -} +package com.aforo.dao; + +import com.aforo.model.Invoice; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface InvoiceDao extends CrudRepository { + + @Query("select i from Invoice i order by i.idInvoice") + List findAllInvoices(); +} diff --git a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/kafka/consumer/ConsumerConfig.java b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/kafka/consumer/ConsumerConfig.java index 4c0b63d..2ff25b6 100644 --- a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/kafka/consumer/ConsumerConfig.java +++ b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/kafka/consumer/ConsumerConfig.java @@ -1,9 +1,9 @@ -package com.aforo.kafka.consumer; - -import org.springframework.context.annotation.Configuration; -import org.springframework.kafka.annotation.EnableKafka; - -@Configuration -@EnableKafka -public class ConsumerConfig { -} +package com.aforo.kafka.consumer; + +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.annotation.EnableKafka; + +@Configuration +@EnableKafka +public class ConsumerConfig { +} diff --git a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/kafka/consumer/TransactionEvents.java b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/kafka/consumer/TransactionEvents.java index 2f8c67f..f9566c9 100644 --- a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/kafka/consumer/TransactionEvents.java +++ b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/kafka/consumer/TransactionEvents.java @@ -1,32 +1,32 @@ -package com.aforo.kafka.consumer; - -import com.aforo.dao.InvoiceDao; -import com.aforo.model.Invoice; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.kafka.clients.consumer.ConsumerRecord; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class TransactionEvents { - - @Autowired - private InvoiceDao _dao; - - @Autowired - private ObjectMapper objectMapper; - - private Logger log = LoggerFactory.getLogger(TransactionEvents.class); - - public void processTransactionEvent(ConsumerRecord consumerRecord) throws JsonProcessingException { - Invoice event = objectMapper.readValue(consumerRecord.value(), Invoice.class); - log.info("Actulizando Invoice ***" + event.getIdInvoice()); - event.setState(1); - log.info("Se ha pagado la factura # " + event.getIdInvoice()); - - _dao.save(event); - } -} +package com.aforo.kafka.consumer; + +import com.aforo.dao.InvoiceDao; +import com.aforo.model.Invoice; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class TransactionEvents { + + @Autowired + private InvoiceDao _dao; + + @Autowired + private ObjectMapper objectMapper; + + private Logger log = LoggerFactory.getLogger(TransactionEvents.class); + + public void processTransactionEvent(ConsumerRecord consumerRecord) throws JsonProcessingException { + Invoice event = objectMapper.readValue(consumerRecord.value(), Invoice.class); + log.info("Actulizando Invoice ***" + event.getIdInvoice()); + event.setState(1); + log.info("Se ha pagado la factura # " + event.getIdInvoice()); + + _dao.save(event); + } +} diff --git a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/kafka/listener/ConsumerListener.java b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/kafka/listener/ConsumerListener.java index 29f4394..4a2ebca 100644 --- a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/kafka/listener/ConsumerListener.java +++ b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/kafka/listener/ConsumerListener.java @@ -1,27 +1,27 @@ -package com.aforo.kafka.listener; - -import com.aforo.kafka.consumer.TransactionEvents; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import org.apache.kafka.clients.consumer.ConsumerRecord; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.kafka.annotation.KafkaListener; -import org.springframework.stereotype.Component; - -@Component -public class ConsumerListener { - - @Autowired - private TransactionEvents events; - - private Logger log = LoggerFactory.getLogger(ConsumerListener.class); - - @KafkaListener(topics = {"transaction-events"}) - public void onMessage(ConsumerRecord consumerRecord) throws JsonMappingException, JsonProcessingException { - log.info("*************** MICROSERVICE APP INVOICE *******************"); - log.info("ConsumerRecord : {}", consumerRecord.value()); - events.processTransactionEvent(consumerRecord); - } -} +package com.aforo.kafka.listener; + +import com.aforo.kafka.consumer.TransactionEvents; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Component; + +@Component +public class ConsumerListener { + + @Autowired + private TransactionEvents events; + + private Logger log = LoggerFactory.getLogger(ConsumerListener.class); + + @KafkaListener(topics = {"transaction-events"}) + public void onMessage(ConsumerRecord consumerRecord) throws JsonMappingException, JsonProcessingException { + log.info("*************** MICROSERVICE APP INVOICE *******************"); + log.info("ConsumerRecord : {}", consumerRecord.value()); + events.processTransactionEvent(consumerRecord); + } +} diff --git a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/model/Invoice.java b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/model/Invoice.java index bd907fd..5c38827 100644 --- a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/model/Invoice.java +++ b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/model/Invoice.java @@ -1,18 +1,18 @@ -package com.aforo.model; - -import lombok.Data; - -import javax.persistence.*; -import java.io.Serializable; - -@Entity -@Table(name="invoice") -@Data -public class Invoice implements Serializable { - - private static final long serialVersionUID = 1L; - @Id - private Integer idInvoice; - private Double amount ; - private Integer state ; -} +package com.aforo.model; + +import lombok.Data; + +import javax.persistence.*; +import java.io.Serializable; + +@Entity +@Table(name="invoice") +@Data +public class Invoice implements Serializable { + + private static final long serialVersionUID = 1L; + @Id + private Integer idInvoice; + private Double amount ; + private Integer state ; +} diff --git a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/service/InvoiceService.java b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/service/InvoiceService.java index f77a162..e20e0de 100644 --- a/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/service/InvoiceService.java +++ b/pay-app-spring-microservices/app-invoice/src/main/java/com/aforo/service/InvoiceService.java @@ -1,19 +1,19 @@ -package com.aforo.service; - -import com.aforo.dao.InvoiceDao; -import com.aforo.model.Invoice; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class InvoiceService { - - @Autowired - private InvoiceDao _dao; - - public List findAllInvoices() { - return _dao.findAllInvoices(); - } -} +package com.aforo.service; + +import com.aforo.dao.InvoiceDao; +import com.aforo.model.Invoice; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class InvoiceService { + + @Autowired + private InvoiceDao _dao; + + public List findAllInvoices() { + return _dao.findAllInvoices(); + } +} diff --git a/pay-app-spring-microservices/app-invoice/src/main/resources/application.properties b/pay-app-spring-microservices/app-invoice/src/main/resources/application.properties index 8b13789..d3f5a12 100644 --- a/pay-app-spring-microservices/app-invoice/src/main/resources/application.properties +++ b/pay-app-spring-microservices/app-invoice/src/main/resources/application.properties @@ -1 +1 @@ - + diff --git a/pay-app-spring-microservices/app-invoice/src/main/resources/bootstrap.properties b/pay-app-spring-microservices/app-invoice/src/main/resources/bootstrap.properties index b254c68..3212aa5 100644 --- a/pay-app-spring-microservices/app-invoice/src/main/resources/bootstrap.properties +++ b/pay-app-spring-microservices/app-invoice/src/main/resources/bootstrap.properties @@ -1,3 +1,3 @@ -spring.application.name=app-invoice -spring.profiles.active=dev -spring.cloud.config.uri=http://app-config:8888 +spring.application.name=app-invoice +spring.profiles.active=dev +spring.cloud.config.uri=http://app-config:8888 diff --git a/pay-app-spring-microservices/app-invoice/src/test/java/com/aforo/AppInvoiceApplicationTests.java b/pay-app-spring-microservices/app-invoice/src/test/java/com/aforo/AppInvoiceApplicationTests.java index faa2489..9a1ff80 100644 --- a/pay-app-spring-microservices/app-invoice/src/test/java/com/aforo/AppInvoiceApplicationTests.java +++ b/pay-app-spring-microservices/app-invoice/src/test/java/com/aforo/AppInvoiceApplicationTests.java @@ -1,13 +1,13 @@ -package com.aforo; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class AppInvoiceApplicationTests { - - @Test - void contextLoads() { - } - -} +package com.aforo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class AppInvoiceApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/pay-app-spring-microservices/app-pay/.gitignore b/pay-app-spring-microservices/app-pay/.gitignore index c2065bc..132b469 100644 --- a/pay-app-spring-microservices/app-pay/.gitignore +++ b/pay-app-spring-microservices/app-pay/.gitignore @@ -1,37 +1,37 @@ -HELP.md -.gradle -build/ -!gradle/wrapper/gradle-wrapper.jar -!**/src/main/**/build/ -!**/src/test/**/build/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache -bin/ -!**/src/main/**/bin/ -!**/src/test/**/bin/ - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr -out/ -!**/src/main/**/out/ -!**/src/test/**/out/ - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ - -### VS Code ### -.vscode/ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/pay-app-spring-microservices/app-pay/Dockerfile b/pay-app-spring-microservices/app-pay/Dockerfile index 95034c5..e22a78b 100644 --- a/pay-app-spring-microservices/app-pay/Dockerfile +++ b/pay-app-spring-microservices/app-pay/Dockerfile @@ -1,13 +1,13 @@ -FROM openjdk:13-alpine as stage1 -COPY . /app -WORKDIR /app -RUN chmod 777 gradlew -RUN ./gradlew clean -RUN ./gradlew bootJar - - -FROM openjdk:13-alpine -EXPOSE 8010 -COPY --from=stage1 /app/build/libs/app-pay-1.0.0.jar app-pay.jar -#ADD ./build/libs/app-config-1.0.0.jar app-config.jar +FROM openjdk:13-alpine as stage1 +COPY . /app +WORKDIR /app +RUN chmod 777 gradlew +RUN ./gradlew clean +RUN ./gradlew bootJar + + +FROM openjdk:13-alpine +EXPOSE 8010 +COPY --from=stage1 /app/build/libs/app-pay-1.0.0.jar app-pay.jar +#ADD ./build/libs/app-config-1.0.0.jar app-config.jar ENTRYPOINT ["java", "-jar", "/app-pay.jar"] \ No newline at end of file diff --git a/pay-app-spring-microservices/app-pay/README.md b/pay-app-spring-microservices/app-pay/README.md index 253df8a..55ce506 100644 --- a/pay-app-spring-microservices/app-pay/README.md +++ b/pay-app-spring-microservices/app-pay/README.md @@ -1,12 +1,12 @@ -# App Pay - -Microservicio encargado de registrar el pago de una factura y dejar un mensaje a la cola de kafka -para actualizar la factura desde el microservicio de app-invoice. También debe dejar un mensaje -para registrar el movimiento en el microservicio de transacciones. - -## Dependencias -* JPA (Hibernate) -* Apache Kafka -* Spring Cloud Config -* PostgreSQL -* Lombok +# App Pay + +Microservicio encargado de registrar el pago de una factura y dejar un mensaje a la cola de kafka +para actualizar la factura desde el microservicio de app-invoice. También debe dejar un mensaje +para registrar el movimiento en el microservicio de transacciones. + +## Dependencias +* JPA (Hibernate) +* Apache Kafka +* Spring Cloud Config +* PostgreSQL +* Lombok diff --git a/pay-app-spring-microservices/app-pay/build.gradle b/pay-app-spring-microservices/app-pay/build.gradle index fdaf2e0..b7de3f7 100644 --- a/pay-app-spring-microservices/app-pay/build.gradle +++ b/pay-app-spring-microservices/app-pay/build.gradle @@ -1,46 +1,51 @@ -plugins { - id 'org.springframework.boot' version '2.3.10.RELEASE' - id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'java' -} - -group = 'com.aforo' -version = '1.0.0' -sourceCompatibility = '11' - -configurations { - compileOnly { - extendsFrom annotationProcessor - } -} - -repositories { - mavenCentral() -} - -ext { - set('springCloudVersion', "Hoxton.SR11") -} - - -dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.kafka:spring-kafka' - implementation 'org.springframework.cloud:spring-cloud-starter-config' - compileOnly 'org.projectlombok:lombok' - runtimeOnly 'mysql:mysql-connector-java' - annotationProcessor 'org.projectlombok:lombok' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.kafka:spring-kafka-test' -} - -dependencyManagement { - imports { - mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" - } -} - -test { - useJUnitPlatform() -} +plugins { + id 'org.springframework.boot' version '2.3.10.RELEASE' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id 'java' +} + +group = 'com.aforo' +version = '1.0.0' +sourceCompatibility = '11' + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +ext { + set('springCloudVersion', "Hoxton.SR11") +} + + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.kafka:spring-kafka' + implementation 'org.springframework.cloud:spring-cloud-starter-config' + implementation 'org.springframework.cloud:spring-cloud-starter-config' + implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery' + implementation 'org.springframework.boot:spring-boot-starter-actuator' + + + compileOnly 'org.projectlombok:lombok' + runtimeOnly 'mysql:mysql-connector-java' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.kafka:spring-kafka-test' +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} + +test { + useJUnitPlatform() +} diff --git a/pay-app-spring-microservices/app-pay/gradle/wrapper/gradle-wrapper.properties b/pay-app-spring-microservices/app-pay/gradle/wrapper/gradle-wrapper.properties index 549d844..cd408f2 100644 --- a/pay-app-spring-microservices/app-pay/gradle/wrapper/gradle-wrapper.properties +++ b/pay-app-spring-microservices/app-pay/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/pay-app-spring-microservices/app-pay/gradlew b/pay-app-spring-microservices/app-pay/gradlew old mode 100644 new mode 100755 diff --git a/pay-app-spring-microservices/app-pay/gradlew.bat b/pay-app-spring-microservices/app-pay/gradlew.bat index 107acd3..ac1b06f 100644 --- a/pay-app-spring-microservices/app-pay/gradlew.bat +++ b/pay-app-spring-microservices/app-pay/gradlew.bat @@ -1,89 +1,89 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pay-app-spring-microservices/app-pay/settings.gradle b/pay-app-spring-microservices/app-pay/settings.gradle index 36f0da7..66e4866 100644 --- a/pay-app-spring-microservices/app-pay/settings.gradle +++ b/pay-app-spring-microservices/app-pay/settings.gradle @@ -1 +1 @@ -rootProject.name = 'app-pay' +rootProject.name = 'app-pay' diff --git a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/AppPayApplication.java b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/AppPayApplication.java index 6a38973..7a132f3 100644 --- a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/AppPayApplication.java +++ b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/AppPayApplication.java @@ -1,13 +1,13 @@ -package com.aforo; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class AppPayApplication { - - public static void main(String[] args) { - SpringApplication.run(AppPayApplication.class, args); - } - -} +package com.aforo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AppPayApplication { + + public static void main(String[] args) { + SpringApplication.run(AppPayApplication.class, args); + } + +} diff --git a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/config/AutoCreateConfig.java b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/config/AutoCreateConfig.java index 9ef4dcf..cca79da 100644 --- a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/config/AutoCreateConfig.java +++ b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/config/AutoCreateConfig.java @@ -1,19 +1,19 @@ -package com.aforo.config; - -import org.apache.kafka.clients.admin.NewTopic; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.kafka.config.TopicBuilder; - -@Configuration -public class AutoCreateConfig { - - @Bean - public NewTopic depositEvent() { - return TopicBuilder - .name("trasaction-events") - .partitions(3) - .replicas(1) - .build(); - } -} +package com.aforo.config; + +import org.apache.kafka.clients.admin.NewTopic; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.config.TopicBuilder; + +@Configuration +public class AutoCreateConfig { + + @Bean + public NewTopic depositEvent() { + return TopicBuilder + .name("trasaction-events") + .partitions(3) + .replicas(1) + .build(); + } +} diff --git a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/controller/PayController.java b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/controller/PayController.java index d627039..45412e5 100644 --- a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/controller/PayController.java +++ b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/controller/PayController.java @@ -1,36 +1,36 @@ -package com.aforo.controller; - -import com.aforo.kafka.producer.PayEventProducer; -import com.aforo.model.Pay; -import com.aforo.service.PayService; -import com.fasterxml.jackson.core.JsonProcessingException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class PayController { - - @Autowired - private PayService service; - - @Autowired - PayEventProducer producer; - - private Logger log = LoggerFactory.getLogger(PayController.class); - - @PostMapping("/pay") - public ResponseEntity postDepositEvent(@RequestBody Pay pay) throws JsonProcessingException { - log.info("Registrando nuevo pago"); - var respose = service.registerPay(pay); - log.info("Enviando mensaje a Kafka"); - producer.sendPayEvent(respose); - log.info("Mensaje agregado a la cola correctamente"); - return ResponseEntity.status(HttpStatus.CREATED).body(respose); - } -} +package com.aforo.controller; + +import com.aforo.kafka.producer.PayEventProducer; +import com.aforo.model.Pay; +import com.aforo.service.PayService; +import com.fasterxml.jackson.core.JsonProcessingException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class PayController { + + @Autowired + private PayService service; + + @Autowired + PayEventProducer producer; + + private Logger log = LoggerFactory.getLogger(PayController.class); + + @PostMapping("/pay") + public ResponseEntity postDepositEvent(@RequestBody Pay pay) throws JsonProcessingException { + log.info("Registrando nuevo pago"); + var respose = service.registerPay(pay); + log.info("Enviando mensaje a Kafka"); + producer.sendPayEvent(respose); + log.info("Mensaje agregado a la cola correctamente"); + return ResponseEntity.status(HttpStatus.CREATED).body(respose); + } +} diff --git a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/dao/PayDao.java b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/dao/PayDao.java index 4a7ee91..94e37fa 100644 --- a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/dao/PayDao.java +++ b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/dao/PayDao.java @@ -1,9 +1,9 @@ -package com.aforo.dao; - -import com.aforo.model.Pay; -import org.springframework.data.repository.CrudRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface PayDao extends CrudRepository { -} +package com.aforo.dao; + +import com.aforo.model.Pay; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PayDao extends CrudRepository { +} diff --git a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/kafka/producer/PayEventProducer.java b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/kafka/producer/PayEventProducer.java index 1f970f4..1c122f6 100644 --- a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/kafka/producer/PayEventProducer.java +++ b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/kafka/producer/PayEventProducer.java @@ -1,73 +1,73 @@ -package com.aforo.kafka.producer; - -import com.aforo.model.Pay; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.common.header.Header; -import org.apache.kafka.common.header.internals.RecordHeader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.kafka.core.KafkaTemplate; -import org.springframework.kafka.support.SendResult; -import org.springframework.stereotype.Component; -import org.springframework.util.concurrent.ListenableFuture; -import org.springframework.util.concurrent.ListenableFutureCallback; - -import java.util.List; - - -@Component -public class PayEventProducer { - - @Autowired - private KafkaTemplate kafkaTemplate; - - @Autowired - private ObjectMapper objectMapper; - - private Logger log = LoggerFactory.getLogger(PayEventProducer.class); - String topic = "transaction-events"; - - public ListenableFuture> sendPayEvent(Pay pay) throws JsonProcessingException { - Integer key = pay.getIdOperation(); - String value = objectMapper.writeValueAsString(pay); - - ProducerRecord producerRecord = buildProducerRecord(key, value, topic); - ListenableFuture> listenableFuture = kafkaTemplate.send(producerRecord); - listenableFuture.addCallback(new ListenableFutureCallback<>() { - - @Override - public void onSuccess(SendResult result) { - handleSuccess(key, value, result); - } - - @Override - public void onFailure(Throwable ex) { - handleFailure(key, value, ex); - } - }); - - return listenableFuture; - } - - private ProducerRecord buildProducerRecord(Integer key, String value, String topic) { - List
recordHeaders = List.of(new RecordHeader("payment-event-source", "scanner".getBytes())); - return new ProducerRecord<>(topic, null, key, value, recordHeaders); - } - - private void handleFailure(Integer key, String value, Throwable e) { - log.error("Error enviando el mensaje, error: {} ", e.getMessage()); - try { - - } catch (Throwable ex) { - log.error("Error OnFailure: {}", ex.getMessage()); - } - } - - private void handleSuccess(Integer key, String value, SendResult result) { - log.info("Message Sent Successfully for the key :{} and the value is {},partition is {}", key, value, - result.getRecordMetadata().partition()); - } -} +package com.aforo.kafka.producer; + +import com.aforo.model.Pay; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.header.Header; +import org.apache.kafka.common.header.internals.RecordHeader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.support.SendResult; +import org.springframework.stereotype.Component; +import org.springframework.util.concurrent.ListenableFuture; +import org.springframework.util.concurrent.ListenableFutureCallback; + +import java.util.List; + + +@Component +public class PayEventProducer { + + @Autowired + private KafkaTemplate kafkaTemplate; + + @Autowired + private ObjectMapper objectMapper; + + private Logger log = LoggerFactory.getLogger(PayEventProducer.class); + String topic = "transaction-events"; + + public ListenableFuture> sendPayEvent(Pay pay) throws JsonProcessingException { + Integer key = pay.getIdOperation(); + String value = objectMapper.writeValueAsString(pay); + + ProducerRecord producerRecord = buildProducerRecord(key, value, topic); + ListenableFuture> listenableFuture = kafkaTemplate.send(producerRecord); + listenableFuture.addCallback(new ListenableFutureCallback<>() { + + @Override + public void onSuccess(SendResult result) { + handleSuccess(key, value, result); + } + + @Override + public void onFailure(Throwable ex) { + handleFailure(key, value, ex); + } + }); + + return listenableFuture; + } + + private ProducerRecord buildProducerRecord(Integer key, String value, String topic) { + List
recordHeaders = List.of(new RecordHeader("payment-event-source", "scanner".getBytes())); + return new ProducerRecord<>(topic, null, key, value, recordHeaders); + } + + private void handleFailure(Integer key, String value, Throwable e) { + log.error("Error enviando el mensaje, error: {} ", e.getMessage()); + try { + + } catch (Throwable ex) { + log.error("Error OnFailure: {}", ex.getMessage()); + } + } + + private void handleSuccess(Integer key, String value, SendResult result) { + log.info("Message Sent Successfully for the key :{} and the value is {},partition is {}", key, value, + result.getRecordMetadata().partition()); + } +} diff --git a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/model/Pay.java b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/model/Pay.java index 2379867..41116e9 100644 --- a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/model/Pay.java +++ b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/model/Pay.java @@ -1,24 +1,24 @@ -package com.aforo.model; - -import lombok.Data; - -import javax.persistence.*; -import java.io.Serializable; -import java.util.Date; - -@Entity -@Table(name="pay") -@Data -public class Pay implements Serializable { - - private static final long serialVersionUID = 1L; - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id_operation") - private Integer idOperation; - @Column(name = "id_invoice") - private Integer idInvoice; - private Double amount; - @Temporal(TemporalType.TIMESTAMP) - private Date dateTime; -} +package com.aforo.model; + +import lombok.Data; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; + +@Entity +@Table(name="pay") +@Data +public class Pay implements Serializable { + + private static final long serialVersionUID = 1L; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id_operation") + private Integer idOperation; + @Column(name = "id_invoice") + private Integer idInvoice; + private Double amount; + @Temporal(TemporalType.TIMESTAMP) + private Date dateTime; +} diff --git a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/service/PayService.java b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/service/PayService.java index ae70de3..2911a64 100644 --- a/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/service/PayService.java +++ b/pay-app-spring-microservices/app-pay/src/main/java/com/aforo/service/PayService.java @@ -1,17 +1,17 @@ -package com.aforo.service; - -import com.aforo.dao.PayDao; -import com.aforo.model.Pay; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class PayService { - - @Autowired - private PayDao _dao; - - public Pay registerPay(Pay pay) { - return _dao.save(pay); - } -} +package com.aforo.service; + +import com.aforo.dao.PayDao; +import com.aforo.model.Pay; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class PayService { + + @Autowired + private PayDao _dao; + + public Pay registerPay(Pay pay) { + return _dao.save(pay); + } +} diff --git a/pay-app-spring-microservices/app-pay/src/main/resources/application.properties b/pay-app-spring-microservices/app-pay/src/main/resources/application.properties index 8b13789..979c28e 100644 --- a/pay-app-spring-microservices/app-pay/src/main/resources/application.properties +++ b/pay-app-spring-microservices/app-pay/src/main/resources/application.properties @@ -1 +1,6 @@ - +# Consul +spring.cloud.consul.host=consul +spring.cloud.consul.port=8500 +spring.cloud.consul.discovery.health-check-interval=5s +spring.cloud.consul.discovery.prefer-ip-address=true +management.endpoints.web.exposure.include=health diff --git a/pay-app-spring-microservices/app-pay/src/main/resources/bootstrap.properties b/pay-app-spring-microservices/app-pay/src/main/resources/bootstrap.properties index 91cb925..e5cc45d 100644 --- a/pay-app-spring-microservices/app-pay/src/main/resources/bootstrap.properties +++ b/pay-app-spring-microservices/app-pay/src/main/resources/bootstrap.properties @@ -1,3 +1,3 @@ -spring.application.name=app-pay -spring.profiles.active=dev -spring.cloud.config.uri=http://app-config:8888 +spring.application.name=app-pay +spring.profiles.active=dev +spring.cloud.config.uri=http://app-config:8888 diff --git a/pay-app-spring-microservices/app-pay/src/test/java/com/aforo/AppPayApplicationTests.java b/pay-app-spring-microservices/app-pay/src/test/java/com/aforo/AppPayApplicationTests.java index d45f2ea..e3a5374 100644 --- a/pay-app-spring-microservices/app-pay/src/test/java/com/aforo/AppPayApplicationTests.java +++ b/pay-app-spring-microservices/app-pay/src/test/java/com/aforo/AppPayApplicationTests.java @@ -1,13 +1,13 @@ -package com.aforo; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class AppPayApplicationTests { - - @Test - void contextLoads() { - } - -} +package com.aforo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class AppPayApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/pay-app-spring-microservices/app-transaction/.gitignore b/pay-app-spring-microservices/app-transaction/.gitignore index c2065bc..132b469 100644 --- a/pay-app-spring-microservices/app-transaction/.gitignore +++ b/pay-app-spring-microservices/app-transaction/.gitignore @@ -1,37 +1,37 @@ -HELP.md -.gradle -build/ -!gradle/wrapper/gradle-wrapper.jar -!**/src/main/**/build/ -!**/src/test/**/build/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache -bin/ -!**/src/main/**/bin/ -!**/src/test/**/bin/ - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr -out/ -!**/src/main/**/out/ -!**/src/test/**/out/ - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ - -### VS Code ### -.vscode/ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/pay-app-spring-microservices/app-transaction/Dockerfile b/pay-app-spring-microservices/app-transaction/Dockerfile index a74e386..2ed5f19 100644 --- a/pay-app-spring-microservices/app-transaction/Dockerfile +++ b/pay-app-spring-microservices/app-transaction/Dockerfile @@ -1,13 +1,13 @@ -FROM openjdk:13-alpine as stage1 -COPY . /app -WORKDIR /app -RUN chmod 777 gradlew -RUN ./gradlew clean -RUN ./gradlew bootJar - - -FROM openjdk:13-alpine -EXPOSE 8010 -COPY --from=stage1 /app/build/libs/app-transaction-1.0.0.jar app-transaction.jar -#ADD ./build/libs/app-config-1.0.0.jar app-config.jar +FROM openjdk:13-alpine as stage1 +COPY . /app +WORKDIR /app +RUN chmod 777 gradlew +RUN ./gradlew clean +RUN ./gradlew bootJar + + +FROM openjdk:13-alpine +EXPOSE 8010 +COPY --from=stage1 /app/build/libs/app-transaction-1.0.0.jar app-transaction.jar +#ADD ./build/libs/app-config-1.0.0.jar app-config.jar ENTRYPOINT ["java", "-jar", "/app-transaction.jar"] \ No newline at end of file diff --git a/pay-app-spring-microservices/app-transaction/build.gradle b/pay-app-spring-microservices/app-transaction/build.gradle index 1ca3403..e51649a 100644 --- a/pay-app-spring-microservices/app-transaction/build.gradle +++ b/pay-app-spring-microservices/app-transaction/build.gradle @@ -1,44 +1,48 @@ -plugins { - id 'org.springframework.boot' version '2.3.10.RELEASE' - id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'java' -} - -group = 'com.aforo' -version = '1.0.0' -sourceCompatibility = '11' - -configurations { - compileOnly { - extendsFrom annotationProcessor - } -} - -repositories { - mavenCentral() -} - -ext { - set('springCloudVersion', "Hoxton.SR11") -} - -dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.kafka:spring-kafka' - implementation 'org.springframework.cloud:spring-cloud-starter-config' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.kafka:spring-kafka-test' -} - -dependencyManagement { - imports { - mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" - } -} - -test { - useJUnitPlatform() -} +plugins { + id 'org.springframework.boot' version '2.3.10.RELEASE' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id 'java' +} + +group = 'com.aforo' +version = '1.0.0' +sourceCompatibility = '11' + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +ext { + set('springCloudVersion', "Hoxton.SR11") +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.kafka:spring-kafka' + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.kafka:spring-kafka-test' + implementation 'org.springframework.cloud:spring-cloud-starter-config' + implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery' + implementation 'org.springframework.boot:spring-boot-starter-actuator' + +} + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" + } +} + +test { + useJUnitPlatform() +} diff --git a/pay-app-spring-microservices/app-transaction/gradle/wrapper/gradle-wrapper.properties b/pay-app-spring-microservices/app-transaction/gradle/wrapper/gradle-wrapper.properties index 549d844..cd408f2 100644 --- a/pay-app-spring-microservices/app-transaction/gradle/wrapper/gradle-wrapper.properties +++ b/pay-app-spring-microservices/app-transaction/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/pay-app-spring-microservices/app-transaction/gradlew b/pay-app-spring-microservices/app-transaction/gradlew old mode 100644 new mode 100755 diff --git a/pay-app-spring-microservices/app-transaction/gradlew.bat b/pay-app-spring-microservices/app-transaction/gradlew.bat index 107acd3..ac1b06f 100644 --- a/pay-app-spring-microservices/app-transaction/gradlew.bat +++ b/pay-app-spring-microservices/app-transaction/gradlew.bat @@ -1,89 +1,89 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pay-app-spring-microservices/app-transaction/settings.gradle b/pay-app-spring-microservices/app-transaction/settings.gradle index 22a90a6..5d83777 100644 --- a/pay-app-spring-microservices/app-transaction/settings.gradle +++ b/pay-app-spring-microservices/app-transaction/settings.gradle @@ -1 +1 @@ -rootProject.name = 'app-transaction' +rootProject.name = 'app-transaction' diff --git a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/AppTransactionApplication.java b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/AppTransactionApplication.java index 83b1bf1..aae7f1b 100644 --- a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/AppTransactionApplication.java +++ b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/AppTransactionApplication.java @@ -1,13 +1,13 @@ -package com.aforo; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class AppTransactionApplication { - - public static void main(String[] args) { - SpringApplication.run(AppTransactionApplication.class, args); - } - -} +package com.aforo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AppTransactionApplication { + + public static void main(String[] args) { + SpringApplication.run(AppTransactionApplication.class, args); + } + +} diff --git a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/controller/TransactionController.java b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/controller/TransactionController.java index ed44a2d..e2e7204 100644 --- a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/controller/TransactionController.java +++ b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/controller/TransactionController.java @@ -1,29 +1,29 @@ -package com.aforo.controller; - -import com.aforo.model.Transaction; -import com.aforo.service.TransactionService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@RestController -public class TransactionController { - - @Autowired - private TransactionService service; - - private Logger log = LoggerFactory.getLogger(TransactionController.class); - - @GetMapping("/all") - public ResponseEntity> findAllInvoices() { - log.info("Consultando Invoices"); - var respose = service.findAllTransaction(); - return ResponseEntity.status(HttpStatus.CREATED).body(respose); - } -} +package com.aforo.controller; + +import com.aforo.model.Transaction; +import com.aforo.service.TransactionService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class TransactionController { + + @Autowired + private TransactionService service; + + private Logger log = LoggerFactory.getLogger(TransactionController.class); + + @GetMapping("/all") + public ResponseEntity> findAllInvoices() { + log.info("Consultando Invoices"); + var respose = service.findAllTransaction(); + return ResponseEntity.status(HttpStatus.CREATED).body(respose); + } +} diff --git a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/dao/TransactionDao.java b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/dao/TransactionDao.java index bb01f57..56b0878 100644 --- a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/dao/TransactionDao.java +++ b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/dao/TransactionDao.java @@ -1,9 +1,9 @@ -package com.aforo.dao; - -import com.aforo.model.Transaction; -import org.springframework.data.mongodb.repository.MongoRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface TransactionDao extends MongoRepository { -} +package com.aforo.dao; + +import com.aforo.model.Transaction; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface TransactionDao extends MongoRepository { +} diff --git a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/kafka/consumer/ConsumerConfig.java b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/kafka/consumer/ConsumerConfig.java index 4c0b63d..2ff25b6 100644 --- a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/kafka/consumer/ConsumerConfig.java +++ b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/kafka/consumer/ConsumerConfig.java @@ -1,9 +1,9 @@ -package com.aforo.kafka.consumer; - -import org.springframework.context.annotation.Configuration; -import org.springframework.kafka.annotation.EnableKafka; - -@Configuration -@EnableKafka -public class ConsumerConfig { -} +package com.aforo.kafka.consumer; + +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.annotation.EnableKafka; + +@Configuration +@EnableKafka +public class ConsumerConfig { +} diff --git a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/kafka/consumer/TransactionEvents.java b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/kafka/consumer/TransactionEvents.java index 3e54492..926306c 100644 --- a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/kafka/consumer/TransactionEvents.java +++ b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/kafka/consumer/TransactionEvents.java @@ -1,29 +1,29 @@ -package com.aforo.kafka.consumer; - -import com.aforo.dao.TransactionDao; -import com.aforo.model.Transaction; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.kafka.clients.consumer.ConsumerRecord; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class TransactionEvents { - - @Autowired - private TransactionDao _dao; - - @Autowired - private ObjectMapper objectMapper; - - private Logger log = LoggerFactory.getLogger(TransactionEvents.class); - - public void processTransactionEvent(ConsumerRecord consumerRecord) throws JsonProcessingException { - Transaction event = objectMapper.readValue(consumerRecord.value(), Transaction.class); - log.info("Registrando Transaccion Invoice ***" + event.getIdInvoice()); - _dao.save(event); - } -} +package com.aforo.kafka.consumer; + +import com.aforo.dao.TransactionDao; +import com.aforo.model.Transaction; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class TransactionEvents { + + @Autowired + private TransactionDao _dao; + + @Autowired + private ObjectMapper objectMapper; + + private Logger log = LoggerFactory.getLogger(TransactionEvents.class); + + public void processTransactionEvent(ConsumerRecord consumerRecord) throws JsonProcessingException { + Transaction event = objectMapper.readValue(consumerRecord.value(), Transaction.class); + log.info("Registrando Transaccion Invoice ***" + event.getIdInvoice()); + _dao.save(event); + } +} diff --git a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/kafka/listener/ConsumerListener.java b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/kafka/listener/ConsumerListener.java index f82cbd5..2b4fae8 100644 --- a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/kafka/listener/ConsumerListener.java +++ b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/kafka/listener/ConsumerListener.java @@ -1,27 +1,27 @@ -package com.aforo.kafka.listener; - -import com.aforo.kafka.consumer.TransactionEvents; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; -import org.apache.kafka.clients.consumer.ConsumerRecord; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.kafka.annotation.KafkaListener; -import org.springframework.stereotype.Component; - -@Component -public class ConsumerListener { - - @Autowired - private TransactionEvents events; - - private Logger log = LoggerFactory.getLogger(ConsumerListener.class); - - @KafkaListener(topics = {"transaction-events"}) - public void onMessage(ConsumerRecord consumerRecord) throws JsonMappingException, JsonProcessingException { - log.info("*************** MICROSERVICE APP TRANSACTION *******************"); - log.info("ConsumerRecord : {}", consumerRecord.value()); - events.processTransactionEvent(consumerRecord); - } -} +package com.aforo.kafka.listener; + +import com.aforo.kafka.consumer.TransactionEvents; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Component; + +@Component +public class ConsumerListener { + + @Autowired + private TransactionEvents events; + + private Logger log = LoggerFactory.getLogger(ConsumerListener.class); + + @KafkaListener(topics = {"transaction-events"}) + public void onMessage(ConsumerRecord consumerRecord) throws JsonMappingException, JsonProcessingException { + log.info("*************** MICROSERVICE APP TRANSACTION *******************"); + log.info("ConsumerRecord : {}", consumerRecord.value()); + events.processTransactionEvent(consumerRecord); + } +} diff --git a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/model/Transaction.java b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/model/Transaction.java index 1b4dcfb..cab9a7e 100644 --- a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/model/Transaction.java +++ b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/model/Transaction.java @@ -1,20 +1,20 @@ -package com.aforo.model; - -import lombok.Data; -import org.bson.codecs.pojo.annotations.BsonId; -import org.springframework.data.mongodb.core.mapping.Document; - -import java.io.Serializable; -import java.util.Date; - -@Document -@Data -public class Transaction implements Serializable { - - private static final long serialVersionUID = 1L; - @BsonId - private String idTransaction; - private Integer idInvoice; - private Double amount ; - private Date dateTime; -} +package com.aforo.model; + +import lombok.Data; +import org.bson.codecs.pojo.annotations.BsonId; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.io.Serializable; +import java.util.Date; + +@Document +@Data +public class Transaction implements Serializable { + + private static final long serialVersionUID = 1L; + @BsonId + private String idTransaction; + private Integer idInvoice; + private Double amount ; + private Date dateTime; +} diff --git a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/service/TransactionService.java b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/service/TransactionService.java index e92eb45..52123e7 100644 --- a/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/service/TransactionService.java +++ b/pay-app-spring-microservices/app-transaction/src/main/java/com/aforo/service/TransactionService.java @@ -1,19 +1,19 @@ -package com.aforo.service; - -import com.aforo.dao.TransactionDao; -import com.aforo.model.Transaction; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class TransactionService { - - @Autowired - private TransactionDao _dao; - - public List findAllTransaction() { - return _dao.findAll(); - } -} +package com.aforo.service; + +import com.aforo.dao.TransactionDao; +import com.aforo.model.Transaction; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class TransactionService { + + @Autowired + private TransactionDao _dao; + + public List findAllTransaction() { + return _dao.findAll(); + } +} diff --git a/pay-app-spring-microservices/app-transaction/src/main/resources/application.properties b/pay-app-spring-microservices/app-transaction/src/main/resources/application.properties index 8b13789..979c28e 100644 --- a/pay-app-spring-microservices/app-transaction/src/main/resources/application.properties +++ b/pay-app-spring-microservices/app-transaction/src/main/resources/application.properties @@ -1 +1,6 @@ - +# Consul +spring.cloud.consul.host=consul +spring.cloud.consul.port=8500 +spring.cloud.consul.discovery.health-check-interval=5s +spring.cloud.consul.discovery.prefer-ip-address=true +management.endpoints.web.exposure.include=health diff --git a/pay-app-spring-microservices/app-transaction/src/main/resources/bootstrap.properties b/pay-app-spring-microservices/app-transaction/src/main/resources/bootstrap.properties index 2bd5d08..05b35e5 100644 --- a/pay-app-spring-microservices/app-transaction/src/main/resources/bootstrap.properties +++ b/pay-app-spring-microservices/app-transaction/src/main/resources/bootstrap.properties @@ -1,3 +1,3 @@ -spring.application.name=app-transaction -spring.profiles.active=dev -spring.cloud.config.uri=http://app-config:8888 +spring.application.name=app-transaction +spring.profiles.active=dev +spring.cloud.config.uri=http://app-config:8888 diff --git a/pay-app-spring-microservices/app-transaction/src/test/java/com/aforo/AppTransactionApplicationTests.java b/pay-app-spring-microservices/app-transaction/src/test/java/com/aforo/AppTransactionApplicationTests.java index 9416622..f2169dc 100644 --- a/pay-app-spring-microservices/app-transaction/src/test/java/com/aforo/AppTransactionApplicationTests.java +++ b/pay-app-spring-microservices/app-transaction/src/test/java/com/aforo/AppTransactionApplicationTests.java @@ -1,13 +1,13 @@ -package com.aforo; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class AppTransactionApplicationTests { - - @Test - void contextLoads() { - } - -} +package com.aforo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class AppTransactionApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/pay-app-spring-microservices/appgw/gateway.config.yml b/pay-app-spring-microservices/appgw/gateway.config.yml index 1a7f68b..886b509 100644 --- a/pay-app-spring-microservices/appgw/gateway.config.yml +++ b/pay-app-spring-microservices/appgw/gateway.config.yml @@ -1,35 +1,73 @@ -http: - port: 8080 -admin: - port: 9876 - host: localhost -apiEndpoints: - appconfig: - host: localhost - paths: ['/config','/config/*'] -serviceEndpoints: - appconfig: - url: 'http://loadbalancer/config/' -policies: - - basic-auth - - cors - - expression - - key-auth - - log - - oauth2 - - proxy - - rate-limit -pipelines: - default: - apiEndpoints: - - appconfig - policies: - # Uncomment `key-auth:` when instructed to in the Getting Started guide. - - key-auth: - - proxy: - - action: - serviceEndpoint: appconfig - changeOrigin: true - prependPath: false - ignorePath: false - stripPath: false +http: + port: 8080 +admin: + port: 9876 + host: localhost +apiEndpoints: + appconfig: + host: localhost + paths: ['/config','/config/*'] + appinvoice: + host: localhost + paths: ['/invoice','/invoice/*'] + apppay: + host: localhost + paths: ['/pay','/pay/*'] + apptransaction: + host: localhost + paths: ['/transaction','/transaction/*'] +serviceEndpoints: + appconfig: + url: 'http://loadbalancer/config/' + appinvoice: + url: 'http://loadbalancer/invoice/all/' + apppay: + url: 'http://loadbalancer/pay/' + apptransaction: + url: 'http://loadbalancer/transaction/all/' + + +policies: + - basic-auth + - cors + - expression + - key-auth + - log + - oauth2 + - proxy + - rate-limit +pipelines: + default: + apiEndpoints: + - appconfig + - appinvoice + - apptransaction + - apppay + policies: + # Uncomment `key-auth:` when instructed to in the Getting Started guide. + - key-auth: + - proxy: + - action: + serviceEndpoint: appconfig + changeOrigin: true + prependPath: false + ignorePath: false + stripPath: false + - action: + serviceEndpoint: appinvoice + changeOrigin: true + prependPath: false + ignorePath: false + stripPath: false + - action: + serviceEndpoint: apppay + changeOrigin: true + prependPath: false + ignorePath: false + stripPath: false + - action: + serviceEndpoint: apptransaction + changeOrigin: true + prependPath: false + ignorePath: false + stripPath: false diff --git a/pay-app-spring-microservices/appgw/models/applications.json b/pay-app-spring-microservices/appgw/models/applications.json index 8b9c248..df1ed65 100644 --- a/pay-app-spring-microservices/appgw/models/applications.json +++ b/pay-app-spring-microservices/appgw/models/applications.json @@ -1,16 +1,16 @@ -{ - "$id": "http://express-gateway.io/models/applications.json", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "redirectUri": { - "type": "string", - "format": "uri" - } - }, - "required": [ - "name" - ] -} +{ + "$id": "http://express-gateway.io/models/applications.json", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "redirectUri": { + "type": "string", + "format": "uri" + } + }, + "required": [ + "name" + ] +} diff --git a/pay-app-spring-microservices/appgw/models/credentials.json b/pay-app-spring-microservices/appgw/models/credentials.json index 3762505..72bd4d0 100644 --- a/pay-app-spring-microservices/appgw/models/credentials.json +++ b/pay-app-spring-microservices/appgw/models/credentials.json @@ -1,85 +1,85 @@ -{ - "$id": "http://express-gateway.io/models/credentials.json", - "type": "object", - "definitions": { - "credentialBase": { - "type": "object", - "properties": { - "autoGeneratePassword": { - "type": "boolean", - "default": true - }, - "scopes": { - "type": [ - "string", - "array" - ], - "items": { - "type": "string" - } - } - }, - "required": [ - "autoGeneratePassword" - ] - } - }, - "properties": { - "basic-auth": { - "allOf": [ - { - "$ref": "#/definitions/credentialBase" - }, - { - "type": "object", - "properties": { - "passwordKey": { - "type": "string", - "default": "password" - } - }, - "required": [ - "passwordKey" - ] - } - ] - }, - "key-auth": { - "type": "object", - "properties": { - "scopes": { - "type": [ - "string", - "array" - ], - "items": { - "type": "string" - } - } - } - }, - "jwt": { - "type": "object", - "properties": {} - }, - "oauth2": { - "allOf": [ - { - "$ref": "#/definitions/credentialBase" - }, - { - "type": "object", - "properties": { - "passwordKey": { - "type": "string", - "default": "secret" - } - }, - "required": [ - "passwordKey" - ] - } - ] - } - } -} +{ + "$id": "http://express-gateway.io/models/credentials.json", + "type": "object", + "definitions": { + "credentialBase": { + "type": "object", + "properties": { + "autoGeneratePassword": { + "type": "boolean", + "default": true + }, + "scopes": { + "type": [ + "string", + "array" + ], + "items": { + "type": "string" + } + } + }, + "required": [ + "autoGeneratePassword" + ] + } + }, + "properties": { + "basic-auth": { + "allOf": [ + { + "$ref": "#/definitions/credentialBase" + }, + { + "type": "object", + "properties": { + "passwordKey": { + "type": "string", + "default": "password" + } + }, + "required": [ + "passwordKey" + ] + } + ] + }, + "key-auth": { + "type": "object", + "properties": { + "scopes": { + "type": [ + "string", + "array" + ], + "items": { + "type": "string" + } + } + } + }, + "jwt": { + "type": "object", + "properties": {} + }, + "oauth2": { + "allOf": [ + { + "$ref": "#/definitions/credentialBase" + }, + { + "type": "object", + "properties": { + "passwordKey": { + "type": "string", + "default": "secret" + } + }, + "required": [ + "passwordKey" + ] + } + ] + } + } +} diff --git a/pay-app-spring-microservices/appgw/models/users.json b/pay-app-spring-microservices/appgw/models/users.json index 0ad047f..caf4322 100644 --- a/pay-app-spring-microservices/appgw/models/users.json +++ b/pay-app-spring-microservices/appgw/models/users.json @@ -1,28 +1,28 @@ -{ - "$id": "http://express-gateway.io/models/users.json", - "type": "object", - "properties": { - "firstname": { - "type": "string" - }, - "lastname": { - "type": "string" - }, - "username": { - "type": "string" - }, - "email": { - "type": "string", - "format": "email" - }, - "redirectUri": { - "type": "string", - "format": "uri" - } - }, - "required": [ - "username", - "firstname", - "lastname" - ] -} +{ + "$id": "http://express-gateway.io/models/users.json", + "type": "object", + "properties": { + "firstname": { + "type": "string" + }, + "lastname": { + "type": "string" + }, + "username": { + "type": "string" + }, + "email": { + "type": "string", + "format": "email" + }, + "redirectUri": { + "type": "string", + "format": "uri" + } + }, + "required": [ + "username", + "firstname", + "lastname" + ] +} diff --git a/pay-app-spring-microservices/appgw/system.config.yml b/pay-app-spring-microservices/appgw/system.config.yml index 7f3e32a..05124bf 100644 --- a/pay-app-spring-microservices/appgw/system.config.yml +++ b/pay-app-spring-microservices/appgw/system.config.yml @@ -1,27 +1,27 @@ -# Core -db: - redis: - host: express-gateway-data-store - port: 6379 - namespace: EG - -#plugins: - # express-gateway-plugin-example: - # param1: 'param from system.config' - -crypto: - cipherKey: sensitiveKey - algorithm: aes256 - saltRounds: 10 - -# OAuth2 Settings -session: - secret: keyboard cat - resave: false - saveUninitialized: false -accessTokens: - timeToExpiry: 7200000 -refreshTokens: - timeToExpiry: 7200000 -authorizationCodes: - timeToExpiry: 300000 +# Core +db: + redis: + host: express-gateway-data-store + port: 6379 + namespace: EG + +#plugins: + # express-gateway-plugin-example: + # param1: 'param from system.config' + +crypto: + cipherKey: sensitiveKey + algorithm: aes256 + saltRounds: 10 + +# OAuth2 Settings +session: + secret: keyboard cat + resave: false + saveUninitialized: false +accessTokens: + timeToExpiry: 7200000 +refreshTokens: + timeToExpiry: 7200000 +authorizationCodes: + timeToExpiry: 300000 diff --git a/pay-app-spring-microservices/commands.md b/pay-app-spring-microservices/commands.md index 4c7fa26..b64bf56 100644 --- a/pay-app-spring-microservices/commands.md +++ b/pay-app-spring-microservices/commands.md @@ -1,98 +1,98 @@ -docker network create distribuidos -docker run -p 5432:5432 --name postgres --network distribuidos -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=db_invoice -d icesiops/postgres:0.1.0 - -docker run -p 3306:3306 --name mysql --network distribuidos -e MYSQL_ROOT_PASSWORD=mysql -e MYSQL_DATABASE=db_operation -d icesiops/mysql:0.1.0 - -docker run -p 27017:27017 --network distribuidos --name mongodb -d mongo - -docker run -p 2181:2181 -d -p 9092:9092 --name servicekafka --network distribuidos -e ADVERTISED_HOST=servicekafka -e NUM_PARTITIONS=3 johnnypark/kafka-zookeeper - -docker run -d -p 8888:8888 --network distribuidos --name app-config icesiops/appconfig:0.1.0 - -docker run -d -p 8006:8006 --network distribuidos --name app-invoice icesiops/appinvoice:0.1.0 - -docker run -d -p 8010:8010 --network distribuidos --name app-pay icesiops/apppay:0.1.0 - -docker run -d -p 8082:8082 --network distribuidos --name app-transaction icesiops/apptransaction:0.1.0 - -psql -h localhost -d db_invoice -U postgres -f data.sql - -#### consul - -Modify application.properties file according to consul server information. -Add the line implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery' into build.gradle depedencies -Install dnsmasq -Create a config file for dnsmasq below the path /etc/dnsmasq.d -Add the next line server=/consul/127.0.0.1#8600 -start dnsmasq -modifiy resolv.conf to add ip loopback like dns server -run command: dig app-service.service.consul - -docker run -d -p 8500:8500 -p 8600:8600/udp --network distribuidos --name consul consul:latest agent -server -bootstrap-expect 1 -ui -data-dir /tmp -client=0.0.0.0 - -### Load Balancer -Create dockerfile -FROM haproxy:2.3 -COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg - -Create haproxy config -defaults - timeout connect 5s - timeout client 1m - timeout server 1m - -frontend stats - bind *:1936 - mode http - stats uri / - stats show-legends - no log - -frontend http_front - bind *:80 - default_backend http_back - -backend http_back - balance roundrobin - server-template mywebapp 1-10 _web._tcp.service.consul resolvers consul resolve-opts allow-dup-ip resolve-prefer ipv4 check - -resolvers consul - nameserver consul 127.0.0.1:8600 - accepted_payload_size 8192 - hold valid 5s - -docker build -t icesiops/loadbalancer:0.1.0 . - -### Application Gateway - -In order to use Identity features, we need to have a data storage like Redis. - -docker run --network distribuidos -d --name express-gateway-data-store \ - -p 6379:6379 \ - redis:alpine -2. Start the Express-Gateway instance -Run the command inside appgw directory o keep in mind change the volume path to pointing to gateway.config.yml -docker run -d --name express-gateway \ - --network distribuidos \ - -v .:/var/lib/eg \ - -p 8080:8080 \ - -p 9876:9876 \ - express-gateway - -3. uncoment #key-auth -4. connect to gw container -docker exec -it express-gateway sh - -5. create users -eg users create - -6. assign auth key -eg credentials create -c sebas -t key-auth -q - -7. copy key 3DvE2HCfZCyfgxAjF40tOk:2U4Cojm11JaPJF6WRUcFBL - -8. Curl API endpoint as Sebas with key credentials - SUCCESS! - -curl -H "Authorization: apiKey ${keyId}:${keySecret}" http://localhost:8080/config/app-pay/dev - -curl -H "Authorization: apiKey 3DvE2HCfZCyfgxAjF40tOk:2U4Cojm11JaPJF6WRUcFBL" http://localhost:8080/config/app-pay/dev +docker network create distribuidos +docker run -p 5432:5432 --name postgres --network distribuidos -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=db_invoice -d icesiops/postgres:0.1.0 + +docker run -p 3306:3306 --name mysql --network distribuidos -e MYSQL_ROOT_PASSWORD=mysql -e MYSQL_DATABASE=db_operation -d icesiops/mysql:0.1.0 + +docker run -p 27017:27017 --network distribuidos --name mongodb -d mongo + +docker run -p 2181:2181 -d -p 9092:9092 --name servicekafka --network distribuidos -e ADVERTISED_HOST=servicekafka -e NUM_PARTITIONS=3 johnnypark/kafka-zookeeper + +docker run -d -p 8888:8888 --network distribuidos --name app-config icesiops/appconfig:0.1.0 + +docker run -d -p 8006:8006 --network distribuidos --name app-invoice icesiops/appinvoice:0.1.0 + +docker run -d -p 8010:8010 --network distribuidos --name app-pay icesiops/apppay:0.1.0 + +docker run -d -p 8082:8082 --network distribuidos --name app-transaction icesiops/apptransaction:0.1.0 + +psql -h localhost -d db_invoice -U postgres -f data.sql + +#### consul + +Modify application.properties file according to consul server information. +Add the line implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery' into build.gradle depedencies +Install dnsmasq +Create a config file for dnsmasq below the path /etc/dnsmasq.d +Add the next line server=/consul/127.0.0.1#8600 +start dnsmasq +modifiy resolv.conf to add ip loopback like dns server +run command: dig app-service.service.consul + +docker run -d -p 8500:8500 -p 8600:8600/udp --network distribuidos --name consul consul:latest agent -server -bootstrap-expect 1 -ui -data-dir /tmp -client=0.0.0.0 + +### Load Balancer +Create dockerfile +FROM haproxy:2.3 +COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg + +Create haproxy config +defaults + timeout connect 5s + timeout client 1m + timeout server 1m + +frontend stats + bind *:1936 + mode http + stats uri / + stats show-legends + no log + +frontend http_front + bind *:80 + default_backend http_back + +backend http_back + balance roundrobin + server-template mywebapp 1-10 _web._tcp.service.consul resolvers consul resolve-opts allow-dup-ip resolve-prefer ipv4 check + +resolvers consul + nameserver consul 127.0.0.1:8600 + accepted_payload_size 8192 + hold valid 5s + +docker build -t icesiops/loadbalancer:0.1.0 . + +### Application Gateway + +In order to use Identity features, we need to have a data storage like Redis. + +docker run --network distribuidos -d --name express-gateway-data-store \ + -p 6379:6379 \ + redis:alpine +2. Start the Express-Gateway instance +Run the command inside appgw directory o keep in mind change the volume path to pointing to gateway.config.yml +docker run -d --name express-gateway \ + --network distribuidos \ + -v .:/var/lib/eg \ + -p 8080:8080 \ + -p 9876:9876 \ + express-gateway + +3. uncoment #key-auth +4. connect to gw container +docker exec -it express-gateway sh + +5. create users +eg users create + +6. assign auth key +eg credentials create -c sebas -t key-auth -q + +7. copy key 3DvE2HCfZCyfgxAjF40tOk:2U4Cojm11JaPJF6WRUcFBL + +8. Curl API endpoint as Sebas with key credentials - SUCCESS! + +curl -H "Authorization: apiKey ${keyId}:${keySecret}" http://localhost:8080/config/app-pay/dev + +curl -H "Authorization: apiKey 3DvE2HCfZCyfgxAjF40tOk:2U4Cojm11JaPJF6WRUcFBL" http://localhost:8080/config/app-pay/dev diff --git a/pay-app-spring-microservices/config/app-invoice-dev.properties b/pay-app-spring-microservices/config/app-invoice-dev.properties index 23d5f14..2b6f483 100644 --- a/pay-app-spring-microservices/config/app-invoice-dev.properties +++ b/pay-app-spring-microservices/config/app-invoice-dev.properties @@ -1,31 +1,33 @@ -# Server -spring.application.name=app-invoice -server.port=8006 - -# Kafka -spring.kafka.consumer.bootstrap-servers=servicekafka:9092 -spring.kafka.consumer.bootstrap-servers=servicekafka:9092 -spring.kafka.admin.properties.bootstrap.servers=servicekafka:9092 -spring.kafka.admin.properties.bootstrap.servers=servicekafka:9092 -spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.IntegerDeserializer -spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer -spring.kafka.consumer.group-id=invoice-events-listener-group - -# JPA -logging.level.org.hibernate.SQL=debug -spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true -spring.jpa.hibernate.ddl-auto=create - -# Postgresql -spring.datasource.url=jdbc:postgresql://postgres:5432/db_invoice -#spring.datasource.url=jdbc:postgresql://postgres:5432/db_invoice -spring.datasource.username=postgres -spring.datasource.password=postgres -spring.datasource.driver-class-name=org.postgresql.Driver -spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL95Dialect - -# Consul -spring.cloud.consul.host=consul -spring.cloud.consul.port=8500 -spring.cloud.consul.discovery.health-check-interval=5s -spring.cloud.consul.discovery.prefer-ip-address=true +# Server +spring.application.name=app-invoice +server.port=8006 + +# Kafka +spring.kafka.consumer.bootstrap-servers=servicekafka:9092 +#spring.kafka.consumer.bootstrap-servers=servicekafka:9092 +#spring.kafka.admin.properties.bootstrap.servers=servicekafka:9092 +#spring.kafka.admin.properties.bootstrap.servers=servicekafka:9092 +spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.IntegerDeserializer +spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer +spring.kafka.consumer.group-id=invoice-events-listener-group + +# JPA +logging.level.org.hibernate.SQL=debug +spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true +spring.jpa.hibernate.ddl-auto=create + +# Postgresql +spring.datasource.url=jdbc:postgresql://postgres:5432/db_invoice +#spring.datasource.url=jdbc:postgresql://postgres:5432/db_invoice +spring.datasource.username=postgres +spring.datasource.password=postgres +spring.datasource.driver-class-name=org.postgresql.Driver +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL95Dialect + + +# Consul +spring.cloud.consul.host=consul +spring.cloud.consul.port=8500 +spring.cloud.consul.discovery.health-check-interval=5s +spring.cloud.consul.discovery.prefer-ip-address=true +management.endpoints.web.exposure.include=health diff --git a/pay-app-spring-microservices/config/app-pay-dev.properties b/pay-app-spring-microservices/config/app-pay-dev.properties index b7959d8..ce9106c 100644 --- a/pay-app-spring-microservices/config/app-pay-dev.properties +++ b/pay-app-spring-microservices/config/app-pay-dev.properties @@ -1,25 +1,32 @@ -# Server -spring.application.name=app-pay -server.port=8010 - -# Kafka -spring.kafka.template.default-topic=transaction-events -spring.kafka.producer.bootstrap-servers=servicekafka:9092 -#spring.kafka.producer.bootstrap-servers=servicekafka:9092 -spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.IntegerSerializer -spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer -spring.kafka.admin.properties.bootstrap.servers=servicekafka:9092 -#spring.kafka.admin.properties.bootstrap.servers=servicekafka:9092 - -# JPA -logging.level.org.hibernate.SQL=debug -spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true -spring.jpa.hibernate.ddl-auto=create - -# MySQL -spring.datasource.url=jdbc:mysql://mysql:3306/db_operation?serverTimezone=America/Lima&allowPublicKeyRetrieval=true&useSSL=false -#spring.datasource.url=jdbc:mysql://mysql:3306/db_operation?serverTimezone=America/Lima&allowPublicKeyRetrieval=true&useSSL=false -spring.datasource.username=root -spring.datasource.password=mysql -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect \ No newline at end of file +# Server +spring.application.name=app-pay +server.port=8010 + +# Kafka +spring.kafka.template.default-topic=transaction-events +spring.kafka.producer.bootstrap-servers=servicekafka:9092 +#spring.kafka.producer.bootstrap-servers=servicekafka:9092 +spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.IntegerSerializer +spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer +spring.kafka.admin.properties.bootstrap.servers=servicekafka:9092 +#spring.kafka.admin.properties.bootstrap.servers=servicekafka:9092 + +# JPA +logging.level.org.hibernate.SQL=debug +spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true +spring.jpa.hibernate.ddl-auto=create + +# MySQL +spring.datasource.url=jdbc:mysql://mysql:3306/db_operation?serverTimezone=America/Lima&allowPublicKeyRetrieval=true&useSSL=false +#spring.datasource.url=jdbc:mysql://mysql:3306/db_operation?serverTimezone=America/Lima&allowPublicKeyRetrieval=true&useSSL=false +spring.datasource.username=root +spring.datasource.password=mysql +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect + +# Consul +spring.cloud.consul.host=consul +spring.cloud.consul.port=8500 +spring.cloud.consul.discovery.health-check-interval=5s +spring.cloud.consul.discovery.prefer-ip-address=true +management.endpoints.web.exposure.include=health diff --git a/pay-app-spring-microservices/config/app-transaction-dev.properties b/pay-app-spring-microservices/config/app-transaction-dev.properties index 17d29f4..0cd8009 100644 --- a/pay-app-spring-microservices/config/app-transaction-dev.properties +++ b/pay-app-spring-microservices/config/app-transaction-dev.properties @@ -1,16 +1,23 @@ -# Server -spring.application.name=app-transaction -server.port=8082 - -# Kafka -spring.kafka.consumer.bootstrap-servers=servicekafka:9092 -#spring.kafka.consumer.bootstrap-servers=servicekafka:9092 -spring.kafka.admin.properties.bootstrap.servers=servicekafka:9092 -#spring.kafka.admin.properties.bootstrap.servers=servicekafka:9092 -spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.IntegerDeserializer -spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer -spring.kafka.consumer.group-id=transaction-events-listener-group - -# MongoDB -spring.data.mongodb.uri=mongodb://mongodb:27017/db_transaction -#spring.data.mongodb.uri=mongodb://mongodb:27017/db_transaction \ No newline at end of file +# Server +spring.application.name=app-transaction +server.port=8082 + +# Kafka +spring.kafka.consumer.bootstrap-servers=servicekafka:9092 +#spring.kafka.consumer.bootstrap-servers=servicekafka:9092 +#spring.kafka.admin.properties.bootstrap.servers=servicekafka:9092 +#spring.kafka.admin.properties.bootstrap.servers=servicekafka:9092 +spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.IntegerDeserializer +spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer +spring.kafka.consumer.group-id=transaction-events-listener-group + +# MongoDB +spring.data.mongodb.uri=mongodb://mongodb:27017/db_transaction +#spring.data.mongodb.uri=mongodb://mongodb:27017/db_transaction + +# Consul +spring.cloud.consul.host=consul +spring.cloud.consul.port=8500 +spring.cloud.consul.discovery.health-check-interval=5s +spring.cloud.consul.discovery.prefer-ip-address=true +management.endpoints.web.exposure.include=health diff --git a/pay-app-spring-microservices/haproxy/Dockerfile b/pay-app-spring-microservices/haproxy/Dockerfile index 9e9a3ad..2627434 100644 --- a/pay-app-spring-microservices/haproxy/Dockerfile +++ b/pay-app-spring-microservices/haproxy/Dockerfile @@ -1,2 +1,2 @@ -FROM haproxy:2.3 +FROM haproxy:2.3 COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg \ No newline at end of file diff --git a/pay-app-spring-microservices/haproxy/haproxy.cfg b/pay-app-spring-microservices/haproxy/haproxy.cfg index 3b54b0c..d1275b0 100644 --- a/pay-app-spring-microservices/haproxy/haproxy.cfg +++ b/pay-app-spring-microservices/haproxy/haproxy.cfg @@ -1,34 +1,60 @@ -defaults - timeout connect 5s - timeout client 1m - timeout server 1m - -frontend stats - bind *:1936 - mode http - stats uri / - stats show-legends - no log - -frontend http_front - bind *:80 - mode http - acl url_config path_beg /config - use_backend config_back if url_config - - default_backend http_back - -backend config_back - mode http - balance roundrobin - http-request set-path "%[path,regsub(^/config/,/)]" - server appconfig app-config.service.consul:8888 resolvers consul resolve-prefer ipv4 check -backend http_back - mode http - balance roundrobin - server-template mywebapp 1-10 _web._tcp.service.consul resolvers consul resolve-prefer ipv4 check - -resolvers consul - nameserver consul consul:8600 - accepted_payload_size 8192 - hold valid 5s +defaults + timeout connect 5s + timeout client 1m + timeout server 1m + +frontend stats + bind *:1936 + mode http + stats uri / + stats show-legends + no log + +frontend http_front + bind *:80 + mode http + acl url_config path_beg /config + acl url_invoice path_beg /invoice + acl url_pay path_beg /pay + acl url_transaction path_beg /transaction + + use_backend config_back if url_config + use_backend invoice_back if url_invoice + use_backend pay_back if url_pay + use_backend transaction_back if url_transaction + + default_backend http_back + +backend config_back + mode http + balance roundrobin + http-request set-path "%[path,regsub(^/config/,/)]" + server appconfig app-config.service.consul:8888 resolvers consul resolve-prefer ipv4 check + +backend invoice_back + mode http + balance roundrobin + http-request set-path "%[path,regsub(^/invoice/,/)]" + server appinvoice app-invoice.service.consul:8006 resolvers consul resolve-prefer ipv4 check + +backend pay_back + mode http + balance roundrobin + http-request set-path "%[path,regsub(^/pay/,/)]" + server appinvoice app-pay.service.consul:8010 resolvers consul resolve-prefer ipv4 check + +backend transaction_back + mode http + balance roundrobin + http-request set-path "%[path,regsub(^/transaction/,/)]" + server appinvoice app-transaction.service.consul:8082 resolvers consul resolve-prefer ipv4 check + +backend http_back + mode http + balance roundrobin + server-template mywebapp 1-10 _web._tcp.service.consul resolvers consul resolve-prefer ipv4 check + +resolvers consul + nameserver consul consul:8600 + accepted_payload_size 8192 + hold valid 5s diff --git a/pay-app-spring-microservices/resources/DB.md b/pay-app-spring-microservices/resources/DB.md index 231dbb3..0697bb4 100644 --- a/pay-app-spring-microservices/resources/DB.md +++ b/pay-app-spring-microservices/resources/DB.md @@ -1,54 +1,54 @@ -# Endpoints - -A continuacion se detallan los scripts para la creación de las bases de datos respectivas para los microservicios - - -## PostgreSQL - -1. Levantar docker de PostgreSQL (Al levantar el docker automaticamente se incluye la base de datos a crear) -``` -$ docker run -p 5434:5432 --name postgres --network aforo255-test -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=db_invoice -d postgres:12-alpine -``` - -2. Si se desea agregar nueva base de datos se debe ingresar al docker de Postgres y crear la base: -``` -$ docker exec -it postgres bash -$ psql -U postgres -$ CREATE TABLE db_invoice; -``` - -3. Conectarse a la base de datos desde cualquier cliente SQL (Ejemplo: Dbeaver) y ejecutar el script: -``` -CREATE TABLE IF NOT EXISTS invoice -( - id_invoice integer not null, - amount numeric, - state integer, - primary key (id_invoice) -); -``` - -## MySQL - -1. Levantar docker de MySQL (Al levantar el docker automaticamente se incluye la base de datos a crear) -``` -$ docker run -p 3307:3306 --name microservicio-mysql8 --network aforo255-test -e MYSQL_ROOT_PASSWORD=mysql -e MYSQL_DATABASE=db_operation -d mysql:8 -``` - -2. Conectarse a la base de datos desde cualquier cliente SQL (Ejemplo: Dbeaver) y ejecutar el script: -``` -CREATE TABLE pay -( - id_invoice integer not null, - amount numeric, - state integer, - primary key (id_invoice) -); -``` - -## MongoDB - -1. Levantar docker de MongoDB (Al levantar el microservicio y almacenar un registro se crea automaticamente la coleccion en mongo) -``` -$ docker run -p 27018:27017 --network aforo255-test --name mongodb -d mongo +# Endpoints + +A continuacion se detallan los scripts para la creación de las bases de datos respectivas para los microservicios + + +## PostgreSQL + +1. Levantar docker de PostgreSQL (Al levantar el docker automaticamente se incluye la base de datos a crear) +``` +$ docker run -p 5434:5432 --name postgres --network aforo255-test -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=db_invoice -d postgres:12-alpine +``` + +2. Si se desea agregar nueva base de datos se debe ingresar al docker de Postgres y crear la base: +``` +$ docker exec -it postgres bash +$ psql -U postgres +$ CREATE TABLE db_invoice; +``` + +3. Conectarse a la base de datos desde cualquier cliente SQL (Ejemplo: Dbeaver) y ejecutar el script: +``` +CREATE TABLE IF NOT EXISTS invoice +( + id_invoice integer not null, + amount numeric, + state integer, + primary key (id_invoice) +); +``` + +## MySQL + +1. Levantar docker de MySQL (Al levantar el docker automaticamente se incluye la base de datos a crear) +``` +$ docker run -p 3307:3306 --name microservicio-mysql8 --network aforo255-test -e MYSQL_ROOT_PASSWORD=mysql -e MYSQL_DATABASE=db_operation -d mysql:8 +``` + +2. Conectarse a la base de datos desde cualquier cliente SQL (Ejemplo: Dbeaver) y ejecutar el script: +``` +CREATE TABLE pay +( + id_invoice integer not null, + amount numeric, + state integer, + primary key (id_invoice) +); +``` + +## MongoDB + +1. Levantar docker de MongoDB (Al levantar el microservicio y almacenar un registro se crea automaticamente la coleccion en mongo) +``` +$ docker run -p 27018:27017 --network aforo255-test --name mongodb -d mongo ``` \ No newline at end of file diff --git a/pay-app-spring-microservices/resources/INFO.md b/pay-app-spring-microservices/resources/INFO.md index 7bfc0c1..b971fce 100644 --- a/pay-app-spring-microservices/resources/INFO.md +++ b/pay-app-spring-microservices/resources/INFO.md @@ -1,63 +1,63 @@ -# Endpoints - -A continuacion se detallan los endpoints y se adjuntan los Curl respectivos de cada microservicio para cumplir con las funcionalidad del trabajo - - -## Microservicios - -#### app-config - -Microservicio que se encarga de manejar las configuraciones de los microservicios, las configuraciones están en el siguiente directorio: - -[Configuraciones](https://github.com/icesi-ops/training_microservices.git) - -Endpoints para consultar configuraciones de los microservicios: - -* Curl consultar las configuraciones de los microservicios almacenadas en el repositorio -``` -curl --location --request GET 'http://localhost:8888/app-pay/dev' - -curl --location --request GET 'http://localhost:8888/app-invoice/dev' - -curl --location --request GET 'http://localhost:8888/app-transaction/dev' -``` - -#### app-pay - -Microservicio que se encarga de registrar los pagos de una factura - -[Dockerfile](https://github.com/icesi-ops/training_microservices.git) - -* Curl del servicio para registrar pagos -``` -curl --location --request POST 'http://localhost:8010/pay' \ ---header 'Content-Type: application/json' \ ---data-raw '{ - "idOperation": 1, - "idInvoice": 1, - "amount": 900, - "dateTime": "2021-05-21" -}' -``` - -#### app-inovice - -Microservicio que se encarga de obtener los mensajes de kafka y actualizar el estado de una factura segun el pago registrado - -[Dockerfile](https://github.com/icesi-ops/training_microservices.git) - -* Curl del servicio para obtener el detalle de todos los invoices -``` -curl --location --request GET 'http://localhost:8006/all' -``` - -#### app-transaction - -Microservicio que se encarga de obtener los mensajes de kafka y registrar las transacciones que se realizan con el pago de las facturas - -[Dockerfile](https://github.com/icesi-ops/training_microservices.git) - -* Curl del servicio para obtener el detalle de todos los invoices -``` -curl --location --request GET 'http://localhost:8082/all' -``` +# Endpoints + +A continuacion se detallan los endpoints y se adjuntan los Curl respectivos de cada microservicio para cumplir con las funcionalidad del trabajo + + +## Microservicios + +#### app-config + +Microservicio que se encarga de manejar las configuraciones de los microservicios, las configuraciones están en el siguiente directorio: + +[Configuraciones](https://github.com/icesi-ops/training_microservices.git) + +Endpoints para consultar configuraciones de los microservicios: + +* Curl consultar las configuraciones de los microservicios almacenadas en el repositorio +``` +curl --location --request GET 'http://localhost:8888/app-pay/dev' + +curl --location --request GET 'http://localhost:8888/app-invoice/dev' + +curl --location --request GET 'http://localhost:8888/app-transaction/dev' +``` + +#### app-pay + +Microservicio que se encarga de registrar los pagos de una factura + +[Dockerfile](https://github.com/icesi-ops/training_microservices.git) + +* Curl del servicio para registrar pagos +``` +curl --location --request POST 'http://localhost:8010/pay' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "idOperation": 1, + "idInvoice": 1, + "amount": 900, + "dateTime": "2021-05-21" +}' +``` + +#### app-inovice + +Microservicio que se encarga de obtener los mensajes de kafka y actualizar el estado de una factura segun el pago registrado + +[Dockerfile](https://github.com/icesi-ops/training_microservices.git) + +* Curl del servicio para obtener el detalle de todos los invoices +``` +curl --location --request GET 'http://localhost:8006/all' +``` + +#### app-transaction + +Microservicio que se encarga de obtener los mensajes de kafka y registrar las transacciones que se realizan con el pago de las facturas + +[Dockerfile](https://github.com/icesi-ops/training_microservices.git) + +* Curl del servicio para obtener el detalle de todos los invoices +``` +curl --location --request GET 'http://localhost:8082/all' +``` diff --git a/pay-app-spring-microservices/resources/microservicesarchitecture.png b/pay-app-spring-microservices/resources/microservicesarchitecture.png old mode 100755 new mode 100644 diff --git a/pay-app-spring-microservices/resources/mysql/Dockerfile b/pay-app-spring-microservices/resources/mysql/Dockerfile index 32bc267..60cba68 100644 --- a/pay-app-spring-microservices/resources/mysql/Dockerfile +++ b/pay-app-spring-microservices/resources/mysql/Dockerfile @@ -1,6 +1,6 @@ -FROM mysql:8 - -env MYSQL_ROOT_PASSWORD=MYSQL -env MYSQL_DATABASE=db_operation -COPY ./mysql.sql /docker-entrypoint-initdb.d - +FROM mysql:8 + +env MYSQL_ROOT_PASSWORD=MYSQL +env MYSQL_DATABASE=db_operation +COPY ./mysql.sql /docker-entrypoint-initdb.d + diff --git a/pay-app-spring-microservices/resources/mysql/mysql.sql b/pay-app-spring-microservices/resources/mysql/mysql.sql index 37a094a..2a5f6fa 100644 --- a/pay-app-spring-microservices/resources/mysql/mysql.sql +++ b/pay-app-spring-microservices/resources/mysql/mysql.sql @@ -1,6 +1,6 @@ -CREATE TABLE pay ( - id_invoice integer not null, - amount numeric, - state integer, - primary key (id_invoice) +CREATE TABLE pay ( + id_invoice integer not null, + amount numeric, + state integer, + primary key (id_invoice) ); \ No newline at end of file diff --git a/pay-app-spring-microservices/resources/postgres/Dockerfile b/pay-app-spring-microservices/resources/postgres/Dockerfile index 450d83f..c1a13e4 100644 --- a/pay-app-spring-microservices/resources/postgres/Dockerfile +++ b/pay-app-spring-microservices/resources/postgres/Dockerfile @@ -1,6 +1,6 @@ -FROM postgres:12-alpine - -env POSTGRES_PASSWORD=postgres -env POSTGRES_DB=db_invoice -COPY ./postgres.sql /docker-entrypoint-initdb.d - +FROM postgres:12-alpine + +env POSTGRES_PASSWORD=postgres +env POSTGRES_DB=db_invoice +COPY ./postgres.sql /docker-entrypoint-initdb.d + diff --git a/pay-app-spring-microservices/resources/postgres/data.sql b/pay-app-spring-microservices/resources/postgres/data.sql index dac1339..3197fc3 100644 --- a/pay-app-spring-microservices/resources/postgres/data.sql +++ b/pay-app-spring-microservices/resources/postgres/data.sql @@ -1,5 +1,5 @@ -INSERT INTO invoice(id_invoice, amount, state) VALUES(1, 1000, 0); -INSERT INTO invoice(id_invoice, amount, state) VALUES(2, 5000, 1); -INSERT INTO invoice(id_invoice, amount, state) VALUES(3, 300, 0); -INSERT INTO invoice(id_invoice, amount, state) VALUES(4, 600, 0); +INSERT INTO invoice(id_invoice, amount, state) VALUES(1, 1000, 0); +INSERT INTO invoice(id_invoice, amount, state) VALUES(2, 5000, 1); +INSERT INTO invoice(id_invoice, amount, state) VALUES(3, 300, 0); +INSERT INTO invoice(id_invoice, amount, state) VALUES(4, 600, 0); INSERT INTO invoice(id_invoice, amount, state) VALUES(5, 400, 0); \ No newline at end of file diff --git a/pay-app-spring-microservices/resources/postgres/postgres.sql b/pay-app-spring-microservices/resources/postgres/postgres.sql index 3ffced7..f1dbb31 100644 --- a/pay-app-spring-microservices/resources/postgres/postgres.sql +++ b/pay-app-spring-microservices/resources/postgres/postgres.sql @@ -1,5 +1,5 @@ -CREATE TABLE IF NOT EXISTS invoice ( - id_invoice integer GENERATED by default as IDENTITY PRIMARY KEY, - amount numeric, - state integer -) +CREATE TABLE IF NOT EXISTS invoice ( + id_invoice integer GENERATED by default as IDENTITY PRIMARY KEY, + amount numeric, + state integer +)