didi / LogiCommon

Java版 认证、鉴权、管理、任务调度通用功能组件
Apache License 2.0
217 stars 64 forks source link
elasticjob security utils

项目概述

LogiCommon 公共模块,包括Logi-security、Logi-job 。LogiCommon 会尽量保持与具体业务的解耦,以简单易用,轻量高效,尽可能减少用户感知的方式做到多平台适配,同时提供可扩展的接口,让用户自由的扩展 LogiCommon 的功能,以满足具体的业务。

---------------数据源信息---------------

logi.security.username=root logi.security.password=123456 logi.security.url=jdbc:mysql://localhost:3306/logi_security?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai logi.security.driver-class-name=com.mysql.jdbc.Driver

- app-name:表示应用的名称,涉及到 logi-security 的数据库操作都会带上这个条件(查询、保存等操作);
- resource-extend-bean-name:resourceExtend的实现类在spring容器bean的名称,logi-security 中资源权限管理模块,需要获取具体资源的信息,所以用户需实现 ResourceExtend 接口并指定实现类在spring容器中bean的名称;
#### 1.3.3 需要实现接口
用户可选的实现 ResourceExtend 接口,如果不实现,则资源权限管理模块的功能不能完整使用。接口详情见代码
#### 1.3.4 导入数据
logi-security相关界面并没提供【角色权限元数据、资源类别数据、部门信息数据、操作日志相关(操作页面、操作对象、对象分类)】的创建功能,logi-security提供了数据导入的接口。
建议全部都导入,简单的数据也行。
## 2.logi-job
### 2.1 介绍
是分布式的定时调度服务。
### 2.2 功能支持
主要提供:分布式定时调度服务、任务管理、分布式锁等功能
- 分布式定时调度服务:添加指定注解,并实现规定的接口,编写待调度的方法;
- 任务管理模块:提供查看任务列表、任务详情、手动执行任务、变更任务状态、任务日志等功能;
- 分布式锁机制:确保多系统下,对于临界资源的保护,和调节调度秩序,防饿死。
### 2.3 使用方式
#### 2.3.1 添加Maven
```xml
<dependency>
    <groupId>io.github.zqrferrari</groupId>
    <artifactId>logi-job-spring-boot-starter</artifactId>
    <version>1.0.10</version>
</dependency>

2.3.2 配置信息

logi-job基于springBoot框架开发,在使用的时候需要在配置文件中增加几项配置信息,如下:

spring:
  logi-job:
    jdbc-url: jdbc:mysql://localhost:3306/es_manager_test?useUnicode=true&characterEncoding=utf8&jdbcCompliantTruncation=true&allowMultiQueries=true&useSSL=false
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    max-lifetime: 60000
    init-sql: true
    init-thread-num: 10
    max-thread-num: 20 #调度最大线程数
    log-exipre: 3  #日志保存天数,以天为单位
    app_name: arius_test02 #应用名,用户隔离机器和环境
    claim-strategy: com.didiglobal.logi.job.core.consensual.RandomConsensual #调度策略,有两种随机和广播,默认是随机

2.3.3 使用样例

package com.didichuxing.datachannel.arius.admin.task.metadata;

import com.didichuxing.datachannel.arius.admin.metadata.job.cluster.monitor.esMonitorJob.MonitorJobHandler;
import com.didiglobal.logi.job.annotation.Task;
import com.didiglobal.logi.job.common.TaskResult;
import com.didiglobal.logi.job.core.job.Job;
import com.didiglobal.logi.job.core.job.JobContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

// @Task 注解自带了 @Component
@Task(name = "esMonitorJob", description = "monitor调度任务", cron = "0 0/1 * * * ? *", autoRegister = true)
public class ESMonitorJobTask implements Job {
    private static final Logger LOGGER = LoggerFactory.getLogger(ESMonitorJobTask.class);

    @Autowired
    private MonitorJobHandler monitorJobHandler;

    @Override
    public TaskResult execute(JobContext jobContext) throws Exception {
        LOGGER.info("class=ESMonitorJobTask||method=execute||msg=start");
        monitorJobHandler.handleJobTask("");
        return TaskResult.SUCCESS;
    }
}

3.logi-log

3.1 介绍

集成了:logi-log-log、logi-log-log4j2。

3.2 添加maven

<dependency>
    <groupId>io.github.zqrferrari</groupId>
    <artifactId>logi-log-log</artifactId>
    <version>1.0.4</version>
</dependency>

3.2 logi-log-log

logi-log-log是基于slf4j封装的组件,为用户提供日志相关功能。各个业务可以选择log4j,logback,log4j2,只要配置上桥接就可以使用。

3.2.1 Trace功能

Trace功能,是为了根据一个flag,把单个请求的日志关联起来。

  1. 入口设置flag

    101.png
  2. Logger对象

    100.png
  3. 打印日志

    102.png
  4. 日志打印结果 103.png

  5. 根据flag,查询单次请求相关日志 104.png 另,新建的线程里打印日志,是不会自动带上flag的,如果需要,可以将flag传入runnable对象。

    105.png

    3.2.2 日志聚合

  6. 日志聚合

    是为了防止频繁打印日志,影响应用的运行,特别是在异常场景下,每条数据都会触发异常。聚合是通过key来实现聚合的,可以自定义key来实现多种聚合。

    106.png
  7. 日志采样

    107.png
  8. 聚合结果

    count表示同一个key出现多少次 108.png

    3.3 logi-log-log4j2

    logi-log-log4j2,是基于log4j2 2.9.1封装的,支持日志发送到kafka,以及过滤重复日志功能。

    3.3.1 日志发送到kafka

    配置kafka appender和layout

    109.png

    配置appender

<Appenders>
    <Kafka name="kafka" topic="${log.kafka.topic}" syncSend="false">
        <SimpleMqLogEventPatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %L - %msg%xEx%n"
                                       appName="${log.app.name}"/>
        <Property name="bootstrap.servers">
            ${log.kafka.bootstrap}
        </Property>
    </Kafka>

</Appenders>
<Loggers>
    <logger name="errorLogger" additivity="false">
        <level value="error"/>
        <AppenderRef ref="errorLogger"/>
        <AppenderRef ref="kafka"/>
    </logger>
</Loggers>

日志输出形如: 110.png 也可以选择直接发送原始日志:

<Kafka name="kafka" topic="${log.kafka.topic}" syncSend="false">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %L - %msg%xEx%n"/>
    <Property name="bootstrap.servers">
        ${log.kafka.bootstrap}
    </Property>
</Kafka>

3.3.2 过滤重复日志

配置appender即可

111.png

打印日志

112.png

日志输出如,count代表1分钟内,同样的日志出现几次

113.png