go-micro講解--Go Micro編寫微服務

後開啟撒打發了發表於2018-07-07

一、什麼是go-micro

  •  Go Micro是一個外掛化的基礎框架,基於此可以構建微服務。Micro的設計哲學是『可插拔』的外掛化架構。在架構之外,它預設實現了consul作為服務發現,通過http進行通訊,通過protobuf和json進行編解碼。我們一步步深入下去。

Go Micro是:

  • 一個用Golang編寫的包
  • 一系列外掛化的介面定義
  • 基於RPc
  • Go Micro為下面的模組定義了介面:
  1. 服務發現
  2. 編解碼
  3. 服務端、客戶端
  4. 訂閱、釋出訊息

二、使用go-micro編寫微服務

安裝protoc

1.github上下載一個cpp包:https://github.com/google/protobuf/releases make make install安裝即可
2.protoc-gen-go
go get -u github.com/golang/protobuf/protoc-gen-go
3.安裝protoc-gen-micro
go get github.com/micro/protoc-gen-micro

安裝Consul

micro預設使用consul作為微服務發現

Consul is used as the default service discovery system.

Discovery is pluggable. Find plugins for etcd, kubernetes, zookeeper and more in the micro/go-plugins repo.

https://www.consul.io/intro/getting-started/install.html

啟動cansul方式參考如下:注意修改自己-data-dir目錄路勁

consul agent -server  -node chenxun-server -bind=192.168.199.62  -data-dir D:\工作檔案備份\consul_1.0.0_windows_amd64\tmp1  -ui

#  consul agent -server -bootstrap-expect 1 -node chenxun-server -bind=192.168.199.62 -data-dir c:/tmp

# ./consul agent -server -bootstrap-expect 1  -data-dir /tmp/consul -node=chenxun-server -bind=192.168.145.130 -ui

準備proto檔案: 檔案儲存為chenxun.proto,名稱隨便寫,在實際專案中根據專案寫就好了

chenxun.proto

syntax = "proto3";

service Greeter {
	rpc Hello(HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
	string name = 1;
}

message HelloResponse {
	string greeting = 2;
}

Generate the proto:

protoc --proto_path=$GOPATH/src:. --micro_out=. --go_out=. chenxun.proto

執行命令後能看到下面檔案:

-rw-r--r--.  1 root  root      2441 Jul  7 10:38 chenxun.micro.go
-rw-r--r--.  1 root  root      2914 Jul  7 10:38 chenxun.pb.go
-rw-r--r--.  1 root  root       185 Jul  6 11:36 chenxun.proto

比如我把這三個檔案放在gopath路勁下面的src目錄下面的mygoproject/gomirco

那麼在import的時候寫: import "mygoproject/gomirco"

Service端程式碼:

package main

import (
	"context"
	"fmt"

	micro "github.com/micro/go-micro"
	proto "mygoproject/gomirco" //這裡寫你的proto檔案放置路勁
)

type Greeter struct{}

func (g *Greeter) Hello(ctx context.Context, req *proto.HelloRequest, rsp *proto.HelloResponse) 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端程式碼:

package main

import (
	"context"
	"fmt"

	micro "github.com/micro/go-micro"
	proto "mygoproject/gomirco" //這裡寫你的proto檔案放置路勁
)


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
	rsp, err := greeter.Hello(context.TODO(), &proto.HelloRequest{Name: "John"})
	if err != nil {
		fmt.Println(err)
	}

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

執行service:

go run examples/service/main.go

執行client:

go run examples/client/main.go

相關文章