init
This commit is contained in:
27
ruoyi-visual/ruoyi-seata-server/Dockerfile
Normal file
27
ruoyi-visual/ruoyi-seata-server/Dockerfile
Normal file
@@ -0,0 +1,27 @@
|
||||
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
|
||||
FROM bellsoft/liberica-openjdk-debian:17.0.11-cds
|
||||
#FROM bellsoft/liberica-openjdk-debian:21.0.5-cds
|
||||
#FROM findepi/graalvm:java17-native
|
||||
|
||||
LABEL maintainer="Lion Li"
|
||||
|
||||
RUN mkdir -p /ruoyi/seata-server/logs \
|
||||
/ruoyi/skywalking/agent
|
||||
|
||||
WORKDIR /ruoyi/seata-server
|
||||
|
||||
ENV TZ=PRC LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" SEATA_IP="" SEATA_PORT=""
|
||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||
|
||||
EXPOSE 7091
|
||||
EXPOSE 8091
|
||||
|
||||
ADD ./target/ruoyi-seata-server.jar ./app.jar
|
||||
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
|
||||
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom \
|
||||
#-Dskywalking.agent.service_name=ruoyi-seata-server \
|
||||
#-Dskywalking.plugin.seata.server=true \
|
||||
#-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \
|
||||
${JAVA_OPTS} -jar app.jar
|
331
ruoyi-visual/ruoyi-seata-server/pom.xml
Normal file
331
ruoyi-visual/ruoyi-seata-server/pom.xml
Normal file
@@ -0,0 +1,331 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ Copyright 1999-2019 Seata.io Group.
|
||||
~
|
||||
~ 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
|
||||
~
|
||||
~ http://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.
|
||||
-->
|
||||
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<groupId>org.dromara</groupId>
|
||||
<artifactId>ruoyi-visual</artifactId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>ruoyi-seata-server</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
<seata.version>2.3.0</seata.version>
|
||||
<spring-boot-for-server.version>2.7.18</spring-boot-for-server.version>
|
||||
<spring-framework-for-server.version>5.3.39</spring-framework-for-server.version>
|
||||
<snakeyaml-for-server.version>2.0</snakeyaml-for-server.version>
|
||||
<tomcat-embed.version>9.0.98</tomcat-embed.version>
|
||||
<logstash-logback-encoder.version>7.2</logstash-logback-encoder.version>
|
||||
<jedis.version>3.8.0</jedis.version>
|
||||
<jackson-mapper.version>1.9.13</jackson-mapper.version>
|
||||
<kafka-clients.version>3.6.1</kafka-clients.version>
|
||||
</properties>
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<!-- spring-framework-->
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-framework-bom</artifactId>
|
||||
<version>${spring-framework-for-server.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- spring-boot -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-dependencies</artifactId>
|
||||
<version>${spring-boot-for-server.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.apache.kafka</groupId>
|
||||
<artifactId>kafka-clients</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-core</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-websocket</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-el</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-framework-bom</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.yaml</groupId>
|
||||
<artifactId>snakeyaml</artifactId>
|
||||
<version>${snakeyaml-for-server.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-core</artifactId>
|
||||
<version>${tomcat-embed.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.seata</groupId>
|
||||
<artifactId>seata-dependencies</artifactId>
|
||||
<version>${seata.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-core</artifactId>
|
||||
<version>${tomcat-embed.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-el</artifactId>
|
||||
<version>${tomcat-embed.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-websocket</artifactId>
|
||||
<version>${tomcat-embed.version}</version>
|
||||
</dependency>
|
||||
<!-- springboot web -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>log4j-to-slf4j</artifactId>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-core</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-websocket</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-el</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.yaml</groupId>
|
||||
<artifactId>snakeyaml</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.yaml</groupId>
|
||||
<artifactId>snakeyaml</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.seata</groupId>
|
||||
<artifactId>seata-server</artifactId>
|
||||
<version>${seata.version}</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/src/main/resources/lib/seata-server-${seata.version}.jar</systemPath>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.seata</groupId>
|
||||
<artifactId>seata-spring-autoconfigure-server</artifactId>
|
||||
<version>${seata.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.seata</groupId>
|
||||
<artifactId>seata-core</artifactId>
|
||||
<version>${seata.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.seata</groupId>
|
||||
<artifactId>seata-config-all</artifactId>
|
||||
<version>${seata.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>log4j</artifactId>
|
||||
<groupId>log4j</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.seata</groupId>
|
||||
<artifactId>seata-discovery-all</artifactId>
|
||||
<version>${seata.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.seata</groupId>
|
||||
<artifactId>seata-serializer-all</artifactId>
|
||||
<version>${seata.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.seata</groupId>
|
||||
<artifactId>seata-compressor-all</artifactId>
|
||||
<version>${seata.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.seata</groupId>
|
||||
<artifactId>seata-metrics-all</artifactId>
|
||||
<version>${seata.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.seata</groupId>
|
||||
<artifactId>seata-console</artifactId>
|
||||
<version>${seata.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- for database -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>druid</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-dbcp2</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.zaxxer</groupId>
|
||||
<artifactId>HikariCP</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>8.0.27</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.beust</groupId>
|
||||
<artifactId>jcommander</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- only for event bus -->
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- jedis -->
|
||||
<dependency>
|
||||
<groupId>redis.clients</groupId>
|
||||
<artifactId>jedis</artifactId>
|
||||
<version>${jedis.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- logback -->
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-core</artifactId>
|
||||
</dependency>
|
||||
<!-- logback appenders -->
|
||||
<dependency>
|
||||
<groupId>net.logstash.logback</groupId>
|
||||
<artifactId>logstash-logback-encoder</artifactId>
|
||||
<version>${logstash-logback-encoder.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.danielwegener</groupId>
|
||||
<artifactId>logback-kafka-appender</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.apache.kafka</groupId>
|
||||
<artifactId>kafka-clients</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.kafka</groupId>
|
||||
<artifactId>kafka-clients</artifactId>
|
||||
<version>${kafka-clients.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alipay.sofa</groupId>
|
||||
<artifactId>jraft-core</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>com.alipay.sofa</groupId>
|
||||
<artifactId>bolt</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alipay.sofa</groupId>
|
||||
<artifactId>bolt</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.codehaus.janino</groupId>
|
||||
<artifactId>janino</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.codehaus.jackson</groupId>
|
||||
<artifactId>jackson-mapper-asl</artifactId>
|
||||
<version>${jackson-mapper.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>${project.artifactId}</finalName>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<version>${spring-boot.version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<!-- 作用:项目打成jar的同时将本地jar包也引入进去 -->
|
||||
<includeSystemScope>true</includeSystemScope>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
@@ -0,0 +1,283 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
* http://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.
|
||||
*/
|
||||
package org.apache.seata.core.store.db;
|
||||
|
||||
import org.apache.seata.common.exception.StoreException;
|
||||
import org.apache.seata.common.executor.Initialize;
|
||||
import org.apache.seata.common.util.ConfigTools;
|
||||
import org.apache.seata.common.util.StringUtils;
|
||||
import org.apache.seata.config.Configuration;
|
||||
import org.apache.seata.config.ConfigurationFactory;
|
||||
import org.apache.seata.core.constants.ConfigurationKeys;
|
||||
import org.apache.seata.core.constants.DBType;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.io.File;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static org.apache.seata.common.DefaultValues.DEFAULT_DB_MAX_CONN;
|
||||
import static org.apache.seata.common.DefaultValues.DEFAULT_DB_MIN_CONN;
|
||||
|
||||
/**
|
||||
* The abstract datasource provider
|
||||
*
|
||||
*/
|
||||
public abstract class AbstractDataSourceProvider implements DataSourceProvider, Initialize {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractDataSourceProvider.class);
|
||||
|
||||
private DataSource dataSource;
|
||||
|
||||
/**
|
||||
* The constant CONFIG.
|
||||
*/
|
||||
protected static final Configuration CONFIG = ConfigurationFactory.getInstance();
|
||||
|
||||
private final static String MYSQL_DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
|
||||
|
||||
private final static String MYSQL8_DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver";
|
||||
|
||||
private final static String MYSQL_DRIVER_FILE_PREFIX = "mysql-connector-java-";
|
||||
|
||||
private final static Map<String, ClassLoader> MYSQL_DRIVER_LOADERS;
|
||||
|
||||
private static final long DEFAULT_DB_MAX_WAIT = 5000;
|
||||
|
||||
static {
|
||||
MYSQL_DRIVER_LOADERS = createMysqlDriverClassLoaders();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init() {
|
||||
this.dataSource = generate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public DataSource provide() {
|
||||
return this.dataSource;
|
||||
}
|
||||
|
||||
public DataSource generate() {
|
||||
validate();
|
||||
return doGenerate();
|
||||
}
|
||||
|
||||
public void validate() {
|
||||
//valid driver class name
|
||||
String driverClassName = getDriverClassName();
|
||||
// ClassLoader loader = getDriverClassLoader();
|
||||
// if (null == loader) {
|
||||
// throw new StoreException("class loader set error, you should not use the Bootstrap classloader");
|
||||
// }
|
||||
try {
|
||||
// loader.loadClass(driverClassName);
|
||||
Class.forName(driverClassName);
|
||||
} catch (ClassNotFoundException exx) {
|
||||
String driverClassPath = null;
|
||||
String folderPath = System.getProperty("loader.path");
|
||||
if (null != folderPath) {
|
||||
driverClassPath = folderPath + "/jdbc/";
|
||||
}
|
||||
throw new StoreException(String.format(
|
||||
"The driver {%s} cannot be found in the path %s. Please ensure that the appropriate database driver dependencies are included in the classpath.", driverClassName, driverClassPath));
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* generate the datasource
|
||||
* @return datasource
|
||||
*/
|
||||
public abstract DataSource doGenerate();
|
||||
|
||||
/**
|
||||
* Get db type db type.
|
||||
*
|
||||
* @return the db type
|
||||
*/
|
||||
protected DBType getDBType() {
|
||||
return DBType.valueof(CONFIG.getConfig(ConfigurationKeys.STORE_DB_TYPE));
|
||||
}
|
||||
|
||||
/**
|
||||
* get db driver class name
|
||||
*
|
||||
* @return the db driver class name
|
||||
*/
|
||||
protected String getDriverClassName() {
|
||||
String driverClassName = CONFIG.getConfig(ConfigurationKeys.STORE_DB_DRIVER_CLASS_NAME);
|
||||
if (StringUtils.isBlank(driverClassName)) {
|
||||
throw new StoreException(
|
||||
String.format("the {%s} can't be empty", ConfigurationKeys.STORE_DB_DRIVER_CLASS_NAME));
|
||||
}
|
||||
return driverClassName;
|
||||
}
|
||||
|
||||
/**
|
||||
* get db max wait
|
||||
*
|
||||
* @return the db max wait
|
||||
*/
|
||||
protected Long getMaxWait() {
|
||||
Long maxWait = CONFIG.getLong(ConfigurationKeys.STORE_DB_MAX_WAIT, DEFAULT_DB_MAX_WAIT);
|
||||
return maxWait;
|
||||
}
|
||||
|
||||
protected ClassLoader getDriverClassLoader() {
|
||||
return MYSQL_DRIVER_LOADERS.getOrDefault(getDriverClassName(), ClassLoader.getSystemClassLoader());
|
||||
}
|
||||
|
||||
private static Map<String, ClassLoader> createMysqlDriverClassLoaders() {
|
||||
Map<String, ClassLoader> loaders = new HashMap<>();
|
||||
String cp = System.getProperty("java.class.path");
|
||||
if (cp == null || cp.isEmpty()) {
|
||||
return loaders;
|
||||
}
|
||||
Stream.of(cp.split(File.pathSeparator))
|
||||
.map(File::new)
|
||||
.filter(File::exists)
|
||||
.map(file -> file.isFile() ? file.getParentFile() : file)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(File::isDirectory)
|
||||
.map(file -> new File(file, "jdbc"))
|
||||
.filter(File::exists)
|
||||
.filter(File::isDirectory)
|
||||
.distinct()
|
||||
.flatMap(file -> {
|
||||
File[] files = file.listFiles((f, name) -> name.startsWith(MYSQL_DRIVER_FILE_PREFIX));
|
||||
if (files != null) {
|
||||
return Stream.of(files);
|
||||
} else {
|
||||
return Stream.of();
|
||||
}
|
||||
})
|
||||
.forEach(file -> {
|
||||
if (loaders.containsKey(MYSQL8_DRIVER_CLASS_NAME) && loaders.containsKey(MYSQL_DRIVER_CLASS_NAME)) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
URL url = file.toURI().toURL();
|
||||
ClassLoader loader = new URLClassLoader(new URL[]{url}, ClassLoader.getSystemClassLoader());
|
||||
try {
|
||||
loader.loadClass(MYSQL8_DRIVER_CLASS_NAME);
|
||||
loaders.putIfAbsent(MYSQL8_DRIVER_CLASS_NAME, loader);
|
||||
} catch (ClassNotFoundException e) {
|
||||
loaders.putIfAbsent(MYSQL_DRIVER_CLASS_NAME, loader);
|
||||
}
|
||||
} catch (MalformedURLException ignore) {
|
||||
}
|
||||
});
|
||||
return loaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get url string.
|
||||
*
|
||||
* @return the string
|
||||
*/
|
||||
protected String getUrl() {
|
||||
String url = CONFIG.getConfig(ConfigurationKeys.STORE_DB_URL);
|
||||
if (StringUtils.isBlank(url)) {
|
||||
throw new StoreException(String.format("the {%s} can't be empty", ConfigurationKeys.STORE_DB_URL));
|
||||
}
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user string.
|
||||
*
|
||||
* @return the string
|
||||
*/
|
||||
protected String getUser() {
|
||||
String user = CONFIG.getConfig(ConfigurationKeys.STORE_DB_USER);
|
||||
if (StringUtils.isBlank(user)) {
|
||||
throw new StoreException(String.format("the {%s} can't be empty", ConfigurationKeys.STORE_DB_USER));
|
||||
}
|
||||
return user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get password string.
|
||||
*
|
||||
* @return the string
|
||||
*/
|
||||
protected String getPassword() {
|
||||
String password = CONFIG.getConfig(ConfigurationKeys.STORE_DB_PASSWORD);
|
||||
String publicKey = getPublicKey();
|
||||
if (StringUtils.isNotBlank(publicKey)) {
|
||||
try {
|
||||
password = ConfigTools.publicDecrypt(password, publicKey);
|
||||
} catch (Exception e) {
|
||||
LOGGER.error(
|
||||
"decryption failed,please confirm whether the ciphertext and secret key are correct! error msg: {}",
|
||||
e.getMessage());
|
||||
}
|
||||
}
|
||||
return password;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get min conn int.
|
||||
*
|
||||
* @return the int
|
||||
*/
|
||||
protected int getMinConn() {
|
||||
int minConn = CONFIG.getInt(ConfigurationKeys.STORE_DB_MIN_CONN, DEFAULT_DB_MIN_CONN);
|
||||
return minConn < 0 ? DEFAULT_DB_MIN_CONN : minConn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get max conn int.
|
||||
*
|
||||
* @return the int
|
||||
*/
|
||||
protected int getMaxConn() {
|
||||
int maxConn = CONFIG.getInt(ConfigurationKeys.STORE_DB_MAX_CONN, DEFAULT_DB_MAX_CONN);
|
||||
return maxConn < 0 ? DEFAULT_DB_MAX_CONN : maxConn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get validation query string.
|
||||
*
|
||||
* @param dbType the db type
|
||||
* @return the string
|
||||
*/
|
||||
protected String getValidationQuery(DBType dbType) {
|
||||
if (DBType.ORACLE.equals(dbType)) {
|
||||
return "select sysdate from dual";
|
||||
} else {
|
||||
return "select 1";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get public key.
|
||||
*
|
||||
* @return the string
|
||||
*/
|
||||
protected String getPublicKey() {
|
||||
return CONFIG.getConfig(ConfigurationKeys.STORE_PUBLIC_KEY);
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
* http://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.
|
||||
*/
|
||||
package org.apache.seata.server;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
*/
|
||||
@SpringBootApplication(scanBasePackages = {"org.apache.seata"})
|
||||
public class SeataServerApplication {
|
||||
public static void main(String[] args) throws IOException {
|
||||
// run the spring-boot application
|
||||
SpringApplication.run(ServerApplication.class, args);
|
||||
}
|
||||
}
|
@@ -0,0 +1,60 @@
|
||||
server:
|
||||
port: 7091
|
||||
|
||||
spring:
|
||||
application:
|
||||
name: ruoyi-seata-server
|
||||
profiles:
|
||||
# 环境配置
|
||||
active: @profiles.active@
|
||||
|
||||
logging:
|
||||
config: classpath:logback-spring.xml
|
||||
file:
|
||||
path: ./logs/seata
|
||||
# extend:
|
||||
# logstash-appender:
|
||||
# destination: 127.0.0.1:4560
|
||||
# kafka-appender:
|
||||
# bootstrap-servers: 127.0.0.1:9092
|
||||
# topic: logback_to_logstash
|
||||
|
||||
console:
|
||||
user:
|
||||
username: seata
|
||||
password: seata
|
||||
|
||||
seata:
|
||||
config:
|
||||
# support: nacos 、 consul 、 apollo 、 zk 、 etcd3
|
||||
type: nacos
|
||||
nacos:
|
||||
server-addr: @nacos.server@
|
||||
group: @nacos.discovery.group@
|
||||
namespace: ${spring.profiles.active}
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
##if use MSE Nacos with auth, mutex with username/password attribute
|
||||
#access-key: ""
|
||||
#secret-key: ""
|
||||
data-id: seata-server.properties
|
||||
registry:
|
||||
# support: nacos 、 eureka 、 redis 、 zk 、 consul 、 etcd3 、 sofa
|
||||
type: nacos
|
||||
nacos:
|
||||
application: ${spring.application.name}
|
||||
server-addr: @nacos.server@
|
||||
group: @nacos.discovery.group@
|
||||
namespace: ${spring.profiles.active}
|
||||
cluster: default
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
##if use MSE Nacos with auth, mutex with username/password attribute
|
||||
#access-key: ""
|
||||
#secret-key: ""
|
||||
security:
|
||||
secretKey: rE7bYayhpvduYwCxuhckybEPDXyna6xwm5m7MZjtjrdXjVxAbXAMccXHyaJvB346
|
||||
tokenValidityInMilliseconds: 1800000
|
||||
csrf-ignore-urls: /metadata/v1/**
|
||||
ignore:
|
||||
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login,/version.json,/health,/error,/vgroup/v1/**
|
@@ -0,0 +1,8 @@
|
||||
Spring Boot Version: ${spring-boot.version}
|
||||
Spring Application Name: ${spring.application.name}
|
||||
_
|
||||
| |
|
||||
___ ___ __ _| |_ __ _ ______ ___ ___ _ ____ _____ _ __
|
||||
/ __|/ _ \/ _` | __/ _` |______/ __|/ _ \ '__\ \ / / _ \ '__|
|
||||
\__ \ __/ (_| | || (_| | \__ \ __/ | \ V / __/ |
|
||||
|___/\___|\__,_|\__\__,_| |___/\___|_| \_/ \___|_|
|
Binary file not shown.
@@ -0,0 +1,97 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<included>
|
||||
|
||||
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>
|
||||
|
||||
<!-- 控制台输出 -->
|
||||
<appender name="file_console" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${log.path}/console.log</file>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 日志文件名格式 -->
|
||||
<fileNamePattern>${log.path}/console.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<!-- 日志最大 1天 -->
|
||||
<maxHistory>1</maxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>${log.pattern}</pattern>
|
||||
<charset>utf-8</charset>
|
||||
</encoder>
|
||||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
|
||||
<!-- 过滤的级别 -->
|
||||
<level>INFO</level>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- 系统日志输出 -->
|
||||
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${log.path}/info.log</file>
|
||||
<!-- 循环政策:基于时间创建日志文件 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 日志文件名格式 -->
|
||||
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<!-- 日志最大的历史 60天 -->
|
||||
<maxHistory>60</maxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>${log.pattern}</pattern>
|
||||
</encoder>
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<!-- 过滤的级别 -->
|
||||
<level>INFO</level>
|
||||
<!-- 匹配时的操作:接收(记录) -->
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<!-- 不匹配时的操作:拒绝(不记录) -->
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${log.path}/error.log</file>
|
||||
<!-- 循环政策:基于时间创建日志文件 -->
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<!-- 日志文件名格式 -->
|
||||
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
|
||||
<!-- 日志最大的历史 60天 -->
|
||||
<maxHistory>60</maxHistory>
|
||||
</rollingPolicy>
|
||||
<encoder>
|
||||
<pattern>${log.pattern}</pattern>
|
||||
</encoder>
|
||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||
<!-- 过滤的级别 -->
|
||||
<level>ERROR</level>
|
||||
<!-- 匹配时的操作:接收(记录) -->
|
||||
<onMatch>ACCEPT</onMatch>
|
||||
<!-- 不匹配时的操作:拒绝(不记录) -->
|
||||
<onMismatch>DENY</onMismatch>
|
||||
</filter>
|
||||
</appender>
|
||||
|
||||
<!-- info异步输出 -->
|
||||
<appender name="async_info" class="ch.qos.logback.classic.AsyncAppender">
|
||||
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
|
||||
<discardingThreshold>0</discardingThreshold>
|
||||
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
|
||||
<queueSize>512</queueSize>
|
||||
<!-- 添加附加的appender,最多只能添加一个 -->
|
||||
<appender-ref ref="file_info"/>
|
||||
</appender>
|
||||
|
||||
<!-- error异步输出 -->
|
||||
<appender name="async_error" class="ch.qos.logback.classic.AsyncAppender">
|
||||
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
|
||||
<discardingThreshold>0</discardingThreshold>
|
||||
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
|
||||
<queueSize>512</queueSize>
|
||||
<!-- 添加附加的appender,最多只能添加一个 -->
|
||||
<appender-ref ref="file_error"/>
|
||||
</appender>
|
||||
|
||||
<!--系统操作日志-->
|
||||
<root level="info">
|
||||
<appender-ref ref="async_info"/>
|
||||
<appender-ref ref="async_error"/>
|
||||
<appender-ref ref="file_console"/>
|
||||
</root>
|
||||
</included>
|
@@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ Copyright 1999-2019 Seata.io Group.
|
||||
~
|
||||
~ 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
|
||||
~
|
||||
~ http://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.
|
||||
-->
|
||||
|
||||
<configuration scan="true" scanPeriod="60 seconds" debug="false">
|
||||
<!-- Context listeners -->
|
||||
<contextListener class="org.apache.seata.server.logging.listener.SystemPropertyLoggerContextListener"/>
|
||||
<!-- common properties -->
|
||||
<springProperty name="PORT" source="server.port" defaultValue="7091"/>
|
||||
<springProperty name="APPLICATION_NAME" source="spring.application.name" defaultValue="seata-server"/>
|
||||
|
||||
<!-- 日志存放路径 -->
|
||||
<property name="log.path" value="logs/${project.artifactId}"/>
|
||||
<!-- 日志输出格式 -->
|
||||
<property name="console.log.pattern"
|
||||
value="%cyan(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
|
||||
|
||||
<!-- 控制台输出 -->
|
||||
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>${console.log.pattern}</pattern>
|
||||
<charset>utf-8</charset>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<include resource="logback-common.xml" />
|
||||
|
||||
<include resource="logback-logstash.xml" />
|
||||
|
||||
<!-- 开启 skywalking 日志收集 -->
|
||||
<include resource="logback-skylog.xml" />
|
||||
|
||||
<root level="INFO">
|
||||
<appender-ref ref="console"/>
|
||||
</root>
|
||||
</configuration>
|
Reference in New Issue
Block a user