前言在开源中国,不知道大家有没有注意到一个Java开源组织——Dromara?该组织由Apache神羽(原灵魂网关)的作者创立,是一个由众多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设计很简单,简单到什么程度呢?以登录验证为例,只需要://登录时写入当前会话的账号idStpUtil.login(10001);//然后在需要验证登录的地方调用如下方法://如果当前会话未登录,这句代码会抛出`NotLoginException`异常StpUtil.checkLogin();至此,我们已经借助Sa-Token完成了登录认证!这时候你的小脑袋可能满是问号,就这么简单吗?自定义领域呢?全局过滤器呢?我不用写各种配置文件吗?没错,在Sa-Token中,登录认证就是这么简单,不需要复杂的前置工作,只需要调用这个简单的API就可以完成session登录认证!当你厌倦了Shiro、SpringSecurity等框架时,你就会明白Sa-Token的API设计相比于这??些传统的老框架是多么的简洁和优雅!权限认证示例(只有有user:add权限的会话才能进入请求)@SaCheckPermission("user:add")@RequestMapping("/user/insert")publicStringinsert(SysUseruser){//...return"Adduser";}踢掉一个账号(对方再次访问系统时会抛出NotLoginException)//让账号id为10001的session强制退出登录StpUtil.logoutByLoginId(10001);在Sa-Token中,大部分功能都可以用一行代码完成:StpUtil.login(10001);//标记当前会话的账号idloginStpUtil.getLoginId();//获取当前会话的账号idloginStpUtil.isLogin();//获取当前会话是否已经登录,返回true或falseStpUtil.logout();//注销当前会话StpUtil.logoutByLoginId(10001);//让账号为10001的会话注销再登录(踢人下线)StpUtil.hasRole("super-admin");//查询当前账号是否包含指定角色ID,返回true或falseStpUtil.hasPermission("user:add");//查询当前账号是否有指定权限,返回true或falseStpUtil.getSession();//获取当前账号id的SessionStpUtil.getSessionByLoginId(10001);//获取账号id10001的SessionStpUtil.getTokenValueByLoginId(10001);//获取账户id为10001的令牌token值StpUtil.login(10001,"PC");//指定登录的设备ID,常用于“同端互斥登录”StpUtil.logoutByLoginId(10001,"PC");//指定强制退出的设备ID(不同端不受影响)StpUtil.openSafe(120);//在当前会话中开启二次认证,有效期为120秒StpUtil.checkSafe();//检查当前session是否在二级认证有效期内,如果验证失败,将抛出异常StpUtil.switchTo(10044);//暂时将当前session身份切换到其他账号即使不跑测试,相信你也能理解大部分API的用法更多信息请参考:https://gitee.com/dromara/sa-...Forest是一个强大的Http客户端框架,极大的解放了你的Http访问工作。Http协议复杂吗?那是因为你还没有用过Forest。虽然业界还有很多其他优秀的Http客户端,但是错过了Forest,就错过了一大片优雅美丽的森林。官网:http://forest.dtflyx.comGitee托管仓库:https://gitee.com/dromara/forestGithub托管仓库:https://github.com/dromara/fo...Forest是一个开源的JavaHTTP客户端框架,用于访问第三方服务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请求接口的:**根据经纬度获取详细地址*@paramlongitudelongitude*@paramlatitudelatitude*@return详细地址信息*/@Get("/service/regeo")MapgetLocation(@Query("longitude")Stringlongitude,@Query("latitude")Stringlatitude);}......Amapamp=Forest.client(Amap.class);//发送请求查询经纬度地图locationInfo=amp.getLocation("32.1242832","56.3290434");自动JSON和XML转换事实上,我们在处理HTTP工作时,除了浪费在组装各种请求参数上,大部分时间都花在了JSON、XML等各种格式数据的序列化和反序列化上。在使用HttpClient之前,这些重复的机械工作都得自己来完成,非常麻烦。使用Forest就方便多了。比如你要POST一个JSON对象,直接挂上@JSONBody就可以了,爽死了。//直接将MyUserInfo转成JSON//将服务器响应返回的JSON数据转成Result类对象@Post("http://localhost:8080/user")ResultcreateUser(@JSONBodyMyUserInfo用户);对比Retrofit和Feign这两个开源框架我之前都用过,都很强大,但是各有优缺点。Retrofit的主要问题在于它与OkHttp的联系过于紧密。部分功能受OkHttp限制。比如我很难处理Get请求等非标准的HTTP请求,传输Body数据。Forest可以在OkHttp和HttpClient之间切换,作为后端,应该使用哪一个。Retrofit注解的丰富程度没有Forest丰富。比如实现一个HTTP网络代理,就得自己写代码,而Forest提供了@HTTPProxy注解,设置一下就大功告成了。如果想基于OkHttp拦截器扩展自定义注解,不是特别方便,但是Forest拦截器比OkHttp方便多了,提供了onInvoke,beforeExecute,onSccuess,onError等回调方法,相当于覆盖了life,oldage、病死一请求。Feign的问题在于它和Spring绑得太紧了,很多功能都需要依赖Spring来完成。Spring相关的包太多太重。Forest的核心包基本涵盖了HTTP需要的所有功能和注解,不依赖Spring,轻量很多,但还是很方便的。更多信息请参考:https://gitee.com/dromara/forestLiteFlow一个超轻量级、快速、稳定、可编排的基于组件的流程引擎/规则引擎。复杂系统解耦神器!如果你正在为复杂的系统设计而头疼,那么LiteFlow是你的不二之选,超低的学习成本和强大的编排功能,让你的系统更加优雅!官网:https://yomahub.com/liteflowGitee托管仓库:https://gitee.com/dromara/lit...Github托管仓库:https://github.com/dromara/li...Liteflow是解决方案天生就是耦合复杂逻辑的,如果你想重写或者重构复杂的业务逻辑,liteflow是最合适的。它是一个轻量级、快速的基于组件的流程引擎框架,组件编排,帮助解耦业务代码,让每个业务板块成为一个组件。使用Liteflow,需要将复杂的业务逻辑通过代码片段拆分成小的组件,并定义规则流程配置。这样,所有组件都可以根据您的复杂流程规则进行配置。同时,Liteflow支持规则文件热加载,修改即时生效。并为各种持久化规则的方式提供扩展。对于LiteFLow,三个核心概念是组件、规则和上下文。你需要这样定义你的组件//这里是公共组件@LiteflowComponent(id="a",name="ComponentADescription")publicclassACmpextendsNodeComponent{@Overridepublicvoidprocess(){//doyourbusiness}}//这是条件组件@LiteflowComponent(id="b",name="ComponentBDescription")publicclassBCondCmpextendsNodeCondComponent{@OverridepublicStringprocessCond(){//doyourbusinessreturn"e";}}然后定义你的规则。LiteFlow支持三种格式:xml、yml和json。这里我们以xml形式为例。这样,您的系统将按照规则文件定义的方式执行您的业务组件。是不是很简单。规则文件在哪里定义的?LiteFlow不限制规则文件的来源。它可以是本地文件、注册中心或任何数据库。LiteFlow提供了一个非常自由的接口供你扩展,你可以把它存放在任何地方。更改规则文件以实时刷新您的规则流!如果你想构建一个高度灵活和可扩展的系统,LiteFlow不是很适合吗?LiteFlow为每个请求开辟并申请一个slot,可以理解为一个context,所有组件共享这个slot。可以通过访问Slot访问任何组件中的任何数据,也可以存储任何数据。您还可以扩展Slot并自定义此插槽的属性。@LiteflowComponent(id="a",name="ComponentADescription")publicclassACmpextendsNodeComponent{@Overridepublicvoidprocess(){Slotslot=this.getSlot();//通过slot的getData、setData,或者访问自己扩展的slot属性}}正是因为Slot的存在,抹平了组件之间的差异,使得各个业务组件之间没有强依赖。这样的设计可以让你的系统高度自由,组件复用,组件更换订单都可以方便的实现!LiteFlow还支持两种脚本语言的接入,目前支持Groovy和QLExpress两种脚本语言。可以在xml/yml/json中定义脚本,以xml为例:100){返回“a”;}else{返回“b”;}]]>那么语言脚本是在哪里定义的呢?LiteFlow的脚本函数是SPI机制的一种实现。你依赖哪个脚本包?,将执行哪个脚本。有了脚本语言的支持,连业务代码都可以热部署吗?香吗?LiteFlow的功能远不止这些。如果想了解更多,请到官网文档了解。相信LiteFlow会让您感到优雅和惊艳。更多内容请参考:https://yomahub.com/liteflowJPom一款简单轻量的低侵入式在线构建、自动部署、日常运维、项目监控的软件DevOps中小型公司团队的福音!轻巧又强大,你不试试吗?官网:https://jpom.io/Gitee托管仓库:https://gitee.com/dromara/JpomGithub托管仓库:https://github.com/dromara/JpomJpom是一个简单轻量低侵入的在线构建、自动部署、日常运维、项目监控等软件多用于中小型公司或团队。传统的项目部署和运维流程常用的方法是登录服务器上传新的项目包,执行相应的命令管理,如果管理多个项目则重复上述步骤。市面上有很多DevOps软件,但是这些软件基本上都比较难用,依赖度很高。Jpom是一款轻量级的DevOps软件,专为低侵入、轻依赖的中小型公司或团队设计。项目主要功能特点创建、修改、删除项目,Jar包管理实时查看控制台日志,备份日志,删除日志,导出日志在线建设项目发布项目一键多节点管理,多节点自动分发在线SSH终端,并通过终端日志和禁用命令实时监控项目状态cpu和ram监控自动报警,导出堆栈信息,查看项目进程端口,服务器状态监控多用户管理,独立用户项目权限(上传和上传)删除权限可控),完美运行日志系统路径白名单模式,防止用户误认操作系统文件在线管理Nginx配置文件和ssl证书文件一键安装(Linux)(推荐)插件如果服务器也需要要管理,还需要在服务器上安装插件安装路径位于执行命令目录(数据和日志存放目录默认位于安装路径,如需修改参考配置文件:extConfig.yml)yuminstall-ywget&&wget-Oinstall.shhttps://dromara.gitee.io/jpom/docs/install.sh&&bashinstall.sh代理备用地址yuminstall-ywget&&wget-Oinstall.shhttps://cdn.jsdelivr.net/gh/dromara/Jpom/docs/install.sh&&bashinstall.sh代理支持自动安装jdk环境yuminstall-ywget&&wget-Oinstall.shhttps://dromara.gitee.io/jpom/docs/install.sh&&bashinstall.shAgentjdk启动成功后,插件端端口为2123,服务器安装路径位于执行命令目录(数据和日志存放目录默认位于安装路径下。如果需要修改参考配置文件:extConfig.yml),如果需要修改数据和日志存放路径,请参考extConfig.yml文件中的jpom.path配置属性yuminstall-ywget&&wget-O安装.shhttps://dromara.gitee.io/jpom/docs/ininstall.sh&&bashinstall.sh服务器备用地址yuminstall-ywget&&wget-Oinstall.shhttps://cdn.jsdelivr.net/gh/dromara/Jpom/docs/install.sh&&bashinstall.sh服务器支持自动安装jdk环境yuminstall-ywget&&wget-Oinstall.shhttps://dromara.gitee.io/jpom/docs/install.sh&&bashinstall.shServerjdk支持自动安装jdk和maven环境yuminstall-ywget&&wget-Oinstall.shhttps://dromara.gitee.io/jpom/docs/install.sh&&bashinstall.sh服务器jdk+mvn启动成功,服务器端口为2122访问管理页面如http://localhost:2122/特别提醒:一键安装时,注意执行的命令不要在同一目录下,即Server和Agent不能安装在同一目录下。如果无法访问,检查防火墙systemctlstatusfirewalld是否开启。如果状态显示为绿色Active:active(运行中),可以暂时关闭防火墙systemctlstopfirewalld,然后重启防火墙firewall-cmd--reload(建议只在测试环境下使用,并使用生产环境慎用)。如果关闭防火墙后仍然无法访问,且您使用的是云服务器,您还需要在云服务器管理后台关闭防火墙。更多信息请参考:https://gitee.com/dromara/Jpom最后,以上推荐的开源项目仅在DromaraJava社区。4.Dromara社区还有很多优秀的开源项目。每一个项目都凝聚着每一位作者日以继夜的辛勤付出。他们以开放的心态拥抱世界,用科技的力量为中国的开源项目贡献力量。为事业做贡献。我们努力发光,照亮他人,也照亮自己。同时,也希望更多的Java开源作者能够加入Dromara社区,凝聚我们这一代的力量,汇聚王者之功,共渡难关,互帮互助。最后,看到这个童鞋点个赞分享一下,再看一遍吧!