为什么许多原本的Java项目都试图用go进行重写开源?
有人的地方就有政治,对互联网公司来说,重构是政治斗争和裁员的重要手段。
给你举个例子吧。前同事A之前在某家公司做运维主管,公司是自建的机房,包括部署,监控,故障自愈,数据库等等平台有关的一切,都是他一手搭起来的,没有人比他更了解。新来的开发经理不服,非要自己来部署,导致出了大故障,等待跑路,A出马几分钟搞定。于是公司只能继续供着他,工资奖金啥的都给的多,偶尔他请假了,有问题也只能等他回来,时间长了,领导哪能容忍这种事?
正好这时候云服务器强势上位了,公司领导拍板决定全面上云,让其他技术也参与,担心这位仁兄不配合,承诺迁移完后有奖金。几个月后迁移完成了,Redis、MongoDB、MySQL使用云托管的,先废一半。部署的时候由开发一起参与CI/CD流程,这时候他的重要性再次被减弱,没多久待不下去了。
放到开发重构也是一样的道理,公司的业务架构都是老员工搞起来的,老员工岂不是会恃宠而骄?那新人怎么上位?
所以不要觉得有一技之长会越来越吃香,公司领导不会让一家独大的局面长久的,会威胁到他。
个人觉得应该是三个主要原因吧。
一. 体积可以明显缩小,部署更简单
因为容器服务越来越主流,这到不是说Java不能在云原生环境使用,现在云原生里的微服务模式,主流编程语言还是Java,只是,依赖于JDK平台确实让容器镜像体积大了很多!大部分情况下,微服务本身jar的体积(包括各种依赖的flat jar)也与JDK本身的体积相差无几(甚至不及)。在多个服务情况下,拉取镜像的成本就高很多,虽然分层存储可以有效降低存储容量,但这也依赖所有微服务需要相同的镜像基座(部署好JDK),对于不同厂商的微应用(服务)情况不一定乐观。
Golang在这部分表现好很多,虽然打包后的Binary也不小(相比于C),但它包含运行时支持及静态链接,非常独立(单体程序易于部署),体积相比Java的服务,总体要小很多。
二. 开发难度不大
后端应用服务最重要的是稳定,Java之所以能长时间占据后端开发市场份额,也是因为其异常及GC机制能够平衡好程序开发难度和程序质量这两个矛盾体。而Golang也引入了GC,开发难度也不高(并不比Java难),不需要特别优秀的能力也能写出健壮的后端应用。
三. 语言发展的必然结果
现在越来越多的人开始使用Golang写后端应用。当你进入这个领域,你就会发现,你需要的各种框架,基础设施基本上都是在重复写一遍其他已经进入该领域的语言的各种框架和基础库😄 这是工程本身决定的,到不一定是抄Java。记得Nodejs刚出来的时候,借助于V8强大的性能,大前端的各种开发工具,框架如雨后春笋般发展起来,但也基本上是走了一遍其他语言(尤其是Java)的路。
不同语言在发展过程中,总会进入其他“先入语言”的领域,然后也会再走一遍人家的路,完善和建立自身在该领域的生态。这是后发语言发展的必经之路!
国内不多,国外倒是不少公司会这么做,我司就这么做了,把之前部分微服务从Java转为了Go,以及部分新的微服务也直接用Go开发。
当时部门开会讨论,非中国人那波人认为Go语言执行非常快,效率得到很大提升;但中国人这波人认为是浪费时间,Java性能也不差,而且学习成本低。
但拗不住外国人占主流,最后还是部分微服务采用了Go。根据目前使用来看,使用Go的微服务在性能上的提升并没有多明显(也许针对高并发会好一些),所以本人一直持保守意见,不过好在后来没有再要求把已开发的Java服务代码改为Go了。
不过Go也有Go的好处,对于微服务,采用Go开发的话确实轻量化,代码量比Java少,开发速度可以非常快,并且部署k8s也很简单,还可以方便的直接集成到云端(例如GCP的Cloud Function)。
随着Go语言的出现及其丰富的原生组件,Go语言正在用于各种类型的项目上。一个最受欢迎的项目是重写原本的Java项目。虽然这种重写如此流行,却存在着很多保留Java原本项目特性的原因。本文将重点讨论这种重写后,为什么能够获得更高的性能、更多的便利和只改变少量语法。
首先,Go语言相比于Java更富有表现力。它的弱类型特性,能够大大的减少代码行数,因此增加了程序的可读性和易用性,而且改变少量语法,即可让原本的Java项目更易读。它的静态编译和内置的错误处理机制,立即检测出Java项目中代码的可靠性。再者,Go语言与C/C++有着类似的内存管理机制,它能够避免Java语言管理内存而引起的内存泄露问题。最后,Go语言支持并发机制,利用Go语言,开发者可以利用其协程、通道等功能,构建的并发应用比Java更加灵活。
此外,Go语言的响应时间和运行效率也远胜于Java。因字节码和由虚拟机编译的特点,Java的运行速度会比Go语言要慢很多。而Go语言明确分配内存,因此程序运行速度快得多,不仅仅可以缩短开发周期,也能大大提升产品整体的性能。通过重新将Java项目重写成Go语言项目,可以让原本的项目拥有更高性能、更大灵活及易用性,减少修改和维护成本,提高产品的稳定性和安全性,加快代码的编辑及实现过程,满足用户对运行效率的要求。
值得一提的是,尽管Go语言拥有众多优势,如果把Java重写成Go语言,不同条件、不同环境下都需要重新考虑,甚至要重新编写很多代码。为了达到最佳性能,Go语言在使用上也有一定的限制,如果想让Go语言项目的运行正常,就需要开发者对Go语言的性能有更深的了解。所以,在重写Java项目时,仔细考虑各个细节,可以使Go最大程度的发挥出它的特性,让用户得到最好的体验,也能为原本的项目带来成功的最终结果。
综上所述,用Go语言重写原本的Java项目,既有利可图,又有风险。如果能够把Go语言的各种优势发挥出来,确保其能够提供有效的运行效率,那么就可以借助Go语言,摆脱Java原本项目中各种不足,让原来Java语言编写的程序,拥有更优秀的性能、更高效的运行,更受用户的欢迎。
你列举的这叫重写开源?
dubbo,motan,sentinel都是非常优秀的java项目。 这个时候突然冒出来好多用go的,他们语言很高调但是中间件设施一片荒漠。这个时候最好的方式当然是把java的轮子改造给go用了。
所以,在我看来,并不是为了go而重写,而是go大军太迅猛,开源社区被迫营业。
有用Java做过PDF导出及打印功能的大佬吗?能否指导一下?
Java生成PDF,打印PDF可以用:
1.PD4ML框架,小巧,但是闭源,出问题,不易解决。
2.iText,开源,丰富的api,支持XML、Html文件转化为PDF文件。网上例子较多,易学习。
3.Apache PDFBox,是处理PDF文档的一个开源的Java工具。适用于生成格式简单且数据量小的PDF文档。
4.docx4j,是一个开源Java库,生成docx文档,提供了将WORD文档转换为PDF文档的功能,并不能直接生成PDF文档。适用于数据小量的PDF文档。结合FreeMarker,docx4j可以,生成格式复杂且数据量大的PDF文档。
希望回答对你有帮助。
目前java开源框架,如pig,guns,ruoyi等,用户为什么不用开源版自己扩展,而去购买企业版?
同样的疑问,一般的程序员还写不出开源软件的水平,还喜欢重复造轮子。
究其原因,应该是两大原因,
一是技术成长考虑:自己写,问题好找。还可以从底层了解系统,写完后还可以吹N。
二是程序员的定位:私活可能他会有这个快速实现(私活要考虑时间跟成本,性价比高的方案优先);公司项目就不一样了,打工的时间换钱,虽有业绩考虑,但程序员写的也是代码,所以最终选择了重复造轮子,再逐步业务的方法。也是屁股决定脑袋,业务业绩没有背
备注,应用性软件公司的问题,大厂场景不一样,不一定能找到轮子[捂脸]
还没有评论,来说两句吧...