天天看點

go-micro入門

安裝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的例子。

  1. 建立項目
    go-micro入門
    項目目錄裡會出現go.mod檔案
  2. 建立main.go檔案,把以下代碼拷貝進去。
package main
import (
	"github.com/micro/go-micro"
)
func main()  {
}
           
  1. 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 服務
           
  1. 因為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

go-micro入門

表示服務啟動成功

6.運作hello用戶端

go run main.go --run_client

go-micro入門