diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..281336c --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +# Created by .ignore support plugin (hsz.mobi) +### Java template +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +.idea/ +*.iml +**/target/ + diff --git a/Dockerfile b/Dockerfile new file mode 100755 index 0000000..f9ca924 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +# 基础镜像 +FROM openjdk:8 +# 作者 +MAINTAINER rongchao@elink-cn.com +# 对应pom.xml文件中的dockerfile-maven-plugin插件JAR_FILE的值 +ARG JAR_FILE +# 对应pom.xml文件中的dockerfile-maven-plugin插件JAR_NAME的值 +ARG JAR_NAME +# 对应pom.xml文件中的dockerfile-maven-plugin插件SERVER_PORT的值 +ARG SERVER_PORT +# 复制打包完成后的jar文件到/opt目录下 +ENV JAR_PATH /mnt/epdc/${JAR_NAME}.jar +ADD ${JAR_FILE} $JAR_PATH +# /data设为环境变量 +ENV DATAPATH /data +# 挂载/data目录到主机 +VOLUME $DATAPATH +# 启动容器时执行 +ENTRYPOINT java -jar $JAR_CONFIG $JAR_PATH +EXPOSE ${SERVER_PORT} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..91b4362 --- /dev/null +++ b/pom.xml @@ -0,0 +1,261 @@ + + + 4.0.0 + + + com.esua.epdc.yushan + epdc-cloud-parent-yushan + 1.0.0 + ../epdc-cloud-parent-yushan + + + epdc-cloud-gateway-yushan + jar + 榆山党建e家网关模块 + + + + org.springframework.cloud + spring-cloud-starter-gateway + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix + + + + + org.springframework.cloud + spring-cloud-starter-zipkin + + + + + com.esua.epdc.yushan + epdc-commons-tools + ${epdc-cloud-commons.version} + + + + com.esua.epdc.yushan + epdc-common-clienttoken + ${epdc-cloud-commons.version} + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + com.spotify + dockerfile-maven-plugin + + + + + + + dev + + true + + + 9094 + dev + dev + + + 2 + 47.104.224.45 + 6379 + elink@888 + + + lb://epdc-auth-server + lb://epdc-admin-server + + lb://epdc-activiti-server + + + http://127.0.0.1:9040 + lb://epdc-app-server + + lb://epdc-heart-server + + lb://epdc-job-server + + lb://epdc-message-server + + + http://127.0.0.1:9064 + lb://epdc-oss-server + lb://epdc-events-server + + http://127.0.0.1:9060 + + + http://127.0.0.1:9085 + + + lb://epdc-services-server + + + + http://127.0.0.1:9068 + lb://epdc-demo-server + http://127.0.0.1:9063 + + lb://epdc-websocket-server + + + lb://epdc-custom-server + lb://epdc-points-server + + http://127.0.0.1:9069 + lb://epdc-analysis-server + + + false + 47.104.224.45:8848 + + 6a3577b4-7b79-43f6-aebb-9c3f31263f6a + + http://localhost:9411 + + + + test + + 10000 + test + test + + + 2 + 114.215.125.123 + 9603 + epdc!redis@master1405 + + + lb://epdc-auth-server + lb://epdc-admin-server + lb://epdc-activiti-server + + lb://epdc-api-server + lb://epdc-app-server + lb://epdc-heart-server + lb://epdc-job-server + lb://epdc-message-server + + lb://epdc-news-server + lb://epdc-oss-server + lb://epdc-events-server + lb://epdc-cloud-analysis-server + + lb://epdc-work-record-server + + lb://epdc-services-server + + lb://epdc-user-server + lb://epdc-demo-server + lb://epdc-group-server + lb://epdc-websocket-server + + lb://epdc-kpi-server + lb://epdc-custom-server + lb://epdc-points-server + lb://epdc-analysis-server + + + + true + 47.104.224.45:8848 + 47.104.85.99 + 6a3577b4-7b79-43f6-aebb-9c3f31263f6a + + http://localhost:9411 + + + + + prod + + 9094 + prod + prod + + + lb://epdc-auth-server + lb://epdc-admin-server + lb://epdc-activiti-server + + lb://epdc-api-server + lb://epdc-app-server + lb://epdc-heart-server + lb://epdc-job-server + lb://epdc-message-server + + lb://epdc-news-server + lb://epdc-oss-server + lb://epdc-cloud-analysis-server + + lb://epdc-work-record-server + + lb://epdc-events-server + lb://epdc-services-server + + lb://epdc-user-server + lb://epdc-demo-server + lb://epdc-group-server + lb://epdc-websocket-server + + lb://epdc-kpi-server + lb://epdc-custom-server + lb://epdc-points-server + lb://epdc-analysis-server + + + + 0 + 172.16.0.54 + 6379 + Elink833066 + + + true + 172.16.0.52:8848 + + + + http://localhost:9411 + + + + + diff --git a/src/main/java/com/elink/esua/epdc/GatewayApplication.java b/src/main/java/com/elink/esua/epdc/GatewayApplication.java new file mode 100644 index 0000000..a0d0e19 --- /dev/null +++ b/src/main/java/com/elink/esua/epdc/GatewayApplication.java @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.elink.esua.epdc; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; + +/** + * 网关服务 + * + * @author Mark sunlightcs@gmail.com + * @since 1.0.0 + */ +@SpringBootApplication +@EnableDiscoveryClient +@EnableFeignClients +public class GatewayApplication { + + public static void main(String[] args) { + SpringApplication.run(GatewayApplication.class, args); + } + +} diff --git a/src/main/java/com/elink/esua/epdc/config/CorsConfig.java b/src/main/java/com/elink/esua/epdc/config/CorsConfig.java new file mode 100644 index 0000000..5f0515c --- /dev/null +++ b/src/main/java/com/elink/esua/epdc/config/CorsConfig.java @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + *

