目標
高效能
效能高是必須的,對於創業公司來說,不停的堆機器也是一個比較大的成本,能省則省。
資源拆分隔離
對資源進行拆分,需要每個服務提供相應的介面,服務之間不能直接存取其他服務的資料庫或者緩衝。
高可用
暫訂目標是99.9的可用性。
開發語言
由於我們的新項目沒有曆史包袱,所有的模組都是重新開發,所以我們可以自由地選擇開發語言和開發架構。以前我們的項目後端開發語言比較雜,有golang的項目,php的項目,還有一小部分是nodejs的項目。新項目我決定統一後台開發語言,選擇golang作為我們的主力後端開發語言。golang在我們這裡主要有以下優勢:
- golang在效能和開發效率上有很好的平衡,文法上很簡單,並發編程簡單高效,基礎庫健全。
- 內建一些pprof包可以profile當前程式的CPU消耗、記憶體佔用、鎖狀態、channel阻塞等,非常便利我們定位問題。
- 對PHP程式員來說,上手更容易,而且效能好很多。
服務架構
對於一般的中小型創業公司而言,自己去開發一個微服務架構相對而言成本就太大了(土豪公司養了一堆閑人的除外)。
經過對比,我們選用Go Micro作為開發架構,因為裡麵包含幾乎所有微服務元件,並且支援非常好的拓展性,通過介面的設計方式,讓我們可以拓展一些自己的組件,比如服務發現、傳輸協議、配置中心等。
Go Micro是一個外掛程式化架構,專註於提供底層的介面定義和基礎工具,這些介面可以接納各種實現。
舉個例子,比如下面是Registry介面:
type Registry interface { Register(*Service, ...RegisterOption) error Deregister(*Service) error GetService(string) ([]*Service, error) ListServices() ([]*Service, error) Watch(...WatchOption) (Watcher, error) String() string Options() Options}
Registry介面定義了服務發現的介面,預設採用了consul作為服務發現的實現,但也可以採用其他實現比如etcd和zookeeper等,只要能滿足介面,就可以使用。外掛程式化的架構意味著如果你想替換底層的實現,你不需要修改任何底層的代碼。
micro-framework.png
Go Micro主要由以下組件構成:
Registry
提供服務註冊、發現、登出、監測機制,註冊中心預設是consul,可通過外掛程式的形式支援etcd2/3、zookeeper等
Selector
選取器提供了負載平衡,可以通過過濾方法對微服務進行過濾,並通過不同路由演算法選擇微服務等。
Transport
微服務間同步請求/響應通訊方式,如http、grpc、tcp、udp等
Broker
微服務鍵非同步發布/訂閱通訊方式,更好的處理分布式系統解耦問題,預設使用http方式,生產環境通常會使用訊息中介軟體,如Kafka、NSQ等。
Codec
服務間訊息的編解碼,支援json、protobuf、bson、msgpack等。
Server
用於啟動服務,為服務命名、註冊Handler、添加中介軟體等。
Client
提供微服務用戶端。
我們將會基於Go Micro進行了二次開發,拓展一些自己的組件,比如配置中心,日誌收集,APM調用鏈,監控資料收集等。
(未完待續)
我的公眾號
qrcode_for_gh_e51d4037d8fa_430.jpg