都9012年了,Java开发者你还在用Spring体系以及Maven开发微服务吗?

jujusharp  •  May 5, 2019 10:47:48 AM

原文地址


都9012年了,Java开发者你还在用Spring体系以及Maven开发微服务吗?
貌似整个Java行业谈到开发微服务貌似都是SpringBoot,Maven等等,为什么我们不能换一下。

我们看到这张图,就会发现Spring已经霸占了Java软件开发的各个领域,不容置疑它的确是包含了Java软件开发的各个方面。还是要向Spring致敬的。

由于Spring框架甚至更轻量的SpringBoot可是动辄五十兆甚至上百兆的Jar包,(参考数据可以看这篇文章)还是显得很臃肿的。这也是其它语言开发者对于Java的印象,臃肿,编译时间长。更何况Spring框架本身使用Maven来build系统的。那么看看下图一家叫Wix的公司原来的Maven本地clean的时间吧。看看这篇来自Wix的Slide吧。(注:来自slideshare,大家应该知道该如何看的吧!)。

可是当现在的软件开发已经进入百花齐放的时代,新型开发语言Golang和Rust所带来的轻量的依赖以及快速迭代都代表了现代软件开发的趋势。而且Spring框架所带来的Dependency Injection(注入依赖)真的适合所有的软件项目吗?尤其现在对于不断集成,快速反应,分离关注点,以及轻量的微服务开发来讲也越发需要现代化地轻量开发模式。

开始划重点


由于我们业务是要服务中小型初创企业,所以他们的需求会千奇百怪,另外由于业务模型不稳定所以修改变动会经常。那么就肯定不适合Spring框架这种类似中年人工作的状态。所以我们急需要一种新的开发模式那就是摆脱Spring,Maven,Hibernate(JPA)而去自己组装所有的东西快速反应以及迭代。

我们可以确定新模式所需要的一些优点:

1. 依赖关系少,只包含必须包含的依赖包,使得编译出来的结果足够小。(注:我们设计的开发模式整体编译出来只有15M。)

2. 启动速度必须足够快,恢复启动速度也必须足够快。考虑微服务模式,其中一个微服务模块可能是被N多个微服务模块依赖,如果它自身启动速度不够快,那么就会带来许多的连锁问题。我们需要的服务可以在1秒以内完成自身的重启。(注:我们设计的服务可以在两三百毫秒内完成启动)

3. 类库可以自主选择灵活切换,譬如JSON解析不是一定要用Jackson,可以转成jsoniter而且无需复杂配置。另外升级也可以很灵活,譬如我们经常去检查所依赖库的性能改进,然后做切换。

4. 尽量所有的开发都基于j2se核心基础java语法以及类库,最大化的发挥java 8本身的语法的改进和功能。

5. 数据库访问使用介于ORM与纯jdbc中间的一种模式,可以享受ORM所带来的便利,同时可以深入到纯sql层面进行调优。

6. 集成速度必须快那就意味着编译速度必须快,我们不喜欢一遍喝着咖啡,一遍看着报纸,然后等待一段程序编译完成发布测试。

同时我们也意识到了一些不利之处:

1. 我们这种行为很大程度上有造轮子的嫌疑,所以我们还是要依赖一些现成的类库的,有微服务的影子譬如支持Restful的框架。

2. 我们可能会遇到本来只需要@Annotation 可能就可以完成的事情,而变成一堆代码去完成。所以我们需要保证足够的开发效率。但是我们认为@Annotation所带来的后期运行时性能的惩罚是我们不能容忍的。

3. 服务发现(Service Discovery),安全(Authorization and Authentication),Api Gateway可能也需要我们自己来整治了。好消息是Java社区有大量更优秀的解决方案,我们只需要尝试以及选择就好了。

4. 集成更多地测试工具来保证新模式的稳定。

那我们主要的工作就是在如何克服这些不利之处了。

我们研究成果


1. Restful的服务框架:SparkJava (embedded Jetty)

2. Json的解析:jsoniter

3. 数据访问:jooq 

4. Connection Pool:common-pool2

5. 配置服务器:基于etcd的解决方案

6. redis cluster访问:redis_clients_jedis

7. build工具:bazel

8. 运行方式:start.sh  以及 end.sh 命令行文件。(提示:java -jar  以及 ps | kill)

9. log输出:log4j2

10. Securiy:jwt 采用jjwt, oauth2 采用 pac4j

有趣的数据


1. 编译出来的Jar包,在15M左右。

2. server  start 和 shutdown 控制在150毫秒以内。

3. build jar包平均时间在5秒以内(除了第一次会在20~30秒)

4. API方法书写简单,让程序员关注于内部逻辑

5. 我们一天可以做到多次快速release。

跟着我们一起过一遍


接下来,我们会不断地详细分享我们的这个开发模式的具体内容,敬请期待。

0 回复
暂时没有回复,你也许会成为第一个哦