一、运行一个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怎么办?

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