01、GoodGuy 的诞生(一个消息推送平台)
02.、GoodGuy 试图去揣摩一个好产品会如何进行消息推送管理平台的需求设计
大家好,我是处于 Java 行业下水道,励志重见天日的好人。
上一篇我说我要做一个叫做 GoodGuy 的个人开源项目,反响一般,没啥人给点声音,挺郁闷,那我可得干点成绩出来才行。
最近个把星期,有事要忙,耽误了,感觉把博客补上。还有一件事,挺让人激动的,我提离职了,个把星期后正式滚蛋,这段时间要把之前的任务收个尾,并且交接工作。滚蛋后,会回老家办点事,随便放松放松。
这篇博客主要是想和大家探讨一下搭建一个项目,应该如何进行技术选型。
开发语言当然是 Java,这一点是毋庸置疑的。除了好人就是干 Java 的主要原因之外,Java 编程语言在 web 开发绝对是霸主地位。Java 有非常好的生态,Spring 生态体系几乎提供了所有 Java 技术场景的解决方案。
JDK 的版本选用的是 JDK 8。我自打开始学习 Java 以来接触的 JDK 版本都是 8。虽然 Java 已经发布到 JDK 17了,但是现在很多公司也都还是在使用 8。后面已经陆续发布了近 10 个新版本,但是 JDK 8 真的非常非常非常够用,免费开源,稳定安全。其实稳定安全应该是最重要的原因,换了 JDK 版本,需要学习和适应新特性,很容易会因为暂时的知识盲区而导致问题。
采用现今最流行、最成熟的 springboot 框架,这点应该无可非议吧。springboot 是 spring 的快速开发框架,属于脚手架,能够快速整合众多技术,拥有各种功能场景的最佳解决方案。相信干 Java 这一行的,应该都七七八八的对 springboot 比较熟悉了,无需太多的学习成本,开发效率大大提高。记得之前刚学 spring + springmvc + mybatis 的时候,光这三个框架的整合都是十分累人,自从学了 springboot,项目轻松搭建,舒服得不行。
任何一个系统都少不了数据的存储,我们选用 mysql 作为我们项目的关系型数据库。MySQL 是使用最广泛的数据库,简单易学,最重要是免费。
数据库的持久化操作,在 2016 年之前流行使用 Hibernate,但在 2016 之后,MyBatis 慢慢成为了主流,也就是我们常说的 SSM 中的 M。MyBatis 是一款优秀的持久层框架,一个半 ORM(对象关系映射) 框架,使用起来非常简单,只要会写 sql 就能上手。
而 Mybatis-Plus,看名字就知道是 MyBatis 的升级版。MyBatis-Plus 是一个 MyBatis 的增强工具,简化开发、提高效率。这是一个国人开发维护的工具,是在 MyBatis 的基础上只做增强不做改变,所以是完全兼容 MyBatis 的。Mybatis-Plus 提供了很多现成的持久化操作 API,我们可以直接调用,如果 API 无法满足我们的需求,我们还可以像使用 MyBatis 那样编写我们自己的 sql。
现在 Java 后端开发普遍都偏向微服务了,相对于传统的单体应用来说,微服务将一个大的应用拆分成多个小的应用(微服务),每个微服务单独部署,实现服务松耦合,每个微服务的复杂度低,方便局部扩展、团队协助,便于开发和维护,也方便实现技术选型多样性。服务之间通过rpc调用,部署更灵活,对于大规模项目整体性能更好。
Spring Could 并不是一项技术,而是技术集合。不提倡造轮子,将现有的技术基于 Spring Boot 再封装,为微服务提供了一套完整的解决方案,主要包括服务注册、服务调用、负载均衡、服务网关、服务降级与熔断、分布式配置管理、消息总线等。Spring Could 主要有五大核心组件:Netflix Eureka(服务发现)、Netflix Ribbon(客服端负载均衡)、Netflix Hystrix(断路器)、Netflix Zuul(服务网关)、Spring Cloud Config(分布式配置)等。
Spring Could 看起来很厉害了,为什么还会有 Spring Could Alibaba 的出现呢?因为 Spring Cloud 进入到了维护阶段,已经不再进行新功能的开发,只是在现有基础上进行缝缝补补。微服务架构越来越火,Spring Could 停滞不前,总得有人去推动微服务的发展。Spring Could 与 阿里巴巴进行合作,各取所需,推出了 Spring Could Alibaba。核心组件有:nacos(动态服务发现、配置管理和服务管理平台)、Sentinel(流量控制)、Seate(分布式事务)等。
在多年前,Spring Could 取代了 Alibaba 的 Dubbo(高性能 Java RPC 框架),如今 Alibaba 又用 Spring Could Alibaba 坐稳了微服务的天下,可谓是相爱相杀了。
【更多 Spring Could Alibaba 介绍可查阅:https://zhuanlan.zhihu.com/p/98874444】
在我刚学 Java 的时候,还没有学到类似于 Maven 这样的 Java 项目构建工具,那时所有的依赖包都需要自己下载引入到项目中,依赖管理十分麻烦,而且还经常会出现一些版本冲突的问题,有时候还为了一个依赖包翻遍整个互联网。
后来学习了 Maven,项目的构建变得特别简单,只需要在 XML 配置文件中用特定的语法描述所需要引入的依赖即可。并且还提供了各种插件,项目编译和打包也能轻松搞定。
除了 Maven之外,与之对标的是 Gradle,Gradle 基于编程语言 Groovy 的领域特定语言来构建项目,而 Maven 是基于 XML。相对来说,Gradle 配置更简洁、性能更好、更灵活。
其实我有没有使用过 Gradle,只是进行了简单了解。我有个朋友干安卓开发的,他们使用的就是 Gradle。其实 Gradle 主要是在安卓开发上特别火,Java 开发还是更倾向于 Maven,可能是因为 Maven 更加标准和规范吧。不过我们还是使用 Maven,毕竟懒,暂时还不想去学 Gradle,而且遇到问题,相关的资料也没那么多,不方便解决问题。
前后端分离,没啥意见吧。前端框架我学的不多,HTML、CSS、JS三剑客肯定是学过的。另外还学过 jQuery、LayUi,但我不太喜欢这两个。我当初为了做毕设,学了 Vue 和 Element UI,感觉 Vue 基于 MVVM 模式实现的双向绑定,用起来真的很爽,数据和视图有一者变化时另一者随之变化。不像 jQuery 那样需要我们自己去操作 DOM 元素,很多时候显得逻辑特别乱。
Element UI 是一套基于 vue 实现的前端组件库,提供了很多美观实用的组件,即使是后端程序员也能够快速成型一个后台管理系统。
前端的东西学得不多,主要是够用就行了。还有一个很火的前端框架是 React,不过我没有学过。在国内 Vue 更火一些,毕竟更简单,有很完善的开发文档。而国外和国内一线大厂可能会更偏向于 React,反正我对比了一下招聘薪资,React 的薪资比 Vue 要高一些。不过咱先不学 React,先用着 Vue 够用就行。
阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。
说白了就是,我们可以将文件存储在 OSS 上,但是要付费。GoodGuy 中,需要运营同学上传消息发送名单的 csv 文件,我们可以将文件存储在本地,或者自己搭建一个文件存储系统,我做毕设的时候,就自己搭建了一个 fastDFS 文件系统,不过相对来说,自己搭建的话,维护成本可能会比较高。为了省事我们直接使用阿里云的 OSS。
消息队列我考虑是使用 RabbitMQ,因为我暂时只学了 RabbitMQ,会啥用啥,大家应该不会反驳吧。
程序之间的通信我们可以使用 RabbitMQ,程序将数据发送到 RabbitMQ 中,其他程序从 RabbitMQ 中读取数据,便实现了通信。RabbitMQ 是基于 AMQP 协议实现的。
AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、 安全。AMQP 协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
对标的产品有 Alibaba 的 RocketMQ 和 Apache 的 Kafka。具体的对比暂时先不说了,各有优缺点,相对来说 RabbitMQ 性能更适中,适用的场景也足够丰富。
Redis 相信大家都很熟悉了吧,必会的技术,不多说,用就对了。
上面是一些暂时能想到,并且暂时能确定下来的技术选型。
当然也有一些暂时没考虑好的技术选型,如下:
暂时先这样,之后可能还会进行完善,或者修改。