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
|
请发表评论