《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 苏三说技术 「苏三说技术」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

前言

最近趁着国庆节放假休息,特地整理了一下,阿里巴巴开源的10款神级项目。

这些开源项目中的绝大多数,我都在实际工作中用过,或者有同事用过。确实挺不错,挺有价值的,现在推荐给大家。

1. Druid

Druid自称是Java语言中最好的数据库连接池,它能够提供强大的监控和扩展功能。监控后台如下图所示:

Druid的主要优点如下:

  • 它能监控数据库访问性能。
  • 它提供了WallFilter,它是基于SQL语义分析来实现防御SQL注入攻击的。
  • 它提供了多种监测连接泄漏的手段。
  • 它提供了数据库密码加密的功能。
  • 它能打印SQL执行日志。

github地址: https://github.com/alibaba/druid

maven中央仓库: https://mvnrepository.com/artifact/com.alibaba/druid

配置maven依赖:

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>

2. fastjson

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

fastjson的主要优点如下:

  • 速度快,fastjson相对其他JSON库的特点是快,从2011年fastjson发布1.1.x版本之后,其性能从未被其他Java实现的JSON库超越。
  • 使用广泛,fastjson在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。
  • 使用简单,fastjson的API十分简洁。
//序列化
String text = JSON.toJSONString(obj);
//反序列化
VO vo = JSON.parseObject("{...}", VO.class);
  • 功能完备,支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。

github地址: https://github.com/alibaba/fastjson

maven中央仓库: https://mvnrepository.com/artifact/com.alibaba/fastjson

配置maven依赖:

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>

3. Dubbo

Apache Dubbo 是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力。这意味着,使用 Dubbo 开发的微服务,将具备相互之间的远程发现与通信能力, 同时利用 Dubbo 提供的丰富服务治理能力,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。

同时 Dubbo 是高度可扩展的,用户几乎可以在任意功能点去定制自己的实现,以改变框架的默认行为来满足自己的业务需求。它目前已交给Apache管理和维护。

架构图如下:

Dubbo的主要优点如下:

  • 基于透明接口的RPC
  • 智能负载均衡
  • 自动服务注册和发现
  • 高扩展性
  • 运行时流量路由
  • 可视化服务治理
  • 云原生友好

github地址: https://github.com/apache/dubbo

maven中央仓库: https://mvnrepository.com/artifact/com.alibaba/dubbo/

配置maven依赖:

<properties>
<dubbo.version>3.0.3</dubbo.version>
</properties>

<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
</dependency>
</dependencies>

4. Rocketmq

Apache RocketMQ是一个分布式消息和流媒体平台,具有低延迟、高性能和可靠性、万亿级容量和灵活的可扩展性。

它提供了多种功能:

  • 消息传递模式,包括发布/订阅、请求/回复和流媒体
  • 金融级交易消息
  • 基于DLedger的内置容错和高可用配置选项
  • 多种跨语言客户端,如Java、C/C++、Python、Go
  • 可插拔传输协议,例如 TCP、SSL、AIO
  • 内置消息追踪能力,也支持opentracing
  • 多功能大数据和流媒体生态系统集成
  • 按时间或偏移量的消息追溯
  • 可靠的 FIFO 和同一队列中的严格有序消息传递
  • 高效的拉推式消费模式
  • 单个队列百万级消息累积能力
  • 多种消息传递协议,如 JMS 和 OpenMessaging
  • 灵活的分布式横向扩展部署架构
  • 闪电般的批量消息交换系统
  • 各种消息过滤机制,例如 SQL 和 Tag
  • 用于隔离测试和云隔离集群的 Docker 镜像
  • 用于配置、指标和监控的功能丰富的管理仪表板
  • 认证和授权
  • 免费的开源连接器,用于源和接收器

rocketmq后台管理界面:

github地址: https://github.com/apache/rocketmq

maven中央仓库: https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-spring-boot-starter

rocketmq包含:服务端和客户端,在我们的项目中主要关注客户端的代码即可。

配置maven依赖:

<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.3.0</version>
</dependency>

4. Arthas

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到JVM的实时运行状态?
  • 怎么快速定位应用的热点,生成火焰图?
  • 怎样直接从JVM内查找某个类的实例?

分析代码消耗时间:

Arthas支持JDK 6+,能够运行在多种操作系统上,比如:Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

github地址: https://alibaba.github.io/arthas/

maven中央仓库: https://mvnrepository.com/artifact/com.taobao.arthas/arthas-spring-boot-starter

在目标机器执行如下命令即可启动arthas:

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

5. Nacos

Nacos是一个易于使用的平台,专为动态服务发现和配置以及服务管理而设计。它可以帮助您轻松构建云原生应用程序和微服务平台。

服务是Nacos的一等公民。Nacos 支持几乎所有类型的服务,例如Dubbo/gRPC 服务、Spring Cloud RESTFul 服务或Kubernetes 服务。

Nacos 提供了四大功能。

  • 服务发现和服务健康检查。Nacos 使服务通过 DNS 或 HTTP 接口注册自己和发现其他服务变得简单。Nacos 还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。
  • 动态配置管理。动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos 无需在更新配置时重新部署应用程序和服务,这使得配置更改更加高效和敏捷。
  • 动态 DNS 服务。Nacos 支持加权路由,让您更容易在数据中心内的生产环境中实现中层负载均衡、灵活的路由策略、流量控制和简单的 DNS 解析服务。它可以帮助您轻松实现基于 DNS 的服务发现,并防止应用程序耦合到特定于供应商的服务发现 API。
  • 服务和元数据管理。Nacos 提供了一个易于使用的服务仪表板,帮助您管理您的服务元数据、配置、kubernetes DNS、服务健康和指标统计。

Nacos 地图:

Nacos 生态图:

github地址: https://github.com/alibaba/nacos

maven中央仓库: https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery

6. easyexcel

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。

easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便。

64M内存1分钟内读取75M(46W行25列)的Excel

github地址: https://github.com/alibaba/easyexcel

maven中央仓库: https://mvnrepository.com/artifact/com.alibaba/easyexcel

配置maven依赖:

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>

7. Sentinel

随着分布式系统变得越来越流行,服务之间的可靠性变得比以往任何时候都更加重要。

Sentinel以“流量”为切入点,在流量控制、 流量整形、熔断、系统自适应保护等多个领域开展工作,保障微服务的可靠性和弹性。

Sentinel具有以下特点:

  • 丰富的适用场景:Sentinel在阿里巴巴得到了广泛的应用,几乎覆盖了近10年双11(11.11)购物节的所有核心场景,比如需要限制突发流量的“秒杀”满足系统容量、消息削峰填谷、下游不可靠业务断路、集群流量控制等。
  • 实时监控:Sentinel 还提供实时监控能力。可以实时查看单台机器的运行时信息,以及500个节点以下集群的运行时信息汇总。
  • 广泛的开源生态系统:Sentinel 提供与 Spring Cloud、Dubbo 和 gRPC 等常用框架和库的开箱即用集成。您只需将适配器依赖项添加到您的服务即可轻松使用 Sentinel。
  • 多语言支持:Sentinel 为 Java、Go和C++提供了本机支持。
  • 丰富的SPI扩展:Sentinel提供简单易用的SPI扩展接口,可以让您快速自定义逻辑,例如自定义规则管理、适配数据源等。

功能概述:

生态系统景观:

github地址: https://github.com/alibaba/Sentinel

maven中央仓库: https://mvnrepository.com/artifact/com.alibaba.csp/sentinel-core

配置maven依赖:

<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.2</version>
</dependency>

8. otter

阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了otter这样一个产品。

otter第一版本可追溯到04~05年,此次外部开源的版本为第4版,开发时间从2011年7月份一直持续到现在,目前阿里巴巴B2B内部的本地/异地机房的同步需求基本全上了otte4。

目前同步规模:

  • 同步数据量6亿
  • 文件同步1.5TB(2000w张图片)
  • 涉及200+个数据库实例之间的同步
  • 80+台机器的集群规模

otter能解决什么?

  • 异构库同步。mysql -> mysql/oracle. (目前开源版本只支持mysql增量,目标库可以是mysql或者oracle,取决于canal的功能)

  • 单机房同步 (数据库之间RTT < 1ms)

    a. 数据库版本升级

    b. 数据表迁移

    c. 异步二级索引

  • 异地机房同步 (比如阿里巴巴国际站就是杭州和美国机房的数据库同步,RTT > 200ms,亮点)

    a. 机房容灾

  • 双向同步

    a. 避免回环算法 (通用的解决方案,支持大部分关系型数据库)

    b. 数据一致性算法 (保证双A机房模式下,数据保证最终一致性,亮点)

  • 文件同步站点镜像 (进行数据复制的同时,复制关联的图片,比如复制产品数据,同时复制产品图片).

工作原理图:

单机房复制示意图:

异地机房复制示意图:

github地址: https://github.com/alibaba/otter

maven中央仓库: https://mvnrepository.com/artifact/com.alibaba.otter/canal.client

9. P3C

P3C插件呈现了阿里巴巴 Java 编码指南,它整合了阿里巴巴集团技术团队多年来的最佳编程实践。由于我们鼓励重用和更好地理解彼此的程序,因此大量 Java 编程团队对跨项目的代码质量提出了苛刻的要求。

阿里巴巴过去见过很多编程问题。例如,有缺陷的数据库表结构和索引设计可能会导致软件架构缺陷和性能风险。另一个例子是混乱的代码结构难以维护。此外,未经身份验证的易受攻击的代码容易受到黑客的攻击。为了解决这些问题,我们为阿里巴巴的Java开发人员编写了这份文档。

更多信息请参考阿里巴巴Java编码指南:

  • 中文版:阿里巴巴Java开发手册
  • 英文版:Alibaba Java Coding Guidelines

该项目由3部分组成:

  • PMD 实现
  • IntelliJ IDEA 插件
  • Eclipse 插件

四十九条规则是基于PMD实现的,更多详细信息请参考P3C-PMD文档。IDE 插件(IDEA 和 Eclipse)中实现的四个规则如下:

  • [Mandatory]禁止使用已弃用的类或方法。注意:例如,应该使用 decode(String source, String encode) 而不是不推荐使用的方法 decode(String encodeStr)。一旦接口被弃用,接口提供者就有义务提供一个新的接口。同时,客户端程序员有义务检查它的新实现是什么。
  • [Mandatory]来自接口或抽象类的重写方法必须用 @Override 注释标记。反例:对于 getObject() 和 get0bject(),第一个是字母“O”,第二个是数字“0”。为了准确判断覆盖是否成功,需要一个@Override注解。同时,一旦抽象类中的方法签名发生变化,实现类将立即报告编译时错误。
  • [Mandatory] 静态字段或方法应直接通过其类名而不是其对应的对象名来引用。
  • [Mandatory] hashCode 和 equals 的用法应该遵循:
  1. 如果 equals 被覆盖,则覆盖 hashCode。
  2. 这两个方法必须为 Set 重写,因为它们用于确保不会在 Set 中插入重复的对象。
  3. 如果使用自定义对象作为 Map 的键,则必须覆盖这两个方法。注意:String 可以用作 Map 的键,因为这两个方法已经被重写。

使用p3c插件的效果:

最新版阿里巴巴Java开发手册下载地址:https://github.com/alibaba/p3c/blob/master/Java开发手册(嵩山版).pdf

github地址:https://github.com/alibaba/p3c/tree/master/idea-plugin

10. Spring Cloud Alibaba

Spring Cloud Alibaba 为分布式应用开发提供一站式解决方案。它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用 Spring Cloud 开发应用程序。

使用Spring Cloud Alibaba,您只需添加一些注解和少量配置,即可将Spring Cloud应用连接到阿里巴巴的分布式解决方案,并通过阿里巴巴中间件构建分布式应用系统。

主要功能如下:

  • 流量控制和服务降级:默认支持 HTTP 服务的流量控制。您还可以使用注释自定义流量控制和服务降级规则。规则可以动态更改。
  • 服务注册和发现:可以注册服务,客户端可以使用 Spring 管理的 bean,自动集成 Ribbon 来发现实例。
  • 分布式配置:支持分布式系统中的外化配置,配置变化时自动刷新。
  • 事件驱动:支持构建与共享消息系统连接的高度可扩展的事件驱动微服务。
  • 分布式事务:支持高性能、易用的分布式事务解决方案。
  • 阿里云对象存储:海量、安全、低成本、高可靠的云存储服务。支持随时随地在任何应用程序中存储和访问任何类型的数据。
  • 阿里云SchedulerX:精准、高可靠、高可用的定时作业调度服务,响应时间秒级。
  • 阿里云短信:覆盖全球的短信服务,阿里短信提供便捷、高效、智能的通讯能力,帮助企业快速联系客户。

主要包含如下组件:

  • Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
  • Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
  • RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
  • Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
  • Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
  • Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
  • Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

github地址: https://github.com/alibaba/spring-cloud-alibaba

配置maven依赖:

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
文章目录
  1. 1. 前言
  2. 2. 1. Druid
  3. 3. 2. fastjson
  4. 4. 3. Dubbo
  5. 5. 4. Rocketmq
  6. 6. 4. Arthas
  7. 7. 5. Nacos
  8. 8. 6. easyexcel
  9. 9. 7. Sentinel
  10. 10. 8. otter
  11. 11. 9. P3C
  12. 12. 10. Spring Cloud Alibaba