micro 功能很是強大,本文將詳細闡述micro api 命令行的功能
重要的事情說3次html
主要做用是爲微服務提供http網關支持。假如後端服務名稱爲go.micro.srv.hello
,提供call
方法,則咱們可用經過http協議來調用微服務。node
curl http://127.0.0.0:8080/hello/call?name=123
micro api
指令所有參數以下git
$micro api -h NAME: micro api - Run the api gateway USAGE: micro api [command options] [arguments...] OPTIONS: --address value Set the api address e.g 0.0.0.0:8080 [%MICRO_API_ADDRESS%] --handler value Specify the request handler to be used for mapping HTTP requests to services; {api, event, http, rpc} [%MICRO_API_HANDLER%] --namespace value Set the namespace used by the API e.g. com.example.api [%MICRO_API_NAMESPACE%] --resolver value Set the hostname resolver used by the API {host, path, grpc} [%MICRO_API_RESOLVER%] --enable_rpc Enable call the backend directly via /rpc [%MICRO_API_ENABLE_RPC%]
翻譯一下github
--address value 設置網關訪問的ip和端口,如設置成0.0.0.0:8080,則能夠經過http://127.0.0.1:8080/進行訪問,默認爲0.0.0.0:8080 --handler value 指定映射具體哪一種類型的處理程序,可選擇{api, event, http, rpc} ,默認是rpc --namespace value 指定暴露哪些微服務,經過命名空間匹配,如指定value爲`go.micro.srv`,則該空間下全部微服務都能被訪問 --resolver value 路徑和微服務的對應關係,默認是micro,可選項爲{host, path, grpc} --enable_rpc 是否支持直接經過rcp接口進行訪問,默認false
咱們經過--handler=api
類型選項,實現http到api
類型處理服務之間的映射,代碼解讀以下golang
handlerapi.zip
並解壓到%GOPATH%/techidea8.com/microapp/doc/
下,解壓後目錄以下所示E:\winlion\gopath\src\techidea8.com\microapp\doc\handerapi>ls go.mod go.sum handerapi.go proto/
#這一步必須作,不然會報錯`build command-line-arguments: cannot load techidea8.com/microapp/doc/handerapi/proto:` >go mod init >go: creating new go.mod: module techidea8.com/microapp/doc/handerapi
>protoc --proto_path=E:/winlion/gopath/src --proto_path=. --go_out=. --micro_out=. proto/handerapi.proto #注意網絡上不少文檔使用--proto_path=import_proto_path:. 這種格式指定path可是在win10這種格式是行不通的 #另一種可行的格式是 -IE:/winlion/gopath/src -I. 以下也是可行的 >protoc -IE:/winlion/gopath/src -I. --go_out=. --micro_out=. proto/handerapi.proto
>go run handerapi.go 2019/08/24 20:59:32 Transport [http] Listening on [::]:54208 2019/08/24 20:59:32 Broker [http] Connected to [::]:54209 2019/08/24 20:59:32 Registry [mdns] Registering node: go.micro.api.example-71c8b1fa-f84b-4cf6-957f-617f67a4083c
>micro list services go.micro.api go.micro.api.example
>curl "http://localhost:8080/example/example1/func1?name=winlion" {"msg":"咱們已經收到你的請求啦winlion"}
咱們經過--handler=event
選項,來實現發佈event
事件,關鍵代碼解讀以下web
handlerevent.zip
並解壓到%GOPATH%/techidea8.com/microapp/doc/
下,解壓後目錄以下所示E:\winlion\gopath\src\techidea8.com\microapp\doc\handlerevent>ls handlerevent.go
核心代碼以下json
service := micro.NewService(micro.Name("test1")) service.Init() //訂閱go.micro.evt.test事件,注意這個test micro.RegisterSubscriber("go.micro.evt.test", service.Server(), new(TestEvent)) if err := service.Run(); err != nil { log.Fatal(err) }
>go run handlerevent.go 2019/08/24 23:17:18 Transport [http] Listening on [::]:57093 2019/08/24 23:17:18 Broker [http] Connected to [::]:57094 2019/08/24 23:17:19 Registry [mdns] Registering node: test1-7efd3b0a-5455-4456-870d-3b34e80f1354 2019/08/24 23:17:19 Subscribing test1-7efd3b0a-5455-4456-870d-3b34e80f1354 to topic: go.micro.evt.test
>micro list services go.micro.api test1 topic:go.micro.evt.test
>micro api --handler=event --namespace=go.micro.evt 2019/08/24 23:06:28 Registering API Event Handler at / 2019/08/24 23:06:28 HTTP API Listening on [::]:8080 2019/08/24 23:06:28 Transport [http] Listening on [::]:56778 2019/08/24 23:06:28 Broker [http] Connected to [::]:56779 2019/08/24 23:06:28 Registry [mdns] Registering node: go.micro.api-c342fe3f-4a06-4955-be3f-79284e580467
>curl -d "{\"message\": \"Hello,Winlion\"}" "http://localhost:8080/test/login" -X POST #服務器側會顯示以下數據 >2019/08/24 23:18:54 Process 收到事件 login {"message": "Hello,Winlion"}
注意,在win系統下,經過curl發佈json數據,須要採用雙引號,而且須要使用轉義字符\
注意 http://localhost:8080/test/login中的test對應go.micro.evt.test中的test
咱們經過--handler=event
選項,來實現發佈event
事件,關鍵代碼解讀以下後端
handlerevent.zip
並解壓到%GOPATH%/techidea8.com/microapp/doc/
下,解壓後目錄以下所示E:\winlion\gopath\src\techidea8.com\microapp\doc\handlerevent>ls handlerevent.go
核心代碼以下api
service := micro.NewService(micro.Name("test1")) service.Init() //訂閱go.micro.evt.test事件,注意這個test micro.RegisterSubscriber("go.micro.evt.test", service.Server(), new(TestEvent)) if err := service.Run(); err != nil { log.Fatal(err) }
>go run handlerevent.go 2019/08/24 23:17:18 Transport [http] Listening on [::]:57093 2019/08/24 23:17:18 Broker [http] Connected to [::]:57094 2019/08/24 23:17:19 Registry [mdns] Registering node: test1-7efd3b0a-5455-4456-870d-3b34e80f1354 2019/08/24 23:17:19 Subscribing test1-7efd3b0a-5455-4456-870d-3b34e80f1354 to topic: go.micro.evt.test
>micro list services go.micro.api test1 topic:go.micro.evt.test
>micro api --handler=event --namespace=go.micro.evt 2019/08/24 23:06:28 Registering API Event Handler at / 2019/08/24 23:06:28 HTTP API Listening on [::]:8080 2019/08/24 23:06:28 Transport [http] Listening on [::]:56778 2019/08/24 23:06:28 Broker [http] Connected to [::]:56779 2019/08/24 23:06:28 Registry [mdns] Registering node: go.micro.api-c342fe3f-4a06-4955-be3f-79284e580467
>curl -d "{\"message\": \"Hello,Winlion\"}" "http://localhost:8080/test/login" -X POST #服務器側會顯示以下數據 >2019/08/24 23:18:54 Process 收到事件 login {"message": "Hello,Winlion"}
注意,在win系統下,經過curl發佈json數據,須要採用雙引號,而且須要使用轉義字符\
注意 http://localhost:8080/test/login中的test對應go.micro.evt.test中的test
咱們經過--handler=rpc
類型選項,實現http到rpc
服務之間的映射,rpc類型和api類型比較類似,能夠參考apihanlder相關代碼,rpchander代碼包爲`handlerrpc·bash
handlerrpc.zip
並解壓到%GOPATH%/techidea8.com/microapp/doc/
下,解壓後目錄以下所示E:\winlion\gopath\src\techidea8.com\microapp\doc\handlerrpc>ls handerapi.go proto/
#這一步必須作,不然會報錯`build command-line-arguments: cannot load techidea8.com/microapp/doc/handerapi/proto:` >go mod init >go: creating new go.mod: module techidea8.com/microapp/doc/handlerrpc
>protoc --proto_path=. --go_out=. --micro_out=. proto/handlerrpc.proto #注意網絡上不少文檔使用--proto_path=import_proto_path:. 這種格式指定path可是在win10這種格式是行不通的 #另一種可行的格式是 -IE:/winlion/gopath/src -I. 以下也是可行的 >protoc -IE:/winlion/gopath/src -I. --go_out=. --micro_out=. proto/handerapi.proto
>go run handlerrpc.go 2019/08/24 20:59:32 Transport [http] Listening on [::]:54208 2019/08/24 20:59:32 Broker [http] Connected to [::]:54209 2019/08/24 20:59:32 Registry [mdns] Registering node: go.micro.api.example-71c8b1fa-f84b-4cf6-957f-617f67a4083c
>micro list services go.micro.api go.micro.api.model1
>curl -H "Content-Type: application/json" -d "{\"arg\": \"Winlion\"}" "http://localhost:8080/model1/model1/action1" {"data":"接收到數據Winlion"}
rpchandler 和 api handler 的區別在於apihandler 的數據交proto模型在rpc的基礎上再次進行了封裝.
咱們經過--handler=http
類型選項,http
服務服務映射,核心代碼以下
handlerweb.go
代碼以下//handlerweb.go package main import ( "encoding/json" "log" "net/http" "github.com/micro/go-micro/web" ) //hello 處理函數,打印helloworld func hello(w http.ResponseWriter, req *http.Request) { //json支持 w.Header().Add("content-type", "application/json;charset=utf-8") if err := json.NewEncoder(w).Encode(map[string]interface{}{ "code": 0, "message": "hello,world", }); err != nil { //頁面報錯顯示信息 http.Error(w, err.Error(), http.StatusNotFound) } } func main() { //new 一個web服務 service := web.NewService(web.Name("go.micro.web.hello")) //綁定映射方法 service.HandleFunc("/", hello) //初始化 service.Init() //運行 if err := service.Run(); err != nil { log.Fatal(err) } }
>go run handlerweb.go 2019/08/24 23:58:14 Listening on [::]:57984
>micro api --handler=http --namespace=go.micro.web 2019/08/24 23:58:42 Registering API HTTP Handler at /{service:[a-zA-Z0-9]+} 2019/08/24 23:58:42 HTTP API Listening on [::]:8080 2019/08/24 23:58:42 Transport [http] Listening on [::]:57992 2019/08/24 23:58:42 Broker [http] Connected to [::]:57993 2019/08/24 23:58:42 Registry [mdns] Registering node: go.micro.api-fecb79d6-0175-4d1c-9243-29c1d616b70d
>curl http://127.0.0.1:8080/hello/ {"code":0,"message":"hello,world"} #注意其中的hello 對應微服務`go.micro.web.hello`中的hello
該做用是開啓rpc 直接訪問支持,設置enable_rpc=true 能夠經過以下接口訪問
>>micro api --handler=rpc --namespace=go.micro.api --enable_rpc=true
>micro new --type=srv techidea8.com/microapp/doc/enablerpc Creating service go.micro.srv.enablerpc in E:\winlion\gopath\src\techidea8.com\microapp\doc\e . ├── main.go ├── plugin.go ├── handler │ └── enablerpc.go ├── subscriber │ └── enablerpc.go ├── proto\enablerpc │ └── enablerpc.proto ├── Dockerfile ├── Makefile ├── README.md └── go.mod download protobuf for micro: brew install protobuf go get -u github.com/golang/protobuf/{proto,protoc-gen-go} go get -u github.com/micro/protoc-gen-micro compile the proto file enablerpc.proto: cd E:\winlion\gopath\src\techidea8.com\microapp\doc\enablerpc protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/enablerpc/enablerpc.proto
注意,因爲win下不能識別--proto_path=.:$GOPATH/src,所以咱們須要自行處理以下腳本,其中E:/winlion/gopath
請替換成各自的GOPATH
>cd /d E:\winlion\gopath\src\techidea8.com\microapp\doc\enablerpc >protoc --proto_path=. --proto_path=E:/winlion/gopath/src --go_out=. --micro_out=. proto/enablerpc/enablerpc.proto
#啓動微服務 >go run main.go #啓動rpc支持 > micro api --handler=rpc --namespace=go.micro.srv --enable_rpc=true
> curl -H "Content-Type: application/json" -d "{\"service\": \"go.micro.srv.enablerpc\",\"method\": \"Enablerpc.Call\", \"request\": {\"name\": \"Winlion\"}}" "http://localhost:8080/rpc" #返回以下數據 {"msg":"Hello Winlion"}
golang分佈式微服務框架go-micro 入門筆記1:1分鐘快速搭建go-micro環境
推薦閱讀
掃微信二維碼實現網站登錄提供體驗地址和源代碼
開源項目golang go語言後臺管理框架restgo-admin
支持手勢觸摸,可左右滑動的日曆插件
你必須知道的18個互聯網業務模型