虽然是这样的标题没错,但是绝非语言大战,笔者本身是一个Java开发者,但说到底就是编程开发人员无疑,因此这并不阻碍我们去了解其它的语言,这就像有的人主食吃面,有的主食吃米,但是他们可以偶尔换个口味嘛(关于素食主义,emming,这不在笔者研究范围……)。
随着5G时代的逐渐到来,互联网公司势必迎来新一轮不小的升级,服务云化必定是大趋势,为了跟上时代步伐,在面试准备之余对云开发相关做了一些了解。在这一过程中,无意接触到了golang。
其实go语言在挺早前就听说过,坊间传说它“天生支持高并发,执行速度接近C,网络服务接近Nginx……”,尽管如此,进一步了解它依然拖沓到现在。
其它还好,当时唯一不理解的是“天生支持高并发”,尤其是“天生”二字,着实让人感到满满的高端和神秘。下面基于笔者初步的了解来解释一下这个疑问(说明可能不是很专业,读者将就吧,如果有更大的兴趣可以自行学习哈):
一句话总结:go语言在设计的时候从关键字层面实现了多协程开发,好像语言本身支持高并发一样。
(协程可以看做是轻量级的线程,即用户级别的线程,系统线程(比如Java中的thread)属于重量级的线程,协程依赖于线程。Java目前为止并没有支持协程)
在go中实现并发操作到底有多简单(你可以回想一下c语言实现协程),来看代码:
func main () {
go add( 3 , 6 )
go add( 1 , 6 )
time.Sleep(time.Second)
}
func add (a int ,b int ) {
result := a+b
fmt.Println(result)
}
go关键字实现了协程开辟调用,如果不进行等待,主线程结束,协程就会马上结束。
不知道看到这里大家有没有理解go在高并发开发中的优势,goroute和channel的模式实现了类似Unix的epoll模型,因此对于一些耗时任务执行是非常有优势的。
那在接口服务方面,go和Java到底是谁更快呢?
为此笔者进行了相关测试,环境如下:
Go : SDK1 .8 ;框架: beego , sqlx1 .4
Java : JDK1 .8 ;框架: springboot2 .0 , springMVC , jdbctemplate (没有使用重量级的 ROM 框架)
ApacheJMeter
均为请求返回json数据 http://127.0.0.1:8080/user
我们个测试十次,然后取平均值
上方的表格就是总体的参数了,ApacheJMeter 配置:线程数1000 setup:1 循环次数:2,二者的error都为0.00%。
可以看出,go的吞吐比Java多出17%左右。
那到这里,很多Java开发者就有点伤心了,这这这……
其实,还是那句老话:“语言之间没有优劣,重要的是用途。”Java的强项在于构建大型项目的整体,更容易实现分布式。在我看来,go在整个体统的某一块会有更好的性能,比如云文件存储、中间件开发,需要处理的逻辑密集度越高,go的优势会越明显,对于系统整体可用性来说,常规的数据访问使用Java可能是更好的选择。
另外关系型数据库是go的主要瓶颈,因为从理论上来说它可以接近nginx的http服务速度,因此,在一些极高并发系统设计,可以考虑使用go结合redis进行重构,比如电商中的秒杀系统。
END
【推荐阅读 】
绝了!Dataway让SpringBoot不在需要Controller、Service了
不要网上乱拷贝代码了!一段网上找的代码突然炸了!
如何搭建一款自己的私有百度网盘?
我把SpringBoot项目从18.18M瘦身到0.18M,部署起来真省事!
项目实践:三招组合拳,手把手教你打出优雅的后端接口
我把SpringBoot的banner换成了美女,老板说工作不饱和,建议安排加班
SpringBoot + Redis + 注解 + 拦截器 实现接口幂等性校验
推荐三个 Vue 后台管理模版,配合 Spring Boot 使用真香!