micro new [service]

Micro中有micro new命令可以快速生成Micro风格的服务模板。

使用

使用micro new很简单,我们先看一下它的使用方法

  1. $ micro new -h
  2. NAME:
  3. micro new - Create a service template
  4. USAGE:
  5. micro new [command options] [arguments...]
  6. OPTIONS:
  7. --namespace "go.micro" Namespace for the service e.g com.example
  8. --type "srv" Type of service e.g api, fnc, srv, web
  9. --fqdn FQDN of service e.g com.example.srv.service (defaults to namespace.type.alias)
  10. --alias Alias is the short name used as part of combined name if specified
  11. --plugin [--plugin option --plugin option] Specify plugins e.g --plugin=registry=etcd:broker=nats or use flag multiple times
  12. --gopath Create the service in the gopath. Defaults to true.

当我们创建新服务时,有两点我们要确认

配置指令作用默认值说明
–namespace服务命令空间go.micro
–type服务类型srv目前支持4种服务类型,分别是api、fnc(function)、srv(service)、web。

其它选项都是可配可不配,一般使用默认即可

配置指令作用默认值说明
–fqdn服务定义域,API需要通过该域找到服务默认是使用服务的命令空间加上类型再加上别名
–alias指定别名声明则必填使用单词,不要带任何标点符号,名称对Micro路由机制影响很大
–plugin使用哪些插件声明则必填需要自选插件时使用
–gopath是否使用GOPATH作为代码路径true

默认方式创建新服务

  1. micro new github.com/micro-in-cn/micro-all-in-one/middle-practices/micro-new/default

可以看到指令参数只有生成服务代码的路径,路径最后一个单词就是服务项目名,所以,最后一个单词一定不要加任何符号!:

  1. Creating service go.micro.srv.default in /Users/me/workspace/go/src/github.com/micro-in-cn/micro-all-in-one/middle-practices/micro-new/default
  2. .
  3. ├── main.go
  4. ├── plugin.go
  5. ├── handler
  6. └── example.go
  7. ├── subscriber
  8. └── example.go
  9. ├── proto/example
  10. └── example.proto
  11. ├── Dockerfile
  12. ├── Makefile
  13. └── README.md
  14. ## 下面是提示要安装protobuf和使用protobuf指令生成类文件,已经安装有了protobuf可以忽略,直接切到项目目录,再执行protoc指令
  15. download protobuf for micro:
  16. brew install protobuf
  17. go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
  18. go get -u github.com/micro/protoc-gen-micro
  19. compile the proto file example.proto:
  20. ## 切目录,生成文件
  21. cd /Users/me/workspace/go/src/github.com/micro-in-cn/micro-all-in-one/middle-practices/micro-new/default
  22. protoc --proto_path=. --go_out=. --micro_out=. proto/example/example.proto

生成的代码中,命令空间前缀为默认的go.micro,默认的服务类型为srv,服务别名(alias)为default

  1. package main
  2. // ...
  3. func main() {
  4. // New Service
  5. service := micro.NewService(
  6. micro.Name("go.micro.srv.default"),
  7. micro.Version("latest"),
  8. )
  9. // ...
  10. }

指定命名空间

现在我们演示使用—namespaceflag指定自己的命名空间,大家可以根据自己的域名定义合适的空间前缀,我们用micro官网的域名mu.micro代替

  1. micro new --namespace=mu.micro github.com/micro-in-cn/micro-all-in-one/middle-practices/micro-new/namespace

生成成功的消息与上面一样,不赘述,我们重点看下服务main方法内容:

  1. package main
  2. // ...
  3. func main() {
  4. // New Service
  5. service := micro.NewService(
  6. micro.Name("mu.micro.srv.namespace"),
  7. micro.Version("latest"),
  8. )
  9. // ...
  10. micro.RegisterSubscriber("mu.micro.srv.namespace", service.Server(), new(subscriber.Example))
  11. // Register Function as Subscriber
  12. micro.RegisterSubscriber("mu.micro.srv.namespace", service.Server(), subscriber.Handler)
  13. // ...
  14. }

