零
上回书讲到了项目的意义与业务主题,那么这次就来简单讲讲有关这个项目的技术选型。
知其愚者,非大愚;知其惑者,非大惑也。
技术选型
很明显,这次我也打算长篇大论了。这篇章节我不仅会简单介绍一下技术选型,还会简单讲一讲其中一部分技术选型的过程。
首先,整个服务端的主要技术我倒是在一开始就想好了:
- Gradle + kotlin dsl script 构建项目。
- 使用Java17。
- 使用SpringCloud,毕竟要做的是微服务架构。
- 使用Spring Webflux。
- R2DBC + MySQL
- 使用Nacos作为配置中心,进行服务发现。
- 喜闻乐见Lombok。
Gradle + kts
首先,讲讲为什么要用Gradle。其实最开始选择Gradle的原因非常简单:我想学。
Maven是有极限的。我从漫长的项目构建过程中学到一件事......越是想要灵活的进行项目配置,就越会发现Maven是有极限的......除非超越XML配置。因此————!
因此我选择了使用Gradle。大家都知道,Maven与Gradle最大也是最显著的区别就是他们的配置方式。Maven使用较为传统的XML文件进行配置。尽管Maven有很多插件可以使用,但是依旧有着很大的局限性。
而Gradle使用脚本文件进行项目配置,其灵活度是很高的。你可以编写代码写更加复杂灵活的逻辑,而不是被限制在pom.xml中既定的选项中。
那么第二个问题:什么是kts?其实就是kotlin为gradle服务的dsl脚本。最简单的来说,就是使用kotlin语法来代替groovy的语法,把项目中的 build.gradle 文件变成了 build.gradle.kts。
至于我为什么要选择这个,理由也很简单:我更熟悉kotlin。至于kts的构建和groovy脚本的构建之间其他更深层的区别和各自的优势,说实话,我的确没有认真的调研过。不过,不也挺好的吗?
Java17
为什么选用Java17?这是一个好问题。问这个问题之前,首先反问一下自己:为什么不用Java17?
Java17是目前最新的LTS版本,上一个是11,再上一个是8。我听说,Spring 6 以及 Springboot 3 未来也都会基于Java17,而且它还支持免费商用。至少我觉得使用Java17没有什么问题。
当然了,调侃归调侃,我自己对Java17的了解也不够深。毕竟这是一个学习项目,首要目的就是学习。
Spring Cloud
没什么好说的。毕竟为了学习和找工作的项目,肯定要用写大家都爱看到的。而且对于微服务的项目架构设计也是一个很好的挑战。
Spring Webflux
这就是个比较有意思的话题了,为什么要用Spring Webflux。首先什么是Spring Webflux,对它感兴趣的可以去阅读下 官方文档[1] 的说明和概述,配合翻译软件实际上应该还是挺好懂的。
简单来说,Webflux就是一种非阻塞的响应式框架。不同于传统的基于Servlet API设计的Spring Web MVC,是完全非阻塞的,在Netty、Undertow和Servlet 3.1+容器等服务器上,并能够更加有效的利用各种资源,比如你宝贵的线程。
当然,对Spring Webflux感兴趣的原因之一也是我对于kotlin协程愈发的熟悉以及对响应式编程的感兴趣。实际上,Spring也早已对kotlin进行了各种方面的支持[2][3]。我虽然非常想直接使用Kotlin进行Spring的响应式编程(这样也可以更好的使用Kotlin平台下的非阻塞ORM库了),但是这次的主题是使用Java,所以我只能忍痛割爱了。😭
其实webflux大家也未必完全未接触过,Spring Cloud Gateway就是使用的Spring webflux。如果感兴趣,你可以参考阅读它的官方文档[4]。而且顺便一提,这个项目所要使用的网关就是Spring Cloud Gateway。
[1]Spring Webflux : docs.spring.io/spring-fram…
[2]Spring对Kotlin的支持 : docs.spring.io/spring-fram…#kotlin
[3]Spring对Kotlin协程的支持 : docs.spring.io/spring-fram…#coroutines
[4]Spring Cloud Gateway : spring.io/projects/sp…
R2DBC + MySQL
实际上,现在从百度上搜索诸如“Spring webflux 实战 项目”之类的关键字,鲜有干活可寻。绝大多数文章都是顶着“入门”的帽子教你写一个简单的Controller Demo就草草了事,最多最多给你一个整合redis的示例,就难以深入了。更有甚者,Demo里用了各种奇奇怪怪的方式,经常会误导后来者(比如曾经的我)。
搜索结果
只讲了redis
假的数据访问层
“干货”视频
也许,依然会有干货满满的知识分享贴,只不过我没有找到,但是实在也是没有耐心继续翻找下去了。
这是为什么呢?或许是Spring webflux实际上本身属于一个较为颠覆性的技术(相对于传统阻塞式的servlet),又相对比较新颖,因此乐意研究使用它的人本身就少,愿意为其写篇文章的人则更是少之又少。当然这只是一些不靠谱的猜测,真正的原因我肯定是不知道了。也许对于一些培训机构来讲可能会有收费课程,但是对于网络上的文章来讲,你其实很难发现一些有价值的内容。
那么回到副标题,什么是R2DBC?首先,你可以参考它们的官方网站[1]。引用它们的介绍原文和译文:
原文:The Reactive Relational Database Connectivity (R2DBC) project brings reactive programming APIs to relational databases.
译文:反应式关系型数据库连接(R2DBC)项目为关系型数据库带来了反应式编程API。(via DeepL.)
说白了,传统的JDBC是一套阻塞的数据库API,那么R2DBC就是一套适应响应式编程的响应式API。那么为什么会提到这个R2DBC呢?
在使用JDBC的时候(当然你有可能不直接使用JDBC),Spring-Data家族里有一员叫做 Spring-Data-JDBC[2]。说到这里,我想你应该知道我想说什么了吧,对的,Spring-Data同样为了响应式框架提供了一个 Spring-Data-R2DBC[3],来提供对数据库的响应式操作的支持。有了R2DBC,就能够愉快的在Spring Webflux中使用数据库了。
根据官方文档的指引,要想通过 Spring-Data-R2DBC 操作MySQL,我们需要一个实现了R2DBC的数据库驱动。我选择了官方所列举出的驱动之一: dev.miku:r2dbc-mysql[4] 。
[1]R2DBC : r2dbc.io/
[2]Spring-Data-JDBC : spring.io/projects/sp…
[3]Spring-Data-R2DBC : spring.io/projects/sp…
[4]dev.miku:r2dbc-mysql : github.com/mirromutth/…
Nacos
想必各位对Nacos应该已经不是很陌生了。当然,如果陌生也没有关系,你可以前往官方网站[1] 对其进行一个简单的了解。
引用其官方的一句话就是:
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
是的,一个用于动态服务发现、配置管理、服务管理的平台。你可以简单的理解为配置中心和服务注册中心。
其实Nacos我曾经对其的使用也不过只是简单的服务注册中心,这一次作为配置中心使用还是第一次呢。
[1]Nacos : nacos.io/zh-cn/index…
Lombok
没什么好说的,懒人标配。“干货”视频
收尾
第零章第二篇到这里就结束了,以上就是大部分的技术选型以及选择它们的原因了。不知道你是否能看到这里呢?如果看到了,那么十分感激。
对于所有的技术总结文章,我也会像本篇一样,尽可能的附上所有我有所参考的文档链接,供大家参阅。
就是这样,感谢您的阅读,我们下一篇再见。