基於go搭建微服務實踐教程 (一)

概覽


下面這張圖就是咱們將要搭建的項目的概覽圖。咱們將開始寫第一個微服務以後咱們會一點點完成這張圖的全部內容。java

clipboard.png

講解:
白色虛線的方框內: docker swarm集羣,運行在一個或多個節點上。
藍色方框內: Spring cloud/Netflix OSS提供的支持系統,或者其餘服務,好比zipkin
黃色方框/白色方框: 一個微服務。python

運行資源消耗


爲何咱們要用go來寫微服務?除啦有意思和有效率,另外一個主要緣由是go在運行時消耗的內存很是小。下面這張圖對比了Spring boot,Spring cloud和go.(都是基於運行在docker swarm上的微服務)linux

clipboard.png

quotes-service是基於spring boot.compservice和accountservice是基於go.兩個都是基於http服務器而且有許多庫來和spring cloud集成。c++

可是內存消耗如今還要考慮麼?咱們如今不是有GB級別的RAM能輕鬆負載一個java應用麼?
能夠這麼說,可是對於一個大企業,他們不止運行幾十個微服務,甚者成百上千的微服務。這樣的話減小資源消耗就能省下不少錢。算法

來看一下亞馬遜主機的價格:spring

clipboard.png

第二列爲cpu數量,第四列爲RAM大小。
咱們看到當RAM增長一倍,價錢也隨着增長一倍。若是你的cpu足夠,就沒必要爲缺乏內存而要多花一倍的錢,後面咱們也會看到go的服務在處理請求時甚至比spring boot 在閒置的時候少。docker

微服務非功能性要求


這篇博客不只僅關於go搭建微服務,更是如何在spring cloud環境下運行和搭建符合真正用於生產環境的微服務產品。包括:編程

  • 中心化配置
  • 服務發現
  • 日誌
  • 分佈式探尋
  • 熔斷
  • 負載均衡
  • 邊緣
  • 監測
  • 安全

這些內容都應該在爲服務裏實現,不只僅是用go,其餘的語言,例如,java,python,寫微服務產品時也應該實現這些功能.在這篇博客中我會盡可能從go語言角度覆蓋這些內容。json

另外一方面要考慮的是關於微服務的實現,你可能聽過:安全

  • HTTP/RPC/REST/SOAP/任何形式的APIS
  • 持久化數據的API (DB clients, JDBC, O/R mappers)
  • 消息處理API (MQTT, AMQP, JMS)
  • 測試 (單元測試,integration, system, acceptance test)
  • 編譯工具/CI/CD

我會講解這其中的一些。

在docker swarm上運行

概覽中咱們看到咱們的服務會運行在docker swarm中,這意味着咱們全部的服務,包括支持服務(服務器配置,邊緣等)和微服務程序都會運行在docker swarm中。在這個項目結束時,咱們運行:

docker service ls

咱們會看到下面這些服務

![圖片上傳中...]

注意:上面這些服務遠多於咱們在第五章裏搭建的s
clipboard.png

go微服務佔用很小的內存-可是性能怎麼樣?對編程語言作有意義的基測很難。從基測網站上提交的算法上看,go比java8大部分時間會快。go大部分狀況和c++差很少快,但在一些基測上,要慢不少。就是說,對於普通的微服務工做-負載HTTP/RPC,序列化/反序列化數據結構,網絡吞吐方面,go能夠表現的不錯。

另外一個重要的特性是go具備垃圾回收功能,在go 1.5GC的垃圾回收中只須要停頓幾微秒。go的垃圾回收也許不是那麼成熟,可是在1.2以後,他表現的很穩定。更爲驚奇的是,你能夠更改經過更改整個棧相對於類的大小,來更改垃圾回收的性能。

然而,咱們在測試性能的同時會寫咱們的第一個微服務,以後咱們會加入熔斷,追蹤,日誌等功能。在咱們加入愈來愈多的功能以後,咱們會用Gatling來測試咱們的性能。

啓動時間


另外一個go的特性是它的啓動速度很是快。一個普通的HTTP服務器加上一些路由和json序列化功能的服務在幾百毫秒就能夠啓動。當咱們在docker中運行時,咱們能夠運行它們在幾秒以內。然而,一個spring boot的微服務須要至少10秒。這個看起來好像沒什麼影響,可是在你須要快速應對大流量的處理時將會很是有用。

靜態連接二進制


另外一個優勢go的靜態連接的二進制包含全部的依賴在一個可執行的二進制文件中,咱們能夠把這個包放在docker容器中。同時這個文件不大,通常來講10-20MB。這樣咱們就能獲得一個很簡單的dokerfile.咱們能夠用一個很基本的docker鏡像來開始。我用的是 iron/base,這個鏡像大約6MB。

FROM iron/base
EXPOSE 6868
ADD eventservice-linux-amd64 \
ENTRYPOINT ["./eventservice-linux-amd64", "-profile=test"]

換句話說,不須要JVM或者其餘運行的組件,只須要這個鏡像裏標準的c庫
咱們以後會講解如何編譯二進制文件和-profile=test是什麼意思。

總結


這篇博客中,咱們介紹爲何要用go來作微服務。主要緣由是:

  • 小的內存消耗
  • 性能良好
  • 靜態連接二進制文件的方便

下一篇文章中,咱們會開始寫第一個微服務。

相關文章
相關標籤/搜索