Skip to content

Latest commit

 

History

History
185 lines (156 loc) · 6.07 KB

README-CN.md

File metadata and controls

185 lines (156 loc) · 6.07 KB

smile-boot-starter

Last update: July, 2020 Spring Boot Version 2.3.1.RELEASE

超轻量级微服务基本支持框架

TRACE ID

概念: 微服务架构下,一个请求可能会有多个应用来承载,每个应用又有多个主机来集群部署,假设一次请求出现问题,我们需要跟踪一次请求,如果没有全局统一的一个ID,问题排查起来可能比较困难

smile-boot-starter提供极简模式快速让项目拥有traceId的跟踪能力(一次请求全局拥有一个ID,聚合日志后可以通过该id查询本次请求的全埋点路径报告)

自动集成smile-boot-logger,对日志埋点输出跟踪日志

引入smile-boot-starter后,自动支持traceId,可由前端传入traceId到后端,也可由首个接收到请求的服务自动生成 支持spring cloud feigndubbo, 不侵入代码,引入jar即自动支持

提供全链路traceId支持,前端或者首个被访问的服务生成,之后本次请求全链路通过LocalDataUtils.getTraceId()获取全局traceId

Environment

项目启动自动激活Environment对象,获取当前工程的环境和应用名称,取值{spring.profiles.active} 和 {spring.profiles.name} EventLogger也会依赖这个类输出环境,所以spring 配置中需要这两个配置

public class EnvironmentTemplate {

    public static void main(String[] args){
        // 是否是日常环境
        Environment.getInstance().isDaily();
        // 是否是预发环境
        Environment.getInstance().isStaging();
        // 是否是线上环境
        Environment.getInstance().isProd();
    }
}

QUICK START

两步快速实现:

  1. 引入依赖
<dependency>
	<groupId>com.el</groupId>
	<artifactId>smile-boot-starter</artifactId>
	<version>${smile-boot-starter.last-version}</version>
</dependency>
  1. application.yml配置
spring:
  profiles:
    # 配置运行环境 可选DAILY|STAGING|PROD,与application.yml多环境配置不冲突
    # 如果环境配置不是DAILY|STAGING|PROD或有其他环境,可以在使用new Environment(applicationName, environment);来映射环境信息
    active: STAGING
  application:
    # 应用名称
    name: trace-test
  smile-boot:
    trace-logger:
      # 日志路径配置,两种配置方式: 例如fatjar位置在/root/admin/runtime/trace-test
      # absolute - 取绝对路径,absolute: /root/admin/runtime/trace-test/log
      # relative - 取项目运行的相对路径,relative: log -> /root/admin/runtime/trace-test/log
      log-path: relative:log
      # 日志文件名 event -> /root/admin/runtime/trace-test/log/event.log
      log-file-name: event
      # 2020-07-12 00:33:32 - msg
      pattern: "%d{yyyy-MM-dd HH:mm:ss} %msg%n"
  1. 对要埋点的方法添加注解
@Slf4j
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class SmsSenderController {

    private final TraceIdServiceProvider traceIdServiceProvider;
   
    
    @GetMapping("/test/api")
    @EventTrace(event = "测试", loggerType = LoggerType.JSON)
    public String test() {
        log.info(LocalDataUtils.getTraceId());
        SmileLocalUtils.setIsSucess(true);
        return traceIdServiceProvider.test();
    }

}

即可获取到日志,默认情况下,日志打在spring boot jar目录下的event.log

FORMAT:
2020-07-12 00:30:16 - TRACE LOG - 
traceId [20200712003016-b20bc50af8824d988d025a5a17124dd8], 
appName [trace-test], 
env [STAGING], 
ip [115.220.204.114], 
event [test - /provider/test/api], 
method [com.landscape.user.repository.TraceIdServiceProvider.test()], 
success [true], 
costTime [4], 
parameter [without parameter], 
response ["success 20200712003016-b20bc50af8824d988d025a5a17124dd8"], 
features [{LOGGER_IS_SUCCESS=true}]

JSON:
2020-07-12 00:30:16 - {
    "appName":"trace-test",
    "costTime":4,
    "env":"STAGING",
    "event":"测试",
    "features":{
        "LOGGER_IS_SUCCESS":"true"
    },
    "ip":"115.220.204.114",
    "method":"com.landscape.user.repository.TraceIdServiceProvider.test()",
    "parameter":"without parameter",
    "result":"\"success 20200712003332-419cdb0d285e433daac7bebbfb88fca3\"",
    "success":true,
    "traceId":"20200712003332-419cdb0d285e433daac7bebbfb88fca3"
}

同时,traceId会返回给前端,放入header中。

  1. EventLogger 事件日志 对某些需要埋点的重要节点,可以使用事件日志来记录。
/**
 * since 2020/1/4
 *
 * @author eddie
 */
@Slf4j
@RestController
@RequirePermissions
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestConfigController {

    @RequestMapping("/get")
    @EventTrace(event = "测试", loggerType = LoggerType.FORMAT)
    public String get() {
        SmileEventLogger.info("测试");
        return "SmileLocalUtils.getTraceId();";
    }
}

输出:

2020-12-15 00:21:48 INFO  - 20201215002148-2706c6d56ffe4197a1e5c58d666596f7 - [com.el.smile.logger.logger.SmileEventLogger.info] line [30]: 测试

TODO 需求定义:

2020-06-30

  • 日志参数可配置
  • 日志文件位置及滚动策略

2020-07-25

  • bug修复: 对当前请求设置一次success将覆盖当前应用所有日志
  • trace日志中增加rpcId
  • 增加业务日志

日志聚合可以使用ELK,或者Loki
ELK比较重,上手有难度,但功能齐全
Loki最近新出的,好多人在推,我没有尝试过,看介绍感觉还可以,可以尝试

技术支持

项目个人维护,有使用问题,或者想共同开发都可以issues里留问题或者微信,周末会看

更新记录

2020-07-11 --------- 0.0.1-SNAPSHOT

  1. 日志输出可配置
  2. 获取公网IP
  3. 增加日志类型控制 FORMAT | JSON

PS:最近更新了Mac 10.16(BIG SUR)系统,各种问题,又懒得退回,就慢点搞吧

主要依赖

  • spring boot自动装配
  • alibaba fastjson
  • lombok