可以看到服务前缀由默认的go.micro改成了mu.micro,其它结构内容一致

指定服务类型

上面两个例子生成的都是默认的服务类型srv,现在我们演示指定为api类型。

  1. micro new --type=api github.com/micro-in-cn/micro-all-in-one/middle-practices/micro-new/apiType
  1. package main
  2. // ...
  3. func main() {
  4. // New Service
  5. service := micro.NewService(
  6. micro.Name("go.micro.api.apiType"),
  7. micro.Version("latest"),
  8. )
  9. // Initialise service
  10. service.Init(
  11. // create wrap for the Example srv client
  12. micro.WrapHandler(client.ExampleWrapper(service)),
  13. )
  14. // ...
  15. }

如生成的代码所示,服务名中的类型部分变成了api

指定FQDN

有些时候我们想要个性化的定义域,那么我们就可以指定—fqdn参数来声明。所谓定义域,默认情况下,服务全名就是命名空间+服务类型+服务名的组合,一旦设定—fqdn,它的值会替换默认值的组合。

下面我们把服务命名改为mu.micro.fqdn.more

  1. micro new --fqdn=mu.micro.fqdn.more github.com/micro-in-cn/micro-all-in-one/middle-practices/micro-new/fqdn
  1. package main
  2. // ...
  3. func main() {
  4. // New Service
  5. service := micro.NewService(
  6. micro.Name("mu.micro.fqdn.more"),
  7. micro.Version("latest"),
  8. )
  9. // ..
  10. // Register Struct as Subscriber
  11. micro.RegisterSubscriber("mu.micro.fqdn.more", service.Server(), new(subscriber.Example))
  12. // Register Function as Subscriber
  13. micro.RegisterSubscriber("mu.micro.fqdn.more", service.Server(), subscriber.Handler)
  14. // ...
  15. }

或许有朋友会问,那—namespace—fqdn起使用会怎么样,有兴趣的同学可以试试,这属于比较偏门且不正经的情况,我们不考虑。

指定别名

前面有提到路径最后一个单词就是服务项目名,或叫服务名。有时候我们不想让目录这个单词变成我们的服务名,比如下面的micro,我们想换成orcim,那我们就可以传入—alias指令。

  1. micro new --alias=orcim github.com/micro-in-cn/micro-all-in-one/middle-practices/micro-new/micro
  1. package main
  2. // ...
  3. func main() {
  4. // New Service
  5. service := micro.NewService(
  6. micro.Name("go.micro.srv.orcim"),
  7. micro.Version("latest"),
  8. )
  9. // ...
  10. // Register Struct as Subscriber
  11. micro.RegisterSubscriber("go.micro.srv.orcim", service.Server(), new(subscriber.Example))
  12. // Register Function as Subscriber
  13. micro.RegisterSubscriber("go.micro.srv.orcim", service.Server(), subscriber.Handler)
  14. // ...
  15. }

生成的代码中,服务名已经由micro变成我们设置的orcim

指定plugin

我们演示使用etcd插件和kafka插件

  1. micro new --plugin=registry=etcd:broker=kafka github.com/micro-in-cn/micro-all-in-one/middle-practices/micro-new/plugin
  1. package main
  2. import (
  3. _ "github.com/micro/go-plugins/registry/etcd"
  4. _ "github.com/micro/go-plugins/broker/kafka"
  5. )

在刚才的指令中我们声明注册中心使用etcd、broker消息代理使用kafka,然后new模板就会生成plugin.go文件,里面包含上面的代码。

不使用GOPATH

目前不提倡这么做,Golang 1.11版本的modules现在还不100%成熟,大家就先默默使用GOPATH。等稳定后,我们再更新文档。