安裝go-micro
1.安裝服務發現能力,docker安裝consul
docker run -d --net=host -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name consul_server consul agent -server -bind=192.168.0.111 -bootstrap-expect=1 -node=node1 -client 0.0.0.0 -ui
輸入http://192.168.0.111:8500 能看到consul的UI頁面表示正常啟動
基礎知識
go的包管理工具一直被人诟病。不像PHP的composer和node的npm那樣好使。
https://segmentfault.com/a/1190000018389353?utm_source=tag-newest
go1.5版本之前沒有包管理,都是基于GOPATH來進行依賴庫管理的。
于是從 Golang1.5 開始推出 vendor 檔案夾機制。
從 Golang1.6 正式開啟這個功能。
Golang 1.11 開始, 實驗性出現了可以不用定義 GOPATH 的功能,且官方有 go mod 支援。Golang 1.12 更是将此特征正式化。
也就是go mod 以後是主流,官方加持buff
配置go mod 代理
在國内拉go的包真的費勁。這個一定要配。
http://goproxy.io/
在goland裡配置
可以參考下面建立vgo項目時直接配置上Proxy。
配置完如果沒有生效的話,重新開機goland即可
Hello World
請記住我們腦子裡隻有go mod 這一個包管理工具。
以下為使用goland建立hello world的例子。
- 建立項目 項目目錄裡會出現go.mod檔案
- 建立main.go檔案,把以下代碼拷貝進去。
package main
import (
"github.com/micro/go-micro"
)
func main() {
}
-
import那裡肯定報紅,按alt+enter,選擇sync package 同步包的操作。
就會把依賴的包下載下傳到GOPATH/pkg/mod裡,也會在項目的External Libraries的Go Modules裡建立索引。
同步完包以後就不會報紅了。根目錄下會生成go.sum檔案。
也可以檢視go.mod,檢視項目的依賴關系。
以上步驟就是利用go mod來管理項目包依賴的。
建立項目就相當于在非GOPATH路徑下建立一個項目檔案夾,執行了 go mod init hello指令
同步包操作相當于執行了 go mod download指令
還有一些有用的 go mod tidy 删除沒有用的依賴,增加新的依賴關系
接下來我們來建立go micro的hello 服務
-
因為go micro 使用了Google Protocol Buffer( 簡稱 Protobuf),安裝protobuf、
https://github.com/protocolbuffers/protobuf/releases
在這裡找到适合自己平台的版本。
win下記得加入系統path裡。
Protocol Buffers 是一種輕便高效的結構化資料存儲格式,可以用于結構化資料串行化,或者說序列化。它很适合做資料存儲或 RPC 資料交換格式。可用于通訊協定、資料存儲等領域的語言無關、平台無關、可擴充的序列化結構資料格式。目前提供了 C++、Java、Python 三種語言的 API。
同時在指令行裡輸入以下指令,分别安裝protoc-gen-micro和protobuf/protoc-gen-go
go install github.com/micro/protoc-gen-micro
go install github.com/golang/protobuf/protoc-gen-go
2.在項目根目錄建立proto目錄,裡面建立hello.proto檔案
syntax = "proto3";
service Hello {
rpc Hello(HelloRequest) returns (HelloResponse) {}
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string greeting = 2;
}
3.進入proto目錄,執行指令
protoc --micro_out=. --go_out=. hello.proto
自動生成代碼。
4.修改main.go代碼,複制以下代碼
package main
import (
"context"
"fmt"
"github.com/micro/cli"
"github.com/micro/go-micro"
"os"
proto "test/proto"
)
type Hello struct {
}
func (g *Hello) Hello(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloResponse) error {
rsp.Greeting = "Hello " + req.Name
return nil
}
func runClient(service micro.Service) {
// Create new greeter client
greeter := proto.NewHelloService("hello", service.Client())
// Call the greeter
rsp, err := greeter.Hello(context.TODO(), &proto.HelloRequest{Name: "John"})
if err != nil {
fmt.Println(err)
return
}
// Print response
fmt.Println(rsp.Greeting)
}
func main() {
service := micro.NewService(
micro.Name("hello"),
micro.Version("latest"),
micro.Metadata(map[string]string{
"type": "helloword",
}),
micro.Flags(cli.BoolFlag{
Name: "run_client",
Usage: "Launch the client",
}),
)
service.Init(
micro.Action(func(c *cli.Context) {
if c.Bool("run_client") {
runClient(service)
os.Exit(0)
}
}),
)
proto.RegisterHelloHandler(service.Server(), new(Hello))
// Run the server
if err := service.Run(); err != nil {
fmt.Println(err)
}
}
5.啟動hello服務
go run main.go
表示服務啟動成功
6.運作hello用戶端
go run main.go --run_client