乐趣区

关于java:这个开源组织里的项目都是精品

前言

在开源中国里,不晓得大家有没有留意到一个 Java 开源组织——Dromara?

这个组织是由 Apache ShenYu(前身是 Soul 网关)的作者创建,多位 Java 开源作者参加的一个 Java 开源组织。

在开源中国社区,很多 Java 开源作者都是各自为战,独立经营我的项目。Domara 组织的诞生就是为了联结 Java 开源的力量,共建社区,资源共享,独特推广中国 Java 开源事业的倒退。

目前 Dromara 社区领有 9 个 GVP 我的项目,和一些 Star 数量很高的我的项目。这些开源我的项目社区都很沉闷,每一个都是能进步工作效率的精品开源作品。上面就来盘点下 Dromara 组织其中的 4 个开源我的项目。都是十分实用的工具,用好这些将会让你的生产效率大大晋升!

Sa-Token

首先我要介绍的是 Sa-Token,可能是史上性能最全的轻量级 Java 权限认证框架。

简略的应用形式,丰盛的个性,弱小的性能,你有什么理由回绝?

官方网站:http://sa-token.dev33.cn/

Gitee 托管仓库:https://gitee.com/dromara/sa-…

Github 托管仓库:https://github.com/dromara/Sa…

Sa-Token 是一个轻量级 Java 权限认证框架,次要解决:登录认证 权限认证 Session 会话 单点登录 OAuth2.0 微服务网关鉴权
等一系列权限相干问题。

Sa-Token 的 API 设计非常简单,有多简略呢?以登录认证为例,你只须要:

// 在登录时写入以后会话的账号 id
StpUtil.login(10001);

// 而后在须要校验登录处调用以下办法:// 如果以后会话未登录,这句代码会抛出 `NotLoginException` 异样
StpUtil.checkLogin();

至此,咱们曾经借助 Sa-Token 实现登录认证!

此时的你小脑袋可能飘满了问号,就这么简略?自定义 Realm 呢?全局过滤器呢?我不必写各种配置文件吗?

没错,在 Sa-Token 中,登录认证就是如此简略,不须要任何的简单前置工作,只需这一行简略的 API 调用,就能够实现会话登录认证!

当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明确,绝对于这些传统老牌框架,Sa-Token 的 API 设计是如许的简略、优雅!

权限认证示例(只有具备 user:add 权限的会话才能够进入申请)

@SaCheckPermission("user:add")
@RequestMapping("/user/insert")
public String insert(SysUser user) {
    // ... 
    return "用户减少";
}

将某个账号踢下线(待到对方再次拜访零碎时会抛出 NotLoginException 异样)

// 使账号 id 为 10001 的会话强制登记登录
StpUtil.logoutByLoginId(10001);

在 Sa-Token 中,绝大多数性能都能够 一行代码 实现:

StpUtil.login(10001);                     // 标记以后会话登录的账号 id
StpUtil.getLoginId();                     // 获取以后会话登录的账号 id
StpUtil.isLogin();                        // 获取以后会话是否曾经登录, 返回 true 或 false
StpUtil.logout();                         // 以后会话登记登录
StpUtil.logoutByLoginId(10001);           // 让账号为 10001 的会话登记登录(踢人下线)StpUtil.hasRole("super-admin");           // 查问以后账号是否含有指定角色标识, 返回 true 或 false
StpUtil.hasPermission("user:add");        // 查问以后账号是否含有指定权限, 返回 true 或 false
StpUtil.getSession();                     // 获取以后账号 id 的 Session
StpUtil.getSessionByLoginId(10001);       // 获取账号 id 为 10001 的 Session
StpUtil.getTokenValueByLoginId(10001);    // 获取账号 id 为 10001 的 token 令牌值
StpUtil.login(10001, "PC");               // 指定设施标识登录,罕用于“同端互斥登录”StpUtil.logoutByLoginId(10001, "PC");     // 指定设施标识进行强制登记 (不同端不受影响)
StpUtil.openSafe(120);                    // 在以后会话开启二级认证,有效期为 120 秒 
StpUtil.checkSafe();                      // 校验以后会话是否处于二级认证有效期内,校验失败会抛出异样 
StpUtil.switchTo(10044);                  // 将以后会话身份长期切换为其它账号 

即便不运行测试,置信您也能意会到绝大多数 API 的用法。

想要理解更多请参考:https://gitee.com/dromara/sa-…

Forest

一款极大水平解放你的 Http 接入工作的弱小 Http 客户端框架。

