雖然是這樣的標題沒錯,但是絕非語言大戰,筆者本身是一個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 使用真香!