Browse Source

init

master
nili 3 years ago
commit
9b5598f970
  1. 12
      .gitignore
  2. 0
      README.md
  3. 41
      build
  4. 84
      luigi-api/pom.xml
  5. 26
      luigi-api/src/main/java/com/bzgame/server/luigi/ApiApplication.java
  6. 17
      luigi-api/src/main/java/com/bzgame/server/luigi/api/HelloController.java
  7. 62
      luigi-api/src/main/java/com/bzgame/server/luigi/api/RequestContext.java
  8. 109
      luigi-api/src/main/java/com/bzgame/server/luigi/api/aop/ApiAop.java
  9. 21
      luigi-api/src/main/java/com/bzgame/server/luigi/api/aop/ApiFlag.java
  10. 40
      luigi-api/src/main/java/com/bzgame/server/luigi/api/config/TomcatConfig.java
  11. 41
      luigi-api/src/main/java/com/bzgame/server/luigi/api/filter/LoginFilter.java
  12. 65
      luigi-api/src/main/resources/application-default.yml
  13. 33
      luigi-api/src/main/resources/application-prod.yml
  14. 65
      luigi-api/src/main/resources/application-test.yml
  15. 4
      luigi-api/src/main/resources/logback-spring.xml
  16. 18
      luigi-api/src/test/java/com/bzgame/server/luigi/ApiTestApplication.java
  17. 16
      luigi-api/src/test/java/com/bzgame/server/luigi/api/test/BaseTest.java
  18. 97
      luigi-api/src/test/resources/application-default.yml
  19. 3
      luigi-api/src/test/resources/bootstrap.yml
  20. 4
      luigi-api/src/test/resources/logback.xml
  21. 73
      luigi-dao/pom.xml
  22. 23
      luigi-dao/src/main/java/com/bzgame/server/luigi/dao/config/MybatisGeneralConfig.java
  23. 63
      luigi-dao/src/main/java/com/bzgame/server/luigi/dao/config/TopicDataSourceConfig.java
  24. 26
      luigi-dao/src/main/java/com/bzgame/server/luigi/dao/domain/DroolRules.java
  25. 13
      luigi-dao/src/main/java/com/bzgame/server/luigi/dao/mapper/DroolRulesMapper.java
  26. 24
      luigi-dao/src/test/resources/application-default.yml
  27. 54
      luigi-service/pom.xml
  28. 17
      luigi-service/src/test/java/com/bzgame/server/luigi/ServiceTestApplication.java
  29. 16
      luigi-service/src/test/java/com/bzgame/server/luigi/service/test/BaseTest.java
  30. 25
      luigi-service/src/test/resources/application-default.yml
  31. 109
      pom.xml
  32. 34
      run
  33. 14
      stop

12
.gitignore

@ -0,0 +1,12 @@
.idea
**/*/target
**/*/logs
*.iml
**/*/pid
**/*/idl/gen-java
*.log
*.DS_Store
logs
pid
system.conf
jar

0
README.md

41
build

@ -0,0 +1,41 @@
#!/bin/bash
mode=`cat system.conf | awk -F = '{print$2}'`
if [ -z "$mode" ]; then
echo "mode is not set"
exit 1
fi
project=`echo $mode | awk -F - '{print $1}'`
if [ -z "$project" ]; then
echo "mode format is wrong"
exit 1
fi
logdir=/var/www/data/log/luigi/$project
if [ ! -d "$logdir" ];then
mkdir -p $logdir
fi
jardir=jar
if [ ! -d "$jardir" ];then
mkdir $jardir
fi
rm -rf logs
ln -s $logdir logs
mvn clean package -DskipTests -U > /dev/null
r=$?
if [ "$r" == "0" ] ; then
echo 'build success'
else
echo 'build fail'
exit 1
fi

84
luigi-api/pom.xml

@ -0,0 +1,84 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>luigi</artifactId>
<groupId>com.bzgame.server</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>luigi-api</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>com.bzgame.server</groupId>
<artifactId>common</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
</dependency>
<dependency>
<groupId>com.bzgame.server</groupId>
<artifactId>luigi-dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

26
luigi-api/src/main/java/com/bzgame/server/luigi/ApiApplication.java

@ -0,0 +1,26 @@
package com.bzgame.server.luigi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.ApplicationPidFileWriter;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
/**
* Created by cba/kit-backend on 2022-03-18 15:25:35
*/
@SpringBootApplication
@ComponentScan({"com.bzgame.server.luigi.service",
"com.bzgame.server.luigi.dao",
"com.bzgame.server.luigi.api"})
@ServletComponentScan
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
public class ApiApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(ApiApplication.class);
application.addListeners(new ApplicationPidFileWriter());
application.run(args);
}
}

17
luigi-api/src/main/java/com/bzgame/server/luigi/api/HelloController.java

@ -0,0 +1,17 @@
package com.bzgame.server.luigi.api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author nidaren
*/
@RestController
@RequestMapping("/api/luigi")
public class HelloController {
@GetMapping("hello")
public String hello() {
return "hello, luigi";
}
}

62
luigi-api/src/main/java/com/bzgame/server/luigi/api/RequestContext.java

@ -0,0 +1,62 @@
package com.bzgame.server.luigi.api;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
public class RequestContext {
private static final String KEY_REQUEST = "request";
private static final String KEY_RESPONSE = "response";
private static final String KEY_UID = "uid";
private static final Logger LOGGER = LoggerFactory.getLogger(RequestContext.class);
private static final ThreadLocal<Map<String, Object>> THREAD_LOCAL = new ThreadLocal<>();
public static void init(HttpServletRequest request, HttpServletResponse response, Integer uid) {
Assert.notNull(request, "request is null");
Map<String, Object> context = new HashMap<>();
context.put(KEY_REQUEST, request);
context.put(KEY_RESPONSE, response);
context.put(KEY_UID, uid);
THREAD_LOCAL.set(context);
}
public static HttpServletRequest getRequest() {
return (HttpServletRequest) THREAD_LOCAL.get().get(KEY_REQUEST);
}
public static HttpServletResponse getResponse() {
return (HttpServletResponse) THREAD_LOCAL.get().get(KEY_RESPONSE);
}
public static Integer getUid() {
return (Integer) THREAD_LOCAL.get().get(KEY_UID);
}
public static String getUidStr() {
Integer uid = (Integer) THREAD_LOCAL.get().get(KEY_UID);
if (uid == null) {
return "empty";
}
return uid + "";
}
public static void clear() {
THREAD_LOCAL.remove();
}
}

109
luigi-api/src/main/java/com/bzgame/server/luigi/api/aop/ApiAop.java

@ -0,0 +1,109 @@
package com.bzgame.server.luigi.api.aop;
import com.bczgame.server.common.exception.BizException;
import com.bczgame.server.common.exception.ExceptionCode;
import com.bczgame.server.common.log.L;
import com.bczgame.server.common.log.Status;
import com.bczgame.server.common.vo.Response;
import com.bzgame.server.luigi.api.RequestContext;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ApiAop {
private static final String EMPTY_STR_IN_LOG = "EMPTY";
@Value("${spring.application.name}")
private String appName;
@Autowired
private ObjectMapper objectMapper;
@Around("@annotation(com.bzgame.server.luigi.api.aop.ApiFlag)")
public Object advice(ProceedingJoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String methodName = signature.getMethod().getName();
ApiFlag flag = signature.getMethod().getAnnotation(ApiFlag.class);
boolean log = flag.log();
boolean logRet = flag.logRet();
boolean logParam = flag.logParam();
boolean needLogin = flag.needLogin();
Throwable exception = null;
long start = System.currentTimeMillis();
Object[] params = joinPoint.getArgs();
Object ret = null;
Status status = Status.SUCCESS;
try {
if (needLogin && RequestContext.getUid() == null) {
throw new BizException(ExceptionCode.NEED_AUTH, "请先登陆");
}
ret = joinPoint.proceed();
return ret;
} catch (Throwable e) {
exception = e;
Response resp = new Response();
resp.setMessage(e.getMessage());
if (e instanceof BizException) {
resp.setCode(((BizException) e).getCode());
} else if (e instanceof IllegalArgumentException) {
resp.setCode(ExceptionCode.PARAM_ILLEGAL_WARN);
resp.setMessage("服务器错误,请稍后重试");
} else {
status = Status.FAILED;
resp.setCode(ExceptionCode.GENERAL_ERROR);
resp.setMessage("服务器错误,请稍后重试");
}
ret = resp;
return resp;
} finally {
if (log) {
int cost = (int) (System.currentTimeMillis() - start);
String paramStr = EMPTY_STR_IN_LOG;
if (logParam && params != null && params.length > 0) {
try {
paramStr = objectMapper.writeValueAsString(params);
} catch (JsonProcessingException e) {
}
}
String retStr = EMPTY_STR_IN_LOG;
if (logRet && ret != null) {
try {
retStr = objectMapper.writeValueAsString(ret);
} catch (JsonProcessingException e) {
}
}
String cookiesStr = EMPTY_STR_IN_LOG;
if (RequestContext.getRequest().getCookies() != null && RequestContext.getRequest().getCookies().length > 0) {
try {
cookiesStr = objectMapper.writeValueAsString(RequestContext.getRequest().getCookies());
} catch (JsonProcessingException e) {
}
}
if (exception == null) {
L.api(cost, status, methodName, RequestContext.getUidStr(), cookiesStr, paramStr, retStr);
} else {
L.api(cost, status, methodName, RequestContext.getUidStr(), cookiesStr, paramStr, retStr, exception);
}
}
}
}
}

21
luigi-api/src/main/java/com/bzgame/server/luigi/api/aop/ApiFlag.java

@ -0,0 +1,21 @@
package com.bzgame.server.luigi.api.aop;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiFlag {
public boolean log() default true;
public boolean logParam() default true;
public boolean logRet() default true;
public boolean needLogin() default false;
}

40
luigi-api/src/main/java/com/bzgame/server/luigi/api/config/TomcatConfig.java

@ -0,0 +1,40 @@
package com.bzgame.server.luigi.api.config;
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.AbstractHttp11Protocol;
import org.apache.tomcat.util.http.LegacyCookieProcessor;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Created by cba/kit-backend on 2022-03-18 15:25:35
*/
@Configuration
public class TomcatConfig {
@Bean
public ServletWebServerFactory servletContainerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
((AbstractHttp11Protocol)connector.getProtocolHandler()).setMaxKeepAliveRequests(-1);
}
});
factory.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
context.setCookieProcessor(new LegacyCookieProcessor());
}
});
return factory;
}
}

41
luigi-api/src/main/java/com/bzgame/server/luigi/api/filter/LoginFilter.java

@ -0,0 +1,41 @@
package com.bzgame.server.luigi.api.filter;
import com.bzgame.server.luigi.api.RequestContext;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author nidaren
*/
@WebFilter(filterName = "ContextFilter", urlPatterns = {"/api/*"})
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpSession session = httpRequest.getSession();
Integer uid = (Integer) session.getAttribute("TODO");
RequestContext.init(httpRequest, (HttpServletResponse) response, uid);
chain.doFilter(request, response);
} finally {
RequestContext.clear();
}
}
@Override
public void destroy() {
}
}

65
luigi-api/src/main/resources/application-default.yml

