Go-Spring 是模仿 Java 的 Spring 全家桶實現的一套 GoLang 的應用程序框架,仍然遵循「習慣優於配置」的原則,提供了依賴注入、自動配置、開箱即用、豐富的第三方類庫集成等功能,可以讓程序員少寫不少的樣板代碼。mysql
1.
前言程序員
去年年末的時候,我所在的團隊因爲業務調整,技術棧也隨之發生改變,由以前的 PHP +Java 變成了 Golang + Java。初次接觸 Golang,頗不適應,首先就是它那不一樣通常的語法,而後是沒有一個成熟好用的開發框架。語法問題時間長了代碼寫的多了也就慢慢適應了,可是沒有順手的開發框架就太影響開發效率和代碼質量了,做爲一個資深的 Java + Spring 全家桶開發者,我但願能改變這一現狀。通過一段時間的使用和探索,我發現徹底能夠搞出一套像 Spring 全家桶(Spring Framework + Spring Boot +Spring Cloud)那樣的解決方案出來!redis
Spring 全家桶在 Java 世界的地位天然無需多言,它不只爲 Java 開發者證實了基於註解開發、基於 AOP 開發以及面向接口開發可以給程序帶來極大的靈活性,更重要的是帶來了依賴注入、聲明式事務、統一的異常處理、模塊自動化加載、更簡單的 Maven 管理、更簡單的單元測試等優秀的開發實踐。spring
可是 GoLang 和 Java 畢竟不一樣,我爲何篤信本身確定能搞出來呢?要回答這個問題,其實是在回答另外一個問題,即 Java 的哪些語言特性支撐了 Spring 全家桶可以實現那些核心能力,而 GoLang 又有哪些類似的語言特性?sql
追根溯源,Java 的字節碼、反射、註解、包掃描等機制支撐了 Spring 全家桶可以實現 AOP 開發、依賴注入、聲明式事務、模塊自動化加載等核心特性。GoLang 由於沒有字節碼,因此不能實現 AOP 。可是 GoLang 有 Tags、Reflection、_ Imports、init() 機制,因此儘管實現起來不必定有 Java 優雅,可是也能實現依賴注入、模塊自動化加載這些 Spring 全家桶的最核心特性。並且,儘管 GoLang 沒法實現 AOP,可是也能夠經過 Middleware 實現一樣的功能。編程
通過一番探索和實踐,終於 Go-Spring 誕生了!在個人眼中,Go-Spring 和 GoLang 自己同樣,一出生就帶着叛逆和創新精神,GoLang 以不一樣於主流編程語言語法的姿態出現,而 Go-Spring 則在質疑中以面向接口和依賴注入等多種絕對 Java 的特性出如今你們眼前。服務器
2.
特性
Go-Spring 是模仿 Java 的 Spring 全家桶實現的一套 GoLang 的應用程序框架,仍然遵循「習慣優於配置」的原則,提供了依賴注入、自動配置、開箱即用、豐富的第三方類庫集成等功能,可以讓程序員少寫不少的樣板代碼。總結起來,Go-Spring 至少有如下五大特色:app
▍可擴展的啓動器框架,幫你優雅的組織代碼框架
下面這張圖展現了一個 rtmp 服務器的啓動函數,這裏只截取了其中的一部分,能夠看到啓動函數的代碼太長了,並且須要精心組織才能保證代碼的可讀性。curl
而使用 Go-Spring 的啓動器框架則能夠把這些啓動過程封裝到單獨的文件中,使得功能更內聚,代碼更清晰。下圖展現的就是一個封裝好的啓動文件。
在使用了 Go-Spring 的啓動器框架以後,程序的啓動過程就變成了很是簡單的一行代碼了!
▍面向接口+依賴注入,靈活替換實現方案
Go-Spring 爲 Redis 服務提供了統一的 API 接口,可是底層實現卻有多種方案。用戶在使用 Redis 服務編寫業務代碼時只須要關注 API 接口,而不須要關心底層採用的是哪一種方案。
固然用戶最終會選擇一個 redis 服務的底層實現,而引入這個實現僅僅只須要一行代碼便可!
若是你想換成其餘的 redis 底層實現,也僅僅是一行代碼的事。
▍自動綁定配置項,簡化配置文件使用
在使用了 Go-Spring 的代碼中只須要爲變量設置好要綁定的配置項的名稱,並在配置文件中添加該配置項,Go-Spring 就會自動幫你完成變量和配置項的綁定工做。
Go-Spring 還支持按照運行環境綁定不一樣的配置文件,好比當檢測到線下環境時 Go-Spring 使用 application-test.properties 配置文件,而當檢測到線上環境時會使用 application-online.properties 配置文件。
▍有效地幫助作好項目的依賴管理
Go-Spring 爲每個模塊都提供了一個抽象接口,使用者不須要關心接口內部是怎麼實現的,這樣能很是容易的解決依賴升級的問題。Go-Spring 保證已發佈的全部版本的項目依賴都是正確的,並且 Go-Spring 每發佈一個版本都會對依賴進行升級,這樣使用者只須要關注 Go-Spring 的版本變化,就能享受到其餘依賴自動升級的好處!
▍讓複雜的單元測試變得更簡單
GoLang 的單元測試尤爲對 http 的單元測試簡直爛的要命!使用 Go-Spring 啓動的項目可以在單元測試的時候使用真實的項目運行環境,而不是使用一個 fake 的 http 環境。
3.
組件
Go-Spring 包含了四個核心項目,其中
go-spring 實現了 IoC 容器和依賴注入等核心功能;
go-spring-boot 提供了自動配置及應用程序的啓動框架;
go-spring-cloud 立足開源世界打造人人可用的微服務框架;
go-spring-didi 聚焦滴滴內部技術實現具備滴滴特色的微服務框架。
4.
示例
下面我將經過一個最簡單的 http 服務爲你們展現如何使用 Go-Spring。
經過上面的 5 個步驟咱們就獲得了一個簡單但完整的 http 服務,使用 go run main.go 命令啓動程序,並使用 curl http://localhost:8080/ 進行測試,能夠看到請求的返回結果以下:
{"code":900001,"msg":"biz error"}
OK,是否是已經開始感受到 Go-Spring 的威力了!下面咱們再來看一下使用了 Go-Spring 框架的項目的單元測試會怎麼寫。
首先,咱們能夠編寫一個 TestMain 函數用於啓動真實的 http 服務器。
實際上圖展現的代碼還能夠更精簡,精簡爲一行。
而後,咱們能夠編寫一個測試函數發送真實的 http 請求,也不須要 fake 或者 mock。
執行這個單元測試,你就會發現,你獲得了一個徹底不用 mock 和 fake ,而且功能完整、能夠斷點調試的測試環境。
5.
總結
除了上面展現的可以建立 http 服務和單元測試以外,Go-Spring 已經支持了 mysql 服務、redis 服務、kafka 服務、ddmq服務、服務註冊和服務發現服務以及多種 rpc 服務,而且更多的新組件和新特性正在源源不斷的經過滴滴內源加入進來,將來 Go-Spring 會變得愈來愈完善,愈來愈好用!
Another Go Style!我我的認爲 Go-Spring 表明了一種新的編程模式,甚至是一種新的生產力方式,我但願你們在使用 Go-Spring 的過程當中可以解放思想,提升效率,獲得更多的快樂和自由,也多留一些時間給朋友和家人!
本文首發自普惠出行產品技術 (ID:pzcxtech)