+ * https://www.renren.io + *

+ * 版权所有,侵权必究! + */ + +package com.elink.esua.epdc.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.web.ServerProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.cors.reactive.CorsUtils; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; + +/** + * Cors跨域 + * + * @author Mark sunlightcs@gmail.com + * @since 1.0.0 + */ +@Configuration +public class CorsConfig { + + private static final String MAX_AGE = "18000L"; + + @Autowired + private ServerProperties serverProperties; + + @Bean + public WebFilter corsFilter() { + return (ServerWebExchange ctx, WebFilterChain chain) -> { + ServerHttpRequest request = ctx.getRequest(); + if (!CorsUtils.isCorsRequest(request)) { + return chain.filter(ctx); + } + HttpHeaders requestHeaders = request.getHeaders(); + ServerHttpResponse response = ctx.getResponse(); + HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod(); + HttpHeaders headers = response.getHeaders(); + if (!request.getURI().getPath().startsWith(serverProperties.getServlet().getContextPath().concat("/ws"))) { + headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, requestHeaders.getOrigin()); + headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); + } + headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders.getAccessControlRequestHeaders()); + if (requestMethod != null) { + headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, requestMethod.name()); + } + headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*"); + headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE); + if (request.getMethod() == HttpMethod.OPTIONS) { + response.setStatusCode(HttpStatus.OK); + return Mono.empty(); + } + return chain.filter(ctx); + }; + } + +} diff --git a/src/main/java/com/elink/esua/epdc/config/ModuleConfigImpl.java b/src/main/java/com/elink/esua/epdc/config/ModuleConfigImpl.java new file mode 100644 index 0000000..86a6548 --- /dev/null +++ b/src/main/java/com/elink/esua/epdc/config/ModuleConfigImpl.java @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.elink.esua.epdc.config; + +import com.elink.esua.epdc.commons.tools.config.ModuleConfig; +import org.springframework.stereotype.Service; + +/** + * 模块配置信息 + * + * @author Mark sunlightcs@gmail.com + * @since 1.0.0 + */ +@Service +public class ModuleConfigImpl implements ModuleConfig { + @Override + public String getName() { + return "gateway"; + } +} diff --git a/src/main/java/com/elink/esua/epdc/feign/ResourceFeignClient.java b/src/main/java/com/elink/esua/epdc/feign/ResourceFeignClient.java new file mode 100644 index 0000000..b52b556 --- /dev/null +++ b/src/main/java/com/elink/esua/epdc/feign/ResourceFeignClient.java @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + *

+ * https://www.renren.io + *

+ * 版权所有,侵权必究! + */ + +package com.elink.esua.epdc.feign; + +import com.elink.esua.epdc.common.token.dto.TokenDto; +import com.elink.esua.epdc.feign.fallback.ResourceFeignClientFallback; +import com.elink.esua.epdc.commons.tools.constant.ServiceConstant; +import com.elink.esua.epdc.commons.tools.security.user.UserDetail; +import com.elink.esua.epdc.commons.tools.utils.Result; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * 资源接口 + * + * @author Mark sunlightcs@gmail.com + * @since 1.0.0 + */ +@FeignClient(name = ServiceConstant.EPDC_AUTH_SERVER, fallback = ResourceFeignClientFallback.class) +public interface ResourceFeignClient { + + /** + * 是否有资源访问权限 + * + * @param token token + * @param url 资源URL + * @param method 请求方式 + * @return 有访问权限,则返回用户信息 + */ + @PostMapping("auth/resource") + Result resource(@RequestHeader(HttpHeaders.ACCEPT_LANGUAGE) String language, @RequestParam("token") String token, + @RequestParam("url") String url, @RequestParam("method") String method); + + /** + * 获取登录用户信息 + * + * @param token + * @return com.elink.esua.epdc.commons.tools.utils.Result + * @author + * @date 2019/8/19 17:19 + */ + @GetMapping("auth/getLoginUserInfo") + Result getLoginUserInfo(@RequestParam("token") String token); +} diff --git a/src/main/java/com/elink/esua/epdc/feign/fallback/ResourceFeignClientFallback.java b/src/main/java/com/elink/esua/epdc/feign/fallback/ResourceFeignClientFallback.java new file mode 100644 index 0000000..987d2ff --- /dev/null +++ b/src/main/java/com/elink/esua/epdc/feign/fallback/ResourceFeignClientFallback.java @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + *

+ * https://www.renren.io + *