@ -0,0 +1,65 @@
spring:
application:
name: luigi-api
aop:
auto: true
proxy-target-class: true
http:
encoding:
enabled: true
charset: UTF-8
pid:
file: pid #pid文件名
session:
redis:
namespace: sss:session
store-type: redis
redis:
host: 127.0.0.1
port: 6379
password:
maxTotal: 128
poolMaxWaitMs: 50
timeOutMs: 100
logging:
config: classpath:logback-spring.xml
server:
port: 8001
connection-timeout: 60000 #Time in milliseconds that connectors will wait for another HTTP request before closing the connection.
tomcat:
accept-count: 1024 # Maximum queue length for incoming connection requests when all possible request processing threads are in use.
max-connections: 256 # Maximum number of connections that the server will accept and process at any given time.
max-threads: 32 # Maximum amount of worker threads.
min-spare-threads: 4 # Minimum amount of worker threads.
accesslog:
enabled: false
directory: logs
prefix: tomcat_access_log
rotate: true
servlet:
session:
cookie:
domain: localhost
path: /
name: MARIO-JSESSIONID
max-age: 15d
timeout: 15d
datasource:
mario:
type: com.zaxxer.hikari.HikariDataSource
jdbcUrl: jdbc:mysql://localhost:3306/mario?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&connectTimeout=300&socketTimeout=2000&serverTimezone=Asia/Shanghai&useAffectedRows=true
username: root
password:
connectionTimeout: 500
maximumPoolSize: 32
minimumIdle: 4
idleTimeout: 600000 #This property controls the maximum amount of time that a connection is allowed to sit idle in the pool
maxLifetime: 3600000 #This property controls the maximum lifetime of a connection in the pool
connectionInitSql: "SET NAMES 'utf8mb4'"
mybatis:
configuration:
map-underscore-to-camel-case: true #数据库字段下划线映射java对象属性用驼峰命名

33
luigi-api/src/main/resources/application-prod.yml

@ -0,0 +1,33 @@
spring:
application:
name: luigi-api
aop:
auto: true
proxy-target-class: true
http:
encoding:
enabled: true
charset: UTF-8
pid:
file: pid #pid文件名
logging:
config: classpath:logback-spring.xml
server:
port: 8001
connection-timeout: 60000 #Time in milliseconds that connectors will wait for another HTTP request before closing the connection.
tomcat:
accept-count: 1024 # Maximum queue length for incoming connection requests when all possible request processing threads are in use.
max-connections: 256 # Maximum number of connections that the server will accept and process at any given time.
max-threads: 32 # Maximum amount of worker threads.
min-spare-threads: 4 # Minimum amount of worker threads.
accesslog:
enabled: false
directory: logs
prefix: tomcat_access_log
rotate: true
mybatis:
configuration:
map-underscore-to-camel-case: true #数据库字段下划线映射java对象属性用驼峰命名

65
luigi-api/src/main/resources/application-test.yml

@ -0,0 +1,65 @@
spring:
application:
name: luigi-api
aop:
auto: true
proxy-target-class: true
http:
encoding:
enabled: true
charset: UTF-8
pid:
file: pid #pid文件名
session:
redis:
namespace: sss:session
store-type: redis
redis:
host: 127.0.0.1
port: 6379
password:
maxTotal: 128
poolMaxWaitMs: 50
timeOutMs: 100
logging:
config: classpath:logback-spring.xml
server:
port: 8001
connection-timeout: 60000 #Time in milliseconds that connectors will wait for another HTTP request before closing the connection.
tomcat:
accept-count: 1024 # Maximum queue length for incoming connection requests when all possible request processing threads are in use.
max-connections: 256 # Maximum number of connections that the server will accept and process at any given time.
max-threads: 32 # Maximum amount of worker threads.
min-spare-threads: 4 # Minimum amount of worker threads.
accesslog:
enabled: false
directory: logs
prefix: tomcat_access_log
rotate: true
servlet:
session:
cookie:
domain: bzgames.cn
path: /
name: MARIO-JSESSIONID
max-age: 15d
timeout: 15d
datasource:
mario:
type: com.zaxxer.hikari.HikariDataSource
jdbcUrl: jdbc:mysql://localhost:3306/mario?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&connectTimeout=300&socketTimeout=2000&serverTimezone=Asia/Shanghai&useAffectedRows=true
username: marioServer
password: YO@9A9e%0&
connectionTimeout: 500
maximumPoolSize: 32
minimumIdle: 4
idleTimeout: 600000 #This property controls the maximum amount of time that a connection is allowed to sit idle in the pool
maxLifetime: 3600000 #This property controls the maximum lifetime of a connection in the pool
connectionInitSql: "SET NAMES 'utf8mb4'"
mybatis:
configuration:
map-underscore-to-camel-case: true #数据库字段下划线映射java对象属性用驼峰命名

