Microservice-微服務-micro/v2-consul-protobuf-RPC-ubuntu
- 1.升級至micro/v2
- 2.consul
- 3.service
- 1.創建目錄,剝離pb.go文件
- 2.service創建
- 3.修改.proto文件
- 4.進行編譯.proto
- 5.go mod init [*.pb.go目錄]
- 6.go mod why
- 7.修改go.mod 文件
- 8.go mod tidy
- 9.go mod verify
- 10.go mod graph【選擇性操作】
- 11.修改main.go
- 12.go.mod
- 13.啓動service
- 4.web
- 1.web創建
- 2.go mod why
- 3.修改go.mod文件
- 4.go mod tidy
- 5.go mod verify
- 6.go mod graph【選擇性操作】
- 7.修改main.go
- 8.修改handler/handler.go
- 9.go.mod
- 10.啓動web
- 5.訪問
1.升級至micro/v2
1.刪除原來的go mod 所在目錄
cd $GOPATH/pkg
sudo rm -rf *
ls
2.下載protobuf
go get -u -v github.com/golang/protobuf@latest
ls -la $GOPATH/bin | grep protoc-gen-go
3.下載micro/v2
由於網絡原因,需要多執行幾次
go get -u -v github.com/micro/micro/v2
最後會有如下錯誤,是由於go.mod的異常導致的,可以暫時不管
go get: github.com/mholt/[email protected] updating to
github.com/mholt/[email protected]: parsing go.mod:
module declares its path as: github.com/caddyserver/certmagic
but was required as: github.com/mholt/certmagic
4.編譯安裝micro/v2
cd $GOPATH/pkg/mod/github.com/micro/micro/v2*
# explain why packages or modules are needed(解釋爲什麼需要依賴)
go mod why
# add missing and remove unused modules(拉取缺少的模塊,移除不用的模塊)
go mod tidy
# verify dependencies have expected content (驗證依賴是否正確)
go mod verify
sudo $GOROOT/bin/go build -o /bin/micro main.go
5.查看版本
cd ~
micro --version
2.consul
爲了方便訪問,指定IP
ifconfig
consul agent -dev -client=192.168.56.14
3.service
1.創建目錄,剝離pb.go文件
mkdir -p $GOPATH/src/www/kokutas/com/pb
2.service創建
創建service【srv】服務,並自定義命名空間www.kokutas.com【默認是go.micro】
1.服務名稱的最後一級不要使用下劃線,否則生成的handler/最後一級目錄名.go中的服務還要做修改,【protobuf生成的時候的服務命名規則問題】
2.type的類型不再是之前的srv,而是service
3.默認爲當前路徑創建,不再使用$GOPATH的路徑,如果需要的話,需要自行先進入$GOPATH路徑
cd $GOPATH/src
micro new --type service --namespace www.kokutas.com www/kokutas/com/user
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
go get -u github.com/micro/protoc-gen-micro/v2
3.修改.proto文件
修改$GOPATH/src/www/kokutas/com/user/proto/user/user.proto不然老是編譯的時候提示警告信息
package www.kokutas.com.service.user;
option go_package = "proto/user;www_kokutas_com_service_user";
4.進行編譯.proto
cd $GOPATH/src
cd www/kokutas/com/user
tree $GOPATH/src/www/kokutas/com/
protoc --proto_path=.:$GOPATH/src --go_out=$GOPATH/src/www/kokutas/com/pb --micro_out=$GOPATH/src/www/kokutas/com/pb proto/user/user.proto
5.go mod init [*.pb.go目錄]
方便後續導包異常的處理【將proto文件從本地導入(pb.go文件所在目錄)】
tree $GOPATH/src/www/kokutas/com
cd $GOPATH/src/www/kokutas/com/pb/proto/user/ && go mod init www/kokutas/com/pb/proto/user && cd $GOPATH/src/www/kokutas/com/user
6.go mod why
explain why packages or modules are needed(解釋爲什麼需要依賴)
cd $GOPATH/src/www/kokutas/com/user
go mod why
www/kokutas/com/user imports
www/kokutas/com/user/proto/user: package www/kokutas/com/user/proto/user is not in GOROOT (/usr/local/go/src/www/kokutas/com/user/proto/user)
7.修改go.mod 文件
修改$GOPATH/src/www/kokutas/com/user下的go.mod 文件
追加【本地只能是相對路徑(=>後面的部分必須是相對路徑),換行符不要動】
cd $GOPATH/src/www/kokutas/com/user
tee -a $GOPATH/src/www/kokutas/com/user/go.mod <<-'EOF'
// 添加是針對proto文件的本地包導入問題處理:只有這個能被go mod why檢測到
require "www/kokutas/com/user/proto/user" v0.0.0
replace "www/kokutas/com/user/proto/user" => "../pb/proto/user"
// 解決go get -u -v github.com/micro/micro/v2的問題:
// module declares its path as: github.com/caddyserver/certmagic
// but was required as: github.com/mholt/certmagic
replace github.com/mholt/certmagic => github.com/caddyserver/certmagic latest
EOF
再次執行
go mod why
8.go mod tidy
add missing and remove unused modules(拉取缺少的模塊,移除不用的模塊)
cd $GOPATH/src/www/kokutas/com/user
go mod tidy
9.go mod verify
verify dependencies have expected content (驗證依賴是否正確)
cd $GOPATH/src/www/kokutas/com/user
go mod verify
10.go mod graph【選擇性操作】
print module requirement graph (打印模塊依賴圖)
cd $GOPATH/src/www/kokutas/com/user
go mod graph
11.修改main.go
修改的是$GOPATH/src/www/kokutas/com/user/main.go
package main
import (
"www/kokutas/com/user/handler"
"www/kokutas/com/user/subscriber"
"github.com/micro/go-micro/v2"
log "github.com/micro/go-micro/v2/logger"
"github.com/micro/go-micro/v2/registry"
user "www/kokutas/com/user/proto/user"
// 添加註冊插件的consul支持
"github.com/micro/go-plugins/registry/consul/v2"
)
func main() {
// 新建consul註冊器
consulReg := consul.NewRegistry(
// 註冊的consul信息
registry.Addrs("192.168.56.14:8500"),
)
// New Service
service := micro.NewService(
micro.Name("www.kokutas.com.service.user"),
micro.Version("latest"),
// 服務添加consul支持
micro.Registry(consulReg),
)
// Initialise service
service.Init()
// Register Handler
user.RegisterUserHandler(service.Server(), new(handler.User))
// Register Struct as Subscriber
micro.RegisterSubscriber("www.kokutas.com.service.user", service.Server(), new(subscriber.User))
// Run service
if err := service.Run(); err != nil {
log.Fatal(err)
}
}
12.go.mod
$GOPATH/src/www/kokutas/com/user/go.mod
module www/kokutas/com/user
go 1.14
require github.com/micro/go-micro/v2 v2.5.0
require (
github.com/micro/go-micro v1.18.0 // indirect
github.com/micro/go-plugins/registry/consul/v2 v2.5.0 // indirect
google.golang.org/protobuf v1.21.0 // indirect
// 添加是針對proto文件的本地包導入問題處理:只有這個能被go mod why檢測到
www/kokutas/com/user/proto/user v0.0.0
)
replace www/kokutas/com/user/proto/user => ../pb/proto/user
// 解決go get -u -v github.com/micro/micro/v2的問題:
// module declares its path as: github.com/caddyserver/certmagic
// but was required as: github.com/mholt/certmagic
replace github.com/mholt/certmagic => github.com/caddyserver/certmagic v0.10.12
13.啓動service
cd $GOPATH/src/www/kokutas/com/user
go run main.go --registry=consul
micro/v2 默認就是grpc進行service的監聽
4.web
1.web創建
新開一個終端,創建client【web】服務,並自定義命名空間www.kokutas.com【默認是go.micro】
cd $GOPATH/src
micro new --type web --namespace www.kokutas.com www/kokutas/com/web
2.go mod why
explain why packages or modules are needed(解釋爲什麼需要依賴)
cd $GOPATH/src
cd www/kokutas/com/web
go mod why
go: finding module for package github.com/micro/go-micro/v2/logger
go: finding module for package github.com/micro/go-micro/v2/client
go: finding module for package github.com/micro/go-micro/v2/web
go: found github.com/micro/go-micro/v2/logger in github.com/micro/go-micro/v2 v2.5.0
www/kokutas/com/web/handler imports
path/to/service/proto/web: package path/to/service/proto/web is not in GOROOT (/usr/local/go/src/path/to/service/proto/web)
3.修改go.mod文件
修改$GOPATH/src/www/kokutas/com/web下的go.mod 文件
追加【本地只能是相對路徑(=>後面的部分必須是相對路徑),換行符不要動】
tee -a $GOPATH/src/www/kokutas/com/web/go.mod <<-'EOF'
// 添加是針對proto文件的本地包導入問題處理:只有這個能被go mod why檢測到
require "path/to/service/proto/web" v0.0.0
replace "path/to/service/proto/web" => "../pb/proto/user"
// 解決go get -u -v github.com/micro/micro/v2的問題:
// module declares its path as: github.com/caddyserver/certmagic
// but was required as: github.com/mholt/certmagic
replace github.com/mholt/certmagic => github.com/caddyserver/certmagic latest
EOF
再次執行
go mod why
4.go mod tidy
add missing and remove unused modules(拉取缺少的模塊,移除不用的模塊)
cd $GOPATH/src/www/kokutas/com/web
go mod tidy
5.go mod verify
verify dependencies have expected content (驗證依賴是否正確)
cd $GOPATH/src/www/kokutas/com/web
go mod verify
6.go mod graph【選擇性操作】
print module requirement graph (打印模塊依賴圖)
cd $GOPATH/src/www/kokutas/com/web
go mod graph
7.修改main.go
修改的是$GOPATH/src/www/kokutas/com/web/main.go
package main
import (
"net/http"
"www/kokutas/com/web/handler"
log "github.com/micro/go-micro/v2/logger"
"github.com/micro/go-micro/v2/web"
// 添加註冊插件的consul支持
"github.com/micro/go-micro/v2/registry"
"github.com/micro/go-plugins/registry/consul/v2"
)
func main() {
// 新建consul註冊器
consulReg := consul.NewRegistry(
// 註冊的consul信息
registry.Addrs("192.168.56.14:8500"),
)
// create new web service
service := web.NewService(
web.Name("www.kokutas.com.web.web"),
web.Version("latest"),
web.Address("192.168.56.14:8080"),
web.Registry(consulReg),
)
// initialise service
if err := service.Init(); err != nil {
log.Fatal(err)
}
// register html handler
service.Handle("/", http.FileServer(http.Dir("html")))
// register call handler
service.HandleFunc("/web/call", handler.WebCall)
// run service
if err := service.Run(); err != nil {
log.Fatal(err)
}
}
8.修改handler/handler.go
修改$GOPATH/src/www/kokutas/com/web/handler/handler.go
package handler
import (
"context"
"encoding/json"
"net/http"
"time"
web "path/to/service/proto/web"
"github.com/micro/go-micro/v2/client"
)
func WebCall(w http.ResponseWriter, r *http.Request) {
// decode the incoming request as json
var request map[string]interface{}
if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
http.Error(w, err.Error(), 500)
return
}
// call the backend service
// NewUserService和www.kokutas.com.service.user要與proto/user.pb.go中的一致
webClient := web.NewUserService("www.kokutas.com.service.user", client.DefaultClient)
rsp, err := webClient.Call(context.TODO(), &web.Request{
Name: request["name"].(string),
})
if err != nil {
http.Error(w, err.Error(), 500)
return
}
// we want to augment the response
response := map[string]interface{}{
"msg": rsp.Msg,
"ref": time.Now().UnixNano(),
}
// encode and write the response as json
if err := json.NewEncoder(w).Encode(response); err != nil {
http.Error(w, err.Error(), 500)
return
}
}
9.go.mod
$GOPATH/src/www/kokutas/com/web/go.mod
module www/kokutas/com/web
go 1.14
require github.com/micro/go-micro/v2 v2.5.0
require (
github.com/micro/go-plugins/registry/consul/v2 v2.5.0 // indirect
google.golang.org/protobuf v1.21.0 // indirect
// 添加是針對proto文件的本地包導入問題處理:只有這個能被go mod why檢測到
path/to/service/proto/web v0.0.0
)
replace path/to/service/proto/web => ../pb/proto/user
// 解決go get -u -v github.com/micro/micro/v2的問題:
// module declares its path as: github.com/caddyserver/certmagic
// but was required as: github.com/mholt/certmagic
replace github.com/mholt/certmagic => github.com/caddyserver/certmagic v0.10.12
10.啓動web
cd $GOPATH/src/www/kokutas/com/web/
go run main.go --registry=consul
5.訪問
1.consul web訪問
瀏覽器打開:
http://192.168.56.14:8500
2.web service 訪問
http://192.168.56.14:8080