main
黄海 11 months ago
parent 274dba9876
commit 9a9a599814

@ -24,7 +24,7 @@
<module name="ms-admin" /> <module name="ms-admin" />
<module name="gw-openapi" /> <module name="gw-openapi" />
<module name="ms-websocket-ocpp" /> <module name="ms-websocket-ocpp" />
<module name="ds-gw" /> <module name="ds-build" />
<module name="ds-base" /> <module name="ds-base" />
<module name="ms-wallet" /> <module name="ms-wallet" />
</profile> </profile>
@ -36,7 +36,7 @@
</component> </component>
<component name="JavacSettings"> <component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_OVERRIDE"> <option name="ADDITIONAL_OPTIONS_OVERRIDE">
<module name="ds-base" options="-parameters" /> <module name="ds-base" options="" />
</option> </option>
</component> </component>
</project> </project>

@ -5,6 +5,8 @@
<file url="file://$PROJECT_DIR$/biz-common/src/main/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/biz-common/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/ds-base/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/ds-base/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/ds-base/src/main/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/ds-base/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/ds-build/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/ds-build/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/ds-gw/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/ds-gw/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/ds-gw/src/main/resources" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/ds-gw/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/gw-openapi/src/main/java" charset="UTF-8" /> <file url="file://$PROJECT_DIR$/gw-openapi/src/main/java" charset="UTF-8" />

@ -11,6 +11,7 @@
<option value="$PROJECT_DIR$/gw-exam/pom.xml" /> <option value="$PROJECT_DIR$/gw-exam/pom.xml" />
<option value="$PROJECT_DIR$/ds-base/pom.xml" /> <option value="$PROJECT_DIR$/ds-base/pom.xml" />
<option value="$PROJECT_DIR$/ds-gw/pom.xml" /> <option value="$PROJECT_DIR$/ds-gw/pom.xml" />
<option value="$PROJECT_DIR$/ds-build/pom.xml" />
</list> </list>
</option> </option>
<option name="ignoredFiles"> <option name="ignoredFiles">

