go-micro微服務框架使用--golang

 

go-micro的簡介:

可插入RPC分佈式系統開發的框架,支持json,proto -rpc的編碼方式,可使用consul或者其它方式的服務發現,默認是consul提供隨機散列的負載均衡。

     1.服務發現  2.編碼解碼 3.服務端,客戶端 4.發佈訂閱消息

 

以下是詳情說明下:

1.安裝 micro install

$ go get -u github.com/micro/micro

提示缺少golang/net ,text,tools,crypto, hashicorp/consul幾個包,一般情況下是需要去github上把這些缺少的包都下全,micro才被安裝成功

go get : 其實是go命令的下載與安裝兩步合併,

-u : 只更新已有的代碼包

-v: 顯示更新過程

2.首次如何使用micro,第一次可以利用micro命令自動生成一個模板srv工程(業務服務模塊),也可以自己新建

$ micro new  example 

(默認爲生成名爲example的srv服務)

        —type “api” 

        —type “web”

        —type “srv”  

到此已經生成一個工程,工程下面包含一個proto文件夾,下面做詳情說明

3.protoc 說明:

micro 依賴google的protobuf,這裏要熟悉protoc的命令使用

$ protoc --proto_path=. --micro_out=. --go_out=.  ./greeter/greeter.proto

--proto_path等同於-I選項:

-IPATH, --proto_path=PATH  

Specify the directory in which to search for   imports.  May be specified multiple times;  directories will be searched in order.  If not  given, the current working directory is used.

--go_out : 生成.go文件後要存放的路徑(這裏應該是和.proto文件放在同一路徑)

./greeter/greeter.proto : 這是我的.proto文件所在位置

報錯:

--micro_out: protoc-gen-micro: 系統找不到指定的文件

提示下面protoc相關依賴包

$ go get github.com/micro/protoc-gen-micro

--go_out: protoc-gen-go: 系統找不到指定的文件。

$ go get -u github.com/golang/protobuf/protoc-gen-go

下載完成之後,再次運行以上命令

$ protoc --proto_path=. --micro_out=. --go_out=.  ./greeter/greeter.proto

protoc-gen-micro: program not found or is not executable

--micro_out: protoc-gen-micro: Plugin failed with status code 1.

 

需要通過如下方式解決

$ protoc \
--plugin=protoc-gen-go=${GOPATH}/bin/protoc-gen-go \
--plugin=protoc-gen-micro=${GOPATH}/bin/protoc-gen-micro \
--proto_path=${GOPATH}/src:. \
--micro_out=. --go_out=. \
proto/*.proto

運行make後再對應目錄下生成這兩個文件

生成example.micro.go

生成example.pb.go

protobuf使用介紹得差不多,後面要把服務跑起來

運行micro

直接go run main.go即可,把服務端的代碼跑起來

package main

import (
    "context"
    "fmt"
    micro "github.com/micro/go-micro"
    proto "../greeter"
)

type Greeter struct{}

func (g *Greeter) Call(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloResponse) error {
        fmt.Println("11")
        rsp.Greeting = "Hello " + req.Name
        return nil
}

func main() {

    // Create a new service. Optionally include some options here.
        service := micro.NewService(
        micro.Name("greeter"),
    )
    // Init will parse the command line flags.
    service.Init()
// Register handler
    proto.RegisterGreeterHandler(service.Server(), new(Greeter))
// Run the server
    if err := service.Run(); err != nil {
        fmt.Println(err)
    }
}

傳參方式 : 1.可以在創建時傳入 (構造的方式)  2.可以用命令行方式 (micro.Flags() ) 與go原生接收命令行參數相同

  如何調用服務端代碼

方式一客戶端調用(再跑一個相同的服務,main.go文件改成以下方式)

通過protobuf方式進行調用,跨語言

package main
import (
    "context"
    "fmt"
    proto "../greeter"
    "github.com/micro/go-micro"
)
func main() {
    // Create a new service. Optionally include some options here.
    service := micro.NewService(micro.Name("greeter.client"))
    service.Init()
// Create new greeter client
    greeter := proto.NewGreeterService("greeter", service.Client())
// Call the greeter,通過protobuf生成的函數進行調用其它微服務

    rsp, err := greeter.Hello(context.TODO(), &proto.HelloRequest{Name: "John"})
    if err != nil {
        fmt.Println(err)
    }
    // Print response
    fmt.Println(rsp.Greeting)
}

方式二

以上啓動的srv服務都是不能被http直接調用,需要再啓動micro api 

$ micro api 

通過http調用  http://localhost:8080/rpc

{ "service": "go.exb",  "method": "Example.Call", "request": {"name": "John”} }

也可以通過micro call命令調用服務

$ ./micro call go.exa Example.Call '{"name": "John”}'

go.exb  : namespace

Example.Call : 服務端代碼實現的接口

 

如果需要使用consul的話,可以用以下方式起動集羣或者單機調式

consul 集羣啓動

$ ./consul agent -server -bootstrap-expect 2 -data-dir=data \
-node=n1 -bind=192.168.0.240 -client=0.0.0.0 &

$ ./consul join 192.168.0.112
$ ./consul join 192.168.0.122

consul 單機啓動

$ ./consul agent -dev -client 0.0.0.0 -ui

agent 運行一個consul agent

join 將agent加入到consul集羣

連接遠程consul

--registry_address=127.0.0.1:8500 爲遠程註冊中心地址與端口

$ go run .\service.go --registry_address=127.0.0.1:8500

$ go run client.go --registry_address=127.0.0.1:8500

 

最後奉上最重要的就是文檔  micro官方文檔  ,   golang相關micro doc

總結的正確姿勢:

a.安裝micro:具體步驟下面都有了,go get 下載報錯,請自行github下載到gopath下面即可

b.可以使用micro new <工程名> 生成模板,工程目錄下Makefile 和dockerfile都已經配置好了,如果使用模板請忽略下面手寫的代碼

c.使用make build && make run  執行makefile文件裏面命令

d.make命令沒有報錯的話,這時工程就可以運行了,可以用go run main.go 把工程跑起來

e.使用用micro list serivces 查看是否運行成功

f.使用 micro call 調用微服務

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章