Http 协定很简单吗?那是因为你还没有应用过 Forest,尽管业内有很多其余优良的 Http 客户端,然而你错过了 Forest,将会错过一大片优雅漂亮的森林。

官方网站:http://forest.dtflyx.com

Gitee 托管仓库:https://gitee.com/dromara/forest

Github 托管仓库:https://github.com/dromara/fo…

Forest 是一个开源的 Java HTTP 客户端框架,用来拜访第三方服务 RESTful 接口。

它可能将 HTTP 的申请参数绑定到 Java 接口上,之后调用 Java 接口就等于在发送 HTTP 申请。所有面向于接口。

很多公司须要在 Java 后盾调用许多第三方 HTTP 接口,比方微信领取、友盟等等第三方平台。

公司外部还有很多服务是用世界最好语言写的,接口天然也只能通过 HTTP 接口来调用。于是与日俱增下来,在 Java 代码中就有许许多多各式各样的 HTTP 调用接口,而且调用形式也不对立,有 HttpClient 写的、有 OkHttp 写的、有本人包装的,光公司外部不同人包装的 HTTP 工具类就有两三种。

而且 url 根本写死在代码中,很难保护,不同接口又有不同的参数传输方式,有 GET、有 POST,有 JSON 传输的、有 XML 传输的。当有一个接口须要批改,完了,光找到代码在什么中央就要花半天工夫。

而 Forest 能帮忙我很好地将 HTTP 代码和业务代码解耦开来,申请调用者不用关怀 HTTP 相干的细节。

主动拼接 HTTP 的各种参数

包含 URL、Header、Body 等等参数都能依附 Java 注解来申明。

这里就举一个高德地图的栗子,来看看 Forest 是如何优雅的申明 HTTP 申请接口的:

/**
 * 高德地图服务客户端接口
 */
@BaseRequest(baseURL = "http://ditu.amap.com")
public interface Amap {

    /**
     * 依据经纬度获取具体地址
     * @param longitude 经度
     * @param latitude 纬度
     * @return 具体地址信息
     */
    @Get("/service/regeo")
    Map getLocation(@Query("longitude") String longitude, @Query("latitude") String latitude);

}

... ...

Amap amp = Forest.client(Amap.class);
// 发送申请查问经纬度
Map locationInfo = amp.getLocation("32.1242832", "56.3290434");

主动 JSON 和 XML 转换

其实,咱们解决 HTTP 的工作时,除了节约在组装各种申请参数外,大部分工夫都花了在序列化和反序列化各种格局的数据上,如 JSON 和 XML。

以前用 HttpClient,这些反复的机械性工作都要本人来搞,很是麻烦。

用 Forest 就不便多了,比方要 POST 一个 JSON 对象,间接挂个 @JSONBody 就好了,就是这么清新。

// 间接将 MyUserInfo 转换成 JSON
// 将服务端响应返回的 JSON 数据转换成 Result<Boolean> 类对象
@Post("http://localhost:8080/user")
Result<Booelean> createUser(@JSONBody MyUserInfo user);

和 Retrofit 以及 Feign 的比拟

之前也用过这两块开源框架,都很弱小,但各有优缺点。

Retrofit 的次要的问题时和 OkHttp 绑的太死,有些性能被 OkHttp 限制住了,比方我想解决 Get 申请传输 Body 数据这种非标准的 HTTP 申请就很难办到,而 Forest 能够随便切换 OkHttp 和 HttpClient 作为后端,须要用哪个时用哪个。

Retrofit 注解的丰富性也不如 Forest,比方要实现 HTTP 网络代理就要本人去写代码,而 Forest 提供了 @HTTPProxy 注解,设置一下就完事了。

如果要扩大自定义注解都是基于 OkHttp 的拦截器,不是特地不便,而 Forest 拦截器要比 OkHttp 的不便很多,提供 onInvoke, beforeExecute, onSccuess,onError 等回调办法,等于把一个申请的生老病死都涵盖了。

而 Feign 的问题则是和 Spring 绑的太紧,很多性能须要依赖 Spring 去做,太加了 Spring 相干包又太重了。

Forest 的外围包根本涵盖了所有 HTTP 所需性能和注解,不依赖 Spring,要轻量许多,但又不失方便性。

想要理解更多请参考:https://gitee.com/dromara/forest

LiteFlow

一款超轻量,疾速,稳固,可编排的组件式流程引擎 / 规定引擎。

解耦简单零碎的神器!如果你正在为设计一个简单零碎感到头痛,那么 LiteFlow 是是你不二的抉择,超低的学习老本,弱小的编排性能,让你的零碎变得更优雅!

