Microservice-微服務-micro/v2-etcd/v3-protobuf-gRPC-ubuntu
更多請參考:
https://micro.mu/docs
1.升級至micro/v2
可以使用官網的獲取最新二進制方式來實現:
# MacOS
curl -fsSL https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh | /bin/bash
# Linux
wget -q https://raw.githubusercontent.com/micro/micro/master/scripts/install.sh -O - | /bin/bash
# Windows
powershell -Command "iwr -useb https://raw.githubusercontent.com/micro/micro/master/scripts/install.ps1 | iex"
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.etcd/v3
1.下載安裝
不建議使用go get 的方式,涉及到新版本的go mod的導包異常問題
1.解決git clone速度慢
sudo cp /etc/hosts /etc/hosts.backup
curl -skX GET 'https://github.com.ipaddress.com/' | grep -oP '<th>IPv4 Addresses</th><td><ul class="comma-separated"><li>.*?</li>'| grep -oP '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'| awk '{print $1" github.com"}'> ~/myhosts
curl -skX GET 'https://fastly.net.ipaddress.com/github.global.ssl.fastly.net' | grep -oP '<th>IPv4 Addresses</th><td><ul class="comma-separated"><li>.*?</li>'| grep -oP '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'| awk '{print $1" github.global.ssl.fastly.net"}'>> ~/myhosts
sudo /bin/bash -c 'cat ~/myhosts>>/etc/hosts'
cat /etc/hosts
sudo service networking restart
rm -f ~/myhosts
2.git clone
cd ~
sudo apt install -y git
git clone https://github.com/etcd-io/etcd.git
3.安裝
cd ~/etcd
go mod tidy
go mod verify
go mod download
go mod vendor
./build
cd bin
sudo cp * /bin/
2.測試
獲取幫助:etcd --help 或者 etcd -h
etcd --version
3.單機啓動etcd v3
# 數據目錄千萬不要創建
# mkdir -p ~/workspace/etcd/data.etcd/
rm -rf ~/workspace/etcd/
# 日誌目錄
rm -rf ~/workspace/etcd/log/
mkdir -p ~/workspace/etcd/log/
etcd --data-dir ~/workspace/etcd/data.etcd/ --listen-client-urls http://127.0.0.1:2379 --advertise-client-urls http://127.0.0.1:2379 & >~/workspace/etcd/log/etcd.log
新開終端etcdctl命令 查看
etcdctl --endpoints 127.0.0.1:2379 endpoint status --write-out="table"
# 或者使用
# ETCDCTL_API=3 etcdctl --endpoints 127.0.0.1:2379 endpoint status --write-out="table"
新開終端查看目前的數據信息
strings ~/workspace/etcd/data.etcd/member/wal/*.wal
3.創建service
1.創建目錄,剝離pb.go文件
mkdir -p $GOPATH/src/www/example/com/pb
2.service創建
創建service【srv】服務,並自定義命名空間www.example.com【默認是go.micro】
1.服務名稱的最後一級不要使用下劃線,否則生成的handler/最後一級目錄名.go中的服務還要做修改,【protobuf生成的時候的服務命名規則問題】
2.type的類型不再是之前的srv,而是service
3.默認爲當前路徑創建,不再使用$GOPATH的路徑,如果需要的話,需要自行先進入$GOPATH路徑
cd $GOPATH/src
micro new --type service --namespace www.example.com www/example/com/user
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
go get -u github.com/micro/protoc-gen-micro/v2
# 解決grpc和protoc版本衝突的問題
go get -u -v github.com/golang/protobuf/[email protected]
3.修改.proto文件
修改的是$GOPATH/src/www/example/com/user/proto/user.proto
package www.example.com.service.user;
option go_package = "proto/user;www_example_com_service_user";
4.進行編譯.proto
使用grpc插件進行編譯
cd $GOPATH/src/www/example/com/user
protoc --proto_path=.:$GOPATH/src --go_out=plugins=grpc:$GOPATH/src/www/example/com/pb --micro_out=plugins=grpc:$GOPATH/src/www/example/com/pb proto/user/user.proto
5.go mod init [*.pb.go目錄]
方便後續導包異常的處理【將proto文件從本地導入(pb.go文件所在目錄)】
tree $GOPATH/src/www/example/com
cd $GOPATH/src/www/example/com/pb/proto/user/ && go mod init www/example/com/pb/proto/user && cd $GOPATH/src/www/example/com/user
6.go mod why
explain why packages or modules are needed(解釋爲什麼需要依賴)
cd $GOPATH/src/www/example/com/user
go mod why
www/example/com/user imports
www/example/com/user/proto/user: package www/example/com/user/proto/user is not in GOROOT (/usr/local/go/src/www/example/com/user/proto/user)
7.修改go.mod 文件
修改$GOPATH/src/www/example/com/user下的go.mod 文件
追加【本地只能是相對路徑(=>後面的部分必須是相對路徑),換行符不要動】
cd $GOPATH/src/www/example/com/user
tee -a $GOPATH/src/www/example/com/user/go.mod <<-'EOF'
// 添加是針對proto文件的本地包導入問題處理:只有這個能被go mod why檢測到
require "www/example/com/user/proto/user" v0.0.0
replace "www/example/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/example/com/user
go mod tidy
9.go mod verify
verify dependencies have expected content (驗證依賴是否正確)
cd $GOPATH/src/www/example/com/user
go mod verify
10.go mod graph【選擇性操作】
print module requirement graph (打印模塊依賴圖)
cd $GOPATH/src/www/example/com/user
go mod graph
11.啓動
不需要進行修改main.go
1.命令註冊
cd $GOPATH/src/www/example/com/user
go run main.go --registry=etcd --registry_address=127.0.0.1:2379
2.查看etcd數據信息
strings ~/workspace/etcd/data.etcd/member/wal/*.wal
或者使用過濾服務名形式:
strings ~/workspace/etcd/data.etcd/member/wal/*.wal | grep "www.example.com.service.user"
3.修改main.go方式的註冊
需要導入的包是:
"github.com/micro/go-micro/v2/registry"
"github.com/micro/go-plugins/registry/etcdv3/v2"
main()方法中:
reg := etcdv3.NewRegistry(func(op *registry.Options) {
op.Addrs = []string{"http://127.0.0.1:2379"}
})
// New Service
service := micro.NewService(
micro.Name("www.example.com.service.user"),
micro.Version("latest"),
micro.Registry(reg),
)
啓動命令:
cd $GOPATH/src/www/example/com/user
go run main.go
更多
web的創建參照之前的micro/v2的grpc版本,etcd的導包做響應修改即可etcdv3
和micro/v2
的更多參考:
https://etcd.io/docs/v3.4.0/
``
```http
https://micro.mu/docs