go micro在win10環境下搭建

環境

操作系統 win10 1909
golang

go1.14.2 windows/amd64

micro [email protected]
protoc protoc-3.12.0-rc-1-win64
consul(可選) consul_1.7.3_windows_amd64

安裝

  • protoc

下載對應版本的安裝包https://github.com/protocolbuffers/protobuf/releases

解壓後隨便找個地方放,把bin目錄地址加到環境變量中。

>protoc --version
libprotoc 3.12.0

  • micro和protoc相關的go插件

#設置mod模式和代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,https://proxy.golang.org,direct

#安裝
go get -u -v github.com/golang/protobuf/protoc-gen-go 
go get -u -v google.golang.org/grpc
#這裏若加-u選項貌似會報錯,就不加了
go get -v github.com/micro/micro/v2
go get -u -v github.com/micro/go-micro/v2
go get -v github.com/micro/micro/v2/cmd/protoc-gen-micro@master

順利安裝完畢後,在$GOPATH/bin下應該會有這仨執行文件

  • consul(可選)

因爲micro v2版本官方棄用consul,默認改用了mdns,生產推薦etcd。參考go-micro v2棄用了consul作爲默認的服務發現

所以裝不裝這個都可以。

https://www.consul.io/downloads.html下載對應版本,網速限制的話可以在這裏https://download.csdn.net/download/HJXINKKL/12428749

解壓後添加路徑到環境變量

>consul -v
Consul v1.7.3

開始創建

  • 目錄結構

│  go.mod
│  go.sum
│
└─helloworld
    ├─message
    │      greeter.pb.go
    │      greeter.pb.micro.go
    │      greeter.proto
    │
    └─services
            client.go
            server.go
  • 初始化項目

在$GOPATH/src下

mkdir microTest
go mod init microTest

  • 定義API 

創建helloworld/message/greeter.proto

syntax = "proto3";

package microTest;
option go_package = "helloworld/message";

service Greeter {
    rpc Hello (Request) returns (Response) {
    }
}

message Request {
    string name = 1;
}

message Response {
    string greeting = 2;
}

microTest下執行protoc命令,就會在helloworld/message/自動生成greeter.pb.go、greeter.pb.micro.go

protoc --micro_out=. --go_out=. helloworld/message/greeter.proto

  • 創建service

創建helloworld/services/server.go文件

package main

import (
    "context"
    "fmt"

    micro "github.com/micro/go-micro/v2"
    proto "microTest/helloworld/message"
)

type Greeter struct{}

func (g *Greeter) Hello(ctx context.Context, req *proto.Request, rsp *proto.Response) error {
    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)
    }
}
  • 創建client

創建helloworld/services/client.go文件

package main

import (
    "context"
    "fmt"

    micro "github.com/micro/go-micro/v2"
    proto "microTest/helloworld/message"
)

func main() {
    // Create a new service
    service := micro.NewService(micro.Name("greeter.client"))
    // Initialise the client and parse command line flags
    service.Init()

    // Create new greeter client
    greeter := proto.NewGreeterService("greeter", service.Client())

    // Call the greeter
    rsp, err := greeter.Hello(context.TODO(), &proto.Request{Name: "John"})
    if err != nil {
        fmt.Println(err)
    }

    // Print response
    fmt.Println(rsp.Greeting)
}

運行服務

  • 啓動server

go run helloworld/services/server.go

  • client請求

go run helloworld/services/client.go

此時,有可能會報錯

{"id":"go.micro.client","code":408,"detail":"context deadline exceeded","status":"Request Timeout"}
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x28 pc=0xeef454]
  • 定位報錯原因

查看服務列表,greeter服務已經啓動了

> micro list services
greeter

查看指定服務信息

micro get service greeter

service  greeter

version latest

ID      Address Metadata
greeter-28a0d7a1-4a26-499d-bd9f-364151021f50    10.0.0.1:57647  broker=http,protocol=grpc,registry=mdns,server=grpc,transport=grpc

Endpoint: Greeter.Hello

Request: {
        message_state MessageState {
                no_unkeyed_literals NoUnkeyedLiterals
                do_not_compare DoNotCompare
                do_not_copy DoNotCopy
                message_info MessageInfo
        }
        int32 int32
        unknown_fields []uint8
        name string
}

Response: {
        message_state MessageState {
                no_unkeyed_literals NoUnkeyedLiterals
                do_not_compare DoNotCompare
                do_not_copy DoNotCopy
                message_info MessageInfo
        }
        int32 int32
        unknown_fields []uint8
        greeting string
}

注意到Address地址爲10.0.0.1:57647,也就是micro註冊到默認網段去了,所以導致服務不可達。

  • 帶指定server_address參數啓動server

go run helloworld/services/server.go --server_address=localhost:8888

  • 再次client請求

go run helloworld/services/client.go

這次返回正常結果

Hello John
  •  再次查看指定服務信息

micro get service greeter

ID      Address Metadata
greeter-f875a030-436a-420d-a29a-a66249d22381    127.0.0.1:8888  protocol=grpc,registry=mdns,server=grpc,transport=grpc,broker=http
  •  服務調用

仿照官網給出的例子

micro call greeter Greeter.Hello '{"name": "John"}' 

不管是PowerShell還是CMD都會報 invalid character 的錯誤。

需要將"進行轉義\",纔可以正常執行,注意PowerShell和CMD的不同

 

使用consul做服務發現

如果非要使用consul的話,就得往client.go和server.go的import中添加

_ "github.com/micro/go-plugins/registry/consul/v2"
  •  啓動Consul agent的開發模式

consul agent -dev

  • 啓動server

go run helloworld/services/server.go --registry=consul --server_address=localhost:8888

  • client請求

go run helloworld/services/client.go --registry=consul 

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