#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
# 安装方式一
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
# 源码安装,下载最新版,目前是 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
说明:
所需二进制文件:micro、protoc-gen-micro、protoc、
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需要通过该域找到服务 默认是使用服务的命令空间加上类型再加上别名 服务定义域
//创建一个新的服务对象实例
service := micro.NewService(
micro.Name("helloservice"),
micro.Version("v1.0.0"),
)
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文件
(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
(1.)命令行测试
micro call 服务名 接口 参数
说明:服务名是我们启动微服务定义的唯一标识,接口的格式是:proto文件定义的service名字 + rpc接口名
使用示例:
micro call go.micro.api.orderservice OrderSrv.GetOrder ‘{"id":1}‘
(2.)web界面测试
// 启动web
micro web
//访问localhost:8082
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的形式
(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
1.启动web后台
micro web
通过http://localhost:8082访问后台
2.使用注册中心启动web后台
MICRO_REGISTRY=consul MICRO_REGISTRY_ADDRESS=127.0.0.1:8500 micro web
(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
原文:https://www.cnblogs.com/tomtellyou/p/12936651.html