在容器化和云原生技术迅速发展的背景下,需要自研一款容器云作为公司内部使用和外部自研产品投入市场,在此基础上需要进一步调研技术选型的开发语言,目前在Java语言和go语言做进一步选择。
容器云开发主流的开发语言是go语言,作为云原生开发的首选语言,go语言在云原生开发具有优势,但是根据目前的现状和语言规模以及公司人力分配的考虑,java语言也可以作为容器云开发的语言,对于开发语言的选择有以下两个方面的不同意见:
选Java:
优势: Java语言公司人力充足,技术生态完善,对于k8s的操作有对应的kubernetes-client的JavaSDK,初步考虑能实现容器云第一阶段的建设目标。
劣势: java语言不是云原生开发主流语言,后期如果跟k8s高度集成的定制功能开发,可能会事倍功半。
选go:
优势:go语言作为云原生的主流语言,已经有对应的容器云平台例如k8s dashboard等使用go语言作为开发,可以进一步借鉴使用。
劣势:go语言公司目前人力薄弱,go语言的web相关开发框架目前不springboot等生态简单,go语言的学习成本的时间投入,开发周期等都会拉长。go语言的经验不足导致的踩坑频率,代码可维护性等表现都不如Java。
针对上述的争议,开启两种语言的调研过程。
SlashData,一家领先的开发者研究公司,发布了第26次Developer Nation调查的初步结果。结果如下:
本次调查收集了来自135个国家的超过一万名开发者的反馈,揭示了开发者社区的最新趋势,特别是在编程语言及其不断壮大的开发者社区方面。通过此处的调研可以发现,go语言确实拥有很强势的发展势头,但是java仍然是老大哥的存在,暂居第三,毫无疑问,java语言的热度在2024年未减。同时,一个语言的热度也相应的反应出语言的生态,生态强大的语言在整个开发的周期中能得到更稳定的解决方案。这也给java作为容器云开发做了一定支撑。
容器云相关的产品和SDK整理:
容器云产品 | 开发语言 | 源码 |
Kubernetes Dashboard | go | |
Rancher | go | |
KubeSphere | go | |
KubeOperator | go | |
kubecube | go | |
Fabric8 kubernetes-client(SDK) | Java | |
kubernetes-client/java(SDK) | Java |
通过以上的整理,发现go语言开发的容器云相关的产品占有很大的市场,也证明了go语言确实是云原生开发的主流语言,但是java也拥有开发容器云等云原生产品的能力,我们可以依赖Fabric8 kubernetes-client(SDK),kubernetes-client/java(SDK)等两个开源的SDK来实现k8s的管理,也能达到实现类似Kubernetes Dashboard,KubeSphere等容器云相关产品类似的效果。所以java作为开发容器云的路可以继续探。
针对选型的两种语言,java和go目前各有优势,不同语言有不同的优势,所以此时应该从语言的学习成本考虑,容器云作为一个新的产品,在开发此类产品的开发人员缺少不了一个学习的过程,根据目前的人力现状,公司的人力主要是java开发者,所以整个学习的成本也将以一个java开发者参与容器云开发的角度进行分析,通过这个角度分析一下java语言选型和go语言选型的学习成本也能作为语言选择的最终考量做数据支撑,以下针对java语言和go语言的学习成本结合实际情况分析:
站在一个开发者的角度,参与容器云平台的开发,首先对应语言的基础语法来说,不会是一个难点,如基本的数据类型,变量,常量,运算符,条件语句,循环语句,函数,变量作用域,数组,接口等各类语言类似的基本语言的操作学习上手会是很快的过程,针对整个学习路径,更多的是分析go语言在Web话开发,微服务开发,以及容器云开发需要对接k8s等方面做分析,主要考虑到以下这些点,如作为Web开发的框架,Web开发过程需要用的关系型数据库,此时考虑的对象关系映射ORM框架,以及工程中必须要的日志框架,还有整个开发不会是从0开始,我们需要脚手架的支持,此时也需要去了解go开发的一些脚手架,当然开发工具的学习也是整个学习的一个环境,功欲善其事,必先利其器,熟悉一个开发工具对应整个开发过程也是不可少的一个环境。整个学习后需要还得考虑go语言如何做工程化,以及如何学习容器k8s相关sdk。针对以上的点,一一列举学习的内容的点,为学习的评估做参考:
框架 | 性能 | 功能丰富度 | 学习曲线 | 适用场景 | 使用的项目 |
Gin | 很高 | 简单,快速开发 | 很容易上手 | 高性能 API,微服务架构 | Rue-go |
Echo | 高 | 丰富,灵活 | 容易上手 | API,Web 应用,微服务 | |
Beego | 中等 | 很丰富,全栈 | 较陡峭 | 企业级应用,全栈开发 | |
Iris | 高 | 丰富,强大 | 中等 | Web 应用,实时应用 | KubeOperator |
Buffalo | 中等 | 非常丰富,全栈 | 中等 | 快速开发,原型设计,Web 应用 | |
go-restful | 中等 | 简单,专注于 API | 容易上手 | 构建 RESTful API 服务,API 文档支 | Dashboard KubeSphere |
以上整理go语言Web开的一些框架,当go语言作为容器云开发的主要语言的时候,我们将熟悉以上的Web开发框架,了解不同的框架的优劣同时才能做出合理的框架选择,当然Web框架的常规建议也能从网上找到,以下做简单整理:
· 性能要求高:Gin 和 Echo 是首选,尤其是 Gin 性能更突出。
· 全栈开发:Beego 和 Buffalo 提供了完整的框架支持,适合更复杂的 Web 应用开发。
· 快速 API 开发:go-restful 是轻量级的框架,专注于构建 RESTfulAPI。
· 多功能需求:Iris 提供了较多的内置功能,适合需要多样化需求的项目
特性 | GORM | XORM | Gorp | Beego ORM |
性能 | 性能较高,但较重 | 性能较好,简单查询更优 | 极高性能,轻量级 | 中等性能,适合 Beego 框架使用 |
功能 | 全功能,支持自动迁移、预加载、事务 | 支持简单的 ORM 功能,简洁 | 提供基本的 ORM 功能,控制权高 | 基础功能,自动迁移,简单查询 |
学习曲线 | 较平缓,但功能丰富 | 简单易用,学习曲线短 | 需要手动映射,学习曲线较陡 | 简单,尤其与 Beego 框架配合使用时 |
灵活性 | 高,支持复杂查询和模型关联 | 比较灵活,但不如 GORM 丰富 | 非常灵活,但缺少自动化功能 | 较低,适合简单需求 |
适用场景 | 企业级应用,高级功能需求 | 中小型项目,简单高效的数据库操作 | 性能要求高,自定义查询,简单项目 | Beego 框架中的 Web 应用,简单需求 |
以上从网上整理了go语言的ORM框架相关的数据,同时也整理出选型建议如下:
· GORM:适合需要全面 ORM 功能的项目,特别是企业级 Web 应用。功能丰富,支持复杂查询,但相对较重。
· XORM:适合中小型项目,需要一个高效且简洁的 ORM。性能优越,灵活性不错,但不如 GORM 丰富。
· Gorp:适合需要手动控制 SQL 查询和完全控制数据库操作的场景。适合性能要求高的简单项目。
· Beego ORM:适合已经在使用 Beego 框架的项目,或者对 ORM 功能的需求较简单的 Web 应用。
高性能的结构化日志库,专为JSON输出优化,支持零分配日志记录 | |
高性能、结构化的日志库,特别强调速度和效率 | |
以其易用性和灵活性著称 |
以上也列举go语言的日志框架,三种日志框架也将在go选择后去学习对比,做出更适合容器云的日志框架选择,结合网上对日志框架的分析,也简单罗列如下:
· Zerolog:适合对性能要求极高的场景,特别是日志聚合和大规模分布式系统。其性能表现优异,适合处理大量日志且需要高吞吐量和低延迟的应用。
· Zap:适合需要高性能且要求丰富功能的应用,特别是结构化日志、大规模分布式系统等。它的性能和灵活性使其成为微服务架构的理想选择。
· Logrus:适合中小型应用,不需要极高性能的场景。由于其简单易用和广泛的社区支持,是大多数应用的入门级日志框架。。
脚手架考虑主要是支持快速搭建Web应用的一种现有的工程,通过脚手架,能快速在此基础上做下一步开发,如java语言的ruoyi框架,在go语言中也存在类似ruoyi的脚手架,以下整理了对应的ruoyi-go的github地址,但是这些项目的完善度远远达不到java语言开发的ruoyi框架,也可以做为学习参考,也是go语言选型要学习的一部分。
https://github.com/lostvip-com/ruoyi-go.git
https://github.com/Kun-GitHub/RuoYi-Go.git
https://gitee.com/OptimisticDevelopers/Ruoyi-Go.git
对于一个语言选型作为开发的主要语言,除了了解框架和脚手架,开发工具,进一步的需要的是如何将框架,脚手架这些充分消化吸收,建立工程化项目的思维,以下主要列举了go建立工程化需要考虑的点和参考:
1.包管理方式:Go语言没有类似于Maven的中央仓库,但有一些常用的依赖管理工具可以帮助开发者管理和导入第三方库。其中最受欢迎的包括:Go Modules、Glide和Dep。这些工具允许您指定所需的依赖关系,并自动下载和构建它们
2.代码结构:参考DDD MVC等开发模式
3.单元测试:标准库 testing 包
4.微服务框架 GoMicro等
5.日志规范:zap logrus等日志框架
6.代码检视:SonarLint
7.CI/CD:Jenkins,gitlab
参考:https://zhuanlan.zhihu.com/p/514426016 ,一步步的建立工程化思维。
对于容器云的开发和k8s的交互,如果go语言作为主要选择,那么项目主要将使用Client-go,controller-runtime等SDK,这些SDK作为项目中主要对接方式,这也是整个开发环节需要考虑的一个部分。
Java语言如果作为容器云开发的主要语言,那么对应的学习成本,我们无需考虑Web框架的学习,将以spring全家桶作为Web开发主要框架,对应日志和http框架,JSON的框架,脚手架等,都有成熟的解决方案,对于java开发参与进来,针对go语言前面的Web框架,对象关系映射框架,日志框架,http框架,JSON框架,脚手架,开发工具,工程化思维,项目运维和bug修复都在java开发者的历史经验得到了历练,此时需要学习的就是对接k8s交互的SDK,主要存在下面两个SDK:
1.kubernetes的kubernetes-client 开发SDK;2.Fabric8的kubernetes-client 开发SDK
对于以上两种SDK的不同可以参考以下参考资料:
https://kubernetes.io/docs/reference/using-api/client-libraries/
https://www.kubernetes.org.cn/8984.html
https://itnext.io/difference-between-fabric8-and-official-kubernetes-java-client-3e0a994fd4af
当然对于Java做容器云开发,也有很多参考的文章作为辅助,以下统统整理在下面,做参考:
https://blog.csdn.net/liuyij3430448/article/details/129534732
https://www.sofastack.tech/blog/java-kubernetes-operator-kubecon-na2019/
以下对于两种语言的选型做总结行比较:
对比项目 | Java | go |
项目上手(学习成本) | 快 | 相对较慢 |
语言规模(社区活跃) | 成熟 | 较成熟 |
项目框架熟悉程度 | 熟悉 | 相对处于入门 |
开发速度 | 较快 | 快 |
容器云管理平台开源项目参考度 | 极少 | 多 |
开发人员 | 多 | 少 |
云原生贴合度 | 低 | 高 |
面向对象OOP | 约束严格 | 自由 |
脚手架(如ruoyi)完善度 | 高 | 低 |
代码规范扫描工具 | AlibabaGuide, SonarLint | errcheck,SonarLint,golangci-lint |