4
luigi-api/src/main/resources/logback-spring.xml

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="logconfig.xml"/>
</configuration>

18
luigi-api/src/test/java/com/bzgame/server/luigi/ApiTestApplication.java

@ -0,0 +1,18 @@
package com.bzgame.server.luigi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Created by cba/kit-backend on 2022-03-18 15:25:35
*/
@SpringBootApplication()
public class ApiTestApplication {
public static void main(String[] args) throws Exception {
SpringApplication app = new SpringApplication(ApiTestApplication.class);
app.run(args);
}
}

16
luigi-api/src/test/java/com/bzgame/server/luigi/api/test/BaseTest.java

@ -0,0 +1,16 @@
package com.bzgame.server.luigi.api.test;
import com.bzgame.server.luigi.ApiTestApplication;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Commit;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* Created by cba/kit-backend on 2022-03-18 15:25:35
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ApiTestApplication.class)
@Commit
public class BaseTest {
}

97
luigi-api/src/test/resources/application-default.yml

@ -0,0 +1,97 @@
spring:
profiles:
active: default
aop:
auto: true
proxy-target-class: true
http:
encoding:
enabled: true
charset: utf-8
pid:
file: pid #pid文件名
logging:
config: classpath:logback.xml
datasource:
topic:
type: com.zaxxer.hikari.HikariDataSource
jdbcUrl: jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&connectTimeout=300&socketTimeout=2000&serverTimezone=Asia/Shanghai
username: xxx
password: xxx
connectionTimeout: 500
maximumPoolSize: 32
minimumIdle: 4
idleTimeout: 600000 #This property controls the maximum amount of time that a connection is allowed to sit idle in the pool
maxLifetime: 3600000 #This property controls the maximum lifetime of a connection in the pool
mybatis:
configuration:
map-underscore-to-camel-case: true #数据库字段下划线映射java对象属性用驼峰命名
redis:
maxTotal: 32
poolMaxWaitMs: 1000
timeOutMs: 500
ip: 127.0.01
port: 6379
password: xxx
server:
port: 8000
connection-timeout: 60000 #Time in milliseconds that connectors will wait for another HTTP request before closing the connection.
tomcat:
accept-count: 1024 # Maximum queue length for incoming connection requests when all possible request processing threads are in use.
max-connections: 256 # Maximum number of connections that the server will accept and process at any given time.
max-threads: 32 # Maximum amount of worker threads.
min-spare-threads: 4 #Minimum amount of worker threads.
eureka:
client:
register-with-eureka: true #向eureka注册
fetchRegistry: true #拉取服务注册信息
registry-fetch-interval-seconds: 30 #拉取服务注册信息频率
instance-info-replication-interval-seconds: 30 #心跳频率
service-url:
defaultZone: http:/localhost:8761/eureka/ #eureka地址.多个地址用逗号分隔
instance:
prefer-ip-address: true #将ip注册到eureka
feign:
hystrix:
enabled: true
client:
config:
#默认feign 客户端配置
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: BASIC
#特定服务的配置
account-service: #fegin client name
connectTimeout: 1000
readTimeout: 3000
loggerLevel: BASIC
hystrix:
#无法为每个feign client单独配置hystrix command属性https://github.com/spring-cloud/spring-cloud-netflix/issues/1864
#采用default hystrix command 全局配置
command:
default:
metrics:
rollingStats:
timeInMilliseconds: 10000 #滑动统计窗口
circuitBreaker:
enabled: true #开启过载熔断
requestVolumeThreshold: 1000 #滑动窗口内可触发按错误比例熔断的最小请求数
errorThresholdPercentage: 50 #熔断触发错误比例
sleepWindowInMilliseconds: 5000 #熔断时间
execution:
isolation:
strategy: SEMAPHORE #采用线程池有性能问题,用SEMAPHORE
semaphore:
maxConcurrentRequests: 100 #信号量的上限
thread:
timeoutInMilliseconds: 5000 #hystrix的超时时间

3
luigi-api/src/test/resources/bootstrap.yml

@ -0,0 +1,3 @@
spring:
application:
name: resource-api