+ * 版权所有,侵权必究! + */ + +package com.elink.esua.epdc.feign.fallback; + +import com.elink.esua.epdc.common.token.dto.TokenDto; +import com.elink.esua.epdc.commons.tools.security.user.UserDetail; +import com.elink.esua.epdc.commons.tools.utils.Result; +import com.elink.esua.epdc.feign.ResourceFeignClient; +import org.springframework.stereotype.Component; + +/** + * 资源接口 Fallback + * + * @author Mark sunlightcs@gmail.com + * @since 1.0.0 + */ +@Component +public class ResourceFeignClientFallback implements ResourceFeignClient { + + @Override + public Result resource(String language, String token, String url, String method) { + return new Result().error(); + } + + @Override + public Result getLoginUserInfo(String token) { + return new Result().error(); + } +} diff --git a/src/main/java/com/elink/esua/epdc/filter/AuthFilter.java b/src/main/java/com/elink/esua/epdc/filter/AuthFilter.java new file mode 100644 index 0000000..864cf6f --- /dev/null +++ b/src/main/java/com/elink/esua/epdc/filter/AuthFilter.java @@ -0,0 +1,154 @@ +/** + * Copyright (c) 2018 人人开源 All rights reserved. + * + * https://www.renren.io + * + * 版权所有,侵权必究! + */ + +package com.elink.esua.epdc.filter; + +import com.alibaba.fastjson.JSON; +import com.elink.esua.epdc.feign.ResourceFeignClient; +import com.elink.esua.epdc.commons.tools.constant.Constant; +import com.elink.esua.epdc.commons.tools.security.user.UserDetail; +import com.elink.esua.epdc.commons.tools.utils.Result; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.util.AntPathMatcher; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.nio.charset.StandardCharsets; +import java.util.List; + +/** + * 权限过滤器 + * + * @author Mark sunlightcs@gmail.com + * @since 1.0.0 + */ +@Configuration +@ConfigurationProperties(prefix = "renren") +public class AuthFilter implements GlobalFilter { + + private final AntPathMatcher antPathMatcher = new AntPathMatcher(); + + @Autowired + private ResourceFeignClient resourceFeignClient; + /** + * 不拦截的urls + */ + private List urls; + + /** + * 不拦截工作端urls + */ + private List workLoginUrls; + + /** + * 拦截的工作端urls + */ + private List workUrls; + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + ServerHttpRequest request = exchange.getRequest(); + String requestUri = request.getPath().pathWithinApplication().value(); + + //请求放行,无需验证权限 + if(pathMatcher(requestUri)){ + return chain.filter(exchange); + } + + //获取用户token + String token = request.getHeaders().getFirst(Constant.TOKEN_HEADER); + if(StringUtils.isBlank(token)){ + token = request.getHeaders().getFirst(Constant.AUTHORIZATION_HEADER); + if (StringUtils.isBlank(token)) { + token = request.getQueryParams().getFirst(Constant.TOKEN_HEADER); + } + } + + //资源访问权限 + String language = request.getHeaders().getFirst(HttpHeaders.ACCEPT_LANGUAGE); + Result result = resourceFeignClient.resource(language, token, requestUri, request.getMethod().toString()); + //没权限访问,直接返回 + if(!result.success()){ + return response(exchange, result); + } + + //获取用户信息 + UserDetail userDetail = result.getData(); + if(userDetail != null){ + //当前登录用户userId,添加到header中 + ServerHttpRequest build = exchange.getRequest().mutate().header(Constant.USER_KEY, userDetail.getId()+"").build(); + return chain.filter(exchange.mutate().request(build).build()); + } + + return chain.filter(exchange); + } + + private Mono response(ServerWebExchange exchange, Object object) { + String json = JSON.toJSONString(object); + DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(json.getBytes(StandardCharsets.UTF_8)); + exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8); + exchange.getResponse().setStatusCode(HttpStatus.OK); + return exchange.getResponse().writeWith(Flux.just(buffer)); + } + + private boolean pathMatcher(String requestUri){ + for (String url : workLoginUrls) { + if(antPathMatcher.match(url, requestUri)){ + return true; + } + } + + for (String url : workUrls) { + if(antPathMatcher.match(url, requestUri)){ + return false; + } + } + + for (String url : urls) { + if(antPathMatcher.match(url, requestUri)){ + return true; + } + } + return false; + } + + public List getUrls() { + return urls; + } + + public void setUrls(List urls) { + this.urls = urls; + } + + public List getWorkLoginUrls() { + return workLoginUrls; + } + + public void setWorkLoginUrls(List workLoginUrls) { + this.workLoginUrls = workLoginUrls; + } + + public List getWorkUrls() { + return workUrls; + } + + public void setWorkUrls(List workUrls) { + this.workUrls = workUrls; + } +} diff --git a/src/main/java/com/elink/esua/epdc/filter/CpAuthGatewayFilterFactory.java b/src/main/java/com/elink/esua/epdc/filter/CpAuthGatewayFilterFactory.java new file mode 100644 index 0000000..eb394b1 --- /dev/null +++ b/src/main/java/com/elink/esua/epdc/filter/CpAuthGatewayFilterFactory.java @@ -0,0 +1,131 @@ + +package com.elink.esua.epdc.filter; + +import com.alibaba.fastjson.JSON; +import com.elink.esua.epdc.common.token.dto.TokenDto; +import com.elink.esua.epdc.commons.tools.constant.Constant; +import com.elink.esua.epdc.commons.tools.utils.Result; +import com.elink.esua.epdc.feign.ResourceFeignClient; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.gateway.filter.GatewayFilter; +import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.util.AntPathMatcher; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.List; + +/** + * app接口权限过滤器 + * + * @author Mark sunlightcs@gmail.com + * @since 1.0.0 + */ +@Component("CpAuth") +public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory { + + @Autowired + private ResourceFeignClient resourceFeignClient; + + @Autowired + private CpProperty cpProperty; + + private final AntPathMatcher antPathMatcher = new AntPathMatcher(); + + @Override + public List shortcutFieldOrder() { + return Arrays.asList("enabled"); + } + + public CpAuthGatewayFilterFactory() { + super(CpAuthGatewayFilterFactory.CpAuthConfig.class); + } + + @Override + public GatewayFilter apply(CpAuthConfig config) { + return (exchange, chain) -> { + if (!config.isEnabled()) { + return chain.filter(exchange); + } + + ServerHttpRequest request = exchange.getRequest(); + String requestUri = request.getPath().pathWithinApplication().value(); + + //请求放行,无需验证权限 + if (!pathMatcher(requestUri)) { + return chain.filter(exchange); + } + + HttpHeaders headers = request.getHeaders(); + String token = headers.getFirst(Constant.AUTHORIZATION_HEADER); + if (StringUtils.isBlank(token)) { + token = request.getQueryParams().getFirst(Constant.AUTHORIZATION_HEADER); + if (StringUtils.isBlank(token)) { + return chain.filter(exchange); + } + } + Result result = resourceFeignClient.getLoginUserInfo(token); + if (!result.success()) { + return response(exchange, result); + } + TokenDto user = result.getData(); + //当前登录用户userId,添加到header中 + if (user != null) { + ServerHttpRequest build = exchange.getRequest().mutate().header(Constant.APP_USER_KEY, user.getUserId()).build(); + return chain.filter(exchange.mutate().request(build).build()); + } + return chain.filter(exchange); + }; + } + + private Mono response(ServerWebExchange exchange, Object object) { + String json = JSON.toJSONString(object); + DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(json.getBytes(StandardCharsets.UTF_8)); + exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8); + exchange.getResponse().setStatusCode(HttpStatus.OK); + return exchange.getResponse().writeWith(Flux.just(buffer)); + } + + private boolean pathMatcher(String requestUri) { + for (String url : cpProperty.getSwaggerUrls()) { + if (antPathMatcher.match(url, requestUri)) { + return false; + } + } + for (String url : cpProperty.getUrls()) { + if (antPathMatcher.match(url, requestUri)) { + return true; + } + } + return false; + } + + public static class CpAuthConfig { + + /** + * 控制是否开启认证 + */ + private boolean enabled; + + public CpAuthConfig() { + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + } +} diff --git a/src/main/java/com/elink/esua/epdc/filter/CpProperty.java b/src/main/java/com/elink/esua/epdc/filter/CpProperty.java new file mode 100644 index 0000000..b15e785 --- /dev/null +++ b/src/main/java/com/elink/esua/epdc/filter/CpProperty.java @@ -0,0 +1,27 @@ +package com.elink.esua.epdc.filter; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author rongchao + * @Date 19-5-17 + */ +@Data +@Component +@EnableConfigurationProperties +@ConfigurationProperties(prefix = "epdc") +public class CpProperty { + + private List urls; + + /** + * 不处理token,直接通过 + */ + private List swaggerUrls; + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..2baead3 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,286 @@ +server: + tomcat: + max-swallow-size: 100MB + port: @server.port@ + servlet: + context-path: /epdc-api + +spring: + application: + name: epdc-gateway-server + #环境 dev|test|prod + profiles: + active: @spring.profiles.active@ + servlet: + multipart: + enabled: true + file-size-threshold: 0 + max-file-size: 100MB + max-request-size: 100MB + redis: + database: @spring.redis.index@ + host: @spring.redis.host@ + timeout: 30s + port: @spring.redis.port@ + password: @spring.redis.password@ + cloud: + gateway: + locator: + enabled: true + routes: + #认证服务 + - id: epdc-auth-server + uri: @gateway.routes.epdc-auth-server.uri@ + order: 1 + predicates: + - Path=${server.servlet.context-path}/auth/** + filters: + - StripPrefix=1 + #Admin服务 + - id: epdc-admin-server + uri: @gateway.routes.epdc-admin-server.uri@ + order: 2 + predicates: + - Path=${server.servlet.context-path}/sys/** + filters: + - StripPrefix=1 + #OSS服务 + - id: epdc-oss-server + uri: @gateway.routes.epdc-oss-server.uri@ + order: 3 + predicates: + - Path=${server.servlet.context-path}/oss/** + filters: + - StripPrefix=1 + #消息服务 + - id: epdc-message-server + uri: @gateway.routes.epdc-message-server.uri@ + order: 4 + predicates: + - Path=${server.servlet.context-path}/message/** + filters: + - StripPrefix=1 + #工作流服务 + - id: epdc-activiti-server + uri: @gateway.routes.epdc-activiti-server.uri@ + order: 5 + predicates: + - Path=${server.servlet.context-path}/activiti/** + filters: + - StripPrefix=1 + #定时任务服务 + - id: epdc-job-server + uri: @gateway.routes.epdc-job-server.uri@ + order: 6 + predicates: + - Path=${server.servlet.context-path}/job/** + filters: + - StripPrefix=1 + #APP流服务 + - id: epdc-api-server + uri: @gateway.routes.epdc-api-server.uri@ + order: 7 + predicates: + - Path=${server.servlet.context-path}/api/** + filters: + - StripPrefix=1 + - CpAuth=true + #爱心互助模块 + - id: epdc-heart-server + uri: @gateway.routes.epdc-heart-server.uri@ + order: 8 + predicates: + - Path=${server.servlet.context-path}/heart/** + filters: + - StripPrefix=1 + #友邻社群模块 + - id: epdc-group-server + uri: @gateway.routes.epdc-group-server.uri@ + order: 9 + predicates: + - Path=${server.servlet.context-path}/group/** + filters: + - StripPrefix=1 + #新闻公告模块 + - id: epdc-news-server + uri: @gateway.routes.epdc-news-server.uri@ + order: 10 + predicates: + - Path=${server.servlet.context-path}/news/** + filters: + - StripPrefix=1 + #党群议事模块 + - id: epdc-events-server + uri: @gateway.routes.epdc-events-server.uri@ + order: 11 + predicates: + - Path=${server.servlet.context-path}/events/** + filters: + - StripPrefix=1 + #生活服务模块 + - id: epdc-services-server + uri: @gateway.routes.epdc-services-server.uri@ + order: 12 + predicates: + - Path=${server.servlet.context-path}/services/** + filters: + - StripPrefix=1 + #APP用户模块 + - id: epdc-user-server + uri: @gateway.routes.epdc-user-server.uri@ + order: 13 + predicates: + - Path=${server.servlet.context-path}/app-user/** + filters: + - StripPrefix=1 + #DEMO服务 + - id: epdc-demo-server + uri: @gateway.routes.epdc-demo-server.uri@ + order: 14 + predicates: + - Path=${server.servlet.context-path}/demo/** + filters: + - StripPrefix=1 + #websocket服务 + - id: epdc-websocket-server + uri: @gateway.routes.epdc-websocket-server.uri@ + order: 15 + predicates: + - Path=${server.servlet.context-path}/ws/** + filters: + - StripPrefix=1 + #绩效考核模块 + - id: epdc-kpi-server + uri: @gateway.routes.epdc-kpi-server.uri@ + order: 16 + predicates: + - Path=${server.servlet.context-path}/kpi/** + filters: + - StripPrefix=1 + #定制模块 + - id: epdc-custom-server + uri: @gateway.routes.epdc-custom-server.uri@ + order: 17 + predicates: + - Path=${server.servlet.context-path}/custom/** + filters: + - StripPrefix=1 + #积分管理 + - id: epdc-points-server + uri: @gateway.routes.epdc-points-server.uri@ + order: 18 + predicates: + - Path=${server.servlet.context-path}/points/** + filters: + - StripPrefix=1 + - id: epdc-cloud-analysis-server + uri: @gateway.routes.epdc-cloud-analysis-server.uri@ + order: 19 + predicates: + - Path=${server.servlet.context-path}/cloudAnalysis/** + filters: + - StripPrefix=1 + #工作日志 + - id: epdc-work-record-server + uri: @gateway.routes.epdc-work-record-server.uri@ + order: 20 + predicates: + - Path=${server.servlet.context-path}/workRecord/** + filters: + - StripPrefix=1 + - id: epdc-analysis-server + uri: @gateway.routes.epdc-analysis-server.uri@ + order: 21 + predicates: + - Path=${server.servlet.context-path}/analysis/** + filters: + - StripPrefix=1 + nacos: + discovery: + server-addr: @nacos.server-addr@ + register-enabled: @nacos.register-enabled@ + ip: @nacos.ip@ + namespace: @nacos.namespace@ + zipkin: + # 指定了 zipkin 服务器的地址 + base-url: @spring.zipkin.base-url@ + sleuth: + sampler: + # 将采样比例设置为 1.0,也就是全部都需要。默认是 0.1 + probability: 1.0 +management: + endpoints: + web: + exposure: + include: "*" + endpoint: + health: + show-details: ALWAYS + + +feign: + hystrix: + enabled: true + +hystrix: + command: + default: + execution: + isolation: + thread: + timeoutInMilliseconds: 60000 #缺省为1000 + +ribbon: + ReadTimeout: 300000 + ConnectTimeout: 300000 + +renren: + urls: + - /auth/captcha + - /auth/login + - /*/swagger-resources/** + - /*/swagger-ui.html + - /*/webjars/** + - /*/v2/api-docs + - /*/swagger/api-docs + - /monitor/** + - /api/** + - /activiti/modeler.html + - /activiti/service/** + - /activiti/editor-app/** + - /message/sms/sendCode #发送验证码 + - /oss/file/download + - /ws/** + - /custom/epidemicSentryPost/downloadQRCode/** + workLoginUrls: + - /api/work/user/getToken #工作端-获取token + - /api/work/user/login #工作端-登录 + - /api/analysis/user/getToken #数据分析端-获取token + - /api/analysis/user/login #数据分析端-登录 + - /api/work/*/swagger/** + workUrls: + - /api/work/** #工作端接口 + - /api/analysis/** #数据端接口 + - /cloudAnalysis/** #数据端接口 + - /workRecord/** #工作日志接口 + +epdc: + # 党建e家接口 + urls: + - /api/** + # 不处理token,直接通过 + swaggerUrls: + - /api/wx/getWxConfig # 获取微信公众号配置 + - /api/admin/dept/completeName # 获取完整部门名称 + - /api/message/sms/sendCode # 发送短信验证码 + - /api/message/sms/registerResult # 发送用户注册审核结果 + - /api/events/issue/upload # 上传图片 + - /api/app-user/user/mp/regist # 公众号用户注册 + - /api/app-user/user/ma/getToken # 小程序用户 登录 + - /api/app-user/user/ma/regist # 小程序用户 注册 + - /api/app-user/user/ma/gridLeaderRegister # 小程序用户 网格长注册 + - /api/app-user/user/ma/v2/getToken # 小程序用户 注册或登录(版本v2) + - /api/work/** #工作端接口不拦截 + - /api/analysis/** #数据端接口不拦截 + - /cloudAnalysis/** #数据端接口 + - /workRecord/** #工作日志接口 diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..96e2a17 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + debug + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + + + ${log.path}/debug.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${log.path}/debug-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + debug + ACCEPT + DENY + + + + + + + ${log.path}/info.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + + ${log.path}/info-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + info + ACCEPT + DENY + + + + + + + ${log.path}/warn.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${log.path}/warn-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + warn + ACCEPT + DENY + + + + + + + ${log.path}/error.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${log.path}/error-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + ERROR + ACCEPT + DENY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +