Skip to content

lbk-ones/easy4j

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

390 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Easy4J 后端框架底座

Easy4J 是一个轻量级、高性能的 Java 基础框架,旨在为企业级应用开发提供稳固的基础架构支持。框架遵循“约定优于配置”的原则,通过简单易用的 API 和丰富的扩展点,帮助开发者快速搭建高质量、易维护的应用系统。

支持

master分支默认为springboot3版本 如果需要springboot2版本请切换分支

  • java 17及其以上
  • springboot 3.0 ~ springboot 3.5.x
  • springboot 3.X 版本

特性

  • 简单:配置简化且文档丰富,易于扩展易于维护易于使用
  • 自带ORM框架:摆脱对于mybatis,jpa,hiberate等orm框架的依赖(方便整合异构数据源和底层模块开发)支持MySql、Oracle、H2、SqlServer、DB2、PostgreSql
  • 内置jpa和mybatis-plus等多种ORM框架:上游服务可以有选择性的使用
  • rpc的整合:同时整合dubbo3和SpringCloudAlibaba体系,可以有选择性的使用
  • 多样性参数注入:默认参数,系统参数,注解参数,远程参数多维度注入
  • 集成化权限认证,授权:有两种方式:1、基于Easy4j的权限认证授权,2、基于spring-security
  • 模块化设计:采用模块化架构,各组件可独立使用或按需组合,实现高内聚低耦合
  • 简化开发:提供常用工具类和基础服务,减少重复开发,极大极大减少配置量,可以0配置启动
  • 任务调度:封装xxl-job和quartz进行中心化调度或无中心化调度
  • 统一异常处理:标准化的异常处理机制,提升系统稳定性
  • 统一国际化:标准化国际i18n
  • 统一api文档规范:使用openapi3为规范,规范系统文档
  • 统一上下文:统一全局上下文和线程级上下文
  • 统一拦截器整合:日志拦截、幂等拦截、数据脱敏、流控、权限、本地消息表
  • 集成常用组件:数据库锁,redis,druid数据源,flyway,MapStruct,分布式主键生成,Json工具Xml工具各种工具类等基础功能
  • 简单链路追踪:可整合或切换成第三方分布式链路
  • 单元测试:使用单元测试来大大提升了底座迭代的容错性,规范化代码开发,同时整合H2,Mockito,Junit5为上游服务提供基础

代码生成界面

代码生成

模块结构

Easy4J 框架包含以下核心模块:

  • ej-base:核心模块,提供基础功能和框架核心组件(启动类,代码生成基础组件,knife4j文档整合等)
  • ej-common:通用模块工具等 (异常处理,i18n,返回体等)
  • ej-context:全局上下文、全局接口
  • ej-db-access:自实现数据库访问模块(支持多种主流数据库),包含单表orm框架,动态表查询实现,从模型或java实体中进行动态ddl语句生成
  • ej-log:日志模块,包括数据库日志和接口日志
  • ej-lock:分布式锁,各种分布式锁实现
  • ej-webmvc:整合springmvc相关通用功能
  • ej-knife4j:整合api文档相关
  • ej-knife4j-nacos-aggregation:api文档通过nacos进行聚合
  • ej-sca:spring-cloud-alibaba 整合
  • ej-sca-gateway:spring-cloud 网关整合比较特殊新增一个
  • ej-sca-seata:spring-cloud 整合seata
  • ej-quartz:封装quartz,可以使用使用工具类手动调度,也可以以类的形式加上注解自动调度
  • ej-xxl-job:xxljob整合
  • ej-datasource:数据源模块 目前整合了Druid 和 Druid的监控页面
  • ej-dnspom:dubbo dns 相关依赖整合
  • ej-dubbo3:dubbo3整合(默认配置,异常,jaeger链路整合)
  • ej-elasticsearch:es整合
  • ej-flyway:flyway整合
  • ej-h2:H2数据库整合
  • ej-idempotent:幂等操作模块
  • ej-jaeger:jaeger分布式链路追踪整合
  • ej-jpa:jpa整合,封装了大量的jpa相关东西
  • ej-logback:整合logback(日志策略和配置参数)
  • ej-ltl-transactional:本地消息表封装
  • ej-mapstruct:mapstruct的通用封装
  • ej-mybatisplus:整合mybatisplus
  • ej-nacos-dubbo3:将dubbo3的注册中心整合到nacos去,并实现nacos作为配置中心
  • ej-redis:redis整合模块
  • ej-sauth:easy4j权限认证模块
  • ej-security:整合spring-security
  • ej-sadmin:springboot-admin 客户端的依赖整合
  • ej-sactuator:actuator整合
  • ej-seed:key的生成相关
  • ej-sentinel:将sentinel和springboot整合起来
  • ej-sentinel-dubbo3:sentinel和dubbos3的依赖整合模块
  • ej-starter:starter模块整合
  • ej-starter/ej-dubbo3-mp-starter:dubbo3体系starter
  • ej-starter/ej-jpa-boot-starter:jpa体系starter
  • ej-starter/ej-spring-boot-starter:springboot体系starter
  • ej-starter/ej-spring-nd-boot-starter:springboot体系无数据源整合starter
  • ej-starter/sca-spring-boot-starter:sca启动
  • ej-starter/sca-gateway-spring-boot-starter:spring-cloud-reactive网关
  • ej-starter/knife4j-nacos-aggregation-starter:api文档聚合相关jar包
  • ej-test:starter的测试模块
  • ej-texample:例子

快速开始

引入依赖

在您的 Maven 项目中根据自己的需求选择依赖添加:

<project xmlns="http://maven.apache.org/POM/4.0.0" 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">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.9</version>
        <relativePath/>
    </parent>

    <groupId>xxx.xxx.xxx</groupId>
    <artifactId>xxx</artifactId>
    <packaging>jar</packaging>

    <name>xxx</name>
    <url>https://github.com/lbk-ones/easy4j</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <!--按需选择-->
        <!--dubbo3 (dns体系) + mybatisplus 微服务-->
        <dependency>
            <groupId>io.github.lbk-ones</groupId>
            <artifactId>dubbo3-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>

        <!--springboot封装 微服务(带数据源)-->
        <dependency>
            <groupId>io.github.lbk-ones</groupId>
            <artifactId>ej-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>

        <!--springboot封装 微服务(不带数据源)-->
        <dependency>
            <groupId>io.github.lbk-ones</groupId>
            <artifactId>ej-spring-nd-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>

        <!-- spring cloud alibaba + Nacos + OpenFeign + Sentinel -->
        <dependency>
            <groupId>io.github.lbk-ones</groupId>
            <artifactId>sca-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>
        
        <!-- spring cloud gateway 网关 -->
        <dependency>
            <groupId>io.github.lbk-ones</groupId>
            <artifactId>sca-gateway-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>
        
        <!--springboot jpa封装-->
        <dependency>
            <groupId>io.github.lbk-ones</groupId>
            <artifactId>jpa-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>
      
        <!--聚合文档相关-->
        <dependency>
          <groupId>io.github.lbk-ones</groupId>
          <artifactId>knife4j-nacos-aggregation-starter</artifactId>
          <version>2.0.1</version>
        </dependency>
      
        <!--     注释掉上面不需要的注释      -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.30</version>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>1.5.5.Final</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

启动代码

package ej.spring.boot.starter.test;
/**
 * 最简单的启动方式 可以使用配置文件去配置 也可以使用在启动注解里面写少量配置
 * @author bokun
 */

import easy4j.module.base.starter.Easy4JStarter;
import easy4j.module.sentinel.EnableFlowDegrade;
import org.springframework.boot.SpringApplication;

// @Easy4JNdStarterNd是无数据源注解
@Easy4JStarter(
        serverPort = 10001,// 服务端口
        serverName = "test-server",// 服务名称
        serviceDesc = "测试",// 服务解释
        author = "bk.li",// 服务作者
        enableH2 = false,// true 代表启动h2作为服务数据库 false h2Url不会生效 
        h2Url = "jdbc:h2:file:~/h2/testdb;DB_CLOSE_ON_EXIT=false", // 使用h2当数据库
        ejDataSourceUrl = "jdbc:postgresql://localhost:5432/postgres@root:123456" // 数据库地址简略写法,其他东西easy4j会自动解析
)
@EnableFlowDegrade // 流控启动注解
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

