上一篇文章中,我們把編寫以及運行微服務所需的環境都準備完畢了,那麼接下來我們正式開始使用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一起討論。
嘗試著寫一些面向初級開發者的基礎教程,之前沒有任何寫作方面的經驗,所以寫的不好的地方請大家輕噴,謝謝。