原创 [Golang實現JVM第三篇] 解釋器雛形

在上一篇中我們已經完成了class文件的解析工作,雖然沒有解析所有的屬性,但是已經足夠支持一些基本的算法題Java代碼編譯生成的class文件了。有了這一步,日後如果遇到新的特性需要支持,只需缺哪補哪,補上對應屬性的解析邏輯就可以

原创 【用Golang實現JVM第一篇】知識準備&前言

學習JVM最好的方法,就是實現它,沒有之一。 對JVM感興趣的朋友可能會去主動尋找講解JVM的書,比如《深入理解JVM》、《Java虛擬機規範》、《虛擬機的設計與實現》,但是這些書都是定性講解,多數人看過以後對不少概念還是會很模糊

原创 [Golang實現JVM第二篇]解析class文件是萬里長征第一步

正確解析class文件是萬里長征第一步。本篇我們會全程使用golang完成class文件的解析工作。 數據類型 JVM的class文件完全是二進制文件,最小單位是字節,也有數據類型,但都是字節的整數倍(廢話)。規範中class文件

原创 Go使用chromedp庫操作headless-chrome爬取"JS畫出來的"網站

隨着類似Vue、Angular這類通過JS將web頁面"畫"出來的前端框架的流行,爬取網頁不再像以前那樣隨便發個GET請求,解析HTML就能搞定了。對於使用這類框架製作的SPA(Single Page Web Applicatio

原创 業務系統如何正確實現防重名功能

常見但是錯誤的實現 在業務系統中防重名是一個非常普遍的需求,例如用戶註冊時不允許用戶名重複、已登錄用戶不可以在自己的賬號範圍內創建同名的某種實體等。很多人在實現的時候都是簡單的先判斷名字是否重複,如果沒有則執行插入操作,如下:

原创 Go1.14(即將發佈)中的性能改進

Go1.14即將於2020年2月底發佈,這個版本有一些值得注意的性能改進,如下: defer 跟正常的函數調用相比,defer幾乎已經沒有額外的開銷了。你可以在對性能極度敏感的代碼中放心的使用defer了。 調度器 Gor

原创 Go Web系統中的錯誤處理(可能是最佳)實踐

文章目錄不要直接無腦返回error使用runtime.Caller()添加代碼位置信息使用錯誤嵌套保存原始錯誤錯誤的分類 在討論所有的錯誤處理實踐之前首先要接受一個事實,那就是每調用一個函數/方法都要檢查一下返回值中的err是否爲

原创 數據庫事務中不可重複讀與幻讀的區別

開門見山 可重複讀僅能保證再次執行同樣的查詢時,先前返回【過】的結果一定跟之前一樣,而不保證會不會多出別的記錄。如果返回了之前沒有出現過的記錄,就是幻讀。 隔離級別 數據庫事務的四種隔離級別相信現在已經爛大街了,但是發現很多文章都

原创 Netty對零拷貝(Zero Copy)三個層次的實現

首先我們來看一下維基百科對零拷貝給出的定義: 零拷貝描述了一種計算機中的操作,即CPU在執行某項任務時不需要先將數據從內存中的一個位置移動到另一個位置就可以完成操作,從而節省了CPU時鐘週期和內存帶寬。 從上面的描述可以看出,

原创 Go中方法接收者是指針類型和值類型的根本區別, 看這一篇就足夠了

要理解使用指針接收者和使用值接收者的根本區別只需要明確一點就夠了:它們的方法名是不一樣的。 方法名 我們拿Man和Woman兩個簡單的結構體舉例: type Man struct { } type Woman struct { }

原创 Git工作流: 主幹開發tag上線

使用git的朋友應該都熟悉一些常見的工作流,比如主幹開發分支上線和分支開發主幹上線。前者是指在master分支永遠是開發版的最新代碼,而分支上則是當前線上部署的代碼,後者反之。這裏給大家介紹一個我個人非常習慣的流程:主幹開發,Ta

原创 用Go寫業務系統需要製造哪些輪子?

如果之前主要是用Java做業務系統 ,那麼想用go重寫的話還是比較痛苦的,最主要的原因就是你會發現要啥沒啥,需要自己重寫(造輪子)。下面列舉了一些需要施工的基礎設施。 錯誤處理 在Java中,只要你沒有刻意的使用4參數的Excep

原创 Vert.x + Protobuf二進制協議解析

這一期介紹如何解析二進制私有協議。 先說幾句題外話,就是絕大多數情況下,可能根本用不着使用私有二進制協議,除非你的業務對性能極其敏感,否則HTTP足矣。 協議 我們的協議非常簡單,先是一個4字節的整數表示數據長度,然後緊接着就是p

原创 Java異常處理使用Throwable而不是Exception

線上問題 近期在線上系統中遇到了一個奇怪的問題,某個請求處理失敗了,但是日誌裏沒有任何錯誤信息,catch(Exception e) {}代碼塊根本沒有執行,因此直接跳過了錯誤處理邏輯,但是finally{}塊卻執行了。根據此現象

原创 Vert.x與Netty的區別

雖然Vert.x是基於Netty的更高級封裝,但它們解決的問題是不太一樣的。可以認爲Vert.x是Netty的超集,它利用Netty的Eventloop爲開發者提供了更友好的編程模型。 Netty解決了如何支撐大量連接的問題 Ne