测试模块代码

import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONWriter;
import easy4j.module.base.plugin.dbaccess.DBAccess;
import easy4j.module.base.plugin.dbaccess.DBAccessFactory;
import easy4j.module.base.plugin.dbaccess.domain.SysLogRecord;
import easy4j.module.base.starter.Easy4JStarter;
import easy4j.infra.common.utils.ListTs;
import easy4j.module.seed.CommonKey;
import easy4j.module.sentinel.EnableFlowDegrade;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@Easy4JStarter(
        serverPort = 10002,
        serverName = "build-server",
        serviceDesc = "测试服务",
        author = "bokun.li",
        enableH2 = true,
        h2Url = "jdbc:h2:file:~/h2/testdb;DB_CLOSE_ON_EXIT=false"
        // 使用h2当数据库
)
@EnableFlowDegrade
// 需要标识启动类
@SpringBootTest(classes = AppTest.class)
public class AppTest {

    @Autowired
    DataSource dataSource;

    // saveRecord
    @Test
    public void test1() throws SQLException {
        DBAccess dbAccess = DBAccessFactory.getDBAccess(dataSource);
        SysLogRecord sysLogRecord = new SysLogRecord();
        sysLogRecord.setId(CommonKey.gennerString());
        sysLogRecord.setRemark("this is the remark");
        sysLogRecord.setParams("this is the params");
        sysLogRecord.setTag("测试新增");
        sysLogRecord.setTagDesc("这是" + DateUtil.formatDate(new Date()) + "的测试用例");
        sysLogRecord.setStatus("1");
        sysLogRecord.setErrorInfo("cause by this is a error info list.....");
        sysLogRecord.setCreateDate(new Date());
        String s = UUID.randomUUID().toString().replaceAll("-", "");
        System.out.println("uuid---" + s);
        sysLogRecord.setTraceId(s);
        int i = dbAccess.saveOne(sysLogRecord, SysLogRecord.class);
        System.out.println("更新条数---" + i);
    }
}

启动服务可以不用application.properties

git提交规则

使用 Conventional Commits 规则

<类型>[可选作用域]: <描述>

[可选正文]

[可选脚注]
类型:
feat:新功能(会触发语义化版本的 MINOR 升级)
fix:修复 bug(会触发语义化版本的 PATCH 升级)
docs:仅修改文档(如 README、注释)
style:不影响代码逻辑的格式调整(如空格、缩进、标点)
refactor:既非新功能也非修复 bug 的代码重构
perf:性能优化(如算法改进、减少资源消耗)
test:添加或修改测试代码(如单元测试、集成测试)
build:构建流程或依赖管理的修改(如 pom.xml、package.json)
ci:CI 配置文件或脚本的修改(如 GitHub Actions、Jenkinsfile)
chore:其他不修改 src 或 test 目录的变更(如配置文件)

