sk_fems_apigw commit
This commit is contained in:
49
.classpath
Normal file
49
.classpath
Normal file
@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" output="target/classes" path="src/main/java">
|
||||
<attributes>
|
||||
<attribute name="optional" value="true"/>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
|
||||
<attributes>
|
||||
<attribute name="optional" value="true"/>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
<attribute name="test" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
|
||||
<attributes>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="src" path="target/generated-sources/annotations">
|
||||
<attributes>
|
||||
<attribute name="optional" value="true"/>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
<attribute name="ignore_optional_problems" value="true"/>
|
||||
<attribute name="m2e-apt" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
|
||||
<attributes>
|
||||
<attribute name="optional" value="true"/>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
<attribute name="ignore_optional_problems" value="true"/>
|
||||
<attribute name="m2e-apt" value="true"/>
|
||||
<attribute name="test" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="output" path="target/classes"/>
|
||||
</classpath>
|
37
.gitignore
vendored
Normal file
37
.gitignore
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
HELP.md
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### STS ###
|
||||
#.apt_generated
|
||||
#.classpath
|
||||
.factorypath
|
||||
.project
|
||||
#.settings
|
||||
#.springBeans
|
||||
#.sts4-cache
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac File ###
|
||||
./DS_Store
|
||||
*.log
|
42
.gitlab-ci.yml
Normal file
42
.gitlab-ci.yml
Normal file
@ -0,0 +1,42 @@
|
||||
services:
|
||||
- docker:19.03.7-dind
|
||||
stages:
|
||||
- build_jar
|
||||
- build_docker_image
|
||||
|
||||
build:
|
||||
image: maven:3.6.3-jdk-11-slim
|
||||
stage: build_jar
|
||||
script:
|
||||
# maven build
|
||||
- echo "=====maven build start====="
|
||||
- mvn clean install
|
||||
- echo "=====maven build end====="
|
||||
tags:
|
||||
- test
|
||||
|
||||
|
||||
docker-build:
|
||||
variables:
|
||||
# do not clone again
|
||||
GIT_STRATEGY: none
|
||||
stage: build_docker_image
|
||||
script:
|
||||
# make docker image and push to local docker
|
||||
- echo "=====make docker image and push to local docker start====="
|
||||
- sudo docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
|
||||
- sudo docker build -t $CI_REGISTRY/root/registry/skfems/apigw .
|
||||
- echo "=====make docker image and push to local docker end====="
|
||||
# push local image to local registry
|
||||
- echo "=====push local image to local registry start====="
|
||||
- sudo docker push $CI_REGISTRY/root/registry/skfems/apigw
|
||||
- sudo docker rmi $CI_REGISTRY/root/registry/skfems/apigw
|
||||
- echo "=====push local image to local registry end====="
|
||||
# comm.base 모듈 분리 배포
|
||||
- echo "=====node build_docker_image comm.base module start====="
|
||||
- sudo docker build -f Dockerfile.keti -t $CI_REGISTRY/root/registry/skfems/apigw_keti .
|
||||
- sudo docker push $CI_REGISTRY/root/registry/skfems/apigw_keti
|
||||
- sudo docker rmi $CI_REGISTRY/root/registry/skfems/apigw_keti
|
||||
- echo "=====node build_docker_image comm module end====="
|
||||
tags:
|
||||
- test
|
117
.mvn/wrapper/MavenWrapperDownloader.java
vendored
Normal file
117
.mvn/wrapper/MavenWrapperDownloader.java
vendored
Normal file
@ -0,0 +1,117 @@
|
||||
/*
|
||||
* Copyright 2007-present the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import java.net.*;
|
||||
import java.io.*;
|
||||
import java.nio.channels.*;
|
||||
import java.util.Properties;
|
||||
|
||||
public class MavenWrapperDownloader {
|
||||
|
||||
private static final String WRAPPER_VERSION = "0.5.6";
|
||||
/**
|
||||
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
|
||||
*/
|
||||
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
|
||||
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
|
||||
|
||||
/**
|
||||
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
|
||||
* use instead of the default one.
|
||||
*/
|
||||
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
|
||||
".mvn/wrapper/maven-wrapper.properties";
|
||||
|
||||
/**
|
||||
* Path where the maven-wrapper.jar will be saved to.
|
||||
*/
|
||||
private static final String MAVEN_WRAPPER_JAR_PATH =
|
||||
".mvn/wrapper/maven-wrapper.jar";
|
||||
|
||||
/**
|
||||
* Name of the property which should be used to override the default download url for the wrapper.
|
||||
*/
|
||||
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
|
||||
|
||||
public static void main(String args[]) {
|
||||
System.out.println("- Downloader started");
|
||||
File baseDirectory = new File(args[0]);
|
||||
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
|
||||
|
||||
// If the maven-wrapper.properties exists, read it and check if it contains a custom
|
||||
// wrapperUrl parameter.
|
||||
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
|
||||
String url = DEFAULT_DOWNLOAD_URL;
|
||||
if(mavenWrapperPropertyFile.exists()) {
|
||||
FileInputStream mavenWrapperPropertyFileInputStream = null;
|
||||
try {
|
||||
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
|
||||
Properties mavenWrapperProperties = new Properties();
|
||||
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
|
||||
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
|
||||
} catch (IOException e) {
|
||||
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
|
||||
} finally {
|
||||
try {
|
||||
if(mavenWrapperPropertyFileInputStream != null) {
|
||||
mavenWrapperPropertyFileInputStream.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
// Ignore ...
|
||||
}
|
||||
}
|
||||
}
|
||||
System.out.println("- Downloading from: " + url);
|
||||
|
||||
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
|
||||
if(!outputFile.getParentFile().exists()) {
|
||||
if(!outputFile.getParentFile().mkdirs()) {
|
||||
System.out.println(
|
||||
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
|
||||
}
|
||||
}
|
||||
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
|
||||
try {
|
||||
downloadFileFromURL(url, outputFile);
|
||||
System.out.println("Done");
|
||||
System.exit(0);
|
||||
} catch (Throwable e) {
|
||||
System.out.println("- Error downloading");
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
|
||||
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
|
||||
String username = System.getenv("MVNW_USERNAME");
|
||||
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
|
||||
Authenticator.setDefault(new Authenticator() {
|
||||
@Override
|
||||
protected PasswordAuthentication getPasswordAuthentication() {
|
||||
return new PasswordAuthentication(username, password);
|
||||
}
|
||||
});
|
||||
}
|
||||
URL website = new URL(urlString);
|
||||
ReadableByteChannel rbc;
|
||||
rbc = Channels.newChannel(website.openStream());
|
||||
FileOutputStream fos = new FileOutputStream(destination);
|
||||
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
||||
fos.close();
|
||||
rbc.close();
|
||||
}
|
||||
|
||||
}
|
BIN
.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
BIN
.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
Binary file not shown.
2
.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
2
.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
|
||||
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
|
5
.settings/org.eclipse.core.resources.prefs
Normal file
5
.settings/org.eclipse.core.resources.prefs
Normal file
@ -0,0 +1,5 @@
|
||||
eclipse.preferences.version=1
|
||||
encoding//src/main/java=UTF-8
|
||||
encoding//src/main/resources=UTF-8
|
||||
encoding//src/test/java=UTF-8
|
||||
encoding/<project>=UTF-8
|
4
.settings/org.eclipse.jdt.apt.core.prefs
Normal file
4
.settings/org.eclipse.jdt.apt.core.prefs
Normal file
@ -0,0 +1,4 @@
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.apt.aptEnabled=true
|
||||
org.eclipse.jdt.apt.genSrcDir=target\\generated-sources\\annotations
|
||||
org.eclipse.jdt.apt.genTestSrcDir=target\\generated-test-sources\\test-annotations
|
17
.settings/org.eclipse.jdt.core.prefs
Normal file
17
.settings/org.eclipse.jdt.core.prefs
Normal file
@ -0,0 +1,17 @@
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||
org.eclipse.jdt.core.compiler.codegen.methodParameters=generate
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
|
||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
|
||||
org.eclipse.jdt.core.compiler.processAnnotations=enabled
|
||||
org.eclipse.jdt.core.compiler.release=disabled
|
||||
org.eclipse.jdt.core.compiler.source=1.8
|
4
.settings/org.eclipse.m2e.core.prefs
Normal file
4
.settings/org.eclipse.m2e.core.prefs
Normal file
@ -0,0 +1,4 @@
|
||||
activeProfiles=
|
||||
eclipse.preferences.version=1
|
||||
resolveWorkspaceProjects=true
|
||||
version=1
|
2
.settings/org.springframework.ide.eclipse.prefs
Normal file
2
.settings/org.springframework.ide.eclipse.prefs
Normal file
@ -0,0 +1,2 @@
|
||||
boot.validation.initialized=true
|
||||
eclipse.preferences.version=1
|
13
Dockerfile
Normal file
13
Dockerfile
Normal file
@ -0,0 +1,13 @@
|
||||
# Build stage
|
||||
FROM maven:3.6.0-jdk-11-slim AS build
|
||||
COPY src /app/src
|
||||
COPY pom.xml /app
|
||||
RUN mvn -f /app/pom.xml clean install -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
|
||||
|
||||
# Package stage
|
||||
FROM openjdk:11-jre-slim
|
||||
COPY --from=build /app/target/*.jar /usr/local/lib/apigw.jar
|
||||
EXPOSE 9999
|
||||
ENV SPRING_PROFILES_ACTIVE cloud_kube
|
||||
ENV SYS_SETTING ""
|
||||
ENTRYPOINT ["java","-jar","/usr/local/lib/apigw.jar", "--spring.profiles.active=${SPRING_PROFILES_ACTIVE}", "${SYS_SETTING}"]
|
13
Dockerfile.keti
Normal file
13
Dockerfile.keti
Normal file
@ -0,0 +1,13 @@
|
||||
# Build stage
|
||||
FROM maven:3.6.0-jdk-11-slim AS build
|
||||
COPY src /app/src
|
||||
COPY pom.xml /app
|
||||
RUN mvn -f /app/pom.xml clean install -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
|
||||
|
||||
# Package stage
|
||||
FROM openjdk:11-jre-slim
|
||||
COPY --from=build /app/target/*.jar /usr/local/lib/apigw.jar
|
||||
EXPOSE 9999
|
||||
ENV SPRING_PROFILES_ACTIVE docker
|
||||
ENV SYS_SETTING ""
|
||||
ENTRYPOINT ["java","-jar","/usr/local/lib/apigw.jar", "--spring.profiles.active=${SPRING_PROFILES_ACTIVE}", "${SYS_SETTING}"]
|
310
mvnw
vendored
Normal file
310
mvnw
vendored
Normal file
@ -0,0 +1,310 @@
|
||||
#!/bin/sh
|
||||
# ----------------------------------------------------------------------------
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Maven Start Up Batch script
|
||||
#
|
||||
# Required ENV vars:
|
||||
# ------------------
|
||||
# JAVA_HOME - location of a JDK home dir
|
||||
#
|
||||
# Optional ENV vars
|
||||
# -----------------
|
||||
# M2_HOME - location of maven2's installed home dir
|
||||
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
# e.g. to debug Maven itself, use
|
||||
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
if [ -z "$MAVEN_SKIP_RC" ] ; then
|
||||
|
||||
if [ -f /etc/mavenrc ] ; then
|
||||
. /etc/mavenrc
|
||||
fi
|
||||
|
||||
if [ -f "$HOME/.mavenrc" ] ; then
|
||||
. "$HOME/.mavenrc"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
# OS specific support. $var _must_ be set to either true or false.
|
||||
cygwin=false;
|
||||
darwin=false;
|
||||
mingw=false
|
||||
case "`uname`" in
|
||||
CYGWIN*) cygwin=true ;;
|
||||
MINGW*) mingw=true;;
|
||||
Darwin*) darwin=true
|
||||
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
|
||||
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
if [ -x "/usr/libexec/java_home" ]; then
|
||||
export JAVA_HOME="`/usr/libexec/java_home`"
|
||||
else
|
||||
export JAVA_HOME="/Library/Java/Home"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
if [ -r /etc/gentoo-release ] ; then
|
||||
JAVA_HOME=`java-config --jre-home`
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$M2_HOME" ] ; then
|
||||
## resolve links - $0 may be a link to maven's home
|
||||
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
|
||||
done
|
||||
|
||||
saveddir=`pwd`
|
||||
|
||||
M2_HOME=`dirname "$PRG"`/..
|
||||
|
||||
# make it fully qualified
|
||||
M2_HOME=`cd "$M2_HOME" && pwd`
|
||||
|
||||
cd "$saveddir"
|
||||
# echo Using m2 at $M2_HOME
|
||||
fi
|
||||
|
||||
# For Cygwin, ensure paths are in UNIX format before anything is touched
|
||||
if $cygwin ; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME=`cygpath --unix "$M2_HOME"`
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
|
||||
fi
|
||||
|
||||
# For Mingw, ensure paths are in UNIX format before anything is touched
|
||||
if $mingw ; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME="`(cd "$M2_HOME"; pwd)`"
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
javaExecutable="`which javac`"
|
||||
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
|
||||
# readlink(1) is not available as standard on Solaris 10.
|
||||
readLink=`which readlink`
|
||||
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
|
||||
if $darwin ; then
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
|
||||
else
|
||||
javaExecutable="`readlink -f \"$javaExecutable\"`"
|
||||
fi
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
|
||||
JAVA_HOME="$javaHome"
|
||||
export JAVA_HOME
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$JAVACMD" ] ; then
|
||||
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
|
||||
else
|
||||
JAVACMD="`which java`"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
echo "Error: JAVA_HOME is not defined correctly." >&2
|
||||
echo " We cannot execute $JAVACMD" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
echo "Warning: JAVA_HOME environment variable is not set."
|
||||
fi
|
||||
|
||||
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
|
||||
|
||||
# traverses directory structure from process work directory to filesystem root
|
||||
# first directory with .mvn subdirectory is considered project base directory
|
||||
find_maven_basedir() {
|
||||
|
||||
if [ -z "$1" ]
|
||||
then
|
||||
echo "Path not specified to find_maven_basedir"
|
||||
return 1
|
||||
fi
|
||||
|
||||
basedir="$1"
|
||||
wdir="$1"
|
||||
while [ "$wdir" != '/' ] ; do
|
||||
if [ -d "$wdir"/.mvn ] ; then
|
||||
basedir=$wdir
|
||||
break
|
||||
fi
|
||||
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
|
||||
if [ -d "${wdir}" ]; then
|
||||
wdir=`cd "$wdir/.."; pwd`
|
||||
fi
|
||||
# end of workaround
|
||||
done
|
||||
echo "${basedir}"
|
||||
}
|
||||
|
||||
# concatenates all lines of a file
|
||||
concat_lines() {
|
||||
if [ -f "$1" ]; then
|
||||
echo "$(tr -s '\n' ' ' < "$1")"
|
||||
fi
|
||||
}
|
||||
|
||||
BASE_DIR=`find_maven_basedir "$(pwd)"`
|
||||
if [ -z "$BASE_DIR" ]; then
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
##########################################################################################
|
||||
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
# This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
##########################################################################################
|
||||
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found .mvn/wrapper/maven-wrapper.jar"
|
||||
fi
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
|
||||
fi
|
||||
if [ -n "$MVNW_REPOURL" ]; then
|
||||
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
else
|
||||
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
fi
|
||||
while IFS="=" read key value; do
|
||||
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
|
||||
esac
|
||||
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Downloading from: $jarUrl"
|
||||
fi
|
||||
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
|
||||
if $cygwin; then
|
||||
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
|
||||
fi
|
||||
|
||||
if command -v wget > /dev/null; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found wget ... using wget"
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
wget "$jarUrl" -O "$wrapperJarPath"
|
||||
else
|
||||
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
|
||||
fi
|
||||
elif command -v curl > /dev/null; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found curl ... using curl"
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
curl -o "$wrapperJarPath" "$jarUrl" -f
|
||||
else
|
||||
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
|
||||
fi
|
||||
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Falling back to using Java to download"
|
||||
fi
|
||||
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
|
||||
# For Cygwin, switch paths to Windows format before running javac
|
||||
if $cygwin; then
|
||||
javaClass=`cygpath --path --windows "$javaClass"`
|
||||
fi
|
||||
if [ -e "$javaClass" ]; then
|
||||
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Compiling MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
# Compiling the Java class
|
||||
("$JAVA_HOME/bin/javac" "$javaClass")
|
||||
fi
|
||||
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||
# Running the downloader
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Running MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
##########################################################################################
|
||||
# End of extension
|
||||
##########################################################################################
|
||||
|
||||
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo $MAVEN_PROJECTBASEDIR
|
||||
fi
|
||||
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME=`cygpath --path --windows "$M2_HOME"`
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
|
||||
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
|
||||
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
|
||||
fi
|
||||
|
||||
# Provide a "standardized" way to retrieve the CLI args that will
|
||||
# work with both Windows and non-Windows executions.
|
||||
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
|
||||
export MAVEN_CMD_LINE_ARGS
|
||||
|
||||
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
exec "$JAVACMD" \
|
||||
$MAVEN_OPTS \
|
||||
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
|
||||
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
|
||||
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
|
182
mvnw.cmd
vendored
Normal file
182
mvnw.cmd
vendored
Normal file
@ -0,0 +1,182 @@
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Licensed to the Apache Software Foundation (ASF) under one
|
||||
@REM or more contributor license agreements. See the NOTICE file
|
||||
@REM distributed with this work for additional information
|
||||
@REM regarding copyright ownership. The ASF licenses this file
|
||||
@REM to you under the Apache License, Version 2.0 (the
|
||||
@REM "License"); you may not use this file except in compliance
|
||||
@REM with the License. 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,
|
||||
@REM software distributed under the License is distributed on an
|
||||
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
@REM KIND, either express or implied. See the License for the
|
||||
@REM specific language governing permissions and limitations
|
||||
@REM under the License.
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Maven Start Up Batch script
|
||||
@REM
|
||||
@REM Required ENV vars:
|
||||
@REM JAVA_HOME - location of a JDK home dir
|
||||
@REM
|
||||
@REM Optional ENV vars
|
||||
@REM M2_HOME - location of maven2's installed home dir
|
||||
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
|
||||
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
|
||||
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
@REM e.g. to debug Maven itself, use
|
||||
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
|
||||
@echo off
|
||||
@REM set title of command window
|
||||
title %0
|
||||
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
|
||||
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
|
||||
|
||||
@REM set %HOME% to equivalent of $HOME
|
||||
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
|
||||
|
||||
@REM Execute a user defined script before this one
|
||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
|
||||
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
|
||||
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
|
||||
:skipRcPre
|
||||
|
||||
@setlocal
|
||||
|
||||
set ERROR_CODE=0
|
||||
|
||||
@REM To isolate internal variables from possible post scripts, we use another setlocal
|
||||
@setlocal
|
||||
|
||||
@REM ==== START VALIDATION ====
|
||||
if not "%JAVA_HOME%" == "" goto OkJHome
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME not found in your environment. >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
:OkJHome
|
||||
if exist "%JAVA_HOME%\bin\java.exe" goto init
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME is set to an invalid directory. >&2
|
||||
echo JAVA_HOME = "%JAVA_HOME%" >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
@REM ==== END VALIDATION ====
|
||||
|
||||
:init
|
||||
|
||||
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
|
||||
@REM Fallback to current working directory if not found.
|
||||
|
||||
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
|
||||
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
|
||||
|
||||
set EXEC_DIR=%CD%
|
||||
set WDIR=%EXEC_DIR%
|
||||
:findBaseDir
|
||||
IF EXIST "%WDIR%"\.mvn goto baseDirFound
|
||||
cd ..
|
||||
IF "%WDIR%"=="%CD%" goto baseDirNotFound
|
||||
set WDIR=%CD%
|
||||
goto findBaseDir
|
||||
|
||||
:baseDirFound
|
||||
set MAVEN_PROJECTBASEDIR=%WDIR%
|
||||
cd "%EXEC_DIR%"
|
||||
goto endDetectBaseDir
|
||||
|
||||
:baseDirNotFound
|
||||
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
|
||||
cd "%EXEC_DIR%"
|
||||
|
||||
:endDetectBaseDir
|
||||
|
||||
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
|
||||
|
||||
@setlocal EnableExtensions EnableDelayedExpansion
|
||||
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
|
||||
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
|
||||
|
||||
:endReadAdditionalConfig
|
||||
|
||||
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
|
||||
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
|
||||
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
|
||||
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
|
||||
)
|
||||
|
||||
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
if exist %WRAPPER_JAR% (
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Found %WRAPPER_JAR%
|
||||
)
|
||||
) else (
|
||||
if not "%MVNW_REPOURL%" == "" (
|
||||
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
)
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Couldn't find %WRAPPER_JAR%, downloading it ...
|
||||
echo Downloading from: %DOWNLOAD_URL%
|
||||
)
|
||||
|
||||
powershell -Command "&{"^
|
||||
"$webclient = new-object System.Net.WebClient;"^
|
||||
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
|
||||
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
|
||||
"}"^
|
||||
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
|
||||
"}"
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Finished downloading %WRAPPER_JAR%
|
||||
)
|
||||
)
|
||||
@REM End of extension
|
||||
|
||||
@REM Provide a "standardized" way to retrieve the CLI args that will
|
||||
@REM work with both Windows and non-Windows executions.
|
||||
set MAVEN_CMD_LINE_ARGS=%*
|
||||
|
||||
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
|
||||
if ERRORLEVEL 1 goto error
|
||||
goto end
|
||||
|
||||
:error
|
||||
set ERROR_CODE=1
|
||||
|
||||
:end
|
||||
@endlocal & set ERROR_CODE=%ERROR_CODE%
|
||||
|
||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
|
||||
@REM check for post script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
|
||||
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
|
||||
:skipRcPost
|
||||
|
||||
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
|
||||
if "%MAVEN_BATCH_PAUSE%" == "on" pause
|
||||
|
||||
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
|
||||
|
||||
exit /B %ERROR_CODE%
|
118
pom.xml
Normal file
118
pom.xml
Normal file
@ -0,0 +1,118 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.2.7.RELEASE</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>com.lsitc.fems</groupId>
|
||||
<artifactId>SpringCloudGateway</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>SpringCloudGateway</name>
|
||||
<description>SpringCloudGateway</description>
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-gateway</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.junit.vintage</groupId>
|
||||
<artifactId>junit-vintage-engine</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api -->
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-api</artifactId>
|
||||
<version>0.11.2</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl -->
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-impl</artifactId>
|
||||
<version>0.11.2</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-jackson -->
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-jackson</artifactId>
|
||||
<version>0.11.2</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-core</artifactId>
|
||||
<version>2.12.2</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 메트릭을 Endpoint로 노출 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
<!-- Micrometer core dependecy -->
|
||||
<dependency>
|
||||
<groupId>io.micrometer</groupId>
|
||||
<artifactId>micrometer-core</artifactId>
|
||||
</dependency>
|
||||
<!-- Micrometer Prometheus registry -->
|
||||
<dependency>
|
||||
<groupId>io.micrometer</groupId>
|
||||
<artifactId>micrometer-registry-prometheus</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-dependencies</artifactId>
|
||||
<version>${spring-cloud.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<excludes>
|
||||
<exclude>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
@ -0,0 +1,32 @@
|
||||
package com.lsitc.fems.SpringCloudGateway;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.cloud.gateway.config.GlobalCorsProperties;
|
||||
import org.springframework.cloud.gateway.handler.FilteringWebHandler;
|
||||
import org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping;
|
||||
import org.springframework.cloud.gateway.route.RouteLocator;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
public class PassCorsRoutePredicateHandlerMapping extends RoutePredicateHandlerMapping {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(PassCorsRoutePredicateHandlerMapping.class);
|
||||
|
||||
public PassCorsRoutePredicateHandlerMapping(FilteringWebHandler webHandler, RouteLocator routeLocator,
|
||||
GlobalCorsProperties globalCorsProperties, Environment environment) {
|
||||
super(webHandler, routeLocator, globalCorsProperties, environment);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Object> getHandler(ServerWebExchange exchange) {
|
||||
logger.info("[PassCorsRoutePredicateHandlerMapping] getHandler");
|
||||
return getHandlerInternal(exchange).map(handler -> {
|
||||
logger.info(exchange.getLogPrefix() + "Mapped to " + handler);
|
||||
// CORS 체크 로직 제거
|
||||
return handler;
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.lsitc.fems.SpringCloudGateway;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.cloud.gateway.config.GlobalCorsProperties;
|
||||
import org.springframework.cloud.gateway.handler.FilteringWebHandler;
|
||||
import org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping;
|
||||
import org.springframework.cloud.gateway.route.RouteLocator;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
import org.springframework.core.env.Environment;
|
||||
|
||||
@SpringBootApplication
|
||||
public class SpringCloudGatewayApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(SpringCloudGatewayApplication.class, args);
|
||||
}
|
||||
|
||||
@Bean
|
||||
@Primary
|
||||
public RoutePredicateHandlerMapping passCorsRoutePredicateHandlerMapping(
|
||||
FilteringWebHandler webHandler, RouteLocator routeLocator,
|
||||
GlobalCorsProperties globalCorsProperties, Environment environment) {
|
||||
return new PassCorsRoutePredicateHandlerMapping(webHandler, routeLocator,
|
||||
globalCorsProperties, environment);
|
||||
}
|
||||
}
|
@ -0,0 +1,229 @@
|
||||
/*
|
||||
* 상기 프로그램에 대한 저작권을 포함한 지적재산권은 LS ITC에 있으며,
|
||||
* LS와 명시적으로 허용하지 않은 사용, 복사, 변경, 제3자에의 공개, 배포는 엄격히 금지되며,
|
||||
* LS의 지적재산권 침해에 해당됩니다.
|
||||
* (Copyright ⓒ 2021 LS ITC. All Rights Reserved| Confidential)
|
||||
*
|
||||
* You are strictly prohibited to copy, disclose, distribute, modify, or use
|
||||
* this program in part or as a whole without the prior written consent of
|
||||
* LS. LS owns the intellectual property rights in
|
||||
* and to this program.
|
||||
* (Copyright ⓒ 2021 LS. All Rights Reserved| Confidential)
|
||||
* Created : 2021.04.06
|
||||
*/
|
||||
package com.lsitc.fems.SpringCloudGateway.filter;
|
||||
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.CharBuffer;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.cloud.gateway.filter.GatewayFilter;
|
||||
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
|
||||
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
|
||||
import org.springframework.core.io.buffer.DataBuffer;
|
||||
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||
import org.springframework.core.io.buffer.DataBufferUtils;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseCookie;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.reactive.function.client.ClientResponse;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Component
|
||||
public class AuthFilter extends AbstractGatewayFilterFactory<Map> {
|
||||
private Logger logger = LoggerFactory.getLogger(AuthFilter.class);
|
||||
private String authServiceUrl = "";
|
||||
private String loginUrl = "";
|
||||
private String cookieId = "";
|
||||
private final WebClient webClient = WebClient.create();
|
||||
|
||||
public AuthFilter() {
|
||||
super(Map.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GatewayFilter apply(Map config) {
|
||||
authServiceUrl = config.get("authAPI").toString();
|
||||
cookieId = config.get("cookieId").toString();
|
||||
loginUrl = config.get("loginUrl").toString();
|
||||
|
||||
return (exchange, chain) -> {
|
||||
ServerHttpRequest request = exchange.getRequest();
|
||||
// 로그인 및 권한 Check 호출
|
||||
Mono<ClientResponse> authServiceResponse = callAuthService(request);
|
||||
// 후처리
|
||||
Mono<Void> middleService = authServiceResponse.flatMap(r -> processAuthResponse(exchange, chain, request, r));
|
||||
return middleService.then();
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @methodName : resolveBodyFromRequest
|
||||
* @date : 2021.05.06
|
||||
* @desc : requestBody를 String으로 변환하여 반환한다.
|
||||
* @param serverHttpRequest
|
||||
* @return
|
||||
*/
|
||||
private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) {
|
||||
// Get the request body
|
||||
Flux<DataBuffer> body = serverHttpRequest.getBody();
|
||||
AtomicReference<String> bodyRef = new AtomicReference<>();
|
||||
body.subscribe(buffer -> {
|
||||
CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer());
|
||||
DataBufferUtils.release(buffer);
|
||||
bodyRef.set(charBuffer.toString());
|
||||
});
|
||||
// Get request body
|
||||
return bodyRef.get();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @methodName : callAuthService
|
||||
* @date : 2021.04.15
|
||||
* @desc : 로그인 및 권한 check API 호출
|
||||
* @param inputRequest
|
||||
* @return
|
||||
*/
|
||||
private Mono<ClientResponse> callAuthService(ServerHttpRequest inputRequest) {
|
||||
logger.info("requestURI : {}", inputRequest.getPath());
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("requestURI", inputRequest.getPath().toString());
|
||||
|
||||
if( inputRequest.getMethod().matches("POST") ) {
|
||||
//POST는 header에서
|
||||
List<String> menuId = inputRequest.getHeaders().get("X-Fems-MenuId");
|
||||
|
||||
logger.info("X-Fems-MenuId : {}", menuId);
|
||||
params.put("menuId", menuId.get(0));
|
||||
// String requestBodyStr = resolveBodyFromRequest(inputRequest);
|
||||
// ObjectMapper mapper = new ObjectMapper();
|
||||
// JsonNode actualObj;
|
||||
// try {
|
||||
// //requestBody
|
||||
// actualObj = mapper.readTree(requestBodyStr);
|
||||
// //menuId
|
||||
// params.put("menuId", actualObj.get("params").get("menuId") != null ? actualObj.get("params").get("menuId").asText() : "2");
|
||||
// } catch (Exception e) {
|
||||
// }
|
||||
} else {
|
||||
//POST는 queryString에서(e.g. menu)
|
||||
params.put("menuId", inputRequest.getQueryParams().getFirst("$menuId"));
|
||||
}
|
||||
System.out.println("getHeaders" + inputRequest.getHeaders());
|
||||
|
||||
System.out.println("authServiceUrl : " + authServiceUrl);
|
||||
System.out.println("cookieId : " + cookieId);
|
||||
System.out.println("getCookies : " + inputRequest.getCookies().toString());
|
||||
System.out.println("getFirst(cookieId) : " + inputRequest.getCookies().getFirst(cookieId));
|
||||
WebClient.RequestBodySpec request = webClient.method(HttpMethod.POST).uri(authServiceUrl)
|
||||
.contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON)
|
||||
.cookie(cookieId,
|
||||
inputRequest.getCookies().getFirst(cookieId) != null
|
||||
? inputRequest.getCookies().getFirst(cookieId).getValue()
|
||||
: "");
|
||||
request.bodyValue(params);
|
||||
return request.exchange();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @methodName : processMiddleResponse
|
||||
* @date : 2021.04.15
|
||||
* @desc :
|
||||
* @param exchange
|
||||
* @param chain
|
||||
* @param request
|
||||
* @param middleServiceResponse
|
||||
* @return
|
||||
*/
|
||||
private Mono<Void> processAuthResponse(ServerWebExchange exchange, GatewayFilterChain chain,
|
||||
ServerHttpRequest request, ClientResponse authServiceResponse) {
|
||||
if (authServiceResponse.statusCode().is2xxSuccessful()) {
|
||||
// 로그인 및 권한 체크 결과 정상이면 새로 발급된 쿠키를 담아준다.
|
||||
ServerHttpRequest modifiedRequest = request.mutate().headers((httpHeaders) -> {
|
||||
httpHeaders.set("Cookie",
|
||||
authServiceResponse.cookies().get(cookieId) != null
|
||||
? authServiceResponse.cookies().get(cookieId).get(0).toString()
|
||||
: "");
|
||||
}).build();
|
||||
|
||||
ServerWebExchange modifiedExchange = exchange.mutate().request(modifiedRequest).build();
|
||||
ResponseCookie cookie = authServiceResponse.cookies().get(cookieId).get(0);
|
||||
exchange.getResponse().addCookie(cookie);
|
||||
System.out.println("exchange.getResponse is2xxSuccessful" + exchange.getResponse());
|
||||
|
||||
// authServiceResponse.bodyToMono(Map.class).subscribe(m -> {
|
||||
//// logger.info("retnCd :: {}", m.get("retnCd"));
|
||||
// });
|
||||
return chain.filter(modifiedExchange);
|
||||
} else {
|
||||
System.out.println("exchange.getResponse else is2xxSuccessful" + exchange.getResponse().getHeaders());
|
||||
System.out.println("exchange.getResponse else is2xxSuccessful" + exchange.getResponse().getCookies());
|
||||
if (exchange.getRequest().getHeaders().getAccept().contains(MediaType.APPLICATION_JSON)) {
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
|
||||
exchange.getResponse().setStatusCode(HttpStatus.OK);
|
||||
|
||||
DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory();
|
||||
DataBuffer dataBuffer = null;
|
||||
|
||||
try {
|
||||
dataBuffer = bufferFactory
|
||||
.wrap(objectMapper.writeValueAsBytes(new HttpError("-1", "문제가 발생하였습니다. 관리자에게 문의하세요.")));
|
||||
} catch (JsonProcessingException e) {
|
||||
dataBuffer = bufferFactory.wrap("".getBytes());
|
||||
}
|
||||
|
||||
return exchange.getResponse().writeWith(Mono.just(dataBuffer));
|
||||
} else {
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
response.setStatusCode(HttpStatus.MOVED_TEMPORARILY);
|
||||
try {
|
||||
response.getHeaders().setLocation(new URI(loginUrl));
|
||||
} catch (URISyntaxException e) {
|
||||
// TODO Auto-generated catch block
|
||||
}
|
||||
return Mono.empty();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public class HttpError {
|
||||
private String rtnCd;
|
||||
private String message;
|
||||
|
||||
HttpError(String rtnCd, String message) {
|
||||
this.rtnCd = rtnCd;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public String getRtnCd() {
|
||||
return rtnCd;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* 상기 프로그램에 대한 저작권을 포함한 지적재산권은 LS ITC에 있으며,
|
||||
* LS와 명시적으로 허용하지 않은 사용, 복사, 변경, 제3자에의 공개, 배포는 엄격히 금지되며,
|
||||
* LS의 지적재산권 침해에 해당됩니다.
|
||||
* (Copyright ⓒ 2021 LS ITC. All Rights Reserved| Confidential)
|
||||
*
|
||||
* You are strictly prohibited to copy, disclose, distribute, modify, or use
|
||||
* this program in part or as a whole without the prior written consent of
|
||||
* LS. LS owns the intellectual property rights in
|
||||
* and to this program.
|
||||
* (Copyright ⓒ 2021 LS. All Rights Reserved| Confidential)
|
||||
* Created : 2021.05.06
|
||||
*/
|
||||
package com.lsitc.fems.SpringCloudGateway.filter;
|
||||
|
||||
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
|
||||
import org.springframework.cloud.gateway.filter.GlobalFilter;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.core.io.buffer.DataBuffer;
|
||||
import org.springframework.core.io.buffer.DataBufferUtils;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@Component
|
||||
public class CacheRequestBodyGlobalFilter implements GlobalFilter, Ordered {
|
||||
@Override
|
||||
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
||||
|
||||
if (exchange.getRequest().getHeaders().getContentType() == null || exchange.getRequest().getMethod().matches("GET")) {
|
||||
return chain.filter(exchange);
|
||||
} else {
|
||||
return DataBufferUtils.join(exchange.getRequest().getBody())
|
||||
.flatMap(dataBuffer -> {
|
||||
DataBufferUtils.retain(dataBuffer);
|
||||
Flux<DataBuffer> cachedFlux = Flux
|
||||
.defer(() -> Flux.just(dataBuffer.slice(0, dataBuffer.readableByteCount())));
|
||||
ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(
|
||||
exchange.getRequest()) {
|
||||
@Override
|
||||
public Flux<DataBuffer> getBody() {
|
||||
return cachedFlux;
|
||||
}
|
||||
};
|
||||
return chain.filter(exchange.mutate().request(mutatedRequest).build());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -0,0 +1,157 @@
|
||||
package com.lsitc.fems.SpringCloudGateway.filter;
|
||||
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.cloud.gateway.filter.GatewayFilter;
|
||||
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
|
||||
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
|
||||
import org.springframework.core.io.buffer.DataBuffer;
|
||||
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseCookie;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.reactive.function.client.ClientResponse;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Component
|
||||
public class MenuLogFilter extends AbstractGatewayFilterFactory<Map> {
|
||||
private Logger logger = LoggerFactory.getLogger(MenuLogFilter.class);
|
||||
private String menuLogServiceUrl = "";
|
||||
private String loginUrl = "";
|
||||
private String cookieId = "";
|
||||
private final WebClient webClient = WebClient.create();
|
||||
|
||||
|
||||
public MenuLogFilter() {
|
||||
super(Map.class);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public GatewayFilter apply(Map config) {
|
||||
menuLogServiceUrl = config.get("menuLogAPI").toString();
|
||||
cookieId = config.get("cookieId").toString();
|
||||
loginUrl = config.get("loginUrl").toString();
|
||||
|
||||
return (exchange, chain) -> {
|
||||
ServerHttpRequest request = exchange.getRequest();
|
||||
// 로그인 및 권한 Check 호출
|
||||
Mono<ClientResponse> menuLogServiceResponse = callMenuLogService(request);
|
||||
// 후처리
|
||||
Mono<Void> middleService = menuLogServiceResponse.flatMap(r -> processMenuLogResponse(exchange, chain, request, r));
|
||||
return middleService.then();
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
private Mono<ClientResponse> callMenuLogService(ServerHttpRequest inputRequest) {
|
||||
logger.info("callMenuLogService : {}", inputRequest.getPath());
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("requestURI", inputRequest.getPath().toString());
|
||||
|
||||
if( inputRequest.getMethod().matches("POST") ) {
|
||||
//POST는 header에서
|
||||
List<String> menuId = inputRequest.getHeaders().get("X-Fems-MenuId");
|
||||
|
||||
logger.info("X-Fems-MenuId : {}", menuId);
|
||||
params.put("menuId", menuId.get(0));
|
||||
} else {
|
||||
//POST는 queryString에서(e.g. menu)
|
||||
String menuId = inputRequest.getQueryParams().getFirst("$menuId");
|
||||
params.put("menuId", menuId == null?"0":menuId);
|
||||
}
|
||||
|
||||
WebClient.RequestBodySpec request = webClient.method(HttpMethod.POST).uri(menuLogServiceUrl)
|
||||
.contentType(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON)
|
||||
.cookie(cookieId,
|
||||
inputRequest.getCookies().getFirst(cookieId) != null
|
||||
? inputRequest.getCookies().getFirst(cookieId).getValue()
|
||||
: "");
|
||||
request.bodyValue(params);
|
||||
return request.exchange();
|
||||
}
|
||||
private Mono<Void> processMenuLogResponse(ServerWebExchange exchange, GatewayFilterChain chain,
|
||||
ServerHttpRequest request, ClientResponse authServiceResponse) {
|
||||
if (authServiceResponse.statusCode().is2xxSuccessful()) {
|
||||
// 로그인 및 권한 체크 결과 정상이면 새로 발급된 쿠키를 담아준다.
|
||||
ServerHttpRequest modifiedRequest = request.mutate().headers((httpHeaders) -> {
|
||||
httpHeaders.set("Cookie",
|
||||
authServiceResponse.cookies().get(cookieId) != null
|
||||
? authServiceResponse.cookies().get(cookieId).get(0).toString()
|
||||
: "");
|
||||
}).build();
|
||||
|
||||
ServerWebExchange modifiedExchange = exchange.mutate().request(modifiedRequest).build();
|
||||
ResponseCookie cookie = authServiceResponse.cookies().get(cookieId).get(0);
|
||||
exchange.getResponse().addCookie(cookie);
|
||||
|
||||
// authServiceResponse.bodyToMono(Map.class).subscribe(m -> {
|
||||
//// logger.info("retnCd :: {}", m.get("retnCd"));
|
||||
// });
|
||||
return chain.filter(modifiedExchange);
|
||||
} else {
|
||||
if (exchange.getRequest().getHeaders().getAccept().contains(MediaType.APPLICATION_JSON)) {
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
|
||||
exchange.getResponse().setStatusCode(HttpStatus.OK);
|
||||
|
||||
DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory();
|
||||
DataBuffer dataBuffer = null;
|
||||
|
||||
try {
|
||||
dataBuffer = bufferFactory
|
||||
.wrap(objectMapper.writeValueAsBytes(new HttpError("-1", "문제가 발생하였습니다. 관리자에게 문의하세요.")));
|
||||
} catch (JsonProcessingException e) {
|
||||
dataBuffer = bufferFactory.wrap("".getBytes());
|
||||
}
|
||||
|
||||
return exchange.getResponse().writeWith(Mono.just(dataBuffer));
|
||||
} else {
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
response.setStatusCode(HttpStatus.MOVED_TEMPORARILY);
|
||||
try {
|
||||
response.getHeaders().setLocation(new URI(loginUrl));
|
||||
} catch (URISyntaxException e) {
|
||||
// TODO Auto-generated catch block
|
||||
}
|
||||
return Mono.empty();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public class HttpError {
|
||||
private String rtnCd;
|
||||
private String message;
|
||||
|
||||
HttpError(String rtnCd, String message) {
|
||||
this.rtnCd = rtnCd;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public String getRtnCd() {
|
||||
return rtnCd;
|
||||
}
|
||||
}
|
||||
}
|
241
src/main/resources/application.yaml
Normal file
241
src/main/resources/application.yaml
Normal file
@ -0,0 +1,241 @@
|
||||
# 공통
|
||||
spring:
|
||||
application:
|
||||
#업무명
|
||||
name: apiGw
|
||||
serverip: localhost
|
||||
profiles:
|
||||
#프로파일(local:로컬환경, dev:개발환경(추가환경개발), docker:운영 택1)
|
||||
active: local
|
||||
#로깅관련
|
||||
logging:
|
||||
loginLogEnable: true
|
||||
menuCnctLogEnable: true
|
||||
level:
|
||||
root: DEBUG
|
||||
#logging
|
||||
config: classpath:logback_spring.xml
|
||||
file:
|
||||
path: logs
|
||||
max-history: 30
|
||||
max-size: 100MB
|
||||
---
|
||||
##############
|
||||
####local#####
|
||||
##############
|
||||
#AuthFilter정의
|
||||
AuthFilter: &AuthFilter
|
||||
- name: AuthFilter
|
||||
args:
|
||||
authAPI: http://localhost:8080/isValidToken
|
||||
cookieId: FEMS_SESSION
|
||||
loginUrl: /login
|
||||
MenuLogFilter: &MenuLogFilter
|
||||
- name: MenuLogFilter
|
||||
args:
|
||||
menuLogAPI: http://localhost:8080/menuLogCont
|
||||
cookieId: FEMS_SESSION
|
||||
loginUrl: /login
|
||||
#MenuLogFilter: &MenuLogFilter
|
||||
# - name: MenuLogFilter
|
||||
# args:
|
||||
# menuLogAPI: http://localhost:9999/menuLogCont
|
||||
# cookieId: FEMS_SESSION
|
||||
# loginUrl: http://localhost:9999/login
|
||||
spring:
|
||||
profiles: local
|
||||
main:
|
||||
allow-bean-definition-overriding: true
|
||||
cloud:
|
||||
gateway:
|
||||
globalcors:
|
||||
corsConfigurations:
|
||||
'[/**]':
|
||||
allowedOrigins: "*"
|
||||
#timeout관련 설정
|
||||
httpclient:
|
||||
connect-timeout: 300000 # 30초
|
||||
response-timeout: 300s # 30초, 글로벌 설정시 seconds
|
||||
pool:
|
||||
max-idle-time: 300000 # 5분간 휴상태이면 회수 처리
|
||||
#routing관련 설정
|
||||
routes:
|
||||
# withoutAuth
|
||||
- id: withOutAuth #id
|
||||
uri: http://localhost:8080/comm #forward url
|
||||
predicates:
|
||||
- Path= /loginChk, /logout, /isValidToken, /menuLogCont, /sso, /comm/SystemLogReadCtr/saveMenuCnctLog, /loginProc #, /login
|
||||
# withOutEms
|
||||
- id: withOutEms
|
||||
uri: http://localhost:8082/
|
||||
predicates:
|
||||
- Path=/ems/effc/MdlDataSetCtr/selectMdlOpen
|
||||
# vuePage
|
||||
- id: vuePage
|
||||
uri: http://localhost:3000/
|
||||
filters:
|
||||
- <<: *MenuLogFilter
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/ems/**/*Page, /comm/**/*Page
|
||||
# vue.js
|
||||
- id: vue #id
|
||||
uri: http://localhost:3000/ #forward url
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/_nuxt/comm/**, /__webpack_hmr/**, /_loading/**, /favicon.ico, /login, /ems/*Page, /comm/*Page, /iframe/**, /
|
||||
# vue sample
|
||||
- id: vueSample #id
|
||||
uri: http://localhost:3010/ #forward url
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/_nuxt/sample/**, /sample/*Page
|
||||
# comm
|
||||
- id: comm #id
|
||||
uri: http://localhost:8080 #forward url
|
||||
filters:
|
||||
- <<: *AuthFilter
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/comm/** #, /
|
||||
# ems
|
||||
- id: ems #id
|
||||
uri: http://localhost:8082 #forward url
|
||||
filters:
|
||||
- <<: *AuthFilter
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/ems/base/**, /ems/api/** ,/ems/bala/**, /ems/effc/**
|
||||
# ems_fopm
|
||||
- id: ems_fopm #id
|
||||
uri: http://localhost:8084 #forward url
|
||||
filters:
|
||||
- <<: *AuthFilter
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/fopm/**
|
||||
# drp
|
||||
- id: drp #id
|
||||
uri: http://localhost:8086 #forward url
|
||||
filters:
|
||||
- <<: *AuthFilter
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/ems/drp/**
|
||||
# cmms
|
||||
- id: cmms #id
|
||||
uri: http://localhost:8089 #forward url
|
||||
filters:
|
||||
- <<: *AuthFilter
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/cmms/**
|
||||
# sample
|
||||
- id: sample #id
|
||||
uri: http://localhost:8090 #forward url
|
||||
filters:
|
||||
- <<: *AuthFilter
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/sample/**
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: "gateway"
|
||||
endpoint:
|
||||
gateway:
|
||||
enabled: true
|
||||
server:
|
||||
port: 9999
|
||||
|
||||
---
|
||||
###############################
|
||||
#### Cloud(Kube) #####
|
||||
###############################
|
||||
AuthFilter: &AuthFilter
|
||||
- name: AuthFilter
|
||||
args:
|
||||
authAPI: http://skfems-comm:8080/isValidToken
|
||||
cookieId: FEMS_SESSION
|
||||
loginUrl: /login
|
||||
MenuLogFilter: &MenuLogFilter
|
||||
- name: MenuLogFilter
|
||||
args:
|
||||
menuLogAPI: http://skfems-comm:8080/menuLogCont
|
||||
cookieId: FEMS_SESSION
|
||||
loginUrl: /login
|
||||
spring:
|
||||
profiles: cloud_kube
|
||||
main:
|
||||
allow-bean-definition-overriding: true
|
||||
cloud:
|
||||
gateway:
|
||||
globalcors:
|
||||
corsConfigurations:
|
||||
'[/**]':
|
||||
allowedOrigins: "*"
|
||||
#timeout관련 설정
|
||||
httpclient:
|
||||
connect-timeout: 300000 # 30초
|
||||
response-timeout: 300s # 30초, 글로벌 설정시 seconds
|
||||
pool:
|
||||
max-idle-time: 300000 # 5분간 휴상태이면 회수 처리
|
||||
#routing관련 설정
|
||||
routes:
|
||||
# withoutAuth
|
||||
- id: withOutAuth #id
|
||||
uri: http://skfems-comm:8080/ #forward url
|
||||
predicates:
|
||||
- Path= /loginChk, /logout, /isValidToken, /menuLogCont, /comm/base/SystemLogReadCtr/saveMenuCnctLog, /loginProc #, /login
|
||||
# withOutEms
|
||||
- id: withOutEms
|
||||
uri: http://skfems-ems:8082/
|
||||
predicates:
|
||||
- Path=/ems/effc/MdlDataSetCtr/selectMdlOpen
|
||||
# vueCommAuthPage
|
||||
- id: vueCommAuthPage
|
||||
uri: http://skfems-ui:3000/
|
||||
filters:
|
||||
- <<: *MenuLogFilter
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/comm/**/*Page, /ems/**/*Page
|
||||
# vue.js
|
||||
- id: vue #id
|
||||
uri: http://skfems-ui:3000/ #forward url
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/_nuxt/comm/**, /__webpack_hmr/**, /_loading/**, /favicon.ico, /login, /iframe/**, /
|
||||
# comm
|
||||
- id: comm #id
|
||||
uri: http://skfems-comm:8080 #forward url
|
||||
filters:
|
||||
- <<: *AuthFilter
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/comm/**
|
||||
# ems
|
||||
- id: ems #id
|
||||
uri: http://skfems-ems:8082 #forward url
|
||||
filters:
|
||||
- <<: *AuthFilter
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/ems/**
|
||||
# webHmi
|
||||
- id: webHmi #id
|
||||
uri: http://skfems-fuxa:1881 #forward url
|
||||
predicates:
|
||||
#라우팅할 path
|
||||
- Path=/webHmi/**
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: "gateway"
|
||||
endpoint:
|
||||
gateway:
|
||||
enabled: true
|
||||
server:
|
||||
port: 9999
|
66
src/main/resources/logback_spring.xml
Normal file
66
src/main/resources/logback_spring.xml
Normal file
@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 -->
|
||||
<configuration scan="true" scanPeriod="60 seconds">
|
||||
<!--springProfile 태그를 사용하면 logback 설정파일에서 복수개의 프로파일을 설정할 수 있다. -->
|
||||
<springProperty scope="context" name="LOG_LEVEL" source="logging.level.root" />
|
||||
<!-- log file path -->
|
||||
<springProperty scope="context" name="LOG_PATH" source="logging.file.path"/>
|
||||
<!-- log file name -->
|
||||
<springProperty scope="context" name="LOG_FILE_NAME" source="spring.application.name"/>
|
||||
<!-- log file size -->
|
||||
<springProperty scope="context" name="LOG_MAX-SIZE" source="logging.file.max-size"/>
|
||||
<!-- log history -->
|
||||
<springProperty scope="context" name="LOG_MAX_HISTORY" source="logging.file.max-history"/>
|
||||
<!-- pattern -->
|
||||
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%-6level] [%logger{0}:%line] - %msg%n" />
|
||||
|
||||
<!-- Console Appender -->
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
|
||||
<pattern>${LOG_PATTERN}</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<!-- File Appender -->
|
||||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<!-- 파일경로 설정 -->
|
||||
<file>${LOG_PATH}/${LOG_FILE_NAME}.log</file>
|
||||
<!-- 출력패턴 설정 -->
|
||||
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
|
||||
<pattern>${LOG_PATTERN}</pattern>
|
||||
</encoder>
|
||||
<!-- Rolling 정책 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
|
||||
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log
|
||||
</fileNamePattern>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<!-- 파일당 최고 용량 kb, mb, gb -->
|
||||
<maxFileSize>${LOG_MAX-SIZE}</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
<!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거 -->
|
||||
<maxHistory>${LOG_MAX_HISTORY}</maxHistory>
|
||||
<!--<MinIndex>1</MinIndex> <MaxIndex>10</MaxIndex> -->
|
||||
</rollingPolicy>
|
||||
</appender>
|
||||
|
||||
<root level="${LOG_LEVEL}">
|
||||
<appender-ref ref="CONSOLE" />
|
||||
<appender-ref ref="FILE" />
|
||||
</root>
|
||||
|
||||
<!-- log4jdbc 옵션 설정 -->
|
||||
<logger name="jdbc" level="OFF" />
|
||||
<!-- 커넥션 open close 이벤트를 로그로 남긴다. -->
|
||||
<logger name="jdbc.connection" level="OFF" />
|
||||
<!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. -->
|
||||
<logger name="jdbc.sqlonly" level="OFF" />
|
||||
<!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. -->
|
||||
<logger name="jdbc.sqltiming" level="DEBUG" />
|
||||
<!-- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다. -->
|
||||
<logger name="jdbc.audit" level="OFF" />
|
||||
<!-- ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. -->
|
||||
<logger name="jdbc.resultset" level="OFF" />
|
||||
<!-- SQL 결과 조회된 데이터의 table을 로그로 남긴다. -->
|
||||
<logger name="jdbc.resultsettable" level="OFF" />
|
||||
</configuration>
|
@ -0,0 +1,13 @@
|
||||
package com.lsitc.fems.SpringCloudGateway;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
@SpringBootTest
|
||||
class SpringCloudGatewayApplicationTests {
|
||||
|
||||
@Test
|
||||
void contextLoads() {
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user