go-micro v3
一、测试环境1)centos7,2)关闭selinux,3)关闭firewalld,4)安装了protoc,5)安装docker-cehttps://github.com/micro/micro1.源码安装microgo get github.com/micro/micro/v32.运行本地servermicro server3.设置为本地服务127.0.0.1:8081micro env set
一、运行一个helloworld示例
1)centos7,2)关闭selinux,3)关闭firewalld,4)安装了protoc,5)v3不需要安装consul
https://github.com/micro/micro
1.源码安装micro
go get github.com/micro/micro/v3
2.运行本地server
micro server
3.设置为本地服务127.0.0.1:8081
micro env set local
4.登陆server, username:admin,password:micro(关闭了selinux才登陆成功)
micro login
5.开始创建服务
micro new helloworld
提示(要求环境有protoc):
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/v3/cmd/protoc-gen-micro
compile the proto file helloworld.proto:
cd helloworld
make proto
6.运行创建的hellowworld服务
micro run helloworld
7.查看服务状态 (注意查看状态是否正常)
micro status
8.查看服务(正确显示列表里应该有"helloworld"这个服务),需等待一会,多刷新几次
micro services
如图所示,多了方框中的helloworld这个服务
9.验证服务,使用micro
micro helloworld --name=Alice
10.使用curl验证
curl -d '{"name": "Alice"}' http://localhost:8080/helloworld
curl有点问题,暂未解决。
已解决
官方源码写了说明,只支持json标签转换
curl -H "Content-Type:application/json" -d '{"name": "Alice"}' http://localhost:8080/helloworld
二、相关命令
[root@localhost ~]# micro run --help
NAME:
micro run - Run a service: micro run [source]
USAGE:
micro run [command options] [arguments...]
DESCRIPTION:
Examples:
micro run github.com/micro/services/helloworld
micro run . # deploy local folder to your local micro server
micro run ../path/to/folder # deploy local folder to your local micro server
micro run helloworld # deploy latest version, translates to micro run github.com/micro/services/helloworld
micro run helloworld@9342934e6180 # deploy certain version
micro run helloworld@branchname # deploy certain branch
从上面命令可知,我们测试验证运行的micro run helloworld是部署github上面的helloworld最新版本
但是我们已经使用micro new helloworld下载在本地了,可以直接运行本地的helloworld服务,而不用每次到github上获取(毕竟那是要科学上网的)
运行本地helloword服务
cd helloworld
micro run .
micro status
micro services
三、定义自己的服务(从模仿开始)
使用 ”micro new [自定义服务名称] “ 的命令 就可以创建服务模板
我们使用micro new greeter创建一个greeter服务
文件目录
代码文件:一个greeter项目目录,里面一个handler业务逻辑代码目录,一个proto相关的protobuf文件以及自动生成的代码的目录,proto和handler都是package,都使用go module,程序入口也使用了module
1)greeter.proto
1 syntax = "proto3";
2
3 service Greeter {
4 rpc Call(Request) returns (Response) {}
5 rpc Hello(Request) returns (Response) {}
6 }
7
8 message Request {
9 string name = 1;
10 }
11
12 message Response {
13 string greeting = 2;
14 string Msg = 3;
15 }
然后在proto目录里使用命令生成greetre.pb.go以及greeter.pb.micro.go
protoc --proto_path=$GOPATH/src:. --micro_out=. --go_out=. greeter.proto
并创建go module文件
go mod init greeter/proto
2)greeter.go =>handler 包
1 package handler
2
3 import (
4 "context"
5
6 log "github.com/micro/micro/v3/service/logger"
7
8 greeter "greeter/proto"
9 )
10
11 type Greeter struct{}
12
13 // Call is a single request handler called via client.Call or the generated client code
14 func (e *Greeter) Call(ctx context.Context, req *greeter.Request, rsp *greeter.Response) error {
15 log.Info("Received Helloworld.Call request")
16 rsp.Msg = "greeter " + req.Name
17 return nil
18 }
19 func (e *Greeter) Hello(ctx context.Context, req *greeter.Request, rsp *greeter.Response) error {
20 log.Info("Received Helloworld.Call request")
21 rsp.Msg = "Hello " + req.Name
22 return nil
23 }
创建go module文件
go mod init greeter/handler
3)main.go
package main
2
3 import (
4 "greeter/handler"
5 pb "greeter/proto"
6
7 "github.com/micro/micro/v3/service"
8 "github.com/micro/micro/v3/service/logger"
9 )
10
11 func main() {
12 // Create service
13 srv := service.New(
14 service.Name("greeter"),
15 service.Version("latest"),
16 )
17
18 // Register handler
19 pb.RegisterGreeterHandler(srv.Server(), new(handler.Greeter))
20
21 // Run service
22 if err := srv.Run(); err != nil {
23 logger.Fatal(err)
24 }
25 }
创建go module
go mod init main
并编辑go.mod文件,添加handler以及proto包的别称
replace greeter/handler => ./handler
replace greeter/proto => ./proto
至此服务代码完成。
使用micro 添加本地代码服务并测试
micro server 启动micro服务
cd greeter/
micro run .
micro services
测试
如图测试结果:
micro greeter 直接调用Call方法
micro greeter --name=viper 传参数viper
micro greeter hello 调用指定的Hello方法
micro greeter hello --name=vipher2 传参数vipher2给Hello方法
使用curl测试api
curl -H "Content-Type:application/json" -d '{"name": "viper"}' http://localhost:8080/greeter
curl -H "Content-Type:application/json" -d '{"name": "vipher2"}' http://localhost:8080/greeter/hello
至此,你已经能够自定义服务,使用自己的业务逻辑。
四、如何使用micro生产开发与部署
4.1 开发
每个服务或者模块使用micro new 服务名称,
1)登陆
micro new userlogin
编辑proto文件夹下的proto文件之后,执行make proto然后再处理handler文件夹下的业务逻辑文件就可以了。
micro new 出来的是服务模板比较方便,后面我们需要使用Dockerfile来构建docker的镜像,都自动帮我们生成了
我使用命令docker build -f userlogin/Dockerfile . 生成了镜像,在本地仓库,这是一个无名字和标签的镜像。
使用--tag 或-t name:tag来定义名称和标签,再次生成镜像
docker build -f userlogin/Dockerfile . -t userlogin:v1
更为方便的是生成模板的文件里有Makefile,使用make 不同的选项可以直接执行不同的命令:
make docker就会直接 生成这个服务的最新版本的镜像
make build 生成go的二进制可执行文件
直接make 直接 init命令
使用make docker 生成docker镜像后运行出错(实际是go的编译文件不能运行):
standard_init_linux.go:219: exec user process caused: no such file or directory
这是因为使用的镜像系统为alpine,而不是centos,换成centos就可以了,当然我们要使用alpine,因为golang在centos像上面的build命令编译的二进制文件
这样不能在alpine运行。centos生成的镜像是200多M,而alpine只有31M。
修改Makefile文件的build选项为
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o userlogin *.go
再次make docker生成go的二进制可执行文件。
[root@localhost userlogin]# docker run userlogin
2021-01-06 12:17:15 file=cmd/cmd.go:451 level=fatal Error setting up auth: {"Id":"auth.Auth.Generate","Code":401,"Detail":"An account is required","Status":"Unauthorized"}
[root@localhost userlogin]#
好,正常生成了docker 镜像,和go run main.go的错误一样了。
[root@localhost userlogin]# go run main.go
2021-01-06 20:19:11 file=cmd/cmd.go:451 level=fatal Error setting up auth: {"Id":"auth.Auth.Generate","Code":401,"Detail":"An account is required","Status":"Unauthorized"}
exit status 1
[root@localhost userlogin]#
micro v3 和v2不同,v2 可以使用go run main.go来运行服务,而v3要使用micro run .方式。那v2生成的二进制运行方面可以在docker执行,但v3怎么办?
更多推荐
所有评论(0)