系统参数

  • easy4j.dev: 是否是开发环境,如果是开发环境那么有些参数会降低提升应用启动速度 (true|false)
  • easy4j.author: 业务模块负责人
  • easy4j.server-port: 服务端口 默认8080 等同于server.port
  • easy4j.server-name: 服务名称 等同于 spring.application.name
  • easy4j.server-desc: 服务描述
  • easy4j.data-source-url: 数据源简写,例如:“jdbc:postgresql://localhost:5432/postgres@root:123456”
  • easy4j.seed-ip-segment: seed模块的雪花算法 ip前缀,用于多网卡确定ip的 例如 10.“设置了ip前缀之后会按照ip来分配工作ID 分布式系统则不会主键重复”
  • easy4j.cors-reject-enable: 是否开启全局允许跨域 默认true 但是可以关闭
  • easy4j.h2-enable: 是否启用h2数据库 (true|false)
  • easy4j.h2-url: h2 数据库地址
  • easy4j.h2-console-username: h2控制台用户名 默认 easy4j
  • easy4j.h2-console-password: H2 控制台密码 默认 easy4j
  • easy4j.enable-sca: 是否启用sca 如果引用了 sca模块的starter那么这个默认是开启的 (true|false)
  • easy4j.env: env 类似于 spring.profiles.active 用于在nacos远程配置文件名称加后缀
  • easy4j.nacos-url: nacos 地址 如果有密码 可以 地址@username:password简写
  • easy4j.nacos-username: nacos用户名
  • easy4j.nacos-password: nacos用户密码
  • easy4j.nacos-config-url: nacos配置中心地址
  • easy4j.nacos-config-username: nacos配置中心用户名
  • easy4j.nacos-config-password: nacos配置中心密码
  • easy4j.nacos-config-group: nacos配置中心group
  • easy4j.nacos-config-namespace: nacos配置中心命名空间
  • easy4j.nacos-config-strict: nacos配置中心严格模式 (true|false)
  • easy4j.nacos-config-file-extension: nacos 远程配置文件后缀默认为:properties
  • easy4j.nacos-discovery-url: nacos 注册中心地址
  • easy4j.nacos-discovery-username: nacos 注册中心用户名
  • easy4j.nacos-discovery-password: nacos 注册中心密码
  • easy4j.nacos-discovery-group: nacos 注册中心group
  • easy4j.nacos-discovery-namespace: nacos 注册中心命名空间
  • easy4j.data-ids: nacos配置中心data-ids 多个,逗号分割如果属于不同组那么就 data-id?group=XXX_GROUP
  • easy4j.nacos-group: nacos配置中心group,如果设置了这个 则配置中心和注册中心可以不用填group
  • easy4j.nacos-name-space: nacos配置中心namespace,如果设置了这个 则配置中心和注册中心可以不用填namespace
  • easy4j.signature-secret: 签名密钥串(字典等敏感接口)
  • easy4j.jwt-secret: jwt签名密钥串
  • easy4j.sign-urls: 需要加强校验的接口清单
  • easy4j.session-expire-time-seconds: 会话过期时间 默认3个小时
  • easy4j.session-refresh-time-remaining: 会话刷新剩余时间,秒为单位,默认十分钟
  • easy4j.simple-link-tracking: 单服务简单链路追踪,默认未开启,true为开启 (true|false)
  • easy4j.print-request-log: 是否打印简单的请求日志,默认不打印,true为打印 (true|false)
  • easy4j.simple-auth-enable: 简单权限认证 默认没开启 true为开启 (true|false)
  • easy4j.simple-auth-is-server: 简单权限认证服务端,默认不是,如果是服务端那么会自动建表,自动注册服务暴露 (true|false)
  • easy4j.simple-auth-session-storage-type: 权限session存储类型:db代表数据库,redis代表redis
  • easy4j.simple-auth-username: 简单权限认证的用户名
  • easy4j.simple-auth-username-cn: 简单权限认证的用户名中文
  • easy4j.simple-auth-password: 简单权限认证的密码,以$开头代表从环境变量中获取
  • easy4j.simple-auth-user-impl-type: 用户信息的实现类型(default、extra)default代表默认实现(默认实现会自动建表),extra代表是外部业务实现,如果是extra则不建默认用户表:该字段无默认值如果开启了EASY4J_SAUTH_IS_SERVER那么必须设置 (default|extra)
  • easy4j.simple-auth-is-cache-authority: 简单权限是否缓存权限列表 (true|false)
  • easy4j.simple-auth-register-to-nacos: 服务端是否将权限注册到nacos去远程调用 (true|false)
  • easy4j.simple-auth-scan-package-prefix: 权限扫描包名,比如org.springframework这种前缀,只有处于这个包前缀的类才会被权限验证,默认是启动类所在包路径
  • easy4j.simple-auth-session-repeat-strategy: 认证时会话重复策略,默认default也就是共用会话,new新建会话,reject不允许重复,public共用会话,kick把已存在的会话踢下线 (default|new|reject|public|kick)
  • easy4j.simple-auth-access-tokens: 认证时会话口令集合,可以以环境变量的形式配在服务器上,以$开头代表从环境变量中获取
  • easy4j.db-request-log-enable: 是否启用RequestLog注解进行请求日志收集 默认启用false关闭 (true|false)
  • easy4j.enable-print-sys-db-sql: 是否开启系统sql日志记录 true 代表开启,默认开启 (true|false)
  • easy4j.cache-http-content-length: 请求体缓存字节流最大大小,默认5M
  • easy4j.admin-server-url: BootAdmin监控地址,配置了代表自动开启admin-client
  • easy4j.redis-server-url: redis server 地址 127.0.0.1:6379@user:123456 用户名如果省略第一位就是密码
  • easy4j.redis-connection-type: Redis连接方式: Single、Sentinel、Cluster 默认单点
  • easy4j.redis-enable: 是否启用redis 如果配置了 redis-server-url 那么这个自动变成true (true|false)
  • easy4j.redis-min-ide-size: redis最小空闲连接数 默认30
  • easy4j.redis-connection-pool-size: redis连接池最大连接数量 默认500
  • easy4j.flyway-enable: 是否启用flyway默认没启动,但是如果在linux服务器上默认是启用了的,开发环境需要置为true才会生效 (true|false)
  • easy4j.flyway-checksum-disabled: 是否启用flyway启动时的内容检查,默认禁用,如果不禁用,已执行脚本更改过之后则启动失败 (true|false)
  • easy4j.sca-gateway-flow-qps: spring-cloud-gateway 流控规则
  • easy4j.seata-enable: 是否启用seata (true|false)
  • easy4j.seata-nacos-url: seata注册中心地址,地址(多个地址用逗号隔开)@用户:密码
  • easy4j.seata-nacos-cluster: seata注册中心集群名称,通常和vgroup-mapping对应起来
  • easy4j.seata-tx-group: seata事务组
  • easy4j.seata-nacos-group: seata注册中心nacos组
  • easy4j.seata-registry-type: seata注册中心类型
  • easy4j.seata-tx-log: seata事务日志是否整合到logback(true代表整合false代表不整合),默认不整合 (true|false)
  • easy4j.xxl-job-enable: 是否使用xxlJob (true|false)
  • easy4j.xxl-job-admin-url: xxlJobAdmin的地址
  • easy4j.xxl-job-access-token: xxlJob的accessToken默认值为default_token
  • easy4j.sentinel-dashboard-enable: 是否开启sentinel的控制台,默认不开启 (true|false)
  • easy4j.sentinel-dashboard-eager: (非必填)sentinel控制台是否提前初始化,默认如果启用控制台则提前初始化 (true|false)
  • easy4j.sentinel-dashboard-url: sentinel控制台地址,示例(localhost:8080)
  • easy4j.metrics-enable: 是否开启指标采集 默认开启 (true|false)
  • easy4j.default-i18n: 默认i18n,默认中文
  • easy4j.db-access-not-cache-schema: 是否不缓存动态表查询的schema信息,默认false也就是要缓存 (true|false)
  • easy4j.log-path: 日志所在目录,默认程序运行当前目录logs文件夹下面
  • easy4j.minio-url: minio地址
  • easy4j.minio-access-key: minio访问key
  • easy4j.minio-secret-key: minio访问密钥
  • easy4j.global-quartz-job-print-log: quartz全局日志打印 (true|false)
  • easy4j.force-register-to-registry: 强制将本机服务注册到注册中心,本机启动的服务默认不会注册到中心了 (true|false)
  • easy4j.quartz-job-restart-check-delete: 针对quartz任务,如果任务被从代码层面删除,那么重启服务之后是否删除所有触发器和任务明细,默认true会删除 (true|false)
  • easy4j.knife4j-nacos-aggregation: knife4j通过nacos进行聚合,默认不聚合 (true|false)
  • easy4j.knife4j-nacos-routers: knife4j要聚合的路由信息,和nacos整合

About

一个简单好用的 Java 基础框架底座

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors