当当架构部总监张亮:玩转Java开源项目

6,116 阅读10分钟

内容来源:2017年5月21日,当当架构部总监张亮在“饿了么技术沙龙-Java专场”进行《玩转Java开源项目》演讲分享。IT大咖说作为独家视频合作方,经主办方和讲者审阅授权发布。
阅读字数:3334 | 7分钟阅读


摘要

开发一个软件,并把源代码发布到github,就是开源么?如何能够开发一个有价值的开源项目、如何能够维持一个健康活跃的社区并让开源项目真正从中受益、如何能够通过它帮助他人和提高自己,这些才是开源更需要关注的方面。我们来看看当当架构部总监是如何从四个方面来玩转Java开源项目。

嘉宾演讲视频地址:t.cn/RSceo7N

Java开源现状


Java是一门历史非常悠久的开发语言,从1995年初见至今,时间的指针已不知不觉的拨动了二十多个年头。请跟我简单回顾一下Java那些抓住历史高光的瞬间,也顺便回忆一下当时那些与Java一起产生共鸣的技术风暴。

Java首次出现在人们的视野中是1995年,它提出了Write once,runanywhere的口号让开发者觉得兴奋。随着JDK 1.0的发布,一些核心概念闪亮登场,它们是JVM,Applet和AWT。Applet和AWT目前虽已退出历史潮流,但当初在网页上展现的冒着热气的咖啡的Applet小程序,确实让人眼前一亮。JVM则沿用至今,基于JVM的跨平台特性对后续的技术产生了深远的影响。

1998年发布的JDK 1.2,首次提出了J2SE、J2EE和J2ME三个系列,分别对应于标准开发,企业级开发和手机开发。J2ME随着手机硬件的更新换代,已逐渐退出历史舞台。而J2SE和J2EE则一直沿用至今。J2EE规范中著名的EJB、JSP、Servlet等既是从那时开始加入并日臻完善的。

2002年发布的JDK 1.4是非常经典的版本,这可能是至今仍然可能在老程序中看到的最老版本。而由于EJB使用起来过于复杂,轻量级的开发框架SpringFramework开始流行。开发者越来越多的抛弃掉笨重的EJB,而转向更为灵活的Spring Framework阵营。而后来出版的由其作者Rod Johnson撰写的《expert one-on-one J2EE Development without EJB》更是成为了不朽的名作,Spring Framework也随之成为Java开发者必须掌握的技术栈。

2006年JDK 1.6发布,从JDK 1.5开始尝试的诸如泛型,元注解等编程语言层面的增强,在JDK 1.6中得到了进一步的完善。同期,参考Google发表的3篇著名的关于GFS、MapReduce和Bigtable学术论文,由Doug Cutting用Java创建并开发的Hadoop面世,它在一定程度上颠覆了传统关系型数据库在数据存储和分析领域的绝对统治,从此大数据成为了技术圈乃至全世界各个领域的热词。

2009年JDK 1.7发布。同时由Google开源的Android趋于成熟,和Apple的IOS形成鼎立之势,共同开启了基于智能手机的移动互联网时代。

随着互联网的发展,信息越来越多,技术的更新迭代也越来越快。最近的一次Java大版本的发布,是2014年的JDK 1.8,它也是目前为止Java的最新版本。而在同一时期出现最多的焦点技术是以Docker为主的容器和如何有效治理容器的微服务。容器方面Java虽然难于建树,但基于Java的Spring Boot、SpringCloud、Zookeeper等优秀的框架以及组件为微服务奠定了坚实的基础。

谈了很久Java历史,那么经历了这么多年的发展,Java必然沉淀了大量极具价值的项目,可供免费使用的开源项目层出不穷。Java门槛越来越高,不仅仅是编程语言层面的问题,也不仅是难于理解的面向对象、设计模式等,而是在于它的技术广度。由于技术栈众多,它几乎很难快速上手,但从另一方面讲,Java生态相对于其他语言更加稳定和成熟,技术组件几乎应有尽有。

Java开源项目类型盘点

基础类:为编程提供便利的基础类库。如:Guava、ApacheCommons等。

框架类:曾被认为Java最重要的部分,早期是业务开发工程师的饭碗。如:SpringFramework、Hibernate、MyBatis、Struts等。

测试类:与其他语言比,Java有较完善的测试体系,它很容易提升测试覆盖率,这得益于广泛的测试类库。如:Junit、TestNG、DbUnit、Mocktio等。

构建类:由于使用Java开发的项目大多规模大,依赖复杂,因此Java构建类工具很完善。如:Ant、Maven等。

中间件:中间件种类很多。比如:Tomcat、Jetty等Web中间件,ActiveMQ、RocketMQ等消息中间件、Dubbo等服务治理中间件等。基础中间件已非常成熟,而分布式中间件仍极少有统一标准。

NoSQL:NoSQL是关系型数据库的有益补充。NoSQL类型主要分为文档数据库、列簇数据库、KV数据库和图数据库。相关产品众多,使用Java开发的也不少,如:Cassandra、Neo4j等。

搜索:全文检索领域中,Lucene是基础类库的佼佼者。而基于Lucene封装的Solr、Elasticsearch等高可用搜索引擎也是很常见的技术。

大数据:Hadoop系列几乎全是用Java开发的。

手机端:刚才提到过的Android系统。

桌面端:虽然使用Java开发桌面系统并非现在的主流,但深入人心的产品依然很多,如:Eclipse。

Java开源不擅长的领域

在容器、缓存和关系型数据库这三个领域,Java的开源项目并不多见,而且当前Java也没有太多机会进驻这些领域。

当今需要的Java开源解决方案

虽然Java已有为数众多的成熟开源项目,但是目前仍稀缺的优秀开源领域主要是分布式、服务化和弹性化这三个方面。

在互联网行业分布式、服务化和弹性化是很重要的非功能需求。每个互联网企业中都有一套足够成熟的系统,但很多系统难于解耦且定制化严重,因此在这方面,成熟的开源产品凤毛麟角。因此,有价值的开源项目应该从这三方面考虑,而且Java比较适合做这些领域的开发。

开发一个开源项目的那些事儿

开源项目的来源

来源主要从四个方面,大公司、创业公司、社区以及个人。

大公司所做的开源产品基本上不与经济收益直接相关。如:Google开源的Kubernetes,Linkedin开源的Kafka等。

创业公司开源的产品一般会与他们的经济利益绑定,大都开源其核心技术,然后针对定制化、咨询以及企业版进行收费服务。如:Docker、Mesosphere的Mesos、Elastic的Elasticsearch等。

完全由社区驱动的开源的产品拥有强大的开源基因,是开源世界的典范。如:Linux、Apache等。

而个人开源的产品,一般是处于孵化阶段。

如何做一个有价值的开源项目

1、以熟悉各种轮子为前提

重复造轮子是巨大的精力浪费,有价值的开源项目应该是现有轮子不能完全覆盖的范围。

2、以解决实际问题为目的

任何技术项目都是以解决实际存在的业务问题为前提的,完全脱离业务的技术其存在价值是存疑的。

3、以系统眼光去规划设计

相比于闭源项目,开源项目的受众更广,影响范围更大,每次升级都带来颠覆性的变更是灾难性的。因此尽量的合理设计系统架构和roadmap是成功的关键。好的系统是设计出来,而非改造出来的。前瞻性的眼光非常重要。

4、以工匠精神去雕琢细节

开放出去的源代码会在一定的范围内引起共鸣。一个值得研读开源项目,其代码必须经过雕琢,让其规范、一致、优雅、易懂,尽量将细节做到极致。通过代码质量给予使用者信心。

打造合理社区

1、灌输开源精神

freeis not free是开源的一句名言。开源的价值不仅仅在于免费,更在于自由。既然已经把源代码开放出去了,那么使用者想怎么改都可以,而不应一味地向开源人索取。因此需要合理对用户进行引导,并让其认同开源精神,最终做到积极反馈社区。

2、关注核心用户

应尽早识别出核心用户,与核心用户共同发展。最好能够抱团形成组织,或作为周边生态加入更大的组织,并利用核心用户的影响力吸引更多的用户。

3、坚持与耐心

成功从来不是一件容易的事,开源也不例外。开源之后要坚持去推广、运营和完善它,并保持足够耐心。相信是金子总会发亮,坚持才能带来最终的收获。

4、文档

文档的重要性甚至优于程序本身。应尽量将使用场景、使用限制、使用建议、配置手册、实现原理、常见问题等描述清晰。优质文档可以屏蔽大量重复问题,减少开源维护者的精力消耗。

聊聊当当开源

当当目前的主要开源产品有三个,分别对应于用于异步化的作业中间件、用于服务化的服务治理中间件以及用于数据水平扩展的数据库分库分表中间件。其关注的核心都是分布式和弹性化。这三个开源项目都有属于自己的关键词。

Elastic-job:Elastic-job的关键词是融入。它是一个分布式弹性化调度框架,由Lite和Cloud两个分支组成,Elastic-Job-Lite提供轻量级、无中心化的作业治理服务。Elastic-Job-Cloud采用中心化方式,它与Mesos完美结合,很容易提供一站式的作业云平台服务。

下图是以Elastic-Job-Cloud为核心的当当作业云架构图:


Sharding-jdbc:Sharding-jdbc的关键词是兼容。它作为一个分布式的数据库中间层,主要职责是透明化数据库水平扩展以及柔性事务的处理。它扩展并完全兼容JDBC协议,因此任何基于JDBC的Java ORM框架均可无缝兼容使用。应用开发工程师无需对现有代码进行任何调整,只需要配置完成分片规则即可直接享用Sharding-JDBC带来的便利。

Sharding-JDBC不仅仅是简单的SQL识别,它拥有一套复杂且完善的知识理论。下图是Sharding-JDBC的架构图:


Dubbox:Dubbox的关键词是扩展。它在阿里开源的Dubbo基础上直接扩展,增加了REST协议等新功能,用于实现异构语言间调用。

三个项目的Github地址是:

github.com/dangdangdot…

github.com/dangdangdot…

github.com/dangdangdot…

这3个项目已较为成熟,已在当当大规模使用,比较符合互联网的业务场景。欢迎感兴趣的同学使用、star和fork,欢迎联系我们并提出宝贵建议。

我的分享到此结束,谢谢大家!