1. 程式人生 > >golang微服務框架go-micro 入門筆記2.1 micro工具之micro api

golang微服務框架go-micro 入門筆記2.1 micro工具之micro api

micro api

micro 功能非常強大,本文將詳細闡述micro api 命令列的功能 重要的事情說3次

主要作用

主要作用是為微服務提供http閘道器支援。假如後端服務名稱為go.micro.srv.hello,提供call方法,則我們可用通過http協議來呼叫微服務。

curl http://127.0.0.0:8080/hello/call?name=123

micro api指令全部引數如下

$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%]

翻譯一下

   --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

apihander

我們通過--handler=api型別選項,實現http到api型別處理服務之間的對映,程式碼解讀如下

  1. 下載handlerapi.zip並解壓到%GOPATH%/techidea8.com/microapp/doc/下,解壓後目錄如下所示
E:\winlion\gopath\src\techidea8.com\microapp\doc\handerapi>ls
go.mod  go.sum  handerapi.go  proto/
  1. 初始化模組
#這一步必須做,否則會報錯`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
  1. 生成proto檔案,請自行替換GOPATH路徑.
>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
  1. 執行
>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
  1. 檢視服務狀態
>micro list services
go.micro.api
go.micro.api.example
  1. 測試
>curl  "http://localhost:8080/example/example1/func1?name=winlion"
{"msg":"我們已經收到你的請求啦winlion"}

eventhander

我們通過--handler=event選項,來實現釋出event事件,關鍵程式碼解讀如下

  1. 下載handlerevent.zip 並解壓到%GOPATH%/techidea8.com/microapp/doc/下,解壓後目錄如下所示
E:\winlion\gopath\src\techidea8.com\microapp\doc\handlerevent>ls
handlerevent.go

核心程式碼如下

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)
}
  1. 執行服務
>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
  1. 檢視服務狀態
>micro list services
go.micro.api
test1
topic:go.micro.evt.test
  1. 啟動event釋出支援
>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
  1. 測試
>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

eventhander

我們通過--handler=event選項,來實現釋出event事件,關鍵程式碼解讀如下

  1. 下載handlerevent.zip 並解壓到%GOPATH%/techidea8.com/microapp/doc/下,解壓後目錄如下所示
E:\winlion\gopath\src\techidea8.com\microapp\doc\handlerevent>ls
handlerevent.go

核心程式碼如下

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)
}
  1. 執行服務
>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
  1. 檢視服務狀態
>micro list services
go.micro.api
test1
topic:go.micro.evt.test
  1. 啟動event釋出支援
>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
  1. 測試
>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

rpchander

我們通過--handler=rpc型別選項,實現http到rpc服務之間的對映,rpc型別和api型別比較相似,可以參考apihanlder相關程式碼,rpchander程式碼包為`handlerrpc·

  1. 下載handlerrpc.zip並解壓到%GOPATH%/techidea8.com/microapp/doc/下,解壓後目錄如下所示
E:\winlion\gopath\src\techidea8.com\microapp\doc\handlerrpc>ls
handerapi.go  proto/
  1. 初始化模組
#這一步必須做,否則會報錯`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
  1. 生成proto檔案,請自行替換GOPATH路徑.
>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
  1. 執行
>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
  1. 檢視服務狀態
>micro list services
go.micro.api
go.micro.api.model1
  1. 測試
>curl -H "Content-Type: application/json" -d "{\"arg\": \"Winlion\"}" "http://localhost:8080/model1/model1/action1"
{"data":"接收到資料Winlion"}

rpchandler 和 api handler 的區別在於apihandler 的資料交proto模型在rpc的基礎上再次進行了封裝.

httphander

我們通過--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
  • 啟動api服務
>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

enable_rpc

該作用是開啟rpc 直接訪問支援,設定enable_rpc=true 可以通過如下介面訪問

  • 開啟rpc支援
>>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個網際