@ -2,233 +2,73 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" <project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--指定父工程-->
<parent>
<groupId>com.dsideal.framework</groupId>
<artifactId>rough</artifactId>
<version>1.0.0</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>dsideal</groupId> <!--项目信息-->
<artifactId>ds-base</artifactId> <artifactId>ds-build</artifactId>
<version>1.0</version> <version>1.0.0</version>
<!--使用jdk1.8进行编译--> <name>ds-build</name>
<properties> <!--依赖包-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- 使用阿里 maven 库 -->
<repositories>
<repository>
<id>ali-maven</id>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
<dependencies> <dependencies>
<!--jfinal主框架--> <!--jfinal主框架-->
<dependency> <dependency>
<groupId>com.jfinal</groupId> <groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId> <artifactId>jfinal</artifactId>
<version>5.2.1</version> <version>${jfinal.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.jfinal</groupId> <groupId>com.jfinal</groupId>
<artifactId>jfinal-undertow</artifactId> <artifactId>jfinal-undertow</artifactId>
<version>3.6</version> <version>${jfinal.undertow.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.jfinal</groupId> <groupId>com.jfinal</groupId>
<artifactId>cos</artifactId> <artifactId>cos</artifactId>
<version>2022.2</version> <version>${jfinal.cos.version}</version>
</dependency>
<dependency>
<groupId>cn.smallbun.screw</groupId>
<artifactId>screw-core</artifactId>
<version>1.0.5</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>cn.hutool</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>hutool-json</artifactId>
<version>8.0.28</version> <version>${hutool.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.minio/minio -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.12</version>
</dependency> </dependency>
<!--https://blog.csdn.net/AdminGuan/article/details/100147488-->
<!--JWT,用于鉴权-->
<dependency> <dependency>
<groupId>io.jsonwebtoken</groupId> <groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId> <artifactId>jjwt</artifactId>
<version>0.7.0</version> <version>0.7.0</version>
</dependency> </dependency>
<!-- SLF4J API -->
<dependency> <dependency>
<groupId>javax.xml.bind</groupId> <groupId>org.slf4j</groupId>
<artifactId>jaxb-api</artifactId> <artifactId>slf4j-api</artifactId>
<version>2.3.1</version> <version>${slf4j-api.version}</version>
</dependency>
<!--引用json库-->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!--引用Mongodb的JFinal插件-->
<!-- https://mvnrepository.com/artifact/com.cybermkd/MongodbPlugin -->
<dependency>
<groupId>com.cybermkd</groupId>
<artifactId>MongodbPlugin</artifactId>
<version>1.0.8.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.12.14</version>
</dependency>
<!--科拓签名用的包-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
<!--引用光-->
<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
<!--日志logback-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<!--安装hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.29</version>
</dependency>
<!--引用fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.45</version>
</dependency>
<!--引用jsoup防止xss攻击-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version>
</dependency>
<!--引用gson-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.5</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.14</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency> </dependency>
<!-- Log4j 作为 SLF4J 的实现 -->
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId> <artifactId>slf4j-log4j12</artifactId>
<version>1.7.36</version> <version>${slf4j-log4j12.version}</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId> <groupId>log4j</groupId>
<artifactId>jackson-core</artifactId> <artifactId>log4j</artifactId>
<version>2.17.2</version> <version>${log4j.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId> <groupId>com.squareup.okhttp3</groupId>
<artifactId>jackson-databind</artifactId> <artifactId>okhttp</artifactId>
<version>2.17.2</version> <version>${okhttp.version}</version>
</dependency> </dependency>
<!--引用ssh+sftp组件-->
<!-- https://mvnrepository.com/artifact/com.github.mwiede/jsch -->
<dependency> <dependency>
<groupId>com.github.mwiede</groupId> <groupId>org.yaml</groupId>
<artifactId>jsch</artifactId> <artifactId>snakeyaml</artifactId>
<version>0.2.19</version> <version>${snakeyaml.version}</version>
</dependency> </dependency>
</dependencies> </dependencies>
<build> </project>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>8</source>
<target>8</target>
<encoding>UTF-8</encoding>
<!-- java8 保留参数名编译参数 -->
<compilerArgument>-parameters</compilerArgument>
</configuration>
</plugin>
</plugins>
</build>
</project>

@ -11,9 +11,9 @@
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<!--项目信息--> <!--项目信息-->
<artifactId>ds-gw</artifactId> <artifactId>ds-build</artifactId>
<version>1.0.0</version> <version>1.0.0</version>
<name>gw-exam</name> <name>ds-build</name>
<!--依赖包--> <!--依赖包-->
<dependencies> <dependencies>
<!--jfinal主框架--> <!--jfinal主框架-->
@ -22,26 +22,11 @@
<artifactId>jfinal</artifactId> <artifactId>jfinal</artifactId>
<version>${jfinal.version}</version> <version>${jfinal.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal-undertow</artifactId>
<version>${jfinal.undertow.version}</version>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>cos</artifactId>
<version>${jfinal.cos.version}</version>
</dependency>
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-json</artifactId> <artifactId>hutool-json</artifactId>
<version>${hutool.version}</version> <version>${hutool.version}</version>
</dependency> </dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
<!-- SLF4J API --> <!-- SLF4J API -->
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
@ -60,15 +45,5 @@
<artifactId>log4j</artifactId> <artifactId>log4j</artifactId>
<version>${log4j.version}</version> <version>${log4j.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>${okhttp.version}</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>${snakeyaml.version}</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

@ -0,0 +1,5 @@
public class buildImage {
public static void main(String[] args) {
System.out.println("开始生成镜像");
}
}

@ -1,18 +1,13 @@
FROM openjdk:8u332-jre-slim-bullseye AS runner FROM openresty/openresty:1.21.4.1-0-alpine AS runner
# WORKDIR指令用于设置容器内部的工作目录即后续指令执行时的当前目录。当Docker容器启动并执行命令时这些命令将在WORKDIR指定的目录中执行。
WORKDIR /root
# ENV TZ这样的用法通常是用来设置时区环境变量TZ代表Time Zone # ENV TZ这样的用法通常是用来设置时区环境变量TZ代表Time Zone
ENV TZ=Asia/Shanghai ENV TZ=Asia/Shanghai
# 将target文件夹下的jar包gw-charge.jar复制到容器的/root目录下 # 将本地的Nginx配置文件复制到镜像中的指定路径
COPY ./ZhuQue /root/ZhuQue COPY ./nginx.conf /etc/nginx/nginx.conf
#设置这个环境变量后您可以在Docker容器中启动Java应用程序时使用这些参数。
ENV JAVA_OPTS="-Xms512m -Xmx1024m"
# 标识为生产环境 # 将本地的静态资源文件复制到镜像中的指定路径
ENV WORKING_ENV="pro" COPY /static /usr/share/nginx/html
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -cp /root/ZhuQue/target/classes:/root/ZhuQue/lib/* com.dsideal.gw.Start" ] # 暴露Nginx服务的端口
EXPOSE 80

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="AdditionalModuleElements">
<content url="file://$MODULE_DIR$/../ds-gw" dumb="true">
<sourceFolder url="file://$MODULE_DIR$/../ds-gw/src/main/resources" type="java-resource" />
</content>
</component>
</module>

@ -0,0 +1,29 @@
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
client_max_body_size 100M; # 允许上传的最大文件大小为100MB
keepalive_timeout 65;
server {
listen 80;
server_name ds-exam;
location / {
root html;
index index.html index.htm;
}
location /base {
proxy_pass http://127.0.0.1:9001/base;
}
}
}

@ -1,78 +0,0 @@
package com.dsideal.gw.Controller;
import com.dsideal.gw.gwApplication;
import com.jfinal.core.Controller;
import okhttp3.*;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public class BaseController extends Controller {
private final OkHttpClient client = new OkHttpClient();
Map<String, Object> jfinalConfig = (Map<String, Object>) gwApplication.yamlConfig.get("jfinal");
private final List<Map<String, String>> routes = (List<Map<String, String>>) jfinalConfig.get("routes");
/**
*
*
* @param path
* @return
*/
private String route(String path) {
if (routes != null) {
for (Map<String, String> route : routes) {
String prefix = route.get("prefix");
if (path.startsWith(prefix)) {
return route.get("url") + path;
}
}
}
return null;
}
public void index() {
String path = getRequest().getRequestURI();
System.out.println(path);
String serviceUrl = route(path); // 根据路径决定转发到哪个微服务
if (serviceUrl == null) {
renderJson("error", "服务未找到");
return;
}
try {
//方法类型
String method = getRequest().getMethod();
//传递jwt token
Request.Builder requestBuilder = new Request.Builder()
.url(serviceUrl);
if (getHeader("Authorization") != null) {
requestBuilder.header("Authorization", getHeader("Authorization"));
}
if ("POST".equalsIgnoreCase(method)) {
String jsonPayload = getRawData(); // 获取请求体中的JSON数据
MediaType JSON = MediaType.get("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, jsonPayload);
requestBuilder.post(body);
}
Request request = requestBuilder.build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
if (response.body() != null) {
renderJson(response.body().string());
}
} else {
renderJson("error", "服务请求失败");
return;
}
} catch (IOException e) {
renderJson("error", "服务请求失败");
return;
}
renderText("Welcome to Base World." + getRequest().getRequestURI());
}
}

@ -1,9 +0,0 @@
package com.dsideal.gw.Controller;
import com.jfinal.core.Controller;
public class IndexController extends Controller {
public void index() {
renderText("Welcome to JFinal Gateway.");
}
}

@ -1,54 +0,0 @@
package com.dsideal.gw.Interceptor;
import com.dsideal.gw.gwApplication;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
import java.util.List;
import java.util.Map;
public class AuthInterceptor implements Interceptor {
//白名单
private final List<String> whitelist;
public AuthInterceptor() {
Map<String, Object> jfinalConfig = (Map<String, Object>) gwApplication.yamlConfig.get("jfinal");
whitelist = (List<String>) jfinalConfig.get("whitelist");
}
/**
*
*
* @param path
* @return
*/
private boolean isWhitelisted(String path) {
if (whitelist != null) {
for (String allowedPath : whitelist) {
if (path.startsWith(allowedPath)) {
return true;
}
}
}
return false;
}
@Override
public void intercept(Invocation inv) {
Controller controller = inv.getController();
String token = controller.getHeader("Authorization");
// 这里添加你的鉴权逻辑,例如检查 token 是否有效
if (!isWhitelisted(controller.getRequest().getRequestURI()) && !isValidToken(token)) {
controller.renderJson("error", "请登录后访问此接口");
} else {
inv.invoke();
}
}
private boolean isValidToken(String token) {
// 添加你的 token 验证逻辑
return "valid-token".equals(token);
}
}

@ -1,97 +0,0 @@
package com.dsideal.gw.Util;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Created by zhzhan on 2017/6/30.
*/
public class JwtUtil {
public static final String AUTHORIZATION_MONITOR_STARTER = "Monitor ";
public static final String AUTHORIZATION_STARTER = "Bearer ";
public static final String CLAIM_KEY_USERID = "userId";
public static final String CLAIM_KEY_OPERATORID = "operatorId";
public static final String CLAIM_KEY_PHONE = "phone";
public static final String CLAIM_KEY_DATE = "date";
public static final String CLAIM_KEY_TYPE = "type";
public static final String SECRET = "ZXZnZWVr5b+r5LmQ5L2g55qE5Ye66KGM";
public static final String CLAIM_MONITOR_ACCOUNT_NAME = "accountName";
public static String generateToken(String secret, String userId, String phone, String type) {
Date date = new Date();
return generateToken(secret, userId, phone, date.toString(), type);
}
public static String generateToken(String secret, String userId, String phone, String date, String type) {
Map<String, Object> claims = new HashMap<>();
claims.put(JwtUtil.CLAIM_KEY_USERID, userId);
claims.put(JwtUtil.CLAIM_KEY_PHONE, phone);
claims.put(JwtUtil.CLAIM_KEY_DATE, date);
claims.put(JwtUtil.CLAIM_KEY_TYPE, type);
return Jwts.builder()
.setClaims(claims)
// .setExpiration(date)
.signWith(SignatureAlgorithm.HS512, secret) //采用什么算法是可以自己选择的不一定非要采用HS512
.compact();
}
public static String generateTokenMonitor(String secret, String userId, String phone, String type, String accountName) {
Date date = new Date();
return generateTokenMonitor(secret, userId, phone, date.toString(), type, accountName);
}
public static String generateTokenMonitor(String secret, String userId, String phone, String date, String type, String accountName) {
Map<String, Object> claims = new HashMap<>();
claims.put(JwtUtil.CLAIM_KEY_USERID, userId);
claims.put(JwtUtil.CLAIM_KEY_PHONE, phone);
claims.put(JwtUtil.CLAIM_KEY_DATE, date);
claims.put(JwtUtil.CLAIM_KEY_TYPE, type);
claims.put(JwtUtil.CLAIM_MONITOR_ACCOUNT_NAME, accountName);
return Jwts.builder()
.setClaims(claims)
// .setExpiration(date)
.signWith(SignatureAlgorithm.HS512, secret) //采用什么算法是可以自己选择的不一定非要采用HS512
.compact();
}
public static String generateToken(String secret, String operatorId, Date date) {
Map<String, Object> claims = new HashMap<>();
claims.put(JwtUtil.CLAIM_KEY_OPERATORID, operatorId);
return Jwts.builder()
.setClaims(claims)
.setExpiration(date)
.signWith(SignatureAlgorithm.HS512, secret) //采用什么算法是可以自己选择的不一定非要采用HS512
.compact();
}
public static Claims getClaimsFromToken(String token, String secret) {
Claims claims;
try {
claims = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
} catch (Exception e) {
try {
claims = Jwts.parser()
.setSigningKey(secret.getBytes(StandardCharsets.UTF_8))
.parseClaimsJws(token)
.getBody();
} catch (Exception err) {
claims = null;
}
}
return claims;
}
}

@ -1,101 +0,0 @@
package com.dsideal.gw.Util;
import com.jfinal.log.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogBackLog extends Log {
public static Logger log;
public LogBackLog(Class<?> clazz) {
log = LoggerFactory.getLogger(clazz);
}
public LogBackLog(String name) {
log = LoggerFactory.getLogger(name);
}
public static LogBackLog getLog(Class<?> clazz) {
return new LogBackLog(clazz);
}
public static LogBackLog getLog(String name) {
return new LogBackLog(name);
}
@Override
public void debug(String message) {
log.debug(message);
}
@Override
public void debug(String message, Throwable t) {
log.debug(message, t);
}
@Override
public void info(String message) {
log.info(message);
}
@Override
public void info(String message, Throwable t) {
log.info(message, t);
}
@Override
public void warn(String message) {
log.warn(message);
}
@Override
public void warn(String message, Throwable t) {
log.warn(message, t);
}
@Override
public void error(String message) {
log.error(message);
}
@Override
public void error(String message, Throwable t) {
log.error(message, t);
}
@Override
public void fatal(String message) {
log.error(message);
}
@Override
public void fatal(String message, Throwable t) {
log.error(message, t);
}
@Override
public boolean isDebugEnabled() {
return log.isDebugEnabled();
}
@Override
public boolean isInfoEnabled() {
return log.isInfoEnabled();
}
@Override
public boolean isWarnEnabled() {
return log.isWarnEnabled();
}
@Override
public boolean isErrorEnabled() {
return log.isErrorEnabled();
}
@Override
public boolean isFatalEnabled() {
return log.isErrorEnabled();
}
}

@ -1,16 +0,0 @@
package com.dsideal.gw.Util;
import com.jfinal.log.ILogFactory;
import com.jfinal.log.Log;
public class LogBackLogFactory implements ILogFactory {
@Override
public Log getLog(Class<?> clazz) {
return new LogBackLog(clazz);
}
@Override
public Log getLog(String name) {
return new LogBackLog(name);
}
}

@ -1,105 +0,0 @@
package com.dsideal.gw;
import cn.hutool.core.io.FileUtil;
import com.dsideal.gw.Controller.BaseController;
import com.dsideal.gw.Controller.IndexController;
import com.dsideal.gw.Util.LogBackLogFactory;
import com.jfinal.config.*;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.template.Engine;
import java.io.File;
import java.io.InputStream;
import java.util.Map;
import org.yaml.snakeyaml.Yaml;
public class gwApplication extends JFinalConfig {
public static Map<String, Object> yamlConfig;
//通过构造函数读取配置文件
public gwApplication() {
//配置文件
String configFile = "application_dev.yaml";
String myEnvVar = System.getenv("WORKING_ENV");
if (myEnvVar != null) {
configFile = configFile.replace("_dev", "_pro");
System.out.println("环境变量 WORKING_ENV 的值是: " + myEnvVar);
} else {
System.out.println("环境变量 WORKING_ENV 未设置");
}
Yaml yaml = new Yaml();
InputStream input = getClass().getClassLoader().getResourceAsStream(configFile);
if (input == null) {
System.out.println("Sorry, unable to find application.yaml");
return;
}
yamlConfig = yaml.load(input);
}
//配置文件
public static void main(String[] args) {
UndertowServer.create(gwApplication.class, "undertow.properties").start();
}
/**
*
*/
@Override
public void configConstant(Constants me) {
//使用LogBack
me.setLogFactory(new LogBackLogFactory());
//开发模式配置,有其它数据库配置时,参考这里的用法
if (yamlConfig != null) {
Map<String, Object> jfinalConfig = (Map<String, Object>) yamlConfig.get("jfinal");
me.setDevMode((boolean) jfinalConfig.get("devMode"));
}
}
/**
*
*/
@Override
public void configRoute(Routes me) {
me.add("/", IndexController.class);
me.add("/base", BaseController.class);
}
@Override
public void configEngine(Engine engine) {
}
@Override
public void configPlugin(Plugins me) {
}
/**
*
*/
@Override
public void configInterceptor(Interceptors me) {
//鉴权拦截器
// me.add(new AuthInterceptor());
}
/**
*
*/
@Override
public void configHandler(Handlers me) {
}
/**
* jfinal
*/
@Override
public void onStart() {
//打印 启动Logo
String path = gwApplication.class.getClassLoader().getResource("logo.txt").getPath();
File file = new File(path);
System.out.println(FileUtil.readUtf8String(file));
}
}

@ -1,14 +0,0 @@
jfinal:
# 开发模式
devMode: true
# 路由配置
routes:
- prefix: /base
url: http://localhost:9002
# 白名单
whitelist:
# 根
- /
# 登录接口
- /base/doLogin

@ -1,8 +0,0 @@
# 路由配置
routes:
- prefix: /base
url: http://localhost:9002
# 白名单
whitelist:
- /base/doLogin

@ -1,12 +0,0 @@
log4j.rootLogger=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.mq=org.apache.rocketmq.logappender.log4j.RocketmqLog4jAppender
log4j.appender.mq.Topic=TOPIC_MEIWEI_SMS_NOTICE_TEST
log4j.appender.mq.Tag=PID_MEIWEI_SMS_RETRY_TIMEOUT
log4j.appender.mq.ProducerGroup=meiwei-producer-retry
log4j.appender.mq.NameServerAddress=127.0.0.1:9876;127.0.0.1:9877
log4j.appender.mq.layout=org.apache.log4j.PatternLayout
log4j.appender.mq.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-4r [%t] (%F:%L) %

@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/usr/local/tomcat8/logs"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %boldYellow([%thread]) %highlight(%-5level) %boldGreen(%logger{40})
- %msg%n
</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/QingLong.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/QingLong.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<logger level="debug" additivity="false">
</logger>
</configuration>

@ -1,16 +0,0 @@
/$$
| $$
/$$$$$$$ /$$$$$$$ /$$$$$$ /$$ /$$ /$$
/$$__ $$ /$$_____/ /$$__ $$| $$ | $$ | $$
| $$ | $$| $$$$$$ | $$ \ $$| $$ | $$ | $$
| $$ | $$ \____ $$ | $$ | $$| $$ | $$ | $$
| $$$$$$$ /$$$$$$$/ | $$$$$$$| $$$$$/$$$$/
\_______/|_______/ \____ $$ \_____/\___/
/$$ \ $$
| $$$$$$/
\______/
power by http://patorjk.com/software/taag/
Font Name: Big Money-sw

@ -1,36 +0,0 @@
# true 值支持热加载
undertow.devMode=false
undertow.port=9001
undertow.host=0.0.0.0
#undertow.resourcePath=/usr/local/tomcat8/webapps/QingLong,classpath:static
#undertow.resourcePath=D:/dsWork/QingLong/WebRoot,classpath:static
# 目录名称
undertow.contextPath=/
# 设定I/O线程数.
server.undertow.io-threads=8
# 设定工作线程数
server.undertow.worker-threads=60
# 查询当前某程序的线程或进程数
# yum install psmisc -y
# ps -e | grep java | awk '{print $1}
# pstree -p 15453 | wc -l
# gzip 压缩开关
undertow.gzip.enable=true
# 配置压缩级别,默认值 -1。 可配置 1 到 9。 1 拥有最快压缩速度9 拥有最高压缩率
undertow.gzip.level=-1
# 触发压缩的最小内容长度
undertow.gzip.minLength=1024
# 开启access日志
server.undertow.accesslog.enabled=true
server.undertow.accesslog.pattern=%t %a "%r" %s (%D ms)
# ssl 开启时,是否开启 http2。检测该配置是否生效在 chrome 地址栏中输入: chrome://net-internals/#http2
#undertow.http2.enable=true
#http://www.jfinal.com/doc/1-4

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>dsExam</title>
</head>
<body>
Welcome to dsExam.
</body>
</html>

@ -1,22 +0,0 @@
{
"hints": [],
"groups": [
{
"sourceType": "com.dsideal.filter.ZuulPreFilter",
"name": "jwt.filter",
"type": "com.dsideal.filter.ZuulPreFilter"
}
],
"properties": [
{
"sourceType": "com.dsideal.filter.ZuulPreFilter",
"name": "jwt.filter.no-access-filter",
"type": "java.util.List<java.lang.String>"
},
{
"sourceType": "com.dsideal.filter.ZuulPreFilter",
"name": "jwt.filter.should-not-filter",
"type": "java.util.List<java.lang.String>"
}
]
}

@ -1,14 +0,0 @@
jfinal:
# 开发模式
devMode: true
# 路由配置
routes:
- prefix: /base
url: http://localhost:9002
# 白名单
whitelist:
# 根
- /
# 登录接口
- /base/doLogin

@ -1,8 +0,0 @@
# 路由配置
routes:
- prefix: /base
url: http://localhost:9002
# 白名单
whitelist:
- /base/doLogin

@ -1,218 +0,0 @@
jwt:
secret: ZXZnZWVr5b+r5LmQ5L2g55qE5Ye66KGM
filter:
should_not_filter:
- /gw/login
- /userapi/getOpenId
- /userapi/weChatAuth
- /userapi/mobileLogin
- /userapi/sendMs
- /financeapi/wxSmallApp/wxSmallAppPayNotice
- /stationapi/station/queryNearbyStation
- /stationapi/station/queryNearbyStationMapMode
- /stationapi/station/queryYiXingWebsiteStationInfo
- /stationapi/station/identifyQR/PfV6GsETrX.txt
- /stationapi/station/PfV6GsETrX.txt
- /stationapi/station/queryStationList
- /stationapi/station/queryStationOperator
- /noticeapi/park/parkCoupon
- /userapi/getChewei
- /cheweiapi/*
- /financeapi/alipay/aliPayNotice
- /financeapi/alipay/aliPayNoticeFromSmallApp
- /financeapi/wxpay/wxAppPayNotice
- /financeapi/alipay/aliPayNoticeByCharge
- /financeapi/wxpay/wxAppChargePayNotice
- /financeapi/wxSmallApp/cmwxSmallAppPayNotice
- /financeapi/hmwxSmallApp/cmwxSmallAppPayNotice
- /financeapi/hmwxSmallApp/cmwxSmallAppPayNoticeByRc
- /userapi/wxLogin
- /userapi/forgetPW
- /userapi/loginByPW
- /userapi/getAccessToken
- /userapi/appWxLogin
- /userapi/user/isReg
- /userapi/adPage/queryAdPage
- /userapi/appVersion/*
- /userapi/weChat/*
- /userapi/redPacket/getRedPacketDrawRecord
- /userapi/rechargeActivity/h5/*
- /userapi/groundLockStatus
- /userapi/getDictByKey
- /orderapi/inspectionReport/queryOrder
- /orderapi/inspectionReport/queryUserInfo
- /orderapi/inspectionReport/notificationShallowReport
- /orderapi/inspectionReport/notificationDeepReport
- /openapi/lock/queryConnectorId
- /openapi/lock/queryParkingLock
- /userapi/h5/*
- /ZhuQue/*
- /userapi/userCard/searchCard
- /orderbkapi/station/querySaasStationIdsInfo
- /orderbkapi/station/querySaasConnectorIdsInfo
- /orderbkapi/saas/chargeorder/saasChargeOrderPageInfo
- /orderbkapi/station/querySaasEquipmentIdsInfo
zuul:
#路径配置
routes:
#用户模块
userapi:
stripPrefix: false
path: /userapi/**
sensitiveHeaders:
#财务模块
financeapi:
stripPrefix: true
path: /financeapi/**
sensitiveHeaders:
#充电站模块
stationapi:
stripPrefix: true
path: /stationapi/**
sensitiveHeaders:
#订单模块
orderapi:
stripPrefix: false
path: /orderapi/**
sensitiveHeaders:
openapi:
stripPrefix: true
path: /openapi/**
sensitiveHeaders:
#订单后台模块
orderbkapi:
stripPrefix: false
path: /orderbkapi/**
sensitiveHeaders:
#协议模块
protocolapi:
stripPrefix: false
path: /protocolapi/**
sensitiveHeaders:
#分发模块
distribute:
stripPrefix: false
path: /distribute/**
sensitiveHeaders:
#通知模块
noticeapi:
stripPrefix: false
path: /noticeapi/**
sensitiveHeaders:
#通知模块
cheweiapi:
stripPrefix: false
path: /cheweiapi/**
sensitiveHeaders:
#运营商账户模块
operatorBill:
stripPrefix: true
path: /operatorBill/**
sensitiveHeaders:
#11、黄海自己扩展的模块,后面所有的JAVA代码开发全部增加到这个路径下
ZhuQue:
stripPrefix: false
path: /ZhuQue/**
sensitiveHeaders:
# 服务主机注册配置
ZhuQue:
ribbon:
listOfServers: zhu-que:9000
orderbkapi:
ribbon:
listOfServers: ms-admin:7011
distribute:
ribbon:
listOfServers: ms-distribute:7012
excelapi:
ribbon:
listOfServers: ms-excel:7013
financeapi:
ribbon:
listOfServers: ms-finance:7014
noticeapi:
ribbon:
listOfServers: ms-notice:7015
openapi:
ribbon:
listOfServers: ms-openapi:7016
orderapi:
ribbon:
listOfServers: ms-order:7017
protocolshenghongapi:
ribbon:
listOfServers: ms-protocol-shenghong:7019
stationapi:
ribbon:
listOfServers: ms-station:7020
taskapi:
ribbon:
listOfServers: ms-task:7021
userapi:
ribbon:
listOfServers: ms-user:7022
walletapi:
ribbon:
listOfServers: ms-wallet:7023
websocketocppapi:
ribbon:
listOfServers: ms-websocket-ocpp:7025
mgrapi:
ribbon:
listOfServers: ms-saas-mgr:7026
cheweiapi:
ribbon:
listOfServers: http://cz.api.cheweiguanjia.com
ribbon:
eureka:
enabled: false #禁用eureka不依赖 eureka
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.AvailabilityFilteringRule #为所有服务配置统一规则,先过滤掉故障实例,再选择并发较小的实例
ReadTimeout: 100000 #请求处理的超时时间 默认1秒单位ms
ConnectTimeout: 100000 #请求连接的超时时间 默认1秒单位ms
MaxAutoRetries: 1 #对当前实例的重试次数 默认0
MaxAutoRetriesNextServer: 3 #切换实例的重试次数 默认1
hystrix:
command:
default:
execution:
timeout:
enabled: true #配置HystrixCommand的执行是否启用超时时间
isolation:
thread:
timeoutInMilliseconds: 10000 #配置HystrixCommand执行的超时时间执行超过该时间会进行服务降级处理 10s
spring:
redis:
database: 0
host: r-bp14c1p5j5lkpw1jc2.redis.rds.aliyuncs.com
port: 6379
password: Ycharge666
timeout: 0
pool:
max-active: 8
max-idle: 8
min-idle: 0

@ -1,12 +0,0 @@
log4j.rootLogger=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.mq=org.apache.rocketmq.logappender.log4j.RocketmqLog4jAppender
log4j.appender.mq.Topic=TOPIC_MEIWEI_SMS_NOTICE_TEST
log4j.appender.mq.Tag=PID_MEIWEI_SMS_RETRY_TIMEOUT
log4j.appender.mq.ProducerGroup=meiwei-producer-retry
log4j.appender.mq.NameServerAddress=127.0.0.1:9876;127.0.0.1:9877
log4j.appender.mq.layout=org.apache.log4j.PatternLayout
log4j.appender.mq.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-4r [%t] (%F:%L) %

@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/usr/local/tomcat8/logs"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %boldYellow([%thread]) %highlight(%-5level) %boldGreen(%logger{40})
- %msg%n
</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/QingLong.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/QingLong.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<logger level="debug" additivity="false">
</logger>
</configuration>

@ -1,16 +0,0 @@
/$$
| $$
/$$$$$$$ /$$$$$$$ /$$$$$$ /$$ /$$ /$$
/$$__ $$ /$$_____/ /$$__ $$| $$ | $$ | $$
| $$ | $$| $$$$$$ | $$ \ $$| $$ | $$ | $$
| $$ | $$ \____ $$ | $$ | $$| $$ | $$ | $$
| $$$$$$$ /$$$$$$$/ | $$$$$$$| $$$$$/$$$$/
\_______/|_______/ \____ $$ \_____/\___/
/$$ \ $$
| $$$$$$/
\______/
power by http://patorjk.com/software/taag/
Font Name: Big Money-sw

@ -1,36 +0,0 @@
# true 值支持热加载
undertow.devMode=false
undertow.port=9001
undertow.host=0.0.0.0
#undertow.resourcePath=/usr/local/tomcat8/webapps/QingLong,classpath:static
#undertow.resourcePath=D:/dsWork/QingLong/WebRoot,classpath:static
# 目录名称
undertow.contextPath=/
# 设定I/O线程数.
server.undertow.io-threads=8
# 设定工作线程数
server.undertow.worker-threads=60
# 查询当前某程序的线程或进程数
# yum install psmisc -y
# ps -e | grep java | awk '{print $1}
# pstree -p 15453 | wc -l
# gzip 压缩开关
undertow.gzip.enable=true
# 配置压缩级别,默认值 -1。 可配置 1 到 9。 1 拥有最快压缩速度9 拥有最高压缩率
undertow.gzip.level=-1
# 触发压缩的最小内容长度
undertow.gzip.minLength=1024
# 开启access日志
server.undertow.accesslog.enabled=true
server.undertow.accesslog.pattern=%t %a "%r" %s (%D ms)
# ssl 开启时,是否开启 http2。检测该配置是否生效在 chrome 地址栏中输入: chrome://net-internals/#http2
#undertow.http2.enable=true
#http://www.jfinal.com/doc/1-4

Binary file not shown.

Binary file not shown.

@ -1,3 +0,0 @@
artifactId=gw-exam
groupId=com.icharge.framework
version=1.0.0

@ -1,13 +0,0 @@
com\dsideal\model\I100cResponse.class
com\dsideal\provider\ApiFallbackProvider$1.class
com\dsideal\service\AsyncTask.class
com\dsideal\model\CommonResponse.class
com\dsideal\config\RedisCacheConfig.class
com\dsideal\service\TokenService.class
META-INF\spring-configuration-metadata.json
com\dsideal\util\JwtUtil.class
com\dsideal\filter\ZuulRoutingFilter.class
com\dsideal\provider\ApiFallbackProvider.class
com\dsideal\GwApplication.class
com\dsideal\filter\CorsFilter.class
com\dsideal\filter\ZuulPreFilter.class

@ -1,11 +0,0 @@
D:\dsWork\dsExam\gw-exam\src\main\java\com\dsideal\service\TokenService.java
D:\dsWork\dsExam\gw-exam\src\main\java\com\dsideal\filter\ZuulRoutingFilter.java
D:\dsWork\dsExam\gw-exam\src\main\java\com\dsideal\model\CommonResponse.java
D:\dsWork\dsExam\gw-exam\src\main\java\com\dsideal\config\RedisCacheConfig.java
D:\dsWork\dsExam\gw-exam\src\main\java\com\dsideal\provider\ApiFallbackProvider.java
D:\dsWork\dsExam\gw-exam\src\main\java\com\dsideal\service\AsyncTask.java
D:\dsWork\dsExam\gw-exam\src\main\java\com\dsideal\filter\CorsFilter.java
D:\dsWork\dsExam\gw-exam\src\main\java\com\dsideal\model\I100cResponse.java
D:\dsWork\dsExam\gw-exam\src\main\java\com\dsideal\util\JwtUtil.java
D:\dsWork\dsExam\gw-exam\src\main\java\com\dsideal\filter\ZuulPreFilter.java
D:\dsWork\dsExam\gw-exam\src\main\java\com\dsideal\GwApplication.java

@ -0,0 +1,21 @@
### 思路
以OpenResty做为网关不使用JAVA系的方法构建网关
原因:
1、OpenResty更快性能更好
2、OpenResty更灵活更熟悉
3、网关主要有两个职能是我关心的一个是路由另一个是鉴权
路由无疑Nginx是无敌的而鉴权我不想依赖于OpenResty,而且使用JAVA来让每个微服务模块
来自行实现,各回各家,各找各妈,不把鉴权任务交给网关。
### 下载地址
https://openresty.org/cn/download.html
### Docker 镜像
https://hub.docker.com/r/openresty/openresty
```shell
docker run -p 80:80 -d openresty/openresty:1.21.4.1-0-alpine
```
我采用的镜像是1.21.4.1-0-alpine这个版本的底包较小适合在容器中使用。
需要使用Dockerfile来创建我的网关镜像采用配置好的nginx.conf拷贝进镜像中
并修改nginx.conf使其符合我的需求。
Loading…
Cancel
Save