4
luigi-api/src/test/resources/logback.xml

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="bcz/app/server/common/log/logconfig.xml"/>
</configuration>

73
luigi-dao/pom.xml

@ -0,0 +1,73 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>luigi</artifactId>
<groupId>com.bzgame.server</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>luigi-dao</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<!--不用tomcat的数据库连接池-->
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<configurationFile>src/main/resources/mybatis-generator/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
<dependency>
<groupId>com.bzgame.server</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>

23
luigi-dao/src/main/java/com/bzgame/server/luigi/dao/config/MybatisGeneralConfig.java

@ -0,0 +1,23 @@
package com.bzgame.server.luigi.dao.config;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
/**
* Created by cba/kit-backend on 2022-03-18 15:25:35
*/
@Configuration
public class MybatisGeneralConfig {
public static final String MBTS_CFG_NAME = "mybatisGeneralCfg";
@Bean(MBTS_CFG_NAME)
@ConfigurationProperties("mybatis.configuration")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public org.apache.ibatis.session.Configuration configuration() {
return new org.apache.ibatis.session.Configuration();
}
}

63
luigi-dao/src/main/java/com/bzgame/server/luigi/dao/config/TopicDataSourceConfig.java

@ -0,0 +1,63 @@
package com.bzgame.server.luigi.dao.config;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
* Created by cba/kit-backend on 2022-03-18 15:25:35
*/
@Configuration
@MapperScan(basePackages = TopicDataSourceConfig.BASE_PACKAGE,sqlSessionFactoryRef = TopicDataSourceConfig.SSF_NAME,sqlSessionTemplateRef = TopicDataSourceConfig.SST_NAME)
public class TopicDataSourceConfig {
//TODO 修改配置常量名
public static final String DS_NAME = "topicDataSource";
public static final String TM_NAME = "topicTransactionManager";
public static final String SSF_NAME = "topicSqlSessionFactory";
public static final String SST_NAME = "topicSqlSessionTemplate";
public static final String DS_CFG_PREFIX = "datasource.topic";
public static final String BASE_PACKAGE = "bcz.app.server.luigi.dao.mapper";
@Bean(name = DS_NAME)
@ConfigurationProperties(DS_CFG_PREFIX)
public DataSource dataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
@Bean(name = TM_NAME)
public DataSourceTransactionManager transactionManager(@Qualifier(DS_NAME) DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = SSF_NAME)
public SqlSessionFactory sqlSessionFactory(@Qualifier(DS_NAME) DataSource dataSource, @Qualifier(MybatisGeneralConfig.MBTS_CFG_NAME) org.apache.ibatis.session.Configuration configuration) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setConfiguration(configuration);
factoryBean.setDataSource(dataSource);
return factoryBean.getObject();
}
@Bean(name = SST_NAME)
public SqlSessionTemplate sqlSessionTemplate(@Qualifier(SSF_NAME) SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

26
luigi-dao/src/main/java/com/bzgame/server/luigi/dao/domain/DroolRules.java

@ -0,0 +1,26 @@
package com.bzgame.server.luigi.dao.domain;
/**
* @author chenyang@baicizhan.com
* @date 2020/3/9 6:31 PM
*/
public class DroolRules {
private long id;
private String rules;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getRules() {
return rules;
}
public void setRules(String rules) {
this.rules = rules;
}
}

13
luigi-dao/src/main/java/com/bzgame/server/luigi/dao/mapper/DroolRulesMapper.java

@ -0,0 +1,13 @@
package com.bzgame.server.luigi.dao.mapper;
import com.bzgame.server.luigi.dao.domain.DroolRules;
import org.apache.ibatis.annotations.Select;
/**
* @author chenyang@baicizhan.com
* @date 2020/3/9 6:32 PM
*/
public interface DroolRulesMapper {
@Select("SELECT *FROM drool_rules WHERE id=1")
DroolRules query();
}

24
luigi-dao/src/test/resources/application-default.yml

@ -0,0 +1,24 @@
#dao单元测试配置文件
spring:
profiles:
active: default
aop:
auto: true
proxy-target-class: true
datasource:
topic:
type: com.zaxxer.hikari.HikariDataSource
jdbcUrl: jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&connectTimeout=1000&socketTimeout=3000&serverTimezone=Hongkong
username: xxx
password: xxx
connectionTimeout: 500
maximumPoolSize: 5
minimumIdle: 1
idleTimeout: 600000 #This property controls the maximum amount of time that a connection is allowed to sit idle in the pool
maxLifetime: 3600000 #This property controls the maximum lifetime of a connection in the pool
mybatis:
configuration:
map-underscore-to-camel-case: true #数据库字段下划线映射java对象属性用驼峰命名

54
luigi-service/pom.xml

@ -0,0 +1,54 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>luigi</artifactId>
<groupId>com.bzgame.server</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>luigi-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
</dependencies>
</project>

17
luigi-service/src/test/java/com/bzgame/server/luigi/ServiceTestApplication.java

@ -0,0 +1,17 @@
package com.bzgame.server.luigi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Created by cba/kit-backend on 2022-03-18 15:25:35
*/
@SpringBootApplication
public class ServiceTestApplication {
public static void main(String[] args) throws Exception {
SpringApplication app = new SpringApplication(ServiceTestApplication.class);
app.run(args);
}
}

16
luigi-service/src/test/java/com/bzgame/server/luigi/service/test/BaseTest.java

@ -0,0 +1,16 @@
package com.bzgame.server.luigi.service.test;
import com.bzgame.server.luigi.ServiceTestApplication;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Commit;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* Created by cba/kit-backend on 2022-03-18 15:25:35
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ServiceTestApplication.class)
@Commit
public class BaseTest {
}

