转: Docker和Kubernetes 为什么更倾向于使用Go而不是Java?
·
- 本文内容摘自互联网上捡到的一个PDF分享内容,感觉讲的不错,特此分享.
- 资料文件名: Go&MOSN分享,资料来源找不到了,忘了在哪里下载的了,如有知道可私聊联系博主。
一、云原生时代对编程语言的要求
Docker和Kubernetes是运行在云环境下的,且都是作为基础设施的存在,这样的应用需要考虑的是占用最少的资源,将资源留给真正服务业务的应用, 所以必须要性能高,占用资源少。
二、Go的特点
- Go是静态类型语言,可以快速编译,不需要运行时依赖,部署和发布有优势,是性能很高而且开发效率也很高的语言。
- 在Go语言出现之前,开发者们总是面临非常艰难的抉择,究竟是使用执行速度快但是编译速度并不理想的语言(如:C++),还是使用编译速度较快但执行效率不佳的语言(如:.NET、Java),或者说开发难度较低但执行速度一般的动态语言呢?
- 显然,Go语言在这 3个条件之间做到了最佳的平衡:快速编译,高效执行,易于开发。
三、Go在云原生领域里的优势
- 1.在云的环境下,服务器的cpu动不动就是100核往上,能充分利用算力是非常重要的,充分利用多核,并发是必不可少的。Go语言正是在多 核和网络化的时代背景下诞生的原生支持并发的编程语言。
- Go语言从底层原生支持并发,无须第三方库,开发人员可以很轻松地在编写程序时 决定怎么使用 CPU 资源,Go在语法层面有非常简单的并发编程支持。
- 2.Go参与并发的最小单位是goroutine,goroutine比系统级线程更细,由go的runtime负责调度,并将 goroutine 合理地分配到每个CPU中,最大限度地使用CPU性能。
- 3.goroutine是Go最显著的特征。
- 它用类协程的方式来处理并发单元,却又在运行时层面做了更深度的优化处理。
- 这使得语法上的并发编程变 得极为容易,无须处理回调,无须关注线程切换,仅一个关键字go。
- 4.多个goroutine中,Go语言使用通道(channel)进行通信,通道是一种内置的数据结构,可以让用户在不同的goroutine之间同步发送具有类型的消息。
- 这让编程模型更倾向于在goroutine之间发送消息,而不是让多个goroutine争夺同一个数据的使用权。
- Go语言通过通道可以实现多个 goroutine之间内存共享。
- 通过channel通信,将并发单元间的数据耦合拆解开来,各司其职,这对所有纠结于内存共享、锁粒度的开发人员都是一个解 脱。
四、Go与Java的对比
- 1.性能:性能一直是java开发遭受诟病的地方。Go的性能可以媲美C,C++。
- 2.多线程:Go就是为多线程而生的,语法直接支持多线程,使用go语法即可使用多线程。
- 在性能方面,Go多线程也是碾压java,Go协程相对 于传统操作系统中的线程 (thread) 是非常轻量级的,所以Go在多线程方面是比Java又快内存占用又小。
- 3.生态:这个是Java的最大优势,现在Go还处于发展阶段,就比如包管理功能,从go vendor到go module,都没有Java Maven强大。
- 4.编译,部署:Go语言编写的程序部署容易,占用内存少,运行效率高,所以在容器环境下,Go是比Java更好的选择,Java的问题在于有个 庞大的运行时,也就是说运行时比较臃肿,而Go语言编写的程序编译后是一个二进制文件,直接copy就可以用,部署方便。
五、总结
- Go与k8s结合更好,可以将一部分中间件能力下沉,利用k8s的功能,Go从诞生到现在,都是致力于将编程简单化,Go更偏向于效率。
- Java的优势依旧在于安全、稳定,跨平台。且Java的生态更加完善。
- 中间件、底层基础设施等这种业务很干净,依赖很少的系统,用Go比Java合适,因为Go高并发更简单,更省内存,启动更快。
- 但复杂的业务开发,架构建设,所以偏好复杂业务的,选Java,比如crm、erp这种。
- Go的优势在于比如协程调度模型,比如启动速度,内存占用等,不要小看协程,它背后显示出的是思想的转变,比如Go提倡“不要通过共享 内存来通信,而要通过通信来共享内存”
- 但是在Java中,基本就是通过共享内存来通信,这就导致一个问题,多线程访问共享内存必须加锁。
更多推荐


所有评论(0)