Go-Micro微服務入門(二):創建一個go-micro項目

2020-10-11 Yeaze

上一篇文章中,我們把編寫以及運行微服務所需的環境都準備完畢了,那麼接下來我們正式開始使用go-micro來創建一個項目。

正式開始之前,我們需要了解的一些知識:

關於go mod:go mod 是go官方推出的go包管理工具,如果你早已受夠了gopath的束縛,那麼來吧,就現在!擁抱go mod,拋棄gopath吧!

Go 1.11 Modules 官方說明文檔(https://github.com/golang/go/wiki/Modules)

Protobuf3文檔(https://developers.google.cn/protocol-buffers/docs/proto3)

micro中文文檔(https://micro.mu/docs/cn/index.html)

創建項目

在自己習慣的工作目錄(任意目錄均可,因為咱有go mod,前提是設置了環境變量「GO111MODULE」為on或者auto)創建項目目錄:

#創建項目目錄mkdir /home/gcc/projects/micro-democd /home/gcc/projects/micro-demo#通過micro創建一個微服務項目結構micro new --namespace=go.micro --type=srv --alias=order --gopath=false order-srv

關於micro new 命令更多參數用法請參閱文檔:https://micro.mu/docs/cn/new.html

上述命令執行後,micro會為你自動生成如下的一個項目結構:

├── main.go├── plugin.go├── handler│ └── order.go├── subscriber│ └── order.go├── proto/order│ └── order.proto├── Dockerfile├── Makefile├── README.md└── go.mod

編輯go.mod文件:

vim /home/gcc/projects/micro-demo/order-srv/go.mod#將文件第一行的 module order-srv 修改為 module micro-demo/order-srv#解釋下為何這麼做:以微服務形式開發項目,那麼一個微服務就是一個可以獨立部署的模塊。對於開發過程中也可以看做是一個相對獨立的項目。而兩個不同的微服務之間的關聯應該就剩下相互之間的RPC調用,RPC調用需要知道對方RPC服務的入參和出參的規範,這個規範就是在proto文件中定義好了,所以在開發過程中需要import別的微服務的接口、結構體等定義的包。這裡修改module名稱就是為了後面開發過程中能方便的導入別的微服務的包。可能解釋的有點晦澀,沒關係,繼續往下看,等用到了就會明白。

編輯proto文件:

vim /home/gcc/projects/micro-demo/order-srv/proto/order/order.proto

你會發現micro已經為我們預先寫好了一些protobuf的定義,但在實際項目開發中這些代碼其實沒什麼用,你應該完全清空後,按照自己的實際業務重新寫。此處,因為只是給大家演示如何使用micro開發微服務,所以便直接使用micro給我生成好的proto文件了(請允許我偷個懶哈(*≧▽≦*))。

根據proto文件生成相應的go代碼:

cd /home/gcc/projects/micro-demo/order-srvprotoc --proto_path=. --go_out=. --micro_out=. proto/order/order.proto

上述命令執行後,會在/home/gcc/projects/micro-demo/order-srv/proto/order目錄下多出order.micro.go 和order.pb.go這兩個文件,這兩個文件其實就是根據你的proto文件自動幫你定義了一些接口、結構體和方法,我們無需對這兩個文件做任何修改,直接使用即可。

打開main.go文件,發現缺少很多依賴包:

main.go

沒關係,不慌,我們有go mod,一個命令直接搞定。

cd /home/gcc/projects/micro-demo/order-srvgo mod tidy

運行微服務:

cd /home/gcc/projects/micro-demo/order-srvgo run main.go

服務啟動成功後會在控制臺看到如下輸出:

2019-10-26 10:26:14.409113 I | Transport [http] Listening on [::]:41927

2019-10-26 10:26:14.409167 I | Broker [http] Connected to [::]:35483

2019-10-26 10:26:14.409408 I | Registry [mdns] Registering node: go.micro.srv.order-37ec23a1-ac7d-4b11-94cf-477c2983c927

2019-10-26 10:26:14.410944 I | Subscribing go.micro.srv.order-37ec23a1-ac7d-4b11-94cf-477c2983c927 to topic: go.micro.srv.order

2019-10-26 10:26:14.412214 I | Subscribing go.micro.srv.order-37ec23a1-ac7d-4b11-94cf-477c2983c927 to topic: go.micro.srv.order

好了,至此一個基於go-micro的微服務就成功運行起來了,接下來我們要如何訪問到這個微服務呢?不慌,接著往下看。

go-micro是一個相對比較完備的微服務框架,一些常用的組件都已經準備好了,基本上是開箱即用的。

我們需要通過一個API網關來訪問到我們剛剛創建的微服務。

API-Gateway可以以多種模式運行,這裡我們先演示一種比較簡單的,更多運行方式請參見文檔:https://micro.mu/docs/cn/api.html

啟動API-Gateway:

#這裡的命名空間 --api_namespace=go.micro.srv參數#必須和main.go中註冊的微服務name前綴要一致,否則無法訪問micro --api_namespace=go.micro.srv api --handler=rpc

訪問微服務:

curl -H 'Content-Type: application/json' -d '{"name": "john"}' "http://localhost:8080/order/call"

成功看到下面的輸出內容即表示訪問成功:

{"msg": "Hello john"}

到這裡我們已經成功創建了一個微服務,啟動並且已經能夠成功訪問了。當然肯定還有很多讀者對go-micro一頭霧水,很多概念也都不清楚。不慌,我們後續系列文章會對整個micro進行一些概念上的介紹,然後逐步深入,但然最好還是自己多研究官方文檔,有問題可以去github上發issue,也可以加入他們的slack一起討論。

嘗試著寫一些面向初級開發者的基礎教程,之前沒有任何寫作方面的經驗,所以寫的不好的地方請大家輕噴,謝謝。

相關焦點

  • Go-Micro微服務入門(一):環境搭建
    :source /etc/profile驗證go是否安裝成功:go version看到輸出類似下列內容即可:go version go1.13.3 linux/amd64安裝micro在任意目錄執行:go get github.com
  • Go-Micro 集成 Nacos 實戰之服務註冊與發現
    Go-Micro 組件用於在 Go 中編寫微服務的插件式 RPC 框架。它提供了用於服務發現,客戶端負載平衡,編碼,同步和異步通信庫。go-micro 是一個獨立的庫,可以獨立於其他工具包使用。在項目根目錄下創建 proto 文件夾,用來存放 protobuf 文件2.
  • Go-Micro微服務入門(三):揭開go-micro的神秘面紗
    在本文正式開始之前,我覺得大家有必要先對微服務有一個大概的認識和了解當下,微服務早已不是什麼新鮮的概念了,甚至已經開始逐步過渡到了下一代微服務-Service Mesh。當前微服務的實施也沒有一個統一的行業標準,因為服務怎麼拆分,拆分的顆粒等這些問題都不是一概而論的,都是需要根據實際業務來選擇最合適的方案。那麼Go-Micro到底是什麼?
  • go微服務框架go-micro深度學習(三)Registry服務的註冊和發現
    服務的註冊與發現是微服務必不可少的功能,這樣系統才能有更高的性能,更高的可用性。go-micro框架的服務發現有自己能用的接口Registry。只要實現這個接口就可以定製自己的服務註冊和發現。go-micro在客戶端做的負載,典型的Balancing-aware Client模式。
  • 什麼是Micro?它是微服務發展的未來……
    而所謂服務,一定要區別於系統,服務一個或者一組相對較小且獨立的功能單元,是用戶可以感知最小功能集。Micro則是一個開源項目,致力於簡化微服務開發。它開始了一個面向微服務開發的微操作框架。但即便在那之前,go micro還是一個被黑客攻擊的小庫,它的創建是為了在2014年時開發一個「kubernetes as a service」項目。
  • Mix PHP V2.2 發布,與 go-micro 深度集成的 PHP 微服務開發框架
    Mix PHP 是一個基於 Swoole 開發的高性能 PHP 框架,從 2017 年開始經過多年發展收穫了很多中小型團隊的支持
  • Mix PHP V2.2 發布,與 go-micro 深度集成的 PHP 微服務開發框架...
    Mix PHP 是一個基於 Swoole 開發的高性能 PHP 框架,從 2017 年開始經過多年發展收穫了很多中小型團隊的支持,框架版本也經歷了多個版本的迭代: V1.*: 基於 Swoole
  • 老王學習go語言——2.1 Go Kit和Go Micro
    它需要一個全面的工具包,用於大的分布式編程。Go kit是一組包和最佳實踐,為任何規模的組織提供全面、可靠且可信賴的構建微服務的方法。這裡是每個技術框架共同的追求:讓開發者專注於自身業務邏輯的開發go-micro的主要功能服務發現:自動服務註冊和名稱解析。服務發現是微服務開發的核心。當服務A需要與服務B通話時,它需要該服務的位置。默認發現機制是多播DNS(mdns),一種零配置系統。
  • 華為雲 ServiceComb 抄襲 Go Micro 代碼,已致歉
    2017年6月19日在 LC3 開源峰會上,華為宣布開源了微服務框架 ServiceComb,華為稱它是 FusionCloud 解決方案中 PaaS 平臺的重要組成部分,內置了高可靠性運行、
  • Go周報2:埠掃描、json瓶頸、slice修改、微服務
    三、關於Go和python互調 很多公司並不是只有一個Go技術棧。諾,有個群友公司就是python+Go技術棧,於是就有了一個問題,以前的一些祖傳庫是python寫的。又不想重寫,GO能不能調。那麼介紹個庫 https://github.com/sbinet/go-python Python本身支持C API。go又有cgo 無縫調用C。
  • Java微服務可以和Go一樣快嗎?
    我們想要一個公平的測試,所以我們創建了一個非常簡單的微服務,沒有外部依賴項(例如資料庫),並且代碼路徑非常短(僅處理字符串)。 我們確實包含了指標和日誌記錄,因為它們似乎總是包含在任何實際的微服務中。 我們使用了小型輕量級的框架(Helidon for Java和Go-Kit for Go),並且還嘗試了Java的純JAX-RS。 我們嘗試了不同版本的Java和不同的JVM。
  • 2019 Go 開發者路線圖,請收下這份指南!
    隨著雲計算的迅速發展,更多基於Go語言的項目正在不斷湧現。今天,CSDN就為大家推薦了一份來自Github的2019年Go開發者指南,幫助大家快速入門Go語言。該指南提供了詳細的進階路線圖,列出了學習Go開發所需的各類知識和技能,而且每個知識點也附上啦相應的學習資源。相信無論是零基礎的新手,還是對Go語言有一定了解的開發者,都能夠有所收穫。
  • Dubbo-go 雲原生核心引擎探索
    ,也湧現了一批 Go 的微服務框架,如 go-micro、go-kit、Dubbo-go 等,跟微服務治理相關的組件也逐漸開始在 Go 生態發力,如 Sentinel、Hystrix 等都推出了 Go 語言版本,而作為微服務框架的核心引擎--註冊中心,也是必不可缺少的組件,市面已經有多款註冊中心支持 Go 語言,應該如何選擇呢?
  • 支持多語言的微服務框架Tars-Go
    提起微服務框架,我們可以自然地舉出 Dubbo、gRPC 與 Spring Cloud 等眾多的知名項目,依據 是否支持服務治理 和 是否支持多語言 兩個維度可將這些微服務框架分為以下四類:同時它提供 Tars 協議二進位流的編解碼功能,將二進位包轉成相應的 Go 數據結構。
  • Sentinel Go0.6發布,支持Warm-Up預熱流控
    Sentinel Go 0.6.0 正式發布,該版本帶來了 Warm-Up 預熱流控特性、go-micro 框架的適配模塊,以及其它的一些特性改進。這樣可以給冷系統一個預熱的時間,避免冷系統被壓垮。WarmUp 預熱控制的示例可以參考 qps_warm_up_example.go
  • 快試試 go-zero 的微服務自動生成
    為什麼說做好微服務很難?go-zero微服務框架就是為此而生。另外,我們始終秉承工具大於約定和文檔的理念。我們希望儘可能減少開發人員的心智負擔,把精力都投入到產生業務價值的代碼上,減少重複代碼的編寫,所以我們開發了goctl工具。下面我通過書店服務來演示通過go-zero快速的創建微服務的流程,走完一遍,你就會發現:原來編寫微服務如此簡單!
  • Go語言憑什麼進到2017年程式語言排行榜的前十
    現在Go的開發已經是完全開放的,並且擁有一個活躍的社區。二、Go語言的特點1、學習曲線它包含了類C語法、GC內置和工程工具。這一點非常重要,因為Go語言容易學習,所以一個普通的大學生花一個星期就能寫出來可以上手的、高性能的應用。在國內大家都追求快,這也是為什麼國內Go流行的原因之一。
  • Go語言愛好者周刊:第 68 期—一道關於浮點數的題
    1、Micro 3.0.0 發布[3]雲原生微服務開發平臺3、go-zero 是如何追蹤你的請求鏈路的[6]微服務架構中,調用鏈可能很漫長5、從來沒有這麼強烈想推薦一個工具這個工具值得大家一試。6、Go 中的循環是如何轉為彙編的?看完你懂了嗎?看懂需要一定的功力。7、那些迷人的 Go 命令行工具Glow,Charm 主打的產品。
  • 微服務 - 如何進行服務限流和熔斷
    通常一個應用由多個微服務組成,微服務之間的數據交互需要通過遠過程調用的方式完成。假設某一時刻,微服務E變為不可用。微服務C需要等待微服務E返回結果,於是請求就會逐漸堆積在微服務C,形成阻塞。隨著微服務C堆積的請求不斷增加,微服務A也會隨之慢慢阻塞。因為伺服器所能支撐的並發數有限,所以最終會耗盡伺服器資源,從而導致調用鏈條上更多的微服務不可用,形成雪崩效應。這種由一個服務崩潰導致整條服務鏈崩潰的情況,我們就稱之為服務雪崩。
  • go程式語言能做什麼
    使用 Go 語言開發的開源項目非常多。早期的 Go 語言開源項目只是通過 Go 語言與傳統項目進行C語言庫綁定實現,例如 Qt、Sqlite 等;後期的很多項目都使用 Go 語言進行重新原生實現,這個過程相對於其他語言要簡單一些,這也促成了大量使用 Go 語言原生開發項目的出現。