周末愉快啊!小伙伴们!
最近,我简单完善了一下之前总结的 Java 最常用的一些框架和开源项目。
发这篇文章的起因是看到知乎有个类似的问题,然后感觉高赞的回答不是很让人满意,获得这么高的点赞也是让我很迷。
![4ca43ce459f78bb582b5d2c242b8bacb.png](https://i-blog.csdnimg.cn/blog_migrate/302884aba5dde46a1cfd2a4fa5521dca.png)
目前,我已经将下面的内容同步到 Github ,阅读原文即可直达:https://github.com/Snailclimb/awesome-java (整理收集不易,花了不少心思,觉得不错就给个 star 吧!ღ( ´・ᴗ・` )比心)。
欢迎补充完善,一起打造一个最棒的 Java 开源项目集合!
系统设计
微服务/分布式
基础框架
- Spring Boot [1] :Spring Boot 可以轻松创建独立的生产级基于 Spring 的应用程序,内置 web 服务器让你可以像运行普通 Java 程序一样运行项目。另外,大部分 Spring Boot 项目只需要少量的配置即可,这有别于 Spring 的重配置。
- spring-cloud-alibaba[2] : Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
Spring Cloud Alibaba
- Sentinel[3] :A lightweight powerful flow control component enabling reliability and monitoring for microservices. (轻量级的流量控制、熔断降级 Java 库)。
- Dubbo[4] :Apache Dubbo 是一个基于 Java 的高性能开源 RPC 框架。
- Nacos[5] :Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 可以作为 Dubbo 的注册中心来使用。
- Seata[6] : Seata 是一种易于使用,高性能,基于 Java 的开源分布式事务解决方案。
- RocketMQ[7] :阿里巴巴开源的一款高性能、高吞吐量的分布式消息中间件。
API 网关
微服务下一个系统被拆分为多个服务,但是像 安全认证,流量控制,日志,监控等功能是每个服务都需要的,没有网关的话,我们就需要在每个服务中单独实现,这使得我们做了很多重复的事情并且没有一个全局的视图来统一管理这些功能。
综上:一般情况下,网关一般都会提供请求转发、安全认证(身份/权限认证)、流量控制、负载均衡、容灾、日志、监控这些功能。
上面介绍了这么多功能实际上网关主要做了一件事情:请求过滤 。权限校验、流量控制这些都可以通过过滤器实现,请求转也是通过过滤器实现的。
- Kong[8] :Kong 是一个云原生、快速的、可伸缩的分布式微服务抽象层(也称为 API 网关、API 中间件或在某些情况下称为服务网格)。2015 年作为开源项目发布,其核心价值是高性能和可扩展性。
- Soul[9] :高性能、基于 webflux 的反应式 Java API 网关
- Spring Cloud Gateway[10] : 基于 Spring Framework 5.x 和 Spring Boot 2.x 构建的高性能网关。
- Zuul[11] : Zuul 是一个 L7 应用程序网关,它提供了动态路由,监视,弹性,安全性等功能。
配置中心
微服务下,业务的发展一般会导致服务数量的增加,进而导致程序配置(服务地址、数据库参数等等)增多。
传统的配置文件的方式已经无法满足当前需求,主要有两点原因:一是安全性得不到保障(配置放在代码库中容易泄露);二是时效性不行 (修改配置需要重启服务才能生效)。
除了 Apollo 和 Spring Cloud Config 之外,Spring Cloud Alibaba 中的 Nacos 组件也可以提高配置功能。
- Apollo[12] :Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
- Spring Cloud Config[13] :Spring Cloud Config 是 Spring Cloud 家族中最早的配置中心,虽然后来又发布了 Consul 可以代替配置中心功能,但是 Config 依然适用于 Spring Cloud 项目,通过简单的配置即可实现功能。
- Consul[14] :Consul 是 HashiCorp 公司推出的开源软件,提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之 Consul 提供了一种完整的服务网格解决方案。
相关阅读:微服务架构中配置中心的选择:Apollo VS Spring Cloud Config[15]
链路追踪
目前分布式链路追踪系统基本都是根据谷歌的《Dapper 大规模分布式系统的跟踪系统》这篇论文发展而来,主流的有 Pinpoint,Skywalking ,CAT(当然也有其他的例如 Zipkin,Jaeger 等产品,不过总体来说不如前面选取的 3 个完成度高)等。
- Skywalking[16] : 针对分布式系统的应用性能监控,尤其是针对微服务、云原生和面向容器的分布式系统架构。
- Zipkin[17] :Zipkin 是一个分布式跟踪系统。它有助于收集解决服务体系结构中的延迟问题所需的时序数据。功能包括该数据的收集和查找。
- CAT[18] :CAT 作为服务端项目基础组件,提供了 Java, C/C++, Node.js, Python, Go 等多语言客户端,已经在美团点评的基础架构中间件框架(MVC 框架,RPC 框架,数据库框架,缓存框架等,消息队列,配置系统等)深度集成,为美团点评各业务线提供系统丰富的性能指标、健康状况、实时告警等。
相关阅读:Skywalking 官网对于主流开源链路追踪系统的对比[19]
消息中间件
我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。
使用消息队列主要有两点好处:一是通过异步处理提高系统性能(削峰、减少响应所需时间);二是降低系统耦合性。
- RocketMQ[20] :阿里巴巴开源的一款高性能、高吞吐量的分布式消息中间件。
- Kafaka[21]: Kafka 是一种分布式的,基于发布 / 订阅的消息系统。关于它的入门可以查看:Kafka 入门看这一篇就够了[22]
- RabbitMQ[23] :由 erlang 开发的基于 AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列。
任务调度/定时任务
任务调度/定时任务在系统中应用太广泛了。为什么需要任务调度/定时任务呢?
- 时间驱动处理场景:整点发送优惠券,每天更新收益,每天刷新标签数据和人群数据。
- 批量处理数据:按月批量统计报表数据,批量更新短信状态,实时性要求不高。
- 异步执行解耦:活动状态刷新,异步执行离线查询,与内部逻辑解耦。
这类框架也比较多,下面就带大家看看!
- Quartz[24] :一个很火的开源任务调度框架,Java 定时任务领域的老大哥或者说参考标准, 很多其他任务调度框架都是基于
quartz
开发的,比如当当网的elastic-job
就是基于quartz
二次开发之后的分布式调度解决方案 - XXL-JOB[25] :XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
- Elastic-Job[26] :Elastic-Job 是当当网开源的一个基于 Quartz 和 Zookeeper 的分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成,一般我们只要使用 Elastic-Job-Lite 就好。
- EasyScheduler[27] ( 更名为 DolphinScheduler,已经成为 Apache 孵化器项目):Easy Scheduler 是一个分布式工作流任务调度系统,主要解决“复杂任务依赖但无法直接监控任务健康状态”的问题。Easy Scheduler 以 DAG 方式组装任务,可以实时监控任务的运行状态。同时,它支持重试,重新运行等操作... 。
- PowerJob[28] :新一代分布式任务调度与计算框架,支持 CRON、API、固定频率、固定延迟等调度策略,提供工作流来编排任务解决依赖关系,使用简单,功能强大,文档齐全,欢迎各位接入使用!http://www.powerjob.tech/ 。
相关阅读:Spring Job、Quartz、XXL-Job 对比+全解析
搜索引擎
数据库对于全文检索不太友好,这种事情最好交给搜索引擎来做,比如电商系统的商品搜索往往都是基于搜索引擎来做的。
Elasticsearch 在搜索引擎数据库领域排名绝对第一,内核基于 Lucene 构建,支持全文搜索是职责所在,提供了丰富友好的 API。
Elasticsearch 除了做搜索引擎,还常常被拿来做日志检索(著名的 ELK 三件套,讲的就是 Elasticsearch,Logstash,Kibana,专门针对日志采集、存储、查询设计的产品组合,相关阅读:什么是 ELK Stack?[29])。
Solr 比较老牌了,但是,目前生态以及社区活跃度都比不上 Elasticsearch。
- Elasticsearch[30]:开源,分布式,RESTful 搜索引擎。
- Solr[31] : Solr(读作“solar”)是 Apache Lucene 项目的开源企业搜索平台。
数据库
连接池
- Druid[32] : 阿里巴巴数据库事业部出品,为监控而生的数据库连接池。
- HikariCP[33] : 一个可靠的高性能 JDBC 连接池。Springboot 2.0 选择 HikariCP 作为默认数据库连接池。
数据库中间件
数据库的数据量大了之后就要考虑读写分离、分库分表,但是一定要尽量能避免分库分表就避免,因为会带来很多其他问题。
- ShardingSphere[34] :ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar(计划中)这 3 款相互独立的产品组成。他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。中文文档:https://shardingsphere.apache.org/document/current/cn/overview/[35] 。
- MyCat[36] : MyCat 是数据库分库分表的中间件,MyCat 使用最多的两个功能是:读写分离和分库分表。MyCat 是一些社区爱好者在阿里 Cobar 的基础上进行二次开发,解决了 Cobar 当时存 在的一些问题,并且加入了许多新的功能在其中。
相关阅读:数据库中间件详解(精品长文)[37]
Redis
- Redisson[38] :Redisson[39]是架设在Redis[40]基础上的一个 Java 驻内存数据网格(In-Memory Data Grid)。支持超过 30 个对象和服务:Set, multiap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Publish / Subscribe, Bloom filter, Spring Cache, Tomcat, Scheduler, JCache API, Hibernate, RPC。Redisson 项目介绍[41]
框架
- MyBatis-Plus[42] : MyBatis-Plus[43](简称 MP)是一个 MyBatis[44] 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
- DataX[45] :DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能。
- canal[46] : canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
- dynamic-datasource-spring-boot-starter[47] :dynamic-datasource-spring-boot-starter 是一个基于 springboot 的快速集成多数据源的启动器。如果说你有配置多数据源、读写分离等需求的话,可以了解一下这个项目。
大数据
- Spark[48] :Spark 是用于大规模数据处理的统一分析引擎。
- Flink[49] :Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。
- HBase[50]:HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。
- Flume[51] :Apache Flume 是一个分布式的、可靠的、可用的,从多种不同的源收集、聚集、移动大量日志数据到集中数据存储的系统。
- Storm[52] : 一个分布式,高容错的实时计算系统。
日志系统
实际项目中使用 ELK 三件套(Elasticsearch,Logstash,Kibana)来做日志系统的非常多。
另外,像 Prometheus + Grafana 也是比较主流的,相关阅读:Prometheus + Grafana 监控配置指北:打造专属监控系统[53] 。
- loki[54] :
Loki
是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。项目受 Prometheus 启发,官方的介绍就是:Like Prometheus, but for logs.
,类似于 Prometheus 的日志系统。相关阅读:
- Loki 日志系统[55]
- 使用 Loki 进行日志监控和报警[56]
开放平台(如微信)
- WxJava[57] : WxJava (微信开发 Java SDK),支持包括微信支付、开放平台、小程序、企业微信/企业号和公众号等的后端开发。
测试
为了能让我们编写的系统更加健壮,必要的测试(UI 测试、单元测试...)是必须的。
- JUnit[58] : Java 测试框架。
- Mockito[59] :Mockito 是一个模拟测试框架,可以让你用优雅,简洁的接口写出漂亮的单元测试。(对那些不容易构建的对象用一个虚拟对象来代替,使其在调试期间用来作为真实对象的替代品)
- PowerMock[60] :编写单元测试仅靠 Mockito 是不够。因为 Mockito 无法 mock 私有方法、final 方法及静态方法等。PowerMock 这个 framework,主要是为了扩展其他 mock 框架,如 Mockito、EasyMock。它使用一个自定义的类加载器,纂改字节码,突破 Mockito 无法 mock 静态方法、构造方法、final 类、final 方法以及私有方法的限制。
- WireMock[61] :模拟 HTTP 服务的工具(Mock your APIs)。
相关阅读:
- The Practical Test Pyramid- Martin Fowler[62] (很赞的一篇文章,不过是英文的)
- 浅谈测试之 PowerMock[63]
机器学习
- Deeplearning4j[64] :Deeplearning4j 是第一个为 Java 和 Scala 编写的商业级,开源,分布式深度学习库。
- Smile[65] :基于 Java 和 Scala 的机器学习库。
相关阅读:
- Java 能用于机器学习和数据科学吗?-InfoQ[66]
- Deeplearning4j 入门 - IBM Developer[67]
Devpos
CI
- Jenkins[68] : Jenkins 是领先的开源自动化服务器。它使用 Java 构建,提供了 1600 多个插件来支持几乎任何东西的自动化,从而使人类实际上可以将时间花在做机器无法做到的事情上。
参考资料
[1]spring-boot: https://github.com/spring-projects/spring-boot
[2]spring-cloud-alibaba: https://github.com/alibaba/spring-cloud-alibaba
[3]Sentinel: https://github.com/alibaba/Sentinel
[4]dubbo: https://github.com/apache/dubbo
[5]nacos: https://github.com/alibaba/nacos
[6]seata: https://github.com/seata/seata
[7]RocketMQ: https://github.com/apache/rocketmq
[8]kong: https://github.com/Kong/kong
[9]soul: https://github.com/Dromara/soul
[10]Spring Cloud Gateway: https://github.com/spring-cloud/spring-cloud-gateway
[11]Zuul: https://github.com/Netflix/zuul
[12]apollo: https://github.com/ctripcorp/apollo
[13]Spring Cloud Config: https://github.com/spring-cloud/spring-cloud-config
[14]Consul: https://github.com/hashicorp/consul
[15]微服务架构中配置中心的选择:Apollo VS Spring Cloud Config: https://www.jianshu.com/p/d78fa8412cbf
[16]skywalking: https://github.com/apache/skywalking
[17]zipkin: https://github.com/openzipkin/zipkin
[18]cat: https://github.com/dianping/cat
[19]Skywalking 官网对于主流开源链路追踪系统的对比: https://skywalking.apache.org/zh/blog/2019-03-29-introduction-of-skywalking-and-simple-practice.html
[20]RocketMQ: https://github.com/apache/rocketmq
[21]Kafaka: https://github.com/apache/kafka
[22]Kafka入门看这一篇就够了: https://github.com/Snailclimb/JavaGuide/blob/master/docs/system-design/data-communication/Kafka入门看这一篇就够了.md
[23]RabbitMQ: https://github.com/rabbitmq
[24]Quartz: https://github.com/quartz-scheduler/quartz
[25]XXL-JOB: https://github.com/xuxueli/xxl-job
[26]Elastic-Job: http://elasticjob.io/index_zh.html
[27]EasyScheduler: https://github.com/analysys/EasyScheduler
[28]PowerJob: https://gitee.com/KFCFans/PowerJob
[29]什么是 ELK Stack?: https://www.elastic.co/cn/what-is/elk-stack
[30]elasticsearch: https://github.com/elastic/elasticsearch
[31]Solr: https://lucene.apache.org/solr/
[32]Druid: https://github.com/alibaba/druid
[33]HikariCP: https://github.com/brettwooldridge/HikariCP
[34]ShardingSphere: https://github.com/apache/shardingsphere
[35]https://shardingsphere.apache.org/document/current/cn/overview/: https://shardingsphere.apache.org/document/current/cn/overview/
[36]MyCat: https://github.com/MyCatApache/MyCat2
[37]数据库中间件详解(精品长文): https://zhuanlan.zhihu.com/p/87144535
[38]redisson: https://github.com/redisson/redisson
[39]Redisson: https://redisson.org/
[40]Redis: http://redis.cn/
[41]Redisson项目介绍: https://github.com/redisson/redisson/wiki/Redisson%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D
[42]MyBatis-Plus: https://github.com/baomidou/mybatis-plus
[43]MyBatis-Plus: https://github.com/baomidou/mybatis-plus
[44]MyBatis: http://www.mybatis.org/mybatis-3/
[45]DataX: https://github.com/alibaba/DataX
[46]canal: https://github.com/alibaba/canal
[47]dynamic-datasource-spring-boot-starter: https://github.com/baomidou/dynamic-datasource-spring-boot-starter]
[48]Spark: https://github.com/apache/spark
[49]flink: https://github.com/apache/flink
[50]HBase: https://hbase.apache.org/
[51]Flume: https://flume.apache.org/
[52]Storm: https://storm.apache.org/
[53]Prometheus + Grafana 监控配置指北:打造专属监控系统: https://counter2015.com/2020/04/13/grafana-monitor-2/
[54]loki: https://github.com/grafana/loki
[55]Loki 日志系统: https://www.cnblogs.com/xiao987334176/p/13187473.html
[56]使用 Loki 进行日志监控和报警: https://www.qikqiak.com/post/use-loki-monitor-alert/
[57]WxJava: https://github.com/Wechat-Group/WxJava
[58]JUnit: http://junit.org/
[59]Mockito: https://github.com/mockito/mockito
[60]PowerMock: https://github.com/powermock/powermock
[61]WireMock: https://github.com/tomakehurst/wiremock
[62]The Practical Test Pyramid- Martin Fowler: https://martinfowler.com/articles/practical-test-pyramid.html
[63]浅谈测试之 PowerMock: https://juejin.im/post/6844903982058618894
[64]Deeplearning4j: https://github.com/eclipse/deeplearning4j
[65]Smile: https://github.com/haifengl/smile
[66]Java 能用于机器学习和数据科学吗?-InfoQ: https://www.infoq.cn/article/GA9UeYlv8ohBzBso9eph
[67]Deeplearning4j 入门 - IBM Developer: https://developer.ibm.com/zh/technologies/artificial-intelligence/articles/cc-get-started-deeplearning4j/
[68]Jenkins: https://github.com/jenkinsci/jenkins
闲聊
分享一些好消息给大家,一起开心一下,嘿嘿。今天一大早就有读者过来给我报喜了,开心。
低调做人,踏实做事。
学 Java ,准备 Java 面试,那必须首选 JavaGuide!
预报一下!最近会写一个简易版的“Spring Boot”,能够简单处理Get和Post请求并且返回json数据那种。框架会比较轻量,依赖很少,代码也会尽量写直白点,不秀技。
我是Guide哥,Java后端开发,会一点前端知识,喜欢烹饪,自由的少年。一个三观比主角还正的技术人。我们下期再见!