Commit cf9b5358 authored by Jun Chen's avatar Jun Chen
Browse files

Merge branch 'master' into performance_models

No related merge requests found
Showing with 766 additions and 510 deletions
+766 -510
......@@ -28,14 +28,6 @@ WeCube是一套开源的,一站式IT架构管理和运维管理工具,主要
## 起源
微众银行在分布式架构实践的过程中,发现将银行核心系统构建于分布式架构之上,会遇到一些与传统单体应用不同的痛点(例如,服务器增多,部署难度大;调用链长,全链路跟踪困难; 系统复杂,问题定位时间长等),在逐步解决这些痛点的过程中,总结了一套IT管理的方法论和最佳实践,并研发了与之配套的IT管理工具体系。WeCube就是将该套方法论和最佳实践,从微众内部众多IT管理工具体系中提炼出来,整合成一套开箱即用的IT管理解决方案。
## 在线体验
用户名:admin
密码:admin
[点此体验国内演示环境](http://134.175.159.201:8090)
[Click here to try online demo](http://119.28.109.23:8090)
## 设计理念
......
......@@ -69,3 +69,5 @@ sed -i "s~{{WECUBE_SERVER_JMX_PORT}}~$wecube_server_jmx_port~g" docker-compose.y
sed -i "s~{{WECUBE_BUCKET}}~$wecube_bucket~g" docker-compose.yml
sed -i "s~{{DOCKER_API_CERTS_PATH}}~$docker_api_certs_path~g" docker-compose.yml
sed -i "s~{{APP_LOG_PATH}}~$app_log_path~g" docker-compose.yml
sed -i "s~{{AUTH_SERVER_LOG_PATH}}~$auth_server_log_path~g" docker-compose.yml
sed -i "s~{{WECUBE_GATEWAY_LOG_PATH}}~$wecube_gateway_log_path~g" docker-compose.yml
......@@ -42,7 +42,7 @@ services:
depends_on:
- platform-core
volumes:
- /data/wecube-gateway/log:/log/
- /data/wecube-gateway/log:{{WECUBE_GATEWAY_LOG_PATH}}
- /etc/localtime:/etc/localtime
ports:
- {{GATEWAY_PORT}}:8080
......@@ -54,12 +54,13 @@ services:
- WECUBE_CORE_HOST={{WECUBE_CORE_HOST}}
- AUTH_SERVER_HOST={{AUTH_SERVER_HOST}}
- GATEWAY_CUSTOM_PARAM={{GATEWAY_CUSTOM_PARAM}}
- WECUBE_GATEWAY_LOG_PATH={{WECUBE_GATEWAY_LOG_PATH}}
platform-core:
image: {{WECUBE_IMAGE_NAME}}:{{WECUBE_IMAGE_VERSION}}
restart: always
volumes:
- {{APP_LOG_PATH}}:/data/wecube/log
- /data/wecube/log:{{APP_LOG_PATH}}
- /etc/localtime:/etc/localtime
- {{DOCKER_API_CERTS_PATH}}:/certs
ports:
......@@ -94,12 +95,13 @@ services:
- WECUBE_BUCKET={{WECUBE_BUCKET}}
- WECUBE_CORE_HOST={{WECUBE_CORE_HOST}}
- WECUBE_CUSTOM_PARAM={{WECUBE_CUSTOM_PARAM}}
- APP_LOG_PATH={{APP_LOG_PATH}}
auth-server:
image: {{AUTH_SERVER_IMAGE_NAME}}:{{AUTH_SERVER_IMAGE_VERSION}}
restart: always
volumes:
- /data/auth_server/log:/log/
- /data/auth_server/log:{{AUTH_SERVER_LOG_PATH}}
- /etc/localtime:/etc/localtime
ports:
- {{AUTH_SERVER_PORT}}:8080
......@@ -111,6 +113,7 @@ services:
- MYSQL_USER_NAME={{AUTH_SERVER_MYSQL_USER_NAME}}
- MYSQL_USER_PASSWORD={{AUTH_SERVER_MYSQL_USER_PASSWORD}}
- AUTH_CUSTOM_PARAM={{AUTH_CUSTOM_PARAM}}
- AUTH_SERVER_LOG_PATH={{AUTH_SERVER_LOG_PATH}}
......@@ -7,6 +7,8 @@ wecube_plugin_host_user=app
wecube_plugin_host_pwd=Apps@123
wecube_bucket=wecube-plugin-package-bucket
app_log_path=/data/wecube/log
auth_server_log_path=/data/auth_server/log
wecube_gateway_log_path=/data/wecube-gateway/log
#cmdb
cmdb_url=http://127.0.0.1:8080/cmdb
......
......@@ -16,6 +16,8 @@ import com.webank.wecube.platform.auth.server.common.ApplicationConstants;
public class DevWebSecurityConfig extends AuthSecurityConfigurerAdapter {
private static final String[] AUTH_WHITELIST = { //
"/v1/health-check",//
"/v1/appinfo/loggers/query",//
"/v1/appinfo/loggers/update",//
"/v1/api/ping", //
"/v2/api-docs", //
"/error", //
......
......@@ -17,6 +17,8 @@ public class TestWebSecurityConfig extends AuthSecurityConfigurerAdapter {
private static final String[] AUTH_WHITELIST = { //
"/v1/health-check",//
"/v1/appinfo/loggers/query",//
"/v1/appinfo/loggers/update",//
"/error", //
"/swagger-resources", //
"/swagger-resources/**", //
......
......@@ -20,7 +20,9 @@ import com.webank.wecube.platform.auth.server.common.ApplicationConstants;
@EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurityConfig extends AuthSecurityConfigurerAdapter {
private static final String[] AUTH_WHITELIST = { //
"/v1/health-check"
"/v1/health-check",//
"/v1/appinfo/loggers/query",//
"/v1/appinfo/loggers/update" //
};
@Override
......
package com.webank.wecube.platform.auth.server.controller;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -7,13 +11,19 @@ import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.webank.wecube.platform.auth.server.common.ApplicationConstants;
import com.webank.wecube.platform.auth.server.dto.CommonResponseDto;
import com.webank.wecube.platform.auth.server.dto.LoggerInfoDto;
import com.webank.wecube.platform.auth.server.service.ApplicationInformationService;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
@RestController
@RequestMapping(ApplicationConstants.ApiInfo.PREFIX_DEFAULT)
public class ApplicationInformationController {
......@@ -34,4 +44,34 @@ public class ApplicationInformationController {
.body(CommonResponseDto.error(e.getMessage()));
}
}
@GetMapping("/appinfo/loggers/query")
public CommonResponseDto queryLoggers() {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
List<ch.qos.logback.classic.Logger> loggers = loggerContext.getLoggerList();
List<LoggerInfoDto> loggerInfos = loggers.stream().filter(lm -> {
return lm.getLevel() != null;
}).map(lm -> {
LoggerInfoDto info = new LoggerInfoDto();
info.setLevel(lm.getLevel() == null ? null : lm.getLevel().toString());
info.setPath(lm.getName());
return info;
}).collect(Collectors.toList());
return CommonResponseDto.okayWithData(loggerInfos);
}
@PostMapping("/appinfo/loggers/update")
public CommonResponseDto changeLogLevel(@RequestBody LoggerInfoDto dto) {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
if (!StringUtils.isEmpty(dto.getLevel())) {
ch.qos.logback.classic.Logger logger = loggerContext.getLogger(dto.getPath());
logger.setLevel(Level.toLevel(dto.getLevel()));
}
return CommonResponseDto.okay();
}
}
package com.webank.wecube.platform.auth.server.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class LoggerInfoDto {
private String level;
private String path;
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
......@@ -3,27 +3,31 @@
<configuration scan="true" scanPeriod="30 seconds">
<property name="logPath"
value="${AUTH_SERVER_LOG_PATH:-/data/auth_server/log}" />
<property name="logFile" value="auth-server" />
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<jmxConfigurator/>
<jmxConfigurator />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-5level %-48logger{48} - %msg%n</pattern>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %-48logger{48} - %msg%n</pattern>
</encoder>
</appender>
<appender name="rollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/wecube-cds.log</File>
<File>${logPath}/${logFile}.log</File>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/wecube-cds.log-%d{yyyyMMdd}.log
<FileNamePattern>${logPath}/${logFile}-%d{yyyyMMdd}.log
</FileNamePattern>
<MaxHistory>2</MaxHistory>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<Pattern><![CDATA[%d{yyyy-MM-dd HH:mm:ss} %thread %-5level %-48logger{48} %msg%n]]>
......@@ -31,32 +35,9 @@
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="subprocessLog"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/subproc-trace.log</File>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/subproc-trace.log-%d{yyyyMMdd}.log
</FileNamePattern>
<MaxHistory>2</MaxHistory>
</rollingPolicy>
<encoder>
<Pattern><![CDATA[%d{yyyy-MM-dd HH:mm:ss} %msg%n]]>
</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="com.gl.wecube.cds.workflow.listener" level="debug" additivity="true">
<appender-ref ref="subprocessLog" />
</logger>
<root level="info">
<appender-ref ref="console"/>
<!--
<appender-ref ref="rollingFile"/>
-->
<!-- <appender-ref ref="console"/> -->
<appender-ref ref="rollingFile" />
</root>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<configuration scan="true" scanPeriod="30 seconds">
<property name="logPath"
value="${AUTH_SERVER_LOG_PATH:-./target/data/auth_server/log}" />
<property name="logFile" value="auth-server" />
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<jmxConfigurator />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %-48logger{48} - %msg%n</pattern>
</encoder>
</appender>
<appender name="rollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${logPath}/${logFile}.log</File>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logPath}/${logFile}-%d{yyyyMMdd}.log
</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<Pattern><![CDATA[%d{yyyy-MM-dd HH:mm:ss} %thread %-5level %-48logger{48} %msg%n]]>
</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console"/>
<!--
<appender-ref ref="rollingFile" />
-->
</root>
</configuration>
......@@ -61,7 +61,6 @@ import static com.google.common.collect.Lists.newArrayList;
import static org.apache.commons.lang3.StringUtils.trim;
@Service
@Transactional
public class PluginInstanceService {
private static final Logger logger = LoggerFactory.getLogger(PluginInstanceService.class);
......
package com.webank.wecube.platform.gateway.controller;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.webank.wecube.platform.gateway.dto.CommonResponseDto;
import com.webank.wecube.platform.gateway.dto.LoggerInfoDto;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping("/gateway/v1")
public class ApplicationInfomationController {
@GetMapping("/appinfo/loggers/query")
public Mono<CommonResponseDto> queryLoggers() {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
List<ch.qos.logback.classic.Logger> loggers = loggerContext.getLoggerList();
List<LoggerInfoDto> loggerInfos = loggers.stream().filter(lm -> {
return lm.getLevel() != null;
}).map(lm -> {
LoggerInfoDto info = new LoggerInfoDto();
info.setLevel(lm.getLevel() == null ? null : lm.getLevel().toString());
info.setPath(lm.getName());
return info;
}).collect(Collectors.toList());
return Mono.just(CommonResponseDto.okayWithData(loggerInfos));
}
@PostMapping("/appinfo/loggers/update")
public Mono<CommonResponseDto> changeLogLevel(@RequestBody LoggerInfoDto dto) {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
if (!StringUtils.isEmpty(dto.getLevel())) {
ch.qos.logback.classic.Logger logger = loggerContext.getLogger(dto.getPath());
logger.setLevel(Level.toLevel(dto.getLevel()));
}
return Mono.just(CommonResponseDto.okay());
}
}
......@@ -6,16 +6,12 @@ import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.webank.wecube.platform.gateway.dto.CommonResponseDto;
import com.webank.wecube.platform.gateway.dto.MvcContextRouteConfigDto;
import com.webank.wecube.platform.gateway.dto.RouteItemInfoDto;
import com.webank.wecube.platform.gateway.dto.RouteItemPushDto;
import com.webank.wecube.platform.gateway.route.DynamicRouteConfigurationService;
......@@ -31,26 +27,6 @@ public class DynamicRouteItemController {
@Autowired
private DynamicRouteConfigurationService service;
@GetMapping("/route-items")
public Mono<CommonResponseDto> listRouteItems(){
List<RouteItemInfoDto> items = service.listAllContextRouteItems();
return Mono.just(CommonResponseDto.okayWithData(items));
}
@GetMapping("/loaded-routes")
public Mono<CommonResponseDto> listLoadedRouteItems(){
List<MvcContextRouteConfigDto> items = service.getAllMvcContextRouteConfigs();
return Mono.just(CommonResponseDto.okayWithData(items));
}
@DeleteMapping("/route-items/{route-name}")
public Mono<CommonResponseDto> deleteRouteItems(@PathVariable("route-name")String routeName){
service.deleteRouteItem(routeName);
return Mono.just(CommonResponseDto.okay());
}
@PostMapping("/route-items")
public Mono<CommonResponseDto> pushRouteItems(@RequestBody RouteItemPushDto request) {
String context = request.getContext();
......
package com.webank.wecube.platform.gateway.controller;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.webank.wecube.platform.gateway.dto.CommonResponseDto;
import com.webank.wecube.platform.gateway.dto.MvcContextRouteConfigDto;
import com.webank.wecube.platform.gateway.dto.RouteItemInfoDto;
import com.webank.wecube.platform.gateway.route.DynamicRouteConfigurationService;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping("/gateway/v1")
public class DynamicRouteManagementController {
private static final Logger log = LoggerFactory.getLogger(DynamicRouteManagementController.class);
@Autowired
private DynamicRouteConfigurationService service;
@GetMapping("/route-items")
public Mono<CommonResponseDto> listRouteItems() {
List<RouteItemInfoDto> items = service.listAllContextRouteItems();
return Mono.just(CommonResponseDto.okayWithData(items));
}
@GetMapping("/loaded-routes")
public Mono<CommonResponseDto> listLoadedRouteItems() {
List<MvcContextRouteConfigDto> items = service.getAllMvcContextRouteConfigs();
return Mono.just(CommonResponseDto.okayWithData(items));
}
@DeleteMapping("/route-items/{route-name}")
public Mono<CommonResponseDto> deleteRouteItems(@PathVariable("route-name") String routeName) {
log.info("to delete route {}", routeName);
service.deleteRouteItem(routeName);
return Mono.just(CommonResponseDto.okay());
}
}
package com.webank.wecube.platform.gateway.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class LoggerInfoDto {
private String level;
private String path;
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
......@@ -12,7 +12,7 @@ logging:
platform:
gateway:
route:
route-config-server: http://${WECUBE_CORE_HOST}:19100
route-config-server: http://${WECUBE_CORE_HOST:127.0.0.1}:19100
route-config-uri: /platform/v1/route-items
route-config-access-key: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJXRUNVQkUtQ09SRSIsImlhdCI6MTU3MDY5MDMwMCwidHlwZSI6ImFjY2Vzc1Rva2VuIiwiY2xpZW50VHlwZSI6IlNVQl9TWVNURU0iLCJleHAiOjE2MDIzMTI3MDAsImF1dGhvcml0eSI6IltTVUJfU1lTVEVNXSJ9.Mq8g_ZoPIQ_mB59zEq0KVtwGn_uPqL8qn6sP7WzEiJxoXQQIcVe7mYsG-E2jxCShEQL7PsMNLM47MYuY7R5nBg
......@@ -24,13 +24,13 @@ spring:
useInsecureTrustManager: true
routes:
- id: platform-core
uri: http://${WECUBE_CORE_HOST}:19100
uri: http://${WECUBE_CORE_HOST:127.0.0.1}:19100
predicates:
- Path=/platform/**
filters:
- DynamicRoute=false
- id: platform-auth-server
uri: http://${AUTH_SERVER_HOST}:19120
uri: http://${AUTH_SERVER_HOST:127.0.0.1}:19120
predicates:
- Path=/auth/**
filters:
......
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<property name="logPath" value="${WECUBE_GATEWAY_LOG_PATH:-/data/wecube-gateway/log}"/>
<property name="logFile" value="wecube-gateway"/>
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
......@@ -9,19 +12,19 @@
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-5level %logger{0} - %msg%n</pattern>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{0} - %msg%n</pattern>
</encoder>
</appender>
<appender name="rollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>../logs/mock/mock-trace.log</File>
<File>${logPath}/${logFile}.log</File>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>../logs/mock/mock-trace-%d{yyyyMMdd}.log
<FileNamePattern>${logPath}/${logFile}-%d{yyyyMMdd}.log
</FileNamePattern>
<MaxHistory>2</MaxHistory>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<Pattern><![CDATA[%d{yyyy-MM-dd HH:mm:ss} %thread %-5level %-48logger{48} %msg%n]]>
......@@ -31,9 +34,9 @@
</appender>
<root level="info">
<appender-ref ref="console" />
<!--
<appender-ref ref="rollingFile" />
<appender-ref ref="console" />
-->
<appender-ref ref="rollingFile" />
</root>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<property name="logPath" value="${WECUBE_GATEWAY_LOG_PATH:-./target/data/wecube-gateway/log}"/>
<property name="logFile" value="wecube-gateway"/>
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<jmxConfigurator />
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{0} - %msg%n</pattern>
</encoder>
</appender>
<appender name="rollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${logPath}/${logFile}.log</File>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logPath}/${logFile}-%d{yyyyMMdd}.log
</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<Pattern><![CDATA[%d{yyyy-MM-dd HH:mm:ss} %thread %-5level %-48logger{48} %msg%n]]>
</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console" />
<!--
<appender-ref ref="rollingFile" />
-->
</root>
</configuration>
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment