1.安裝go-micro
#linux 下
export GO111MODULE=on
export GOPROXY=https://goproxy.io
# windows下設置如下環境變量
setx GO111MODULE on
setx GOPROXY https://goproxy.io
# 使用如下指令安裝
go get -u -v github.com/micro/micro
go get -u -v github.com/micro/go-micro
2.其他安裝方式
# 安裝方式一
export GO111MODULE=on
export GOPROXY=https://goproxy.io
go get -u -v github.com/micro/micro
cd $GOPATH/src/github.com/micro/micro
go build -o micro main.go
sudo cp micro /usr/local/bin/
# 安裝方式二
cd $GOPATH/src/github.com/micro/
git clone https://github.com/micro/micro.git
cd $GOPATH/src/github.com/micro/micro
go build -o micro main.go
sudo cp micro /usr/local/bin/
安裝 go-micro 和protoc-gen-micro
go get -u -v github.com/micro/go-micro
go get github.com/micro/protoc-gen-micro
3.安裝 protoc
sudo apt-get install autoconf automake libtool curl make g++ unzip
# 源碼安裝,下載最新版,目前是 v3.10.1
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.10.1/protobuf-all-3.10.1.tar.gz
tar zxvf protobuf-all-3.10.1.tar.gz
cd protobuf-3.10.1/
./autogen.sh
./configure
make
make install
protoc -h
# 或者
git clone https://github.com/google/protobuf
cd protobuf
./autogen.sh
./configure
make
make check
sudo make install
# 安裝protoc-gen-go
go get -u -v github.com/golang/protobuf/protoc-gen-go
# 生成代碼
protoc --proto_path=$GOPATH/src:. --micro_out=. --go_out=. xxx.proto
3、配置LD_LIBRARY_PATH
新建/etc/ld.so.conf.d/libprotobuf.conf (vim /etc/ld.so.conf.d/libprotobuf.conf ),內容如下:
/usr/local/lib
然后,需要執行命令
sudo ldconfig
添加路徑
# vim /etc/profile
LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
說明:
所需二進制文件:micro、protoc-gen-micro、protoc、
4.生成微服務框架
cd micro-demo
micro new hello/srv --type=srv --alias=hello --namespace=io.github.xxx --gopath=false
//實踐案例:
root@localhost:src/micro-example# micro new --type service micro-example/rpc/srv
Creating service go.micro.service.srv in micro-example/rpc/srv
.
├── main.go
├── generate.go
├── plugin.go
├── handler
│ └── srv.go
├── subscriber
│ └── srv.go
├── proto/srv
│ └── srv.proto
├── Dockerfile
├── Makefile
├── README.md
├── .gitignore
└── go.mod
download protoc zip packages (protoc-$VERSION-$PLATFORM.zip) and install:
visit https://github.com/protocolbuffers/protobuf/releases
download protobuf for micro:
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
go get github.com/micro/micro/v2/cmd/protoc-gen-micro
compile the proto file srv.proto:
cd micro-example/rpc/srv
protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/srv/srv.proto
---------------------------------------------------------------------------------
root@cwj-PC:/usr/workspace/gocode/TestCode/src# micro new --type api micro-example/rpc/api
Creating service go.micro.api.api in micro-example/rpc/api
.
├── main.go
├── generate.go
├── plugin.go
├── client
│ └── api.go
├── handler
│ └── api.go
├── proto/api
│ └── api.proto
├── Makefile
├── Dockerfile
├── README.md
├── .gitignore
└── go.mod
download protoc zip packages (protoc-$VERSION-$PLATFORM.zip) and install:
visit https://github.com/protocolbuffers/protobuf/releases
download protobuf for micro:
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
go get github.com/micro/micro/v2/cmd/protoc-gen-micro
compile the proto file api.proto:
cd micro-example/rpc/api
protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/api/api.proto
----------------------------------------------------------------------------------
root@localhost:src# micro new --type "web" micro-example/rpc/web
Creating service go.micro.web.web in micro-example/rpc/web
.
├── main.go
├── plugin.go
├── handler
│ └── handler.go
├── html
│ └── index.html
├── Dockerfile
├── Makefile
├── README.md
├── .gitignore
└── go.mod
鏈接:https://www.codeleading.com/article/6791963704/
命令說明:
配置指令 作用 默認值 說明
–namespace 服務命令空間 go.micro 可以根據自己的域名定義合適的空間前綴
–type 服務類型 srv 目前支持4種服務類型,分別是api、fnc(function)、srv(service)、web。
–alias 指定別名 聲明則必填 使用單詞,不要帶任何標點符號,名稱對Micro路由機制影響很大
–plugin 使用哪些插件 聲明則必填 需要自選插件時使用
–gopath 是否使用GOPATH作為代碼路徑 true或者false 使用go modules 可以設置為false
–fqdn 服務定義域,API需要通過該域找到服務 默認是使用服務的命令空間加上類型再加上別名 服務定義域
5.創建一個服務
//創建一個新的服務對象實例
service := micro.NewService(
micro.Name("helloservice"),
micro.Version("v1.0.0"),
)
6.編寫proto文件,生成go文件
protoc --go_out=plugins=micro:. message.proto
protoc --proto_path=./:. --micro_out=. --go_out=. ./message.proto
protoc參數說明:
--proto_path - proto文件目錄
--micro_out - 生成的micro源碼保存目錄
--go_out - 生成的go源碼保存目錄
proto/xxx.proto - 最后面的參數就是我們要編譯的proto文件
// 生成protoc 文檔
(1.)下載protoc-gen-doc二進制到/usr/local/bin目錄
go get -u github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc
(2.)生成proto文件時加入下面的參數
--doc_out=./doc --doc_opt=html,index.html
7.錯誤記錄
(1.)缺乏包路徑
2020/04/26 16:33:39 WARNING: Missing 'go_package' option in "hello.proto", please specify:
option go_package = ".;protoes";
A future release of protoc-gen-go will require this be specified.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.
解決辦法:
//package message; //注釋掉包
option go_package = ".;protoes"; //新增該行
參考:https://learnku.com/articles/43758
8.服務啟動后,測試
(1.)命令行測試
micro call 服務名 接口 參數
說明:服務名是我們啟動微服務定義的唯一標識,接口的格式是:proto文件定義的service名字 + rpc接口名
使用示例:
micro call go.micro.api.orderservice OrderSrv.GetOrder '{"id":1}'
(2.)web界面測試
// 啟動web
micro web
//訪問localhost:8082
9.基於consul/etcd的服務注冊
MICRO_REGISTRY=consul \
MICRO_REGISTRY_ADDRESS=127.0.0.1:8500 \
go run orderservice.go
MICRO_REGISTRY - 注冊中心類型,這里設置為consul
MICRO_REGISTRY_ADDRESS - 注冊中心地址, IP + PORT的形式
---------------------------------------------------------
MICRO_REGISTRY= etcd \
MICRO_REGISTRY_ADDRESS=127.0.0.1:2379 \
go run orderservice.go
MICRO_REGISTRY - 注冊中心類型,這里設置為etcd
MICRO_REGISTRY_ADDRESS - 注冊中心地址, IP + PORT的形式
10.API網關示例
(1.)反向代理的方式
1.下載代碼
git clone https://github.com/micro/examples
2.切換到例子源碼根目錄
cd examples
3. 啟動基礎服務
go run greeter/srv/main.go
4. 新打開一個命令窗口,啟動api服務,這就是我們說的聚合服務
go run greeter/api/api.go
5. 新打開一個命令窗口,啟動go micro api網關
micro api --handler=api
6.測試網關API
curl "http://localhost:8080/greeter/say/hello?name=John"
{"message":"Hello John"} // 輸出結果
(2.)Restful方式
安裝go-restful庫來實現RESTful風格的路徑映射,從而實現HTTP的WEB API服務
go get github.com/emicklei/go-restful
(3.)Rest映射
type Student struct {
}
var (
cli proto.StudentService
)
func (s *Student) GetStudent(req *restful.Request, rsp *restful.Response) {
name := req.PathParameter("name")
fmt.Println(name)
response, err := cli.GetStudent(context.TODO(), &proto.Request{
Name: name,
})
if err != nil {
fmt.Println(err.Error())
rsp.WriteError(500, err)
}
rsp.WriteEntity(response)
}
func main() {
service := web.NewService(
web.Name("go.micro.api.student"),
)
service.Init()
cli = proto.NewStudentService("go.micro.srv.student", client.DefaultClient)
student := new(Student)
ws := new(restful.WebService)
ws.Path("/student")
ws.Consumes(restful.MIME_XML, restful.MIME_JSON)
ws.Produces(restful.MIME_JSON, restful.MIME_XML)
ws.Route(ws.GET("/{name}").To(student.GetStudent))
wc := restful.NewContainer()
wc.Add(ws)
service.Handle("/", wc)
if err := service.Run(); err != nil {
log.Fatal(err)
}
}
參考鏈接:
https://www.qfgolang.com/?special=go-microweifuwukuangjia&pid=2620
11.micro web后台
1.啟動web后台
micro web
通過http://localhost:8082訪問后台
2.使用注冊中心啟動web后台
MICRO_REGISTRY=consul \
MICRO_REGISTRY_ADDRESS=127.0.0.1:8500 \
micro web
12.micro實現發布訂閱模式
(1.)消息組件初始化
...
server := micro.NewService(
micro.Name("go.micro.srv"),
micro.Version("latest"),
micro.Broker(mqtt.NewBroker()),
)
...
(2.)消息訂閱
pubSub := service.Server().Options().Broker
_, err := pubSub.Subscribe("go.micro.srv.message", func(event broker.Event) error {
var req *message.StudentRequest
if err := json.Unmarshal(event.Message().Body, &req); err != nil {
return err
}
fmt.Println(" 接收到信息:", req)
//去執行其他操作
return nil
})
(3.)消息發布
brok := service.Server().Options().Broker
if err := brok.Connect(); err != nil {
log.Fatal(" broker connection failed, error : ", err.Error())
}
student := &message.Student{Name: "davie", Classes: "軟件工程專業", Grade: 80, Phone: "12345678901"}
msgBody, err := json.Marshal(student)
if err != nil {
log.Fatal(err.Error())
}
msg := &broker.Message{
Header: map[string]string{
"name": student.Name,
},
Body: msgBody,
}
err = brok.Publish("go.micro.srv.message", msg)
if err != nil {
log.Fatal(" 消息發布失敗:%s\n", err.Error())
} else {
log.Print("消息發布成功")
}
相關鏈接
https://www.qfgolang.com/?special=go-microweifuwukuangjia
http://entere.github.io/2019/10/29/go-micro微服務教程一:搭建go-micro運行環境/
https://songyuchao.cn/blog/protobuf-for-go-micro/
https://www.tizi365.com/archives/486.html