Go微服務 - 第一部分 - 介紹及理論基礎

Go微服務理論基礎介紹

藍圖概述

下圖是咱們整個系列文章中構建的系統藍圖總體視圖。然而,咱們將從頭開始寫咱們的第一個Go微服務,而後當咱們沿着博客系列的各部分進展時,咱們將會愈來愈接近下面的圖所表明的結構。python

clipboard.png

圖例基本以下:linux

  • 虛線白框: 在一個或多個節點上運行的邏輯Docker Swarm集羣。
  • 藍色框: 來自Spring Cloud/Netflix OSS棧或其餘服務例如Zipkin的支持服務。
  • 沙色/白盒: 實際的微服務。

它或多或少和Magnus Larssons微服務博客系列中使用的藍圖相同,主要區別在於實際微服務是使用Go嵌入Java來實現的。qutoes-service是一個例外,它爲咱們提供了基於JVM的微服務, 咱們能夠用於和咱們的基於Go的微服務的無縫集成對比以及測試平臺。算法

理論基礎: 運行信息

有人會問,爲何咱們要使用Go來寫微服務呢? 除了可使用這麼有趣和具備創造性的語言幹活以外,使用Go構建微服務的主要理由是具備微小的內存佔用。讓咱們看看下面的截圖,咱們正運行在Docker Swarm下的Go微服務以及基於Spring Bot和Spring Cloud架構的微服務。編程

clipboard.png

quotes-service是Spring啓動的,而compservice和accountservice是基於Go的。二者都是使用大量類庫部署和Spring Cloud基礎設施集成起來用於處理HTTP的服務器。安全

2017年真的重要嗎? 看看Java實現的微服務和Go實現的微服務所佔的內存大小,就會讓咱們感受到吃驚, 相差幾十倍。確實如此,對於大型企業來講,運行數十個服務都是少的,不少公司會運行成千上萬的放在雲提供上的微服務。當咱們運行大量的容器,節約資源會爲公司節省大量的資金。服務器

微服務的非功能性需求

本文不只僅是關於如何使用Go語言構建微服務的 - 它一樣是一個在Spring Cloud環境中表現良好的,而且是符合一個生產就緒的微服務領域所須要的品質。網絡

考慮以下(順序無特殊考慮):數據結構

  • 集中化配置: Centralized configuration.
  • 服務發現: Service Discovery.
  • 日誌: Logging.
  • 分佈式跟蹤: Distributed Tracing.
  • 斷路器: Circuit Breaking.
  • 負載均衡: Load balancing.
  • 邊界: Edge.
  • 監控: Monitoring.
  • 安全: Security.

全部這些東西我認爲當你決定嘗試微服務的時候都須要考慮的,而不用管你具體使用Go語言、Java語言、js、python、C#仍是其餘你喜歡的語言來編碼。這個博客序列咱們從Go語言的視角來揭示全部的這些話題。架構

另一個視角是在你實際的微服務實現中的東西。無論你來自什麼語言,你均可能有提供了以下功能的類庫:負載均衡

  • HTTP/RPC/REST/SOAP/諸如此類的API.
  • 持久化API(DB客戶端、JDBC、O/R映射).
  • 消息API(MQTT、AMQP、JMS).
  • 可測試性(單元測試/集成測試/系統測試/驗收測試).
  • 構建工具(CI/CD)
  • 更多...

我不會涵蓋這些話題的全部內容。若是我要這麼作,我將會寫一本書而不是博客系列文章。我將涵蓋它們中的一小部分。

在Docker Swarm模式下運行

這些文章系列中的系統領域的基本前提是咱們的運行環境是Docker Swarm。意思就是全部服務 - 支持服務(配置服務器、邊界服務等)或實際微服務實現都是部署爲Docker Swarm服務中的。 當咱們到文章序列末尾的時候,有以下Docker命令:

clipboard.png

再次請注意,上面列舉的服務包含了咱們在第五部分設置咱們的Swarm陣列的時候會包含的不少服務。

性能

好吧 - 由於Go微服務佔用很小的內存信息 - 可是它們能執行嗎? 有意圖的對標不一樣編程語言是很是難的。也就是說, 若是咱們拿例如benchmarkgame這樣的網站來看,人們能夠提交明確算法的各類語言中的實現, 而後互相進行性能比較,Go語言通常稍微比Java 8快些,稍微有點意外。 Go語言實際一般和C++對比稍微慢一點,只是基於一些基準測試場景而言。也就是說, Go語言對於通常的微服務工做負載來講執行很好 - 服務HTTP/RPC, 序列化/反序列化數據結構, 處理網絡I/O等等。

Go語言另一個特別重要的屬性就是它具備垃圾回收機制的語言。在Go 1.5的垃圾回收主要重寫以後,GC暫停通常幾乎應該就幾毫秒的樣子。若是你來自JVM世界(我本身就是),Go語言的垃圾回收器可能還不是那麼成熟,可是在Go 1.2之後引入的一些改變讓它彷佛已經很是可靠了。這也是一個不可配置的奇蹟--也有一個球形把手(GOGC), 你能夠微調Go語言中的GC行爲, 能夠控制相對可到達對象的總堆尺寸。

然而 - 跟蹤性能影響,由於咱們將構建咱們第一個微服務,而且添加諸如斷路器、跟蹤、日誌等東西到裏邊, 這樣能夠很是有意思,所以咱們在後面的文章中將使用Gatling測試, 來看咱們不斷向微服務添加更多功能後的性能變化。

啓動時間

Go應用程序的另一個好特色就是它啓動很是快。簡單的帶有一些路由、JSON序列化等的HTTP服務器通常啓動時間最多100微秒。當咱們在Docker容器中運行咱們的Go微服務,咱們能夠看到它們健康的就緒服務最多數秒之內, 而咱們相關的Spring Boot類型的微服務通常須要至少10秒才能就緒。雖然這不是最重要的特色,可是它確定是有用的,當你的環境須要經過快速擴展來處理沒法預料的大訪問量。

靜態連接二進制文件

基於Go語言的Docker微服務的另一個大好處是,咱們能夠在一個可執行二進制文件中得到靜態連接的二進制全部依賴關係。雖然文件自己不是很緊湊(一個微服務通常來講具備10-20Mb的樣子), 最大的好處是咱們能獲得很是簡單的Dockerfile,而且咱們可使用很是裸露的基礎Docker映像。 我使用了一個基礎映像叫作iron/base, 它大概只有6MB。

FROM iron/base

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

換句話說就是 - 沒有JVM或其餘運行時的必要組件, 除了標準C庫(libc)以外,都是包含在基本映像之中的。

咱們將在後續文章中更加深刻到如何構建咱們的二進制以及-profile=test的一些東西。

總結

本篇文章中,咱們介紹了一些使用Go語言構建微服務的一些關鍵因素: 例如內存信息佔用少、良好的性能以及便捷的靜態連接二進制。

中英文對照

  • 運行信息: Runtime footprint, 參考連接: https://bbs.csdn.net/topics/4...
  • 單元測試: Unit Test.
  • 集成測試: Integration Test.
  • 系統測試: System Test.
  • 驗收測試: Acceptance Test.
  • 持續集成: Continuous Integration.
  • 持續部署: Continuous Deployment.

參考連接

相關文章
相關標籤/搜索