Microservice-微服务-micro-consul-protobuf-RPC-ubuntu
系统/工具/插件 | 版本 | 说明 |
---|---|---|
ubuntu | Linux version 5.3.0-46-generic (buildd@lcy01-amd64-013) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #38~18.04.1-Ubuntu SMP Tue Mar 31 04:17:56 UTC 2020 | cat /proc/version |
consul | Consul v1.7.2 Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents) | consul version |
micro | micro version 1.18.0 | micro --version |
go-micro | v1.18.0 | - |
创建一个service-srv【service】和一个service-web【client】
consul
consul agent -dev
1.srv
1.创建目录,剥离pb.go文件
mkdir -p $GOPATH/src/micro/rpc/pb
2.srv创建
cd $GOPTH/src/
micro new --type srv micro/rpc/srv
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
go get -u github.com/micro/protoc-gen-micro
3.进行编译.proto
cd $GOPATH/src/micro/rpc/srv
tree $GOPATH/src/micro/rpc/srv
protoc --proto_path=.:$GOPATH/src --go_out=$GOPATH/src/micro/rpc/pb --micro_out=$GOPATH/src/micro/rpc/pb proto/srv/srv.proto
4.go mod init [*.pb.go目录]
tree $GOPATH/src/micro/rpc
cd $GOPATH/src/micro/rpc/pb/proto/srv/ && go mod init micro/rpc/pb/proto/srv && cd $GOPATH/src/micro/rpc/srv
5.查看导包异常
cd $GOPATH/src/micro/rpc/srv
go mod why
go: finding module for package github.com/micro/go-micro/util/log
go: finding module for package github.com/micro/go-micro
go: found github.com/micro/go-micro in github.com/micro/go-micro v1.18.0
go: downloading github.com/onsi/gomega v1.4.3
go: downloading github.com/onsi/ginkgo v1.7.0
go: downloading github.com/nats-io/nats-server/v2 v2.1.0
go: downloading github.com/golang/mock v1.2.0
go: downloading github.com/prometheus/client_golang v1.1.0
go: downloading github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
go: downloading github.com/soheilhy/cmux v0.1.4
go: downloading gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127
go: downloading github.com/prometheus/common v0.6.0
go: downloading github.com/jonboulle/clockwork v0.1.0
go: downloading github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2
go: downloading github.com/alangpierce/go-forceexport v0.0.0-20160317203124-8f1d6941cd75
go: downloading github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c
go: downloading github.com/coreos/bbolt v1.3.3
go: downloading github.com/kr/pretty v0.1.0
go: downloading github.com/grpc-ecosystem/go-grpc-middleware v1.1.0
go: downloading github.com/kr/text v0.1.0
go: downloading github.com/hpcloud/tail v1.0.0
go: downloading github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5
go: downloading go.etcd.io/bbolt v1.3.3
go: downloading github.com/grpc-ecosystem/grpc-gateway v1.8.5
go: downloading github.com/coreos/go-semver v0.3.0
go: downloading github.com/dgrijalva/jwt-go v3.2.0+incompatible
go: downloading gopkg.in/fsnotify.v1 v1.4.7
go: downloading gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
micro/rpc/srv imports
micro/rpc/srv/proto/srv: package micro/rpc/srv/proto/srv is not in GOROOT (/usr/local/go/src/micro/rpc/srv/proto/srv)
6.修改go.mod 文件
修改$GOPATH/src/micro/rpc/srv下的go.mod 文件
追加【本地只能是相对路径(=>后面的部分必须是相对路径),换行符不要动】
tee -a $GOPATH/src/micro/rpc/srv/go.mod <<-'EOF'
require "micro/rpc/srv/proto/srv" v0.0.0
replace "micro/rpc/srv/proto/srv" => "../pb/proto/srv"
EOF
再次执行包异常检测
go mod why
7.添加consul支持
修改$GOPATH/src/micro/rpc/srv/main.go文件
原main.go文件:
package main
import (
"micro/rpc/srv/handler"
"micro/rpc/srv/subscriber"
"github.com/micro/go-micro"
"github.com/micro/go-micro/util/log"
srv "micro/rpc/srv/proto/srv"
)
func main() {
// New Service
service := micro.NewService(
micro.Name("go.micro.srv.srv"),
micro.Version("latest"),
)
// Initialise service
service.Init()
// Register Handler
srv.RegisterSrvHandler(service.Server(), new(handler.Srv))
// Register Struct as Subscriber
micro.RegisterSubscriber("go.micro.srv.srv", service.Server(), new(subscriber.Srv))
// Register Function as Subscriber
micro.RegisterSubscriber("go.micro.srv.srv", service.Server(), subscriber.Handler)
// Run service
if err := service.Run(); err != nil {
log.Fatal(err)
}
}
修改后main.go文件:
package main
import (
"micro/rpc/srv/handler"
"micro/rpc/srv/subscriber"
"github.com/micro/go-micro"
"github.com/micro/go-micro/util/log"
// 调用的protobuf生成的包
srv "micro/rpc/srv/proto/srv"
// 添加注册插件
"github.com/micro/go-micro/registry"
// 添加注册插件的consul支持
"github.com/micro/go-plugins/registry/consul"
)
func main() {
// 新建consul注册器
consulReg := consul.NewRegistry(
// 注册的地址信息
registry.Addrs("127.0.0.1:8500"),
)
// New Service
// 新建服务
service := micro.NewService(
// 服务名称
micro.Name("go.micro.srv.srv"),
// 服务版本号
micro.Version("latest"),
// 服务添加consul支持
micro.Registry(consulReg),
)
// Initialise service
// 服务初始化
service.Init()
// Register Handler
// 注册句柄
srv.RegisterSrvHandler(service.Server(), new(handler.Srv))
// Register Struct as Subscriber
// 注册订阅服务的结构体
micro.RegisterSubscriber("go.micro.srv.srv", service.Server(), new(subscriber.Srv))
// Register Function as Subscriber
// 注册订阅服务的方法
micro.RegisterSubscriber("go.micro.srv.srv", service.Server(), subscriber.Handler)
// Run service
// 启动服务
if err := service.Run(); err != nil {
log.Fatal(err)
}
}
8.启动srv
cd $GOPATH/src/micro/rpc/srv
go run main.go
2.web
新开一个终端,创建client【web】服务
1.web创建
cd $GOPATH/src
micro new --type web micro/rpc/web
2.查看导包异常
cd $GOPATH/src/micro/rpc/web
go mod why
go: finding module for package github.com/micro/go-micro/util/log
go: finding module for package github.com/micro/go-micro/web
go: finding module for package github.com/micro/go-micro/client
go: found github.com/micro/go-micro/util/log in github.com/micro/go-micro v1.18.0
micro/rpc/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/micro/rpc/web下的go.mod 文件
追加【本地只能是相对路径(=>后面的部分必须是相对路径),换行符不要动】
tee -a $GOPATH/src/micro/rpc/web/go.mod <<-'EOF'
require "path/to/service/proto/web" v0.0.0
replace "path/to/service/proto/web" => "../pb/proto/srv"
EOF
再次执行包异常检测
go mod why
4.添加consul支持
修改$GOPATH/src/micro/rpc/web/main.go文件
原main.go文件:
package main
import (
"net/http"
"github.com/micro/go-micro/util/log"
"micro/rpc/web/handler"
"github.com/micro/go-micro/web"
)
func main() {
// create new web service
service := web.NewService(
web.Name("go.micro.web.web"),
web.Version("latest"),
)
// 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)
}
}
修改后main.go文件:
package main
import (
"net/http"
"github.com/micro/go-micro/util/log"
"micro/rpc/web/handler"
"github.com/micro/go-micro/web"
// 添加注册插件
"github.com/micro/go-micro/registry"
// 添加注册插件的consul支持
"github.com/micro/go-plugins/registry/consul"
)
func main() {
// 新建consul注册器
consulReg := consul.NewRegistry(
// 注册的地址信息
registry.Addrs("127.0.0.1:8500"),
)
// create new web service
// 创建web服务
service := web.NewService(
// 服务名
web.Name("go.micro.web.web"),
// 服务版本
web.Version("latest"),
// 服务添加consul支持
web.Registry(consulReg),
// 指定web服务端口号
web.Address(":8080"),
)
// initialise service
// 服务初始化
if err := service.Init(); err != nil {
log.Fatal(err)
}
// register html handler
// 注册静态资源处理句柄
service.Handle("/", http.FileServer(http.Dir("html")))
// register call handler
// 注册/web/call服务请求处理句柄
service.HandleFunc("/web/call", handler.WebCall)
// run service
// 启动服务
if err := service.Run(); err != nil {
log.Fatal(err)
}
}
5.修改handler/handler.go
修改$GOPATH/src/micro/rpc/web/handler/handler.go
原handler/handler.go文件:
package handler
import (
"context"
"encoding/json"
"net/http"
"time"
web "path/to/service/proto/web"
"github.com/micro/go-micro/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
webClient := web.NewWebService("go.micro.srv.web", 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
}
}
修改后的handler/handler.go文件:
package handler
import (
"context"
"encoding/json"
"net/http"
"time"
web "path/to/service/proto/web"
"github.com/micro/go-micro/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
}
// 基于后端服务go.micro.srv.srv创建web客户端
// NewSrvService/rpc/pb/proto/srv/srv.pb.micro.go的NewSrvService方法名一致
// go.micro.srv.srv也要和micro/rpc/pb/proto/srv/srv.pb.micro.go的go.micro.srv.srv的一致
webClient := web.NewSrvService("go.micro.srv.srv", client.DefaultClient)
// call the backend service
// 客户端调用后端服务
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
}
}
6.启动web服务
cd $GOPATH/src/micro/rpc/web
go run main.go
3.访问
1.consul web访问
浏览器打开:
http://127.0.0.1:8500
2.web service 访问
http://127.0.0.1:8080
4.附go.mod文件
1.srv
$GOPATH/src/micro/rpc/srv/go.mod
module micro/rpc/srv
go 1.14
require github.com/micro/go-micro v1.18.0
require (
github.com/micro/go-plugins v1.5.1 // indirect
google.golang.org/protobuf v1.21.0 // indirect
micro/rpc/srv/proto/srv v0.0.0
)
replace micro/rpc/srv/proto/srv => ../pb/proto/srv
2.web
$GOPATH/src/micro/rpc/web/go.mod
module micro/rpc/web
go 1.14
require github.com/micro/go-micro v1.18.0
require (
github.com/micro/go-plugins v1.5.1 // indirect
google.golang.org/protobuf v1.21.0 // indirect
path/to/service/proto/web v0.0.0
)
replace path/to/service/proto/web => ../pb/proto/srv