有哪些优秀的Java开源项目最值得阅读?
54 个回答
注意:我这里推荐的并不是阅读源码,仅推荐个人学习和使用。
也可以参考 https:// github.com/tuyucheng7/a wesome-java
首当其冲的必须是Guava,提供集合、并发、缓存、数学工具类
Eclipse Collection是一个高性能的集合库
JUnit-Pioneer是一个JUnit 5扩展,提供很多方便的JUnit 5 Extension
Mockito是一个Mock框架
Disruptor是一个高性能的无锁队列
Vavr是一个Java 8函数编程库
CAS是一个SSO库
NullAway是一个工具库,减少NPE
Instancio是一个测试数据Mock库
TestContainer允许在测试中启动、访问Docker容器
Caffeine高性能缓存库,代码写的质量挺高,并发数据结构的使用合理,可以看源码学习。
------------------------------------------8/13修改-------------------------------------------------
测试相关:
[JUnit 5]( https:// github.com/junit-team/j unit5 ):单元测试框架
[AssertJ]( https:// github.com/assertj/asse rtj ):测试断言库
[RestAssured]( https:// github.com/rest-assured /rest-assured ):API接口测试库
[Pact]( https:// github.com/pact-foundat ion/pact-jvm ):契约测试库
[JsonPath]( https:// github.com/json-path/Js onPath ):JsonPath的Java实现
[Cucumber]( https:// github.com/cucumber/cuc umber-jvm ):BDD框架
[Selenium]( https:// github.com/SeleniumHQ/s elenium ):UI自动化测试框架
[Selenide]( https:// github.com/selenide/sel enide ):Selenium的封装
[Gatling]( https:// github.com/gatling/gatl ing ):编程式的负载测试框架
[Wiremock]( https:// github.com/wiremock/wir emock ):接口Mock库
[Spock]( https:// github.com/spockframewo rk/spock ):包含单测、断言、Mock功能的框架
[Microcks]( https:// github.com/microcks/mic rocks ):微服务Mock工具
[Awaitility]( https:// github.com/awaitility/a waitility ):测试异步程序的库
开发框架:
[Quarkus]( https:// github.com/quarkusio/qu arkus ):更现代的微服务、云框架,红帽开源
[Micronaut]( https:// github.com/micronaut-pr ojects/micronaut-core ):JVM微服务框架,Oracle开源
[Dropwizard]( https:// github.com/dropwizard/d ropwizard ):构建Restful接口的Web框架,领英开源
[Ktor]( https:// github.com/ktorio/ktor ):Kotlin中构建异步微服务的轻量级框架
[Javalin]( https:// github.com/javalin/java lin ):轻量级Java、Kotlin框架
[Blade]( https:// github.com/lets-blade/b lade ):轻量级的MVC框架
[Primefaces]( https:// github.com/primefaces/p rimefaces ):开发JSF应用的UI库
[Helidon]( https:// github.com/helidon-io/h elidon ):虚拟线程上的微服务框架,Oracle开源
[JHipster]( https:// github.com/jhipster/gen erator-jhipster ):前后端全栈框架
[Hilla]( https:// github.com/vaadin/hilla ):支持React/Web组件的全栈框架
[Akka]( https:// github.com/akka/akka ):Actor模型的异步框架
[Vert.X]( https:// github.com/eclipse-vert x/vert.x ):响应式框架
[Camel]( https:// github.com/apache/camel ):开发企业级集成模式的框架
[Armeria]( https:// github.com/line/armeria ):Netty创始人推出的微服务框架,可以使用Spring Boot、gRPC、Dropwizard等不同技术开发
其他库:
[P6spy]( https:// github.com/p6spy/p6spy ):非侵入的SQL跟踪库
[Async-HTTP-Client]( https:// github.com/AsyncHttpCli ent/async-http-client ):异步HttpClient
[MapStruct]( https:// github.com/mapstruct/ma pstruct ):基于注解处理器的Bean映射工具
[Camunda]( https:// github.com/camunda/camu nda-bpm-platform ):更现代化的BPM工具
[gRP]( https:// github.com/grpc/grpc-ja va ):gRPC Java实现
[gRPC-Boot-Starter]( https:// github.com/LogNet/grpc- spring-boot-starter ):个人(非官方)开发的gRPC Spring Boot Starter
[Ebean]( https:// github.com/ebean-orm/eb ean ):比较简单的ORM库
[Coroutines]( https:// github.com/Kotlin/kotli nx.coroutines ):Kotlin协程
[Quasar]( https:// github.com/puniverse/qu asar ):Java协程库
[FXGL]( https:// github.com/AlmasB/FXGL ):JavaFX游戏引擎
[RxJava]( https:// github.com/ReactiveX/Rx Java ):响应式框架
[RSocket]( https:// github.com/rsocket/rsoc ket-java ):RSocket的Java实现
------------------------------------------8/14修改-------------------------------------------------
[Manifold]( https:// github.com/manifold-sys tems/manifold ):一个比较有趣的语法糖库,提供扩展方法、运算符重载、字符串模板、元编程等功能,这是一个编译期插件
[Pulsar]( https:// github.com/apache/pulsa r ):新一代消息处理平台
看到很多回答只是列了一堆项目,但是并没说怎么才能学好。
所以我的回答:
先小篇幅推荐几个开源项目,
再大篇幅说说怎么学习开源项目。
——能学到才是最重要的
推荐开源项目(排名不分先后)
1. Head-First-Design-Patterns
https:// github.com/bethrobson/H ead-First-Design-Patterns
Star: 2.2k
《Head First Design Patterns》书籍的示例代码,与2014年7月发布的书籍对应,你可以载代码并从命令行编译并运行,或者将代码加载到 Eclipse 中的项目中。
2. Mall
https:// github.com/macrozheng/m all
Star: 47k
mall致力于打造一个完整的电商系统,采用现阶段流行技术实现。
mall包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现。
前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。
后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。
3. miaosha
https:// github.com/qiurunze123/ miaosha
Star: 19.3k
miaosha = 秒杀,秒杀系统设计与实现
这个项目是对高并发大流量如何进行秒杀架构,而做的一个系统整理。
一点小建议:如果你完全没接触过 MQ、SpringBoot、Redis、Dubbo、ZK 、Maven、lua等,建议你可以先在网上搜一下每一块知识的快速入门,也可以下载本项目边做边学习。
4. spring-boot-demo
https:// github.com/xkcoding/spr ing-boot-demo
Star: 20.8k
spring boot demo 是一个用来深度学习并实战 spring boot 的项目,目前总共包含65个集成demo,已经完成53个。
这个项目已成功集成 actuator(监控)、admin(可视化监控)、logback(日志)、aopLog(通过AOP记录web请求日志)、统一异常处理(json级别和页面级别)、freemarker(模板引擎)、Mybatis、redis、zookeeper、RabbitMQ、Kafka等。
5. eladmin
https:// github.com/elunez/eladm in
Star: 14.6k
这是一个基于 Spring Boot、Jpa、Spring Security、redis、Vue 的前后端分离的后台管理系统。
项目采用分模块开发方式,权限控制采用 RBAC,支持数据字典与数据权限管理,支持一键生成前后端代码,支持动态路由。
系统功能:用户管理、角色管理、菜单管理、部门管理、岗位管理、SQL监控、定时任务、邮件工具、七牛云存储、支付宝支付、服务监控、运维管理等
6. 99-problems
https:// github.com/shekhargulat i/99-problems
Star: 3.3k
光看名字就能对其功能了解一二,它的作用是帮助大家磨练逻辑编程中的具体技能。大家可以选择利用Java 8、Scala 或者 Haskell 进行问题解决,并最终找到最精致的解决办法。
如果大家喜爱解题,其中还提供多种不同层级的难度供各位选择。另外,如果大家将全部 99 道难题解决掉,则可进一步冲击Java Deathmatch。如果大家被难住了,请点击此处查看难题——但请注意,认真思考之后再参阅比较好。
我就推荐这几个吧,不罗列了,太占篇幅,更多的可以看其他回答。
然后是重点来了,怎么学开源项目、开源组件
以我曾经深入研究过的 druid (阿里的开源数据库连接池)为例子,说说我自己开源项目的高效学习方法。
druid地址如下:
https:// github.com/alibaba/drui d
对我而言,学好的关键就在于问自己七个问题。
问题1. 组件解决了什么问题
问这个问题的目的是明确组件的问题域,任何组件的出现都是为了解决某类问题的。
druid 要解决的问题本质其实是如何降低应用和中间件交互所消耗的时间成本。
知道了 druid 要解决的问题,我们就等于知道了它的核心主题。druid 的主要技术思路,全部都是围绕着这个核心主题来实现的。
比如,druid 本身的 LRU 策略、对一些关键对象的缓存、竞争资源的高效率利用……都是围绕着这个核心问题来设计和落地的。
问题2. 组件有什么优点
确认了组件需要解决的问题,只是第一步。一套开源组件,往往项目都比较庞大。所以,就得想个办法分而克之,分出各个具体的知识点去学习。
而这些知识点,往往和官方文档宣传的组件优点可以对上。
比如,druid 的官方文档是这么说的:
从上面这幅图,就可以看出来,druid 有如下几个特点: 1. 能被监控 2. 容易扩展 3. 性能优秀 4. 稳定性好 5. 安全 6. 运行期问题容易排查
这些就是我们要去学习的各个知识点。
问题3. 组件的主干和分支都是哪些
知道了组件的优点,就等同于知道了需要学习的知识点。可是,知识点如果多而杂,就需要确认好哪些学哪些不学?哪些先学哪些后学?
那么,组件的主干和分支就需要分解出来,以便定出学习计划。而划分出主干和分支,就需要综合我们前面说的组件要解决的问题。
通过前面的学习,我们知道 druid 解决的是降低中间件的时间成本,也知道了它的特点:
- 能被监控
- 容易扩展
- 性能优秀
- 稳定性好
- 安全
- 运行期问题容易排查
此时,我们的学习计划就是:先学习 druid 是如何实现高性能的;高性能后,如果我们研究 druid 是为了后续在工作中应用,那么,能被监控这个特点就是下一个要学习的知识点。
所以,这一问,是为了拟定学习计划而问。
问题4. 组件的这些优点是如何实现的
在上个问题之后,我们就可以分步骤的进行学习了。学的怎么样,就需要通过这个问题,来考察自己是否真的学懂了这些知识点。
回到 druid 上,让人满意的答案就是,我们能用自己的话去总结出每个知识点的技术实现。比如:
问:druid 的监控是如何实现的?
答:druid 通过自己实现 JDBC API 自身提供的 PooledConnection、Connection、Statement、ResultSet接口,获得了可以在这些接口的关键方法中植入统计的能力。统计的数据会定期采样后存储在某些命名叫做 xxxStat 的对象里,供后面展示使用。
问:druid 是如何实现扩展的?
答:能扩展的实现方式是第三方实现 druid 提供的一个 Filter 接口后,再被配置到 druid 的配置文件里。这样就会在 DruidDataSource 初始化的时候,去读取并初始化这些实现了 Filter 接口的实例。初始化后的 Filter 会在后面 druid 从创建数据库连接到执行 SQL 语句再到释放连接这一系列步骤后,被不断的链式执行。
就这样,分知识点回答出让自己满意的答案,就等同于考核了自己对每个知识点学习的质量,如果回答不满意,就再去查漏补缺即可。
问题5. 组件的系统设计思路是什么
我们学习了各个零散的知识点之后并不够,因为学习一套开源组件,原理是基础,系统设计则是骨架。
明白了技术点,只是对当编码高手有用,但是当你自己设计组件的时候,你的底气在哪里呢?答案就在这些你看过的开源组件的系统设计思路上。
所以,把知识点融合起来形成一个整体,再去推断出系统的设计思路,对我们成为一名优秀的架构师,是有非常大的帮助的。
比如,通过各个知识点的深入学习,融会贯通后,我认为 druid 的设计思路如下:
如果以后遇到为公司底层构造一套池化中间件对象的需求时,这种设计思路自然就成了我设计的重要模板之一。
问题6. 组件的缺点是什么
为什么会问组件的缺点?因为在我如此了解了一套组件之后,却还是免不了误用和踩坑,这其中最严重的就是,生产环境在组件出现问题之后,我们却没有紧急预案。
这种现象的原因就是没有去深入思考过一套技术的利弊。问组件的缺点,就会迫使我们去深入思考利弊,从而在以后不管是应用组件,又或者是去根据学习到的知识自己实践,都能成竹在胸,从容以对。
回到 druid 身上,当我们去读它源码的时候,思考一下:
durid 的这些实现真的就是完美的吗?
那肯定不是, 比如:
-
druid 的采样功能很多时候我们并不需要,但是由于 druid 的实现是写死在实现的关键代码里的,所以无法自由的对其进行插拔。这时候,就要注意,采样可能造成的内存占用问题。
- druid 是对 JDBC API 做了层层封装的,在这些封装中 druid 又添加了很多自己的实现。但是,这些实现很难避免bug,然而由于有这些封装,就会导致 Bug 很难查,又或者很难自己改。这时候,就需要在测试环境,把 druid 的日志级别调成 DEBUG 级别,然后仔细观察日志,看看是否有什么不可知的风险。
所以,这一问,是为了深度思考,让我们在任何新技术的学习和实战时,都能成为最稳定的那个仔。
不管以后我们模仿还是应用 druid,就能提前预测到风险,从而重点监控,提前准备预案。
问题7. 和同类别的组件之间有什么区别
当学习完了组件,知道了组件的优缺点,理解了组件的运行原理,明白了组件的设计思路之后,一切就完整了吗?
对不起,还不够。
因为我们还缺乏一种东西,就是学习的拓展,即学习的广度。
学习组件,我们除了知道它要解决的问题域外,还需要知道它在同类组件中的地位。
为什么?因为以后我们去任何一个稍微成规模的公司后,需要面临一个问题,内部的竞争。
比如,我们写了一套消息治理中间件。如果想提升自己的技术话语权,就需要在全公司,和同类产品竞争。竞争胜出了,自己的职业生涯就有了巨大发展的可能。
回到 druid 上,在SpringBoot2.0时代,druid 出现了巨大的竞争对手——HiKariCP。
而 HiKariCP 之所以能胜出,是因为它排除了 druid 使用的公平锁,使得性能提升了大约 70% 。
通过 druid 和 HiKariCP 的比较和学习,我们就能更加深入的理解高并发,能更有效率的去压榨出系统的性能。
通过 druid 和 HiKariCP 作者之间的互相较量,我们还能明白如何去更好的对比竞品,去展现最为关键的数据指标,一举赢得胜利。
以上列举的七个问题,是我为了解决高效高质研究开源组件,得到的最佳实践。
总结一下:
- 先通过问组件解决了什么问题,去确定自己的学习目的和思考边界。
- 再问组件有什么优点,以及主干和分支是哪些,去拟定出学习计划。
- 再后,通过问组件的优点是如何实现的,去考察自己的学习质量。
- 然后,通过问组件的系统设计思路是什么,让自己讲学到的各种独立的知识融汇贯通,打造成体系。
- 最后,通过问组件的缺点是什么以及和竞品的区别去迫使自己在学习之外,再行深度思考和广度思考,对学习进行查漏补缺以及进一步提升学习质量,打造出更为突出的知识体系。
看完如果觉得有收获,请随手点个赞。
最后,再给大家分享一些我整理的技术资料,都是非常经典的资料,有需要的自取。资料的介绍和领取方式如下: