首頁 > 後端開發 > Golang > 主體

如何建構go-micro開發環境

藏色散人
發布: 2020-08-12 13:58:50
轉載
3001 人瀏覽過
##Golang教學

專欄為大家介紹於搭建go-micro#》以下由Golang教程幫助!

如何建構go-micro開發環境

最近因為要用到 go-micro,所以在學習微服務相關的內容,這篇是記錄 micro 的建構過程。

安裝環境

micro 提供了一個 runtime,在使用 go-micro 之前需要先安裝它。有以下幾種方式安裝

go get github.com/micro/micro/v2
登入後複製

這種方式我裝不上,不是網路的原因,不知道哪裡有衝突。 。 。

docker
docker pull micro/micro
登入後複製

##
# MacOS
curl -fsSL https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh | /bin/bash

# Linux
wget -q  https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh -O - | /bin/bash

# Windows
powershell -Command "iwr -useb https://raw.githubusercontent.com/micro/micro/master/scripts/install.ps1 | iex"
登入後複製

推薦使用這種方式下載安裝,把編譯好的二進位包加入到環境變數就能直接使用了。不想用腳本安裝可以在 github 的 release 頁面下載

https://github.com/micro/micro/releases
登入後複製

#測試一下

現在已經安裝好 micro 了,測試一下。

micro web
登入後複製
登入後複製

輸出

$ micro web2020-07-05 04:24:16  file=http/http.go:90 level=info service=web HTTP API Listening on [::]:80822020-07-05 04:24:16  file=v2@v2.9.1/service.go:200 level=info service=web Starting [service] go.micro.web2020-07-05 04:24:16  file=grpc/grpc.go:864 level=info service=web Server [grpc] Listening on [::]:264492020-07-05 04:24:16  file=grpc/grpc.go:697 level=info service=web Registry [mdns] Registering node: go.micro.web-b76a12a1-5226-429f-9633-ce304f179657
登入後複製

現在造訪

localhost:8082 就可以查看 micro 的 web 頁面了。

安裝 protoc

protoc 是 protobuf 的編譯器,而 protobuf 是用來傳輸資料的格式,類似 json、xml 這些。

protoc 下載位址

https://github.com/protocolbuffers/protobuf/releases
登入後複製

下載好之後,bin 資料夾中有個 protoc 的可執行文件,把這個也加入到環境變數。 (可以直接把它放到已經添加了環境變量的資料夾下就可以了,可以避免電腦裡寫滿了各種環境變量,並且常用工具放到一個資料夾也方便管理)

#推薦:《

go語言

還有個protoc-gen-go 也需要放進去,可以用下面的方式下載。

go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
登入後複製

example

現在讓我們寫一個 demo 來練習一下。

一共有三個文件,

server.goclient.gogreeter.proto

#greeter.proto

syntax = "proto3";package protos;service Greeter {
    rpc Hello (Request) returns (Response){};}message Request {
    string name = 1;}message Response {
    string greeting = 2;}
登入後複製

server.go

package mainimport (
    "context"
    "fmt"
    "github.com/micro/go-micro/v2")type Greeter struct {}func (g *Greeter) Hello(context context.Context, req *Request, rsp *Response) error {
    rsp.Greeting = "Hello " + req.Name    return nil}func main() {
    service := micro.NewService(
        micro.Name("greeter"),
    )
    service.Init()

    err := RegisterGreeterHandler(service.Server(), new(Greeter))
    if err != nil {
        fmt.Println(err)
    }

    if err := service.Run(); err != nil {
        fmt.Println(err)
    }}
登入後複製

client.go

package mainimport (
    "context"
    "fmt"
    "github.com/micro/go-micro/v2")func main() {
    service := micro.NewService(micro.Name("greeter.client"))
    service.Init()

    greeter := NewGreeterService("greeter", service.Client())
    rsp, err := greeter.Hello(context.TODO(), &Request{Name: "Zaun pianist"})
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(rsp.Greeting)}
登入後複製
#強烈建議使用go mod 來管理依賴,專案更新速度很快,百度上的許多教學都不行了,安裝過程各種錯誤

這是我的mod 檔
module hello

go 1.14require (
    github.com/golang/protobuf v1.4.0
    github.com/micro/go-micro/v2 v2.9.1
    google.golang.org/protobuf v1.22.0)
登入後複製

注意,我的greeter.proto 和server.go、client.go 檔案是放在同一個資料夾下面的

編譯greeter.proto##
protoc --micro_out=. --go_out=. greeter.proto
登入後複製

編譯完成之後,會產生兩個go 原始碼檔:

  • greeter.pb.go
  • greeter.pb.micro .go

執行

現在可以執行server 了,這裡因為client 和server 是放在同一個資料夾,也就是同一個套件中,兩個都有main 函數,所以不能用go run ./,至於為什麼要加上另外兩個,這個是go 語言編譯器的要求,必須要指明編譯所需要用到的文件。

go run server.go greeter.pb.go greeter.pb.micro.go
登入後複製

可以用micro 查看目前正在執行的微服務

micro list services
登入後複製

也可以在web 端查看

micro web
登入後複製
登入後複製

如果沒有出錯,這個時候是可以看到服務已經註冊成功了。

$ micro list services
go.micro.web
greeter
登入後複製

測試

現在可以執行客戶端來測試一下了

go run client.go greeter.pb.go greeter.pb.micro.go
登入後複製

我在測試的時候出了問題,服務已經註冊好了,但是client 去呼叫的時候,缺少回傳了

{"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]
登入後複製

檢查一下服務的資訊

micro get service greeter
登入後複製
$ micro get service greeter                                                                                    
service  greeter                                                                                               

version latest                                                                                                 

ID      Address Metadata                                                                                       
greeter-5d86321e-86f2-41a6-8230-f015466bf791    10.198.75.60:51395      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                                                                                        
}
登入後複製

注意看裡面的IP 位址,註冊到了10.198.xx 去了,因此才會報錯? ? ?
因此在註冊服務的時候,指定 IP 位址

go run server.go greeter.pb.go greeter.pb.micro.go --server_address=localhost:8888
登入後複製

這時候再用 client 呼叫就不會出錯了。

$ go run client.go greeter.pb.go greeter.pb.micro.go
Hello Zaun pianist
登入後複製

以上是如何建構go-micro開發環境的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!