25
luigi-service/src/test/resources/application-default.yml

@ -0,0 +1,25 @@
#service单元测试配置文件
spring:
profiles:
active: default
aop:
auto: true
proxy-target-class: true
datasource:
topic:
type: com.zaxxer.hikari.HikariDataSource
jdbcUrl: jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&connectTimeout=300&socketTimeout=2000&serverTimezone=Hongkong
username: xxx
password: xxx
connectionTimeout: 300
maximumPoolSize: 5
minimumIdle: 1
idleTimeout: 600000 #This property controls the maximum amount of time that a connection is allowed to sit idle in the pool
maxLifetime: 3600000 #This property controls the maximum lifetime of a connection in the pool
mybatis:
configuration:
map-underscore-to-camel-case: true #数据库字段下划线映射java对象属性用驼峰命名

109
pom.xml

@ -0,0 +1,109 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bzgame.server</groupId>
<artifactId>luigi</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>luigi-api</module>
<module>luigi-service</module>
<module>luigi-dao</module>
</modules>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
<dependency>
<groupId>com.bzgame.server</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.2</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!--源码打包-->
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase><!--指定绑定的声明周期阶段-->
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

34
run

@ -0,0 +1,34 @@
#!/bin/bash
mode=`cat system.conf | awk -F = '{print$2}'`
if [ -z "$mode" ]; then
echo "mode is not set"
exit 1
fi
project=`echo $mode | awk -F - '{print $1}'`
profile=`echo $mode | awk -F - '{print $2}'`
if [ -z "$project" ]; then
echo "mode format is wrong"
exit 1
fi
if [ -z "$profile" ]; then
echo "mode format is wrong"
exit 1
fi
version=1.0-SNAPSHOT
jar=luigi-$project-$version.jar
targetdir=luigi-$project/target
projectmem=256m
if [ "$profile" = "prod" ]
then
projectmem=512m
fi
rm -rf jar/*
cp $targetdir/$jar jar/
java -server -Xmx$projectmem -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -verbose:gc -Xlog:gc*:logs/gc.log:time,l,tg:filecount=7,filesize=16M -jar jar/$jar --spring.profiles.active=$profile > run.log 2>&1

14
stop

@ -0,0 +1,14 @@
#!/bin/bash
if [ -f pid ]; then
if kill `cat pid` ; then
echo 'kill process succeed'
else
echo 'kill process fail'
exit 1
fi
else
echo 'pid file not exists'
exit 1
fi
Loading…
Cancel
Save