官方网站:https://yomahub.com/liteflow

Gitee 托管仓库:https://gitee.com/dromara/lit…

Github 托管仓库:https://github.com/dromara/li…

Liteflow 为解耦简单逻辑而生,如果你要对简单业务逻辑进行新写或者重构,用 liteflow 最合适不过。它是一个轻量,疾速的组件式流程引擎框架,组件编排,帮忙解耦业务代码,让每一个业务片段都是一个组件。

应用 Liteflow,你须要去把简单的业务逻辑按代码片段拆分成一个个小组件,并定义一个规定流程配置。这样,所有的组件,就能依照你的规定配置去进行简单的流转。同时 Liteflow 反对规定文件的热加载,即时实现批改失效。并提供多种长久化规定的形式的扩大。

应用 LiteFLow,三大外围概念是组件,规定和上下文。

你须要这么像这样去定义你的组件

// 这里一般组件
@LiteflowComponent(id = "a", name = "组件 A 形容")
public class ACmp extends NodeComponent {
    @Override
    public void process() {//do your business}
}

// 这是条件组件
@LiteflowComponent(id = "b", name = "组件 B 形容")
public class BCondCmp extends NodeCondComponent {
    @Override
    public String processCond() {
        //do your business
          return "e";
    }
}

而后去定义你的规定,LiteFlow 反对 xml,yml,json 三种格局,这里以 xml 模式为例

<?xml version="1.0" encoding="UTF-8"?>
<flow>
    <chain name="chain1">
        <then value="a,b(c|d|e)"/> <!-- c 为路由组件,用来路由到 c,d,e -->
        <then value="sub_chain"/> <!-- 子流程 -->
    </chain>
  
      <chain name="sub_chain">
        <when value="f,g,h"/> <!-- when 代表并行 -->
          <then value="j,k" /> <!-- then 代表串行 -->
    </chain>
</flow>

这样你的零碎就会依照规定文件定义的形式,去执行你的业务组件。是不是很简略。

那规定文件定义在哪呢,LiteFlow 并不限定你的规定文件起源,能够是本地文件,能够是注册核心,能够是任何数据库。LiteFlow 提供了十分自在的接口供你扩大,你想存储在哪里都行。扭转规定文件,即可实时刷新你的规定流程!如果你想做一个灵便度高,伸缩性强的零碎,LiteFlow 是不是非常适合呢。

LiteFlow 为每一个申请都去开拓申请了一个 Slot,你能够了解为上下文,所有的组件共享这个 Slot。你能够在任意组件里通过对 Slot 的拜访来取得任意数据,也能够寄存任意数据。你也能够扩大 Slot,自定义这个 slot 的属性。

@LiteflowComponent(id = "a", name = "组件 A 形容")
public class ACmp extends NodeComponent {
    @Override
    public void process() {Slot slot = this.getSlot();
          // 通过对 slot 的 getData,setData,或者存取你本人扩大的 slot 属性
    }
}

正因为有 Slot 的存在,才抹平了组件与组件之间的差异性,使得每一个业务组件之间无强依赖。这样的设计,就能够让你的零碎高度自由化,组件复用,组件调换程序得以不便的实现!

LiteFlow 还反对 2 种脚本语言的接入,目前反对 Groovy 和 QLExpress 两种脚本语言。你能够在 xml/yml/json 定义脚本,以下以 xml 为例:

<?xml version="1.0" encoding="UTF-8"?>
<flow>
    <nodes>
        <node id="s1" name="一般脚本" type="script">
            <![CDATA[
                def a=3;
                def b=2;
                slot.setData("s1",a*b);
            ]]>
        </node>

        <node id="s2" name="条件脚本" type="cond_script">
            <![CDATA[count = slot.getData("count");
                if(count > 100){return "a";}else{return "b";}
            ]]>
        </node>
    </nodes>

    <chain name="chain1">
        <then value="a,b,c,s1"/>
    </chain>

    <chain name="chain2">
        <then value="d,s2(a|b)"/>
    </chain>
</flow>

那么在什么中央定义是哪种语言的脚本呢,LiteFlow 的脚本性能是一个 SPI 机制的实现,你依赖了哪个脚本包,就以哪种脚本的形式执行。

有了脚本语言的反对,连业务代码是不是都能够热部署了?香不香?

LiteFlow 的性能远不止这些,想理解更多,请到官网文档去查看理解。置信 LiteFlow 会让你感到优雅和惊艳。

想要理解更多请参考:https://yomahub.com/liteflow

JPom

一款简而轻的低侵入式在线构建、主动部署、日常运维、我的项目监控软件

中小公司团队 DevOps 的福音!轻量且弱小,你不试试?

官方网站:https://jpom.io/

Gitee 托管仓库:https://gitee.com/dromara/Jpom

Github 托管仓库:https://github.com/dromara/Jpom

Jpom 是一款简而轻的低侵入式在线构建、主动部署、日常运维、我的项目监控软件

中小公司或者团队 中传统我的项目部署、运维流程通用的办法是登录服务器上传新的我的项目包,执行相应命令治理,如果治理多个我的项目则反复操作上述步骤。

市面上有很许多 DevOps 软件然而这些软件根本都会是难上手,重依赖。Jpom 则是针对 中小公司或者团队 设计的一款 低侵入 轻依赖 的一款 轻量级 的 DevOps 软件。

我的项目次要性能及特点

  1. 创立、批改、删除我的项目、Jar 包治理
  2. 实时查看控制台日志、备份日志、删除日志、导出日志
  3. 在线构建我的项目公布我的项目一键搞定
  4. 多节点治理、多节点主动散发
  5. 在线 SSH 终端,并且有终端日志和禁用命令
  6. 实时监控我的项目状态异样主动报警
  7. cpu、ram 监控、导出堆栈信息、查看我的项目过程端口、服务器状态监控
  8. 多用户治理,用户我的项目权限独立(上传、删除权限可管制), 欠缺的操作日志
  9. 零碎门路白名单模式,杜绝用户误操作系统文件
  10. 在线治理 Nginx 配置文件、ssl 证书文件

一键装置(Linux)(举荐)

插件端

如果服务端也须要被治理,在服务端上也须要装置插件端

装置的门路位于执行命令目录(数据、日志寄存目录默认位于装置门路, 如须要批改参考配置文件:extConfig.yml

yum install -y wget && wget -O install.sh https://dromara.gitee.io/jpom/docs/install.sh && bash install.sh Agent

备用地址

yum install -y wget && wget -O install.sh https://cdn.jsdelivr.net/gh/dromara/Jpom/docs/install.sh && bash install.sh Agent

反对主动装置 jdk 环境

yum install -y wget && wget -O install.sh https://dromara.gitee.io/jpom/docs/install.sh && bash install.sh Agent jdk

启动胜利后, 插件端的端口为 2123

服务端

装置的门路位于执行命令目录(数据、日志寄存目录默认位于装置门路, 如须要批改参考配置文件:extConfig.yml

如果须要批改数据、日志存储门路请参照 extConfig.yml 文件中 jpom.path 配置属性

yum install -y wget && wget -O install.sh https://dromara.gitee.io/jpom/docs/install.sh && bash install.sh Server

备用地址

yum install -y wget && wget -O install.sh https://cdn.jsdelivr.net/gh/dromara/Jpom/docs/install.sh && bash install.sh Server


反对主动装置 jdk 环境

yum install -y wget && wget -O install.sh https://dromara.gitee.io/jpom/docs/install.sh && bash install.sh Server jdk

反对主动装置 jdk 和 maven 环境

yum install -y wget && wget -O install.sh https://dromara.gitee.io/jpom/docs/install.sh && bash install.sh Server jdk+mvn

启动胜利后, 服务端的端口为 2122 拜访治理页面 例如http://localhost:2122/

特地揭示:一键装置的时候留神执行命令不可在同一目录下,即 Server 端和 Agent 端不可装置在同一目录下

如无法访问,查看下是否开启了防火墙 systemctl status firewalld,如状态显示为绿色Active: active (running) 可长期敞开防火墙 systemctl stop firewalld,而后重启防火墙firewall-cmd --reload(倡议仅测试环境下应用,生产环境下慎用)
如敞开防火墙后仍无法访问,并且应用的是云服务器,还须要到云服务器治理后盾中敞开防火墙

想要理解更多请参考:https://gitee.com/dromara/Jpom

最初

以上举荐的开源我的项目,仅仅是 Dromara Java 社区里其中 4 个,Dromara 社区还有很多更为优良的开源我的项目。每一个我的项目都凝固着每个作者日日夜夜的心血和付出,他们用凋谢的心态去拥抱这个世界,用技术的力量为中国的开源事业添砖加瓦。

咱们致力发着光,为了照亮他人,也为了亮堂自我。

同时也心愿有更多的 Java 开源作者能退出 Dromara 社区,凝聚吾辈之力,汇聚诸君之绩,乘风破浪,风雨同舟。

最初,看到这的童鞋,点赞,分享,在看点起来